From 647cdaa62570700b36a86bcc3f413bb0e2f96f04 Mon Sep 17 00:00:00 2001 From: "courtmanr@gmail.com" Date: Fri, 30 May 2025 11:45:08 +0100 Subject: [PATCH] fix: ensure API clients are properly reloaded after configuration save - Make runDiscoveryCycle globally accessible for config reload - Use global API clients in discovery and metrics cycles - Trigger discovery cycle after configuration reload - Fix issue where metrics cycle couldn't find reloaded API clients This ensures the server properly initializes and starts collecting data after saving configuration through the web interface. --- server/configApi.js | 11 +++++++++++ server/index.js | 17 +++++++++++++---- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/server/configApi.js b/server/configApi.js index a21725951..4a940fbb0 100644 --- a/server/configApi.js +++ b/server/configApi.js @@ -331,6 +331,17 @@ class ConfigApi { global.lastReloadTime = Date.now(); } + // Trigger a discovery cycle if we have endpoints configured + if (endpoints.length > 0) { + console.log('Triggering discovery cycle after configuration reload...'); + // Import and call runDiscoveryCycle if available + if (global.runDiscoveryCycle && typeof global.runDiscoveryCycle === 'function') { + setTimeout(() => { + global.runDiscoveryCycle(); + }, 1000); // Give a moment for everything to settle + } + } + console.log('Configuration reloaded successfully'); return true; } catch (error) { diff --git a/server/index.js b/server/index.js index 4d9158d9a..40b38cc76 100644 --- a/server/index.js +++ b/server/index.js @@ -727,12 +727,16 @@ async function runDiscoveryCycle() { let errors = []; try { - if (Object.keys(apiClients).length === 0 && Object.keys(pbsApiClients).length === 0) { + // Use global API clients if local ones aren't set + const currentApiClients = global.pulseApiClients ? global.pulseApiClients.apiClients : apiClients; + const currentPbsApiClients = global.pulseApiClients ? global.pulseApiClients.pbsApiClients : pbsApiClients; + + if (Object.keys(currentApiClients).length === 0 && Object.keys(currentPbsApiClients).length === 0) { console.warn("[Discovery Cycle] API clients not initialized yet, skipping run."); return; } // Use imported fetchDiscoveryData - const discoveryData = await fetchDiscoveryData(apiClients, pbsApiClients); + const discoveryData = await fetchDiscoveryData(currentApiClients, currentPbsApiClients); const duration = Date.now() - startTime; @@ -772,7 +776,10 @@ async function runMetricCycle() { let errors = []; try { - if (Object.keys(apiClients).length === 0) { + // Use global API clients if local ones aren't set + const currentApiClients = global.pulseApiClients ? global.pulseApiClients.apiClients : apiClients; + + if (Object.keys(currentApiClients).length === 0) { console.warn("[Metrics Cycle] PVE API clients not initialized yet, skipping run."); return; } @@ -783,7 +790,7 @@ async function runMetricCycle() { if (runningVms.length > 0 || runningContainers.length > 0) { // Use imported fetchMetricsData - const fetchedMetrics = await fetchMetricsData(runningVms, runningContainers, apiClients); + const fetchedMetrics = await fetchMetricsData(runningVms, runningContainers, currentApiClients); const duration = Date.now() - startTime; @@ -990,6 +997,7 @@ async function startServer() { // Store globally for config reload global.pulseApiClients = { apiClients, pbsApiClients }; + global.runDiscoveryCycle = runDiscoveryCycle; console.log("INFO: All API clients initialized."); } catch (initError) { @@ -1004,6 +1012,7 @@ async function startServer() { apiClients = {}; pbsApiClients = {}; global.pulseApiClients = { apiClients, pbsApiClients }; + global.runDiscoveryCycle = runDiscoveryCycle; } server.listen(PORT, () => {