From 6a878e182188d5e2f89a1fcf567fa1be035e6533 Mon Sep 17 00:00:00 2001 From: redpinecube Date: Mon, 4 Aug 2025 13:17:18 -0500 Subject: [PATCH 1/7] implement : CountKubeflexControlPlaneContexts Signed-off-by: redpinecube --- pkg/kubeconfig/extensions.go | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/pkg/kubeconfig/extensions.go b/pkg/kubeconfig/extensions.go index 5e89ea01..69486fd7 100644 --- a/pkg/kubeconfig/extensions.go +++ b/pkg/kubeconfig/extensions.go @@ -334,3 +334,30 @@ func CheckContextScopeKubeflexExtensionSet(kconf clientcmdapi.Config, ctxName st return DiagnosisStatusOK } + +func CountKubeflexControlPlaneContexts(kconf clientcmdapi.Config) int { + count := 0 + + for _, ctx := range kconf.Contexts { + ext := ctx.Extensions + if ext == nil { + continue + } + + runtimeObj, ok := ext[ExtensionKubeflexKey] + if !ok { + continue + } + + var extData RuntimeKubeflexExtension + if err := ConvertRuntimeObjectToRuntimeExtension(runtimeObj, &extData); err != nil { + continue + } + + if cpName, ok := extData.Data[ExtensionControlPlaneName]; ok && cpName != "" { + count++ + } + } + + return count +} From 6e89bce9e5477ba0c5e787908c2edc7db410ca7c Mon Sep 17 00:00:00 2001 From: redpinecube Date: Mon, 4 Aug 2025 13:52:48 -0500 Subject: [PATCH 2/7] test : CountKubeflexControlPlaneContexts - 0 control planes Signed-off-by: redpinecube --- pkg/kubeconfig/extensions_test.go | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/pkg/kubeconfig/extensions_test.go b/pkg/kubeconfig/extensions_test.go index 8a45cc84..97b1c913 100644 --- a/pkg/kubeconfig/extensions_test.go +++ b/pkg/kubeconfig/extensions_test.go @@ -265,3 +265,24 @@ func TestCheckContextScopeKubeflexExtensionSetPartialData(t *testing.T) { t.Errorf("Expected %s, got %s", DiagnosisStatusWarning, result) } } + +func TestCountKubeflexControlPlaneContextsZero(t *testing.T) { + kconf := api.NewConfig() + kconf.Clusters["cluster1"] = &api.Cluster{Server: "https://example.com:6443"} + kconf.AuthInfos["user1"] = &api.AuthInfo{Token: "token"} + + ext := NewRuntimeKubeflexExtension() + ext.Data[ExtensionContextsIsHostingCluster] = "true" + + kconf.Contexts["ctx1"] = &api.Context{ + Cluster: "cluster1", + AuthInfo: "user1", + Extensions: map[string]runtime.Object{ExtensionKubeflexKey: ext}, + } + + expected := 0 + got := CountKubeflexControlPlaneContexts(*kconf) + if got != expected { + t.Errorf("Expected %d control plane context(s), got %d", expected, got) + } +} From 855eb81e0e85ad11279c6c68106d4ee34f0f64fb Mon Sep 17 00:00:00 2001 From: redpinecube Date: Mon, 4 Aug 2025 14:00:32 -0500 Subject: [PATCH 3/7] test : CountKubeflexControlPlaneContexts with one control plane Signed-off-by: redpinecube --- pkg/kubeconfig/extensions_test.go | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/pkg/kubeconfig/extensions_test.go b/pkg/kubeconfig/extensions_test.go index 97b1c913..fed1cbd8 100644 --- a/pkg/kubeconfig/extensions_test.go +++ b/pkg/kubeconfig/extensions_test.go @@ -286,3 +286,33 @@ func TestCountKubeflexControlPlaneContextsZero(t *testing.T) { t.Errorf("Expected %d control plane context(s), got %d", expected, got) } } + +func TestCountKubeflexControlPlaneContextsOne(t *testing.T) { + kconf := api.NewConfig() + kconf.Clusters["cluster1"] = &api.Cluster{Server: "https://example.com:6443"} + kconf.Clusters["cluster2"] = &api.Cluster{Server: "https://example2.com:6443"} + kconf.AuthInfos["user1"] = &api.AuthInfo{Token: "token"} + + hostExt := NewRuntimeKubeflexExtension() + hostExt.Data[ExtensionContextsIsHostingCluster] = "true" + kconf.Contexts["ctx1"] = &api.Context{ + Cluster: "cluster1", + AuthInfo: "user1", + Extensions: map[string]runtime.Object{ExtensionKubeflexKey: hostExt}, + } + + // Control plane + cpExt := NewRuntimeKubeflexExtension() + cpExt.Data[ExtensionControlPlaneName] = "control-plane-1" + kconf.Contexts["ctx2"] = &api.Context{ + Cluster: "cluster2", + AuthInfo: "user1", + Extensions: map[string]runtime.Object{ExtensionKubeflexKey: cpExt}, + } + + expected := 1 + got := CountKubeflexControlPlaneContexts(*kconf) + if got != expected { + t.Errorf("Expected %d control plane context(s), got %d", expected, got) + } +} From d46dc0588f2eeb0d074ac5d5ecb63e62097ad677 Mon Sep 17 00:00:00 2001 From: redpinecube Date: Mon, 4 Aug 2025 14:05:45 -0500 Subject: [PATCH 4/7] test : CountKubeflexControlPlaneContexts with multiple control planes Signed-off-by: redpinecube --- pkg/kubeconfig/extensions_test.go | 50 +++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/pkg/kubeconfig/extensions_test.go b/pkg/kubeconfig/extensions_test.go index fed1cbd8..9a386b6e 100644 --- a/pkg/kubeconfig/extensions_test.go +++ b/pkg/kubeconfig/extensions_test.go @@ -316,3 +316,53 @@ func TestCountKubeflexControlPlaneContextsOne(t *testing.T) { t.Errorf("Expected %d control plane context(s), got %d", expected, got) } } + +func TestCountKubeflexControlPlaneContextsMultiple(t *testing.T) { + kconf := api.NewConfig() + kconf.Clusters["cluster1"] = &api.Cluster{Server: "https://example.com:6443"} + kconf.Clusters["cluster2"] = &api.Cluster{Server: "https://example2.com:6443"} + kconf.Clusters["cluster3"] = &api.Cluster{Server: "https://example3.com:6443"} + kconf.Clusters["cluster4"] = &api.Cluster{Server: "https://example4.com:6443"} + kconf.AuthInfos["user1"] = &api.AuthInfo{Token: "token"} + + hostExt := NewRuntimeKubeflexExtension() + hostExt.Data[ExtensionContextsIsHostingCluster] = "true" + kconf.Contexts["ctx1"] = &api.Context{ + Cluster: "cluster1", + AuthInfo: "user1", + Extensions: map[string]runtime.Object{ExtensionKubeflexKey: hostExt}, + } + + // Control plane 1 + cpExt1 := NewRuntimeKubeflexExtension() + cpExt1.Data[ExtensionControlPlaneName] = "cp-1" + kconf.Contexts["ctx2"] = &api.Context{ + Cluster: "cluster2", + AuthInfo: "user1", + Extensions: map[string]runtime.Object{ExtensionKubeflexKey: cpExt1}, + } + + // Control plane 2 + cpExt2 := NewRuntimeKubeflexExtension() + cpExt2.Data[ExtensionControlPlaneName] = "cp-2" + kconf.Contexts["ctx3"] = &api.Context{ + Cluster: "cluster3", + AuthInfo: "user1", + Extensions: map[string]runtime.Object{ExtensionKubeflexKey: cpExt2}, + } + + // Control plane 3 + cpExt3 := NewRuntimeKubeflexExtension() + cpExt3.Data[ExtensionControlPlaneName] = "cp-3" + kconf.Contexts["ctx4"] = &api.Context{ + Cluster: "cluster4", + AuthInfo: "user1", + Extensions: map[string]runtime.Object{ExtensionKubeflexKey: cpExt3}, + } + + expected := 3 + got := CountKubeflexControlPlaneContexts(*kconf) + if got != expected { + t.Errorf("Expected %d control plane context(s), got %d", expected, got) + } +} From b19e8b18d820a37165848a045f522c7c0b994810 Mon Sep 17 00:00:00 2001 From: redpinecube Date: Mon, 4 Aug 2025 14:21:28 -0500 Subject: [PATCH 5/7] implement : CheckExtensionInitialContextNameSet Signed-off-by: redpinecube --- pkg/kubeconfig/extensions.go | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/pkg/kubeconfig/extensions.go b/pkg/kubeconfig/extensions.go index 69486fd7..2131f8f9 100644 --- a/pkg/kubeconfig/extensions.go +++ b/pkg/kubeconfig/extensions.go @@ -361,3 +361,22 @@ func CountKubeflexControlPlaneContexts(kconf clientcmdapi.Config) int { return count } + +func CheckExtensionInitialContextNameSet(kconf clientcmdapi.Config) string { + runtimeObj, exists := kconf.Extensions[ExtensionKubeflexKey] + if !exists { + return DiagnosisStatusCritical + } + + runtimeExtension := &RuntimeKubeflexExtension{} + if err := ConvertRuntimeObjectToRuntimeExtension(runtimeObj, runtimeExtension); err != nil { + return DiagnosisStatusCritical + } + + val, ok := runtimeExtension.Data[ExtensionInitialContextName] + if !ok || val == "" { + return DiagnosisStatusWarning + } + + return DiagnosisStatusOK +} From 98c73b5103f527e058465bda4aee041d599f5818 Mon Sep 17 00:00:00 2001 From: redpinecube Date: Mon, 25 Aug 2025 14:49:21 -0500 Subject: [PATCH 6/7] fix tests Signed-off-by: redpinecube --- pkg/kubeconfig/extensions.go | 27 -------- pkg/kubeconfig/extensions_test.go | 103 ------------------------------ 2 files changed, 130 deletions(-) diff --git a/pkg/kubeconfig/extensions.go b/pkg/kubeconfig/extensions.go index 2131f8f9..b00b20c2 100644 --- a/pkg/kubeconfig/extensions.go +++ b/pkg/kubeconfig/extensions.go @@ -335,33 +335,6 @@ func CheckContextScopeKubeflexExtensionSet(kconf clientcmdapi.Config, ctxName st return DiagnosisStatusOK } -func CountKubeflexControlPlaneContexts(kconf clientcmdapi.Config) int { - count := 0 - - for _, ctx := range kconf.Contexts { - ext := ctx.Extensions - if ext == nil { - continue - } - - runtimeObj, ok := ext[ExtensionKubeflexKey] - if !ok { - continue - } - - var extData RuntimeKubeflexExtension - if err := ConvertRuntimeObjectToRuntimeExtension(runtimeObj, &extData); err != nil { - continue - } - - if cpName, ok := extData.Data[ExtensionControlPlaneName]; ok && cpName != "" { - count++ - } - } - - return count -} - func CheckExtensionInitialContextNameSet(kconf clientcmdapi.Config) string { runtimeObj, exists := kconf.Extensions[ExtensionKubeflexKey] if !exists { diff --git a/pkg/kubeconfig/extensions_test.go b/pkg/kubeconfig/extensions_test.go index 9a386b6e..ba899649 100644 --- a/pkg/kubeconfig/extensions_test.go +++ b/pkg/kubeconfig/extensions_test.go @@ -206,8 +206,6 @@ func TestCheckHostingClusterContextNameSingle(t *testing.T) { } } - - func TestCheckContextScopeKubeflexExtensionSetNoKubeflexExtensions(t *testing.T) { kconf := api.NewConfig() kconf.Clusters["cluster1"] = &api.Cluster{Server: "https://example.com:6443"} @@ -265,104 +263,3 @@ func TestCheckContextScopeKubeflexExtensionSetPartialData(t *testing.T) { t.Errorf("Expected %s, got %s", DiagnosisStatusWarning, result) } } - -func TestCountKubeflexControlPlaneContextsZero(t *testing.T) { - kconf := api.NewConfig() - kconf.Clusters["cluster1"] = &api.Cluster{Server: "https://example.com:6443"} - kconf.AuthInfos["user1"] = &api.AuthInfo{Token: "token"} - - ext := NewRuntimeKubeflexExtension() - ext.Data[ExtensionContextsIsHostingCluster] = "true" - - kconf.Contexts["ctx1"] = &api.Context{ - Cluster: "cluster1", - AuthInfo: "user1", - Extensions: map[string]runtime.Object{ExtensionKubeflexKey: ext}, - } - - expected := 0 - got := CountKubeflexControlPlaneContexts(*kconf) - if got != expected { - t.Errorf("Expected %d control plane context(s), got %d", expected, got) - } -} - -func TestCountKubeflexControlPlaneContextsOne(t *testing.T) { - kconf := api.NewConfig() - kconf.Clusters["cluster1"] = &api.Cluster{Server: "https://example.com:6443"} - kconf.Clusters["cluster2"] = &api.Cluster{Server: "https://example2.com:6443"} - kconf.AuthInfos["user1"] = &api.AuthInfo{Token: "token"} - - hostExt := NewRuntimeKubeflexExtension() - hostExt.Data[ExtensionContextsIsHostingCluster] = "true" - kconf.Contexts["ctx1"] = &api.Context{ - Cluster: "cluster1", - AuthInfo: "user1", - Extensions: map[string]runtime.Object{ExtensionKubeflexKey: hostExt}, - } - - // Control plane - cpExt := NewRuntimeKubeflexExtension() - cpExt.Data[ExtensionControlPlaneName] = "control-plane-1" - kconf.Contexts["ctx2"] = &api.Context{ - Cluster: "cluster2", - AuthInfo: "user1", - Extensions: map[string]runtime.Object{ExtensionKubeflexKey: cpExt}, - } - - expected := 1 - got := CountKubeflexControlPlaneContexts(*kconf) - if got != expected { - t.Errorf("Expected %d control plane context(s), got %d", expected, got) - } -} - -func TestCountKubeflexControlPlaneContextsMultiple(t *testing.T) { - kconf := api.NewConfig() - kconf.Clusters["cluster1"] = &api.Cluster{Server: "https://example.com:6443"} - kconf.Clusters["cluster2"] = &api.Cluster{Server: "https://example2.com:6443"} - kconf.Clusters["cluster3"] = &api.Cluster{Server: "https://example3.com:6443"} - kconf.Clusters["cluster4"] = &api.Cluster{Server: "https://example4.com:6443"} - kconf.AuthInfos["user1"] = &api.AuthInfo{Token: "token"} - - hostExt := NewRuntimeKubeflexExtension() - hostExt.Data[ExtensionContextsIsHostingCluster] = "true" - kconf.Contexts["ctx1"] = &api.Context{ - Cluster: "cluster1", - AuthInfo: "user1", - Extensions: map[string]runtime.Object{ExtensionKubeflexKey: hostExt}, - } - - // Control plane 1 - cpExt1 := NewRuntimeKubeflexExtension() - cpExt1.Data[ExtensionControlPlaneName] = "cp-1" - kconf.Contexts["ctx2"] = &api.Context{ - Cluster: "cluster2", - AuthInfo: "user1", - Extensions: map[string]runtime.Object{ExtensionKubeflexKey: cpExt1}, - } - - // Control plane 2 - cpExt2 := NewRuntimeKubeflexExtension() - cpExt2.Data[ExtensionControlPlaneName] = "cp-2" - kconf.Contexts["ctx3"] = &api.Context{ - Cluster: "cluster3", - AuthInfo: "user1", - Extensions: map[string]runtime.Object{ExtensionKubeflexKey: cpExt2}, - } - - // Control plane 3 - cpExt3 := NewRuntimeKubeflexExtension() - cpExt3.Data[ExtensionControlPlaneName] = "cp-3" - kconf.Contexts["ctx4"] = &api.Context{ - Cluster: "cluster4", - AuthInfo: "user1", - Extensions: map[string]runtime.Object{ExtensionKubeflexKey: cpExt3}, - } - - expected := 3 - got := CountKubeflexControlPlaneContexts(*kconf) - if got != expected { - t.Errorf("Expected %d control plane context(s), got %d", expected, got) - } -} From e52e66fa1a5b02ca2d7768bfc5830de88b0966f0 Mon Sep 17 00:00:00 2001 From: redpinecube Date: Mon, 25 Aug 2025 14:40:58 -0500 Subject: [PATCH 7/7] update diagnosis msg Signed-off-by: redpinecube --- pkg/kubeconfig/extensions.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/kubeconfig/extensions.go b/pkg/kubeconfig/extensions.go index b00b20c2..6d374b61 100644 --- a/pkg/kubeconfig/extensions.go +++ b/pkg/kubeconfig/extensions.go @@ -338,12 +338,12 @@ func CheckContextScopeKubeflexExtensionSet(kconf clientcmdapi.Config, ctxName st func CheckExtensionInitialContextNameSet(kconf clientcmdapi.Config) string { runtimeObj, exists := kconf.Extensions[ExtensionKubeflexKey] if !exists { - return DiagnosisStatusCritical + return DiagnosisStatusWarning } runtimeExtension := &RuntimeKubeflexExtension{} if err := ConvertRuntimeObjectToRuntimeExtension(runtimeObj, runtimeExtension); err != nil { - return DiagnosisStatusCritical + return DiagnosisStatusWarning } val, ok := runtimeExtension.Data[ExtensionInitialContextName]