<template lang='pug'> v-container#page-import(column, grid-list-md) v-layout(column) v-flex v-card v-card-title.display-1.pa-2 Kendra Web Crawling v-card-text h3 For more information about Kendra Web Crawling, see <a href="https://github.com/aws-solutions/qnabot-on-aws/blob/main/docs/kendra_crawler_guide/README.md" target="_blank">here</a> v-card-text(v-if="kendraIndexerEnabled == true") p Current Status: {{ status }} v-card-text(v-if="!kendraIndexerEnabled") p The following settings should be configured. p p ENABLE_KENDRA_WEB_INDEXER - should be set to true p KENDRA_WEB_PAGE_INDEX - the ID of the Kendra Index used to store the content of the web pages p KENDRA_INDEXER_URLS - a comma separated list of web pages to index v-card-actions v-btn#btnKendraStartIndex( :disabled="status == 'STARTING' || status == 'CREATING' || status == 'UPDATING' || status == 'DELETING' || status == 'SYNCING' || status =='SYNCING_INDEXING' || status == 'STOPPING' || !kendraIndexerEnabled", @click="start" ) Start Crawling v-flex(v-if="history && history.length > 0") v-card-title.headline Kendra Crawling History v-card-text h3 <a :href="dashboard_url" target="_blank">View Web Crawling Errors in CloudWatch </a> v-card-text table.table tr th(style="text-align: left") Start Time th(style="text-align: left") End Time th(style="text-align: left") Status th(style="text-align: left") Error Message th(style="text-align: left") Documents Scanned th(style="text-align: left") Documents Added th(style="text-align: left") Documents Modified th(style="text-align: left") Documents Deleted th(style="text-align: left") Documents Failed template(v-for="(job, index) in history") tr td {{ convertToLocalTime(job.StartTime) }} td {{ convertToLocalTime(job.EndTime) }} td {{ job.Status }} td {{ job.ErrorMessage }} td {{ job.Metrics.DocumentsScanned }} td {{ job.Metrics.DocumentsAdded }} td {{ job.Metrics.DocumentsModified }} td {{ job.Metrics.DocumentsDeleted }} td {{ job.Metrics.DocumentsFailed }} </template> <script> // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 var Vuex = require("vuex"); var Promise = require("bluebird"); var _ = require("lodash"); var Promise = require("bluebird"); module.exports = { data: function () { var self = this; return { status: "", dashboard_url:"", history: {}, dialog: false, text: false, ready: false, kendraIndexerEnabled: false, lastStatusCheck: Date.now(), intervalBetweenPoll: 10000, isPolling: 0 }; }, components: {}, computed: {}, updated: function () { console.log("updated"); var self = this; if(!self.kendraIndexerEnabled){ self.IsKendraEnabled().then((data) => { self.kendraIndexerEnabled = data; }) } this.poll( () => { console.log("last status check " + self.lastStatusCheck); if (!self.lastStatusCheck || (Date.now() - self.lastStatusCheck > self.intervalBetweenPoll)) { self.lastStatusCheck = Date.now(); console.log("getting status"); self.getKendraIndexingStatus().then((data) => { if(self.status == "SUCCEEDED" && data.Error && data.Error.toLowerCase().includes("not found")){ // Most likely caused by Kendra Throttling error, don't change the current status self.intervalBetweenPoll = 20000 return } self.dashboard_url = data.DashboardUrl; self.status = data.Status; self.history = data.History; self.intervalBetweenPoll = 10000 }); } //if the Kendra Start Index isn't displayed -- stop syncing var shouldPoll = ( document.getElementById("btnKendraStartIndex") && document.getElementById("btnKendraStartIndex").offsetWidth == 0 ) == null; console.log("Should Poll " + shouldPoll); return shouldPoll; }, 600000, 10000 ).catch((error) => console.log("Error trying to retrieve status " + error)); }, mounted: function () { var self = this; console.log("updated"); var self = this; self.getKendraIndexingStatus().then((data) => { self.status = data.Status; (self.history = data.History), console.log("History " + JSON.stringify(self.history)); self.lastStatusCheck = Date.now(); }); self.$forceUpdate(); }, methods: { start: async function () { this.$store .dispatch("api/startKendraV2Indexing") .catch((err) => console.log(`error while trying to start indexing ` + err) ); this.status = "STARTING"; await new Promise((r) => setTimeout(r, 3000)); this.getKendraIndexingStatus().then((data) => { this.status = data.Status; }); this.$forceUpdate(); }, getKendraIndexingStatus: async function () { var result = await this.$store.dispatch("api/getKendraIndexingStatus"); return result; }, convertToLocalTime: function (isoDateTime) { if(isoDateTime == ""){ return "" } var isoDateTime = new Date(isoDateTime); return ( isoDateTime.toLocaleDateString() + " " + isoDateTime.toLocaleTimeString() ); }, IsKendraEnabled: async function(){ const settings=await this.$store.dispatch('api/listSettings'); console.log(JSON.stringify(settings)); return _.get(settings[2],"ENABLE_KENDRA_WEB_INDEXER")=="true" && _.get(settings[2],"KENDRA_INDEXER_URLS") !== "" && _.get(settings[2],"KENDRA_WEB_PAGE_INDEX") !== ""; }, poll: function (fn, timeout, interval) { var endTime = Number(new Date()) + (timeout || 2000); interval = interval || 100; var checkCondition = function (resolve, reject) { // If the condition is met, we're done! var result = fn(); if (result) { resolve(result); } //If the condition isn't met but the timeout hasn't elapsed, go again else if (true) { /*Number(new Date()) < endTime) */ setTimeout( checkCondition, interval, resolve, reject ); } // Didn't match and too much time, reject! else { reject(new Error("timed out for " + fn + ": " + arguments)); } }; return new Promise(checkCondition); }, }, }; </script> <style lang='scss' scoped> </style>