diff --git a/backend/cmd/headlamp_test.go b/backend/cmd/headlamp_test.go index 792732fd23f..863688f0d8e 100644 --- a/backend/cmd/headlamp_test.go +++ b/backend/cmd/headlamp_test.go @@ -23,6 +23,7 @@ import ( "github.com/headlamp-k8s/headlamp/backend/pkg/kubeconfig" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "k8s.io/client-go/tools/clientcmd" "k8s.io/client-go/tools/clientcmd/api" ) @@ -604,6 +605,8 @@ func TestHandleClusterAPI_XForwardedHost(t *testing.T) { assert.Equal(t, "OK", rr.Body.String()) } +// test for keeping the original name of a cluster + func TestRenameCluster(t *testing.T) { kubeConfigByte, err := os.ReadFile("./headlamp_testdata/kubeconfig") require.NoError(t, err) @@ -1025,3 +1028,58 @@ func TestHandleClusterHelm(t *testing.T) { }) } } + +// test for handleHeadlampInfo, currently checks for headlamp_info field and headlamp_info.originalName field. +func (c *HeadlampConfig) TestHandleHeadlampInfo(t *testing.T) { + // create a temp directory for our test kubeconfig + tmpDir := t.TempDir() + mockConfigFile := filepath.Join(tmpDir, "config") + + // copy "kubeconfig_headlampinfo" test data to the temp directory + testDataPath := filepath.Join("headlamp_testdata", "kubeconfig_headlampinfo") + testData, err := os.ReadFile(testDataPath) + require.NoError(t, err, "failed to read test data for 'kubeconfig_headlampinfo'") + + err = os.WriteFile(mockConfigFile, testData, 0o600) + require.NoError(t, err, "failed to write test kubeconfig") + + // load the kubeconfig file + config, err := clientcmd.LoadFromFile(mockConfigFile) + require.NoError(t, err, "failed to load kubeconfig") + + // create a slice to hold the kubeconfig.Context objects + kubeContexts := make([]*kubeconfig.Context, 0, len(config.Contexts)) + + // loop through each context and push the kubeContext object into the slice + for contextName, context := range config.Contexts { + kubeContext := &kubeconfig.Context{ + Name: contextName, + KubeContext: context, + Cluster: config.Clusters[context.Cluster], + AuthInfo: config.AuthInfos[context.AuthInfo], + } + kubeContexts = append(kubeContexts, kubeContext) + } + + // use the kubeContexts slice for further processing + for _, ctx := range kubeContexts { + // Call handleHeadlampInfo + err = c.handleHeadlampInfo(ctx) + require.NoError(t, err, "failed to handle headlamp_info") + } + + // check that the headlamp_info field was correctly handled for each context + for _, ctx := range kubeContexts { + // Check if the headlamp_info field was correctly handled + assert.NotNil(t, ctx.Extensions["headlamp_info"], "headlamp_info field should be present") + } + + // check that the headlamp_info.originalName field was correctly handled for each context + for _, ctx := range kubeContexts { + if headlampInfo, ok := ctx.Extensions["headlamp_info"].(map[string]interface{}); ok { + assert.NotNil(t, headlampInfo["originalName"], "headlamp_info.originalName field should be present") + } else { + t.Errorf("headlamp_info field is not of expected type") + } + } +} diff --git a/backend/cmd/headlamp_testdata/kubeconfig_headlampinfo.yaml b/backend/cmd/headlamp_testdata/kubeconfig_headlampinfo.yaml new file mode 100644 index 00000000000..d73e15e4242 --- /dev/null +++ b/backend/cmd/headlamp_testdata/kubeconfig_headlampinfo.yaml @@ -0,0 +1,114 @@ +apiVersion: v1 +clusters: + - cluster: + certificate-authority-data: PLACEHOLDER_CERTIFICATE_AUTHORITY_DATA_X + extensions: + - extension: + last-update: Mon, 26 Dec 2022 20:33:03 IST + provider: testkubex.sigs.k8s.io + version: v1.28.0 + name: cluster_info + server: PLACEHOLDER_SERVER_URL_X + name: testkubex + - cluster: + certificate-authority-data: PLACEHOLDER_CERTIFICATE_AUTHORITY_DATA_Y + extensions: + - extension: + last-update: Tue, 27 Dec 2022 20:33:03 IST + provider: testkubey.sigs.k8s.io + version: v1.28.0 + name: cluster_info + server: PLACEHOLDER_SERVER_URL_Y + name: testkubey + - cluster: + certificate-authority-data: PLACEHOLDER_CERTIFICATE_AUTHORITY_DATA_Z + extensions: + - extension: + last-update: Wed, 28 Dec 2022 20:33:03 IST + provider: testkubez.sigs.k8s.io + version: v1.28.0 + name: cluster_info + server: PLACEHOLDER_SERVER_URL_Z + name: testkubez +contexts: + - context: + cluster: testkubex + extensions: + - extension: + last-update: Mon, 26 Dec 2022 20:33:03 IST + provider: testkubex.sigs.k8s.io + version: v1.28.0 + name: context_info + - extension: + creationTimestamp: null + customName: testkubexworks + name: headlamp_info + namespace: default + user: testkubex + name: testkubex + - context: + cluster: testkubey + extensions: + - extension: + last-update: Tue, 27 Dec 2022 20:33:03 IST + provider: testkubey.sigs.k8s.io + version: v1.28.0 + name: context_info + - extension: + creationTimestamp: null + customName: testkubeyworks + name: headlamp_info + namespace: default + user: testkubey + name: testkubey + - context: + cluster: testkubez + extensions: + - extension: + last-update: Wed, 28 Dec 2022 20:33:03 IST + provider: testkubez.sigs.k8s.io + version: v1.28.0 + name: context_info + namespace: default + user: testkubez + name: testkubez +current-context: testkubex +kind: Config +preferences: {} +users: + - name: testkubex + user: + client-certificate-data: PLACEHOLDER_CLIENT_CERTIFICATE_DATA_X + client-key-data: PLACEHOLDER_CLIENT_KEY_DATA_X + auth-provider: + config: + client-id: PLACEHOLDER_CLIENT_ID_X + client-secret: PLACEHOLDER_CLIENT_SECRET_X + idp-issuer-url: PLACEHOLDER_IDP_ISSUER_URL_X + refresh-token: PLACEHOLDER_REFRESH_TOKEN_X + id-token: PLACEHOLDER_ID_TOKEN_X + expiry: PLACEHOLDER_EXPIRY_X + - name: testkubey + user: + client-certificate-data: PLACEHOLDER_CLIENT_CERTIFICATE_DATA_Y + client-key-data: PLACEHOLDER_CLIENT_KEY_DATA_Y + auth-provider: + config: + client-id: PLACEHOLDER_CLIENT_ID_Y + client-secret: PLACEHOLDER_CLIENT_SECRET_Y + idp-issuer-url: PLACEHOLDER_IDP_ISSUER_URL_Y + refresh-token: PLACEHOLDER_REFRESH_TOKEN_Y + id-token: PLACEHOLDER_ID_TOKEN_Y + expiry: PLACEHOLDER_EXPIRY_Y + - name: testkubez + user: + client-certificate-data: PLACEHOLDER_CLIENT_CERTIFICATE_DATA_Z + client-key-data: PLACEHOLDER_CLIENT_KEY_DATA_Z + auth-provider: + config: + client-id: PLACEHOLDER_CLIENT_ID_Z + client-secret: PLACEHOLDER_CLIENT_SECRET_Z + idp-issuer-url: PLACEHOLDER_IDP_ISSUER_URL_Z + refresh-token: PLACEHOLDER_REFRESH_TOKEN_Z + id-token: PLACEHOLDER_ID_TOKEN_Z + expiry: PLACEHOLDER_EXPIRY_Z diff --git a/backend/pkg/kubeconfig/kubeconfig.go b/backend/pkg/kubeconfig/kubeconfig.go index de645e3c9e5..3e068309387 100644 --- a/backend/pkg/kubeconfig/kubeconfig.go +++ b/backend/pkg/kubeconfig/kubeconfig.go @@ -45,6 +45,7 @@ type Context struct { proxy *httputil.ReverseProxy `json:"-"` Internal bool `json:"internal"` Error string `json:"error"` + Extensions map[string]interface{} `json:"extensions"` } type OidcConfig struct {