Related to #692: Skip unsupported guest OS info calls
This commit is contained in:
parent
b829d86d2c
commit
923293fbf7
2 changed files with 119 additions and 48 deletions
|
|
@ -1,6 +1,7 @@
|
|||
package monitoring
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"math"
|
||||
"testing"
|
||||
|
|
@ -278,3 +279,41 @@ func TestConvertPoolInfoToModelNil(t *testing.T) {
|
|||
t.Fatalf("expected nil result for nil input")
|
||||
}
|
||||
}
|
||||
|
||||
func TestIsGuestAgentOSInfoUnsupportedError(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
cases := []struct {
|
||||
name string
|
||||
err error
|
||||
want bool
|
||||
}{
|
||||
{name: "nil error", err: nil, want: false},
|
||||
{name: "unrelated error", err: errors.New("guest agent timeout"), want: false},
|
||||
{
|
||||
name: "missing os-release path",
|
||||
err: errors.New(`API error 500: {"errors":{"message":"guest agent command failed: Failed to open file '/etc/os-release': No such file or directory"}}`),
|
||||
want: true,
|
||||
},
|
||||
{
|
||||
name: "missing usr lib os-release",
|
||||
err: errors.New("API error 500: guest agent command failed: Failed to open file '/usr/lib/os-release': No such file or directory"),
|
||||
want: true,
|
||||
},
|
||||
{
|
||||
name: "unsupported command",
|
||||
err: errors.New("API error 500: unsupported command: guest-get-osinfo"),
|
||||
want: true,
|
||||
},
|
||||
}
|
||||
|
||||
for _, tc := range cases {
|
||||
tc := tc
|
||||
t.Run(tc.name, func(t *testing.T) {
|
||||
t.Parallel()
|
||||
if got := isGuestAgentOSInfoUnsupportedError(tc.err); got != tc.want {
|
||||
t.Fatalf("isGuestAgentOSInfoUnsupportedError(%v) = %v, want %v", tc.err, got, tc.want)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2485,6 +2485,16 @@ func (m *Monitor) fetchGuestAgentMetadata(ctx context.Context, client PVEClientI
|
|||
return client.GetVMAgentInfo(ctx, nodeName, vmid)
|
||||
})
|
||||
if err != nil {
|
||||
if isGuestAgentOSInfoUnsupportedError(err) {
|
||||
osInfoSkip = true
|
||||
osInfoFailureCount = guestAgentOSInfoFailureThreshold
|
||||
log.Warn().
|
||||
Str("instance", instanceName).
|
||||
Str("vm", vmName).
|
||||
Int("vmid", vmid).
|
||||
Err(err).
|
||||
Msg("Guest agent OS info unsupported (missing os-release). Skipping future calls to avoid qemu-ga issues (refs #692)")
|
||||
} else {
|
||||
osInfoFailureCount++
|
||||
if osInfoFailureCount >= guestAgentOSInfoFailureThreshold {
|
||||
osInfoSkip = true
|
||||
|
|
@ -2503,6 +2513,7 @@ func (m *Monitor) fetchGuestAgentMetadata(ctx context.Context, client PVEClientI
|
|||
Err(err).
|
||||
Msg("Guest agent OS info unavailable")
|
||||
}
|
||||
}
|
||||
} else if agentInfo, ok := agentInfoRaw.(map[string]interface{}); ok && len(agentInfo) > 0 {
|
||||
osName, osVersion = extractGuestOSInfo(agentInfo)
|
||||
osInfoFailureCount = 0 // Reset on success
|
||||
|
|
@ -2720,6 +2731,27 @@ func extractGuestOSInfo(data map[string]interface{}) (string, string) {
|
|||
return osName, osVersion
|
||||
}
|
||||
|
||||
func isGuestAgentOSInfoUnsupportedError(err error) bool {
|
||||
if err == nil {
|
||||
return false
|
||||
}
|
||||
|
||||
msg := strings.ToLower(err.Error())
|
||||
|
||||
// OpenBSD qemu-ga emits "Failed to open file '/etc/os-release'" (refs #692)
|
||||
if strings.Contains(msg, "os-release") &&
|
||||
(strings.Contains(msg, "failed to open file") || strings.Contains(msg, "no such file or directory")) {
|
||||
return true
|
||||
}
|
||||
|
||||
// Some Proxmox builds bubble up "unsupported command: guest-get-osinfo"
|
||||
if strings.Contains(msg, "guest-get-osinfo") && strings.Contains(msg, "unsupported") {
|
||||
return true
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
func stringValue(val interface{}) string {
|
||||
switch v := val.(type) {
|
||||
case string:
|
||||
|
|
|
|||
Loading…
Reference in a new issue