From 4f1f77e0aeb0a4042eceeb4cd52ee23ec14fd1d3 Mon Sep 17 00:00:00 2001 From: Pulse Monitor Date: Thu, 28 Aug 2025 11:56:02 +0000 Subject: [PATCH] fix: improve error handling for node connection tests (addresses #362, #363) - Handle standalone nodes properly in diagnostics (fixes #362) - Try /nodes endpoint first which works for both clustered and standalone - Make cluster status optional, not required for connection success - Set cluster node count to 1 for standalone nodes - Fix test connection UI showing success styling on errors (fixes #363) - Return proper HTTP error status when test-config endpoint fails - Clean up error messages to remove "API request failed: XXX" prefix - Add debug logging to trace test result states - Ensure consistent error status codes from all test endpoints Both issues reported connection problems - standalone nodes failing to connect and error messages appearing with success styling. These fixes ensure proper handling of both scenarios. --- .../src/components/Settings/NodeModal.tsx | 21 +++++++++-- internal/api/config_handlers.go | 8 +++++ internal/api/diagnostics.go | 36 ++++++++++++------- 3 files changed, 50 insertions(+), 15 deletions(-) diff --git a/frontend-modern/src/components/Settings/NodeModal.tsx b/frontend-modern/src/components/Settings/NodeModal.tsx index 0cd1e1ff7..4c3ebb51b 100644 --- a/frontend-modern/src/components/Settings/NodeModal.tsx +++ b/frontend-modern/src/components/Settings/NodeModal.tsx @@ -205,9 +205,15 @@ export const NodeModal: Component = (props) => { message: result.message || 'Connection successful' }); } catch (error) { + console.error('Test existing node error:', error); + let errorMessage = 'Connection failed'; + if (error instanceof Error) { + // Remove "API request failed: XXX " prefix if present + errorMessage = error.message.replace(/^API request failed: \d{3}\s*/, ''); + } setTestResult({ status: 'error', - message: error instanceof Error ? error.message : 'Connection failed' + message: errorMessage }); } finally { setIsTesting(false); @@ -261,9 +267,15 @@ export const NodeModal: Component = (props) => { isCluster: result.isCluster }); } catch (error) { + console.error('Test connection error:', error); + let errorMessage = 'Connection failed'; + if (error instanceof Error) { + // Remove "API request failed: XXX " prefix if present + errorMessage = error.message.replace(/^API request failed: \d{3}\s*/, ''); + } setTestResult({ status: 'error', - message: error instanceof Error ? error.message : 'Connection failed' + message: errorMessage }); } finally { setIsTesting(false); @@ -1256,6 +1268,11 @@ export const NodeModal: Component = (props) => { {/* Test Result */} + {(() => { + const result = testResult(); + console.log('Test result display:', { status: result?.status, message: result?.message }); + return null; + })()}
0 { + // Set node details + if len(nodes) > 0 { nodeDiag.Details = &NodeDetails{ NodeCount: len(nodes), } // Get version from first node - if len(nodes) > 0 { - if status, err := client.GetNodeStatus(ctx, nodes[0].Node); err == nil && status != nil { - if status.PVEVersion != "" { - nodeDiag.Details.Version = status.PVEVersion - } + if status, err := client.GetNodeStatus(ctx, nodes[0].Node); err == nil && status != nil { + if status.PVEVersion != "" { + nodeDiag.Details.Version = status.PVEVersion } } } + // Try to get cluster status (this may fail for standalone nodes, which is OK) + if clusterStatus, err := client.GetClusterStatus(ctx); err == nil { + nodeDiag.ClusterInfo = &ClusterInfo{ + Nodes: len(clusterStatus), + } + } else { + // Standalone node or cluster status not available + // This is not an error - standalone nodes don't have cluster status + log.Debug().Str("node", node.Name).Msg("Cluster status not available (likely standalone node)") + nodeDiag.ClusterInfo = &ClusterInfo{ + Nodes: 1, // Standalone node + } + } + // Run VM disk monitoring check nodeDiag.VMDiskCheck = r.checkVMDiskMonitoring(ctx, client, node.Name) }