diff --git a/cmd/unbounded-net-controller/cluster_status.go b/cmd/unbounded-net-controller/cluster_status.go index d33dcce34..f5b22b1d9 100644 --- a/cmd/unbounded-net-controller/cluster_status.go +++ b/cmd/unbounded-net-controller/cluster_status.go @@ -18,6 +18,7 @@ import ( "k8s.io/klog/v2" "github.com/Azure/unbounded/internal/net/controller" + statuspkg "github.com/Azure/unbounded/internal/net/status" statusv1alpha1 "github.com/Azure/unbounded/internal/net/status/v1alpha1" "github.com/Azure/unbounded/internal/version" ) @@ -821,12 +822,8 @@ func collectClusterProblems(status *ClusterStatusResponse) []StatusProblem { } if overview := status.NodeOverviews[node.NodeInfo.Name]; overview != nil { - if overview.RouteMismatch { - appendProblem("node", nodeName, "Route next-hop mismatches (expected vs present)") - } - - if unhealthy := overview.PeerCount - overview.HealthyPeers; unhealthy > 0 { - appendProblem("node", nodeName, fmt.Sprintf("%d peers are not healthy", unhealthy)) + for _, message := range statuspkg.OverviewDiagnosticMessages(*overview, node.NodeInfo.ProviderID) { + appendProblem("node", nodeName, message) } continue diff --git a/cmd/unbounded-net-controller/node_overview_test.go b/cmd/unbounded-net-controller/node_overview_test.go index 6c7176d91..b4edb51a0 100644 --- a/cmd/unbounded-net-controller/node_overview_test.go +++ b/cmd/unbounded-net-controller/node_overview_test.go @@ -110,6 +110,7 @@ func TestClusterOverviewPreservesCountsAndEnrichment(t *testing.T) { overview := statusv1alpha1.NodeStatusOverview{ NodeInfo: NodeInfo{Name: "node", SiteName: "site", WireGuard: &WireGuardStatusInfo{Interface: "wg0"}}, StatusSource: "ws", PeerCount: 20, HealthyPeers: 17, RouteCount: 30, RouteMismatch: true, + RouteMismatchCount: 2, UnhealthyPeerLinks: 3, } c.PatchOverview("node", overview) snapshot := c.Get() diff --git a/cmd/unbounded-net-controller/overview_diagnostics_test.go b/cmd/unbounded-net-controller/overview_diagnostics_test.go index 7cebaa0fe..fc055c31d 100644 --- a/cmd/unbounded-net-controller/overview_diagnostics_test.go +++ b/cmd/unbounded-net-controller/overview_diagnostics_test.go @@ -50,6 +50,35 @@ func TestOverviewDiagnosticMessagesMatchFullProblems(t *testing.T) { t.Fatalf("IPIP warning applied outside Azure: %v", otherCloud) } + metadata := statuspkg.OverviewMetadata(overview) + metadata.NodeInfo.ProviderID = node.NodeInfo.ProviderID + cluster := &ClusterStatusResponse{ + Nodes: []*NodeStatusResponse{&metadata}, + NodeOverviews: map[string]*statusv1alpha1.NodeStatusOverview{"node": &overview}, + } + + problems := collectClusterProblems(cluster) + if len(problems) != 1 || !slices.Equal(problems[0].Errors, fullProblems[0].Errors) { + t.Fatalf("overview problem pipeline=%+v, legacy=%+v", problems, fullProblems) + } + + metadata.NodeInfo.ProviderID = "other://vm" + + if problems = collectClusterProblems(cluster); len(problems) != 1 || len(problems[0].Errors) != 2 { + t.Fatalf("controller ignored enriched cloud identity: %+v", problems) + } + + overview.RouteMismatch = false + overview.RouteMismatchCount = 0 + overview.UnhealthyPeerLinks = 0 + + if problems = collectClusterProblems(cluster); len(problems) != 0 { + t.Fatalf("overview peer counts incorrectly replaced diagnostic link health: %+v", problems) + } + + overview.RouteMismatchCount = 3 + overview.UnhealthyPeerLinks = 2 + overview.UsesIPIP = false if noIPIP := statuspkg.OverviewDiagnosticMessages(overview, node.NodeInfo.ProviderID); len(noIPIP) != 2 { t.Fatalf("Azure warning applied without IPIP: %v", noIPIP)