diff --git a/app/static/index.html b/app/static/index.html
index d8aa176..53d967f 100644
--- a/app/static/index.html
+++ b/app/static/index.html
@@ -1918,6 +1918,8 @@
async function loadWorkloadScanner() {
let loadingModal = null;
+ let timeoutId = null;
+
try {
// Show fullscreen loading modal
loadingModal = showFullscreenLoading(
@@ -1925,8 +1927,25 @@
'Please wait while we analyze your cluster resources and generate insights...'
);
- // Load cluster status
- const clusterResponse = await fetch('/api/v1/cluster/status');
+ // Set timeout for loading (30 seconds)
+ timeoutId = setTimeout(() => {
+ hideFullscreenLoading();
+ showError('metrics-grid', 'Request timeout - API is taking too long to respond');
+ }, 30000);
+
+ // Load cluster status with timeout
+ const controller = new AbortController();
+ const timeoutController = setTimeout(() => controller.abort(), 25000);
+
+ const clusterResponse = await fetch('/api/v1/cluster/status', {
+ signal: controller.signal
+ });
+ clearTimeout(timeoutController);
+
+ if (!clusterResponse.ok) {
+ throw new Error(`HTTP error! status: ${clusterResponse.status}`);
+ }
+
const clusterData = await clusterResponse.json();
// Update progress
@@ -1946,15 +1965,22 @@
currentData = { cluster: clusterData };
- // Hide loading modal after a short delay
+ // Clear timeout and hide loading modal
+ clearTimeout(timeoutId);
setTimeout(() => {
hideFullscreenLoading();
}, 500);
} catch (error) {
console.error('Error loading workload scanner data:', error);
+ if (timeoutId) clearTimeout(timeoutId);
hideFullscreenLoading();
- showError('metrics-grid', 'Failed to load cluster data');
+
+ if (error.name === 'AbortError') {
+ showError('metrics-grid', 'Request timeout - API is taking too long to respond');
+ } else {
+ showError('metrics-grid', 'Failed to load cluster data: ' + error.message);
+ }
}
}