Persist PVE fallback host after portless retry
This commit is contained in:
parent
8606bb47cf
commit
93d8c624b4
2 changed files with 72 additions and 2 deletions
|
|
@ -77,3 +77,45 @@ func TestCreateConfigHelpersNormalizeHosts(t *testing.T) {
|
||||||
t.Fatalf("expected default port on host built from fields, got %q", fromFields.Host)
|
t.Fatalf("expected default port on host built from fields, got %q", fromFields.Host)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestStripDefaultPort(t *testing.T) {
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
host string
|
||||||
|
defaultPort string
|
||||||
|
want string
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "removes default PVE port",
|
||||||
|
host: "https://pve.local:8006",
|
||||||
|
defaultPort: defaultPVEPort,
|
||||||
|
want: "https://pve.local",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "keeps non-default port",
|
||||||
|
host: "https://pve.local:8443",
|
||||||
|
defaultPort: defaultPVEPort,
|
||||||
|
want: "https://pve.local:8443",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "preserves http scheme when removing port",
|
||||||
|
host: "http://pve.local:8006",
|
||||||
|
defaultPort: defaultPVEPort,
|
||||||
|
want: "http://pve.local",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "returns trimmed host unchanged when parse fails",
|
||||||
|
host: "://bad",
|
||||||
|
defaultPort: defaultPVEPort,
|
||||||
|
want: "://bad",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
if got := StripDefaultPort(tt.host, tt.defaultPort); got != tt.want {
|
||||||
|
t.Fatalf("StripDefaultPort(%q, %q) = %q, want %q", tt.host, tt.defaultPort, got, tt.want)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -5526,12 +5526,40 @@ func (m *Monitor) retryPVEPortFallback(ctx context.Context, instanceName string,
|
||||||
|
|
||||||
// Switch to the working host for the remainder of the poll (and future polls)
|
// Switch to the working host for the remainder of the poll (and future polls)
|
||||||
primaryHost := instanceCfg.Host
|
primaryHost := instanceCfg.Host
|
||||||
instanceCfg.Host = fallbackHost
|
|
||||||
|
// Persist with an explicit port to avoid re-normalization back to :8006 on reloads.
|
||||||
|
persistHost := fallbackHost
|
||||||
|
if parsed, err := url.Parse(fallbackHost); err == nil && parsed.Host != "" && parsed.Port() == "" {
|
||||||
|
port := "443"
|
||||||
|
if strings.EqualFold(parsed.Scheme, "http") {
|
||||||
|
port = "80"
|
||||||
|
}
|
||||||
|
parsed.Host = net.JoinHostPort(parsed.Hostname(), port)
|
||||||
|
persistHost = parsed.Scheme + "://" + parsed.Host
|
||||||
|
}
|
||||||
|
|
||||||
|
instanceCfg.Host = persistHost
|
||||||
m.pveClients[instanceName] = fallbackClient
|
m.pveClients[instanceName] = fallbackClient
|
||||||
|
|
||||||
|
// Update in-memory config so subsequent polls build clients against the working port.
|
||||||
|
for i := range m.config.PVEInstances {
|
||||||
|
if m.config.PVEInstances[i].Name == instanceName {
|
||||||
|
m.config.PVEInstances[i].Host = persistHost
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Persist to disk so restarts keep the working endpoint.
|
||||||
|
if m.persistence != nil {
|
||||||
|
if err := m.persistence.SaveNodesConfig(m.config.PVEInstances, m.config.PBSInstances, m.config.PMGInstances); err != nil {
|
||||||
|
log.Warn().Err(err).Str("instance", instanceName).Msg("Failed to persist fallback PVE host")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
log.Warn().
|
log.Warn().
|
||||||
Str("instance", instanceName).
|
Str("instance", instanceName).
|
||||||
Str("primary", primaryHost).
|
Str("primary", primaryHost).
|
||||||
Str("fallback", fallbackHost).
|
Str("fallback", persistHost).
|
||||||
Msg("Primary PVE host failed; using fallback without default port")
|
Msg("Primary PVE host failed; using fallback without default port")
|
||||||
|
|
||||||
return fallbackNodes, fallbackClient, nil
|
return fallbackNodes, fallbackClient, nil
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue