Merge pull request #72529 from liggitt/use-overridden-context-namespace

Use overridden context when determining if default namespace came from config
This commit is contained in:
Kubernetes Prow Robot 2019-01-08 00:52:02 -08:00 committed by GitHub
commit 10bb353a95
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 48 additions and 17 deletions

View File

@ -150,7 +150,12 @@ func (config *DeferredLoadingClientConfig) Namespace() (string, bool, error) {
// if we got a default namespace, determine whether it was explicit or implicit // if we got a default namespace, determine whether it was explicit or implicit
if raw, err := mergedKubeConfig.RawConfig(); err == nil { if raw, err := mergedKubeConfig.RawConfig(); err == nil {
if context := raw.Contexts[raw.CurrentContext]; context != nil && len(context.Namespace) > 0 { // determine the current context
currentContext := raw.CurrentContext
if config.overrides != nil && len(config.overrides.CurrentContext) > 0 {
currentContext = config.overrides.CurrentContext
}
if context := raw.Contexts[currentContext]; context != nil && len(context.Namespace) > 0 {
return ns, false, nil return ns, false, nil
} }
} }

View File

@ -38,6 +38,7 @@ func (l *testLoader) Load() (*clientcmdapi.Config, error) {
} }
type testClientConfig struct { type testClientConfig struct {
rawconfig *clientcmdapi.Config
config *restclient.Config config *restclient.Config
namespace string namespace string
namespaceSpecified bool namespaceSpecified bool
@ -45,7 +46,10 @@ type testClientConfig struct {
} }
func (c *testClientConfig) RawConfig() (clientcmdapi.Config, error) { func (c *testClientConfig) RawConfig() (clientcmdapi.Config, error) {
return clientcmdapi.Config{}, fmt.Errorf("unexpected call") if c.rawconfig == nil {
return clientcmdapi.Config{}, fmt.Errorf("unexpected call")
}
return *c.rawconfig, nil
} }
func (c *testClientConfig) ClientConfig() (*restclient.Config, error) { func (c *testClientConfig) ClientConfig() (*restclient.Config, error) {
return c.config, c.err return c.config, c.err
@ -224,10 +228,11 @@ func TestInClusterConfigNamespace(t *testing.T) {
testCases := map[string]struct { testCases := map[string]struct {
clientConfig *testClientConfig clientConfig *testClientConfig
icc *testICC icc *testICC
overrides *ConfigOverrides
checkedICC bool checkedICC bool
result string result string
ok bool overridden bool
err error err error
}{ }{
"in-cluster checked on empty error": { "in-cluster checked on empty error": {
@ -256,8 +261,8 @@ func TestInClusterConfigNamespace(t *testing.T) {
clientConfig: &testClientConfig{namespace: "test", namespaceSpecified: true}, clientConfig: &testClientConfig{namespace: "test", namespaceSpecified: true},
icc: &testICC{}, icc: &testICC{},
result: "test", result: "test",
ok: true, overridden: true,
}, },
"in-cluster checked when namespace is not specified, but is defaulted": { "in-cluster checked when namespace is not specified, but is defaulted": {
@ -266,7 +271,7 @@ func TestInClusterConfigNamespace(t *testing.T) {
checkedICC: true, checkedICC: true,
result: "test", result: "test",
ok: false, overridden: false,
}, },
"in-cluster error returned when config is empty": { "in-cluster error returned when config is empty": {
@ -294,7 +299,7 @@ func TestInClusterConfigNamespace(t *testing.T) {
checkedICC: true, checkedICC: true,
result: "test", result: "test",
ok: true, overridden: true,
}, },
"in-cluster config returned when config is empty and namespace is defaulted but not explicitly set": { "in-cluster config returned when config is empty and namespace is defaulted but not explicitly set": {
@ -309,20 +314,41 @@ func TestInClusterConfigNamespace(t *testing.T) {
checkedICC: true, checkedICC: true,
result: "test", result: "test",
ok: false, overridden: false,
},
"overridden context used to verify explicit namespace in config": {
clientConfig: &testClientConfig{
namespace: "default",
namespaceSpecified: false, // a namespace that comes from a context is not considered overridden
rawconfig: &clientcmdapi.Config{Contexts: map[string]*clientcmdapi.Context{"overridden-context": {Namespace: "default"}}},
},
overrides: &ConfigOverrides{CurrentContext: "overridden-context"},
icc: &testICC{
possible: true,
testClientConfig: testClientConfig{
namespace: "icc",
namespaceSpecified: false, // a namespace that comes from icc is not considered overridden
},
},
checkedICC: true,
result: "default",
overridden: false, // a namespace that comes from a context is not considered overridden
}, },
} }
for name, test := range testCases { for name, test := range testCases {
c := &DeferredLoadingClientConfig{icc: test.icc} t.Run(name, func(t *testing.T) {
c.clientConfig = test.clientConfig c := &DeferredLoadingClientConfig{icc: test.icc, overrides: test.overrides}
c.clientConfig = test.clientConfig
ns, ok, err := c.Namespace() ns, overridden, err := c.Namespace()
if test.icc.called != test.checkedICC { if test.icc.called != test.checkedICC {
t.Errorf("%s: unexpected in-cluster-config call %t", name, test.icc.called) t.Errorf("%s: unexpected in-cluster-config call %t", name, test.icc.called)
} }
if err != test.err || ns != test.result || ok != test.ok { if err != test.err || ns != test.result || overridden != test.overridden {
t.Errorf("%s: unexpected result: %v %s %t", name, err, ns, ok) t.Errorf("%s: unexpected result: %v %s %t", name, err, ns, overridden)
} }
})
} }
} }