diff --git a/tools/clientcmd/client_config_test.go b/tools/clientcmd/client_config_test.go index 7ed3a1d7..ea3c77b5 100644 --- a/tools/clientcmd/client_config_test.go +++ b/tools/clientcmd/client_config_test.go @@ -288,7 +288,7 @@ func TestModifyContext(t *testing.T) { // there should now be two contexts if len(startingConfig.Contexts) != len(expectedCtx) { - t.Fatalf("unexpected nuber of contexts, expecting %v, but found %v", len(expectedCtx), len(startingConfig.Contexts)) + t.Fatalf("unexpected number of contexts, expecting %v, but found %v", len(expectedCtx), len(startingConfig.Contexts)) } for key := range startingConfig.Contexts { diff --git a/tools/clientcmd/config.go b/tools/clientcmd/config.go index 5f1660bf..a7eae66b 100644 --- a/tools/clientcmd/config.go +++ b/tools/clientcmd/config.go @@ -83,10 +83,13 @@ func (o *PathOptions) GetEnvVarFiles() []string { } func (o *PathOptions) GetLoadingPrecedence() []string { + if o.IsExplicitFile() { + return []string{o.GetExplicitFile()} + } + if envVarFiles := o.GetEnvVarFiles(); len(envVarFiles) > 0 { return envVarFiles } - return []string{o.GlobalFile} } diff --git a/tools/clientcmd/loader.go b/tools/clientcmd/loader.go index b0672291..901ed50c 100644 --- a/tools/clientcmd/loader.go +++ b/tools/clientcmd/loader.go @@ -304,6 +304,10 @@ func (rules *ClientConfigLoadingRules) Migrate() error { // GetLoadingPrecedence implements ConfigAccess func (rules *ClientConfigLoadingRules) GetLoadingPrecedence() []string { + if len(rules.ExplicitPath) > 0 { + return []string{rules.ExplicitPath} + } + return rules.Precedence } diff --git a/tools/clientcmd/loader_test.go b/tools/clientcmd/loader_test.go index e5f09c20..1e770e67 100644 --- a/tools/clientcmd/loader_test.go +++ b/tools/clientcmd/loader_test.go @@ -865,3 +865,46 @@ func TestDeduplicate(t *testing.T) { } } } + +func TestLoadingGetLoadingPrecedence(t *testing.T) { + testCases := map[string]struct { + rules *ClientConfigLoadingRules + env string + precedence []string + }{ + "default": { + precedence: []string{filepath.Join(os.Getenv("HOME"), ".kube/config")}, + }, + "explicit": { + rules: &ClientConfigLoadingRules{ + ExplicitPath: "/explicit/kubeconfig", + }, + precedence: []string{"/explicit/kubeconfig"}, + }, + "envvar-single": { + env: "/env/kubeconfig", + precedence: []string{"/env/kubeconfig"}, + }, + "envvar-multiple": { + env: "/env/kubeconfig:/other/kubeconfig", + precedence: []string{"/env/kubeconfig", "/other/kubeconfig"}, + }, + } + + kubeconfig := os.Getenv("KUBECONFIG") + defer os.Setenv("KUBECONFIG", kubeconfig) + + for name, test := range testCases { + t.Run(name, func(t *testing.T) { + os.Setenv("KUBECONFIG", test.env) + rules := test.rules + if rules == nil { + rules = NewDefaultClientConfigLoadingRules() + } + actual := rules.GetLoadingPrecedence() + if !reflect.DeepEqual(actual, test.precedence) { + t.Errorf("expect %v, got %v", test.precedence, actual) + } + }) + } +}