mirror of
https://github.com/rcourtman/Pulse.git
synced 2026-09-11 14:00:29 +00:00
0dd3f8bedb
When every cluster endpoint failed health, getHealthyClient wrapped the failure as `no healthy nodes available in cluster X (all N endpoints unreachable: [...])`, dropping the per-endpoint reason from cc.lastError. The connections aggregator's auth-error regex (401/403/unauthorized/forbidden/authentication/...) only sees the outer message, so a token rejected with 401 on every endpoint of a clustered PVE connection surfaced as `state: "unreachable"` / `adapterHealth: "blocked"` instead of `state: "unauthorized"` / `credentialStatus: "invalid"` — the same Settings → Connections brokenness the rest of today's commits set out to remove. Single-node `pve:pi` already classified the same kind of failure correctly because its error came straight from the per-instance client; only the cluster wrapper masked it. Surface each unhealthy endpoint's already-sanitized reason in the outer error. The "no healthy nodes available" prefix is preserved so existing callers that test for it (monitor_polling_storage.go, internal cluster_client passthroughs, existing tests) keep working. Add a regression test covering both shapes: - all endpoints failed auth → wrapped error contains "Authentication failed" so the aggregator regex now matches. - endpoint with no recorded reason → wrapped error includes the fallback "no recorded reason" text rather than a bare URL.