From 43864466a2c013f3d4ffe583a3b6d8a277dde6e9 Mon Sep 17 00:00:00 2001 From: Angus Lees <gus@inodes.org> Date: Wed, 6 Sep 2017 21:31:09 +1000 Subject: [PATCH] Allow explicit --namespace to override value in kubeconfig context If the current kubeconfig context is declared with an explicit (non-empty) namespace, then `mergedKubeConfig.Namespace()` returns that *config file* namespace value, ignoring an explicit `--namespace` command line flag. See https://github.com/kubernetes/client-go/issues/288 for upstream client-go bug/discussion. This change works around the issue by just checking the Namespace override ourselves before falling through to the regular function. Further fixes #103 --- cmd/delete.go | 2 +- cmd/diff.go | 2 +- cmd/root.go | 12 +++++++++++- cmd/update.go | 2 +- 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/cmd/delete.go b/cmd/delete.go index 88e92b26..f7df57ef 100644 --- a/cmd/delete.go +++ b/cmd/delete.go @@ -50,7 +50,7 @@ var deleteCmd = &cobra.Command{ return err } - c.DefaultNamespace, _, err = clientConfig.Namespace() + c.DefaultNamespace, err = defaultNamespace(clientConfig) if err != nil { return err } diff --git a/cmd/diff.go b/cmd/diff.go index dd5bff41..22664a22 100644 --- a/cmd/diff.go +++ b/cmd/diff.go @@ -48,7 +48,7 @@ var diffCmd = &cobra.Command{ return err } - c.DefaultNamespace, _, err = clientConfig.Namespace() + c.DefaultNamespace, err = defaultNamespace(clientConfig) if err != nil { return err } diff --git a/cmd/root.go b/cmd/root.go index a812cae1..1b836b76 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -60,6 +60,7 @@ const ( ) var clientConfig clientcmd.ClientConfig +var overrides clientcmd.ConfigOverrides func init() { RootCmd.PersistentFlags().CountP(flagVerbose, "v", "Increase verbosity. May be given multiple times.") @@ -74,7 +75,6 @@ func init() { // The "usual" clientcmd/kubectl flags loadingRules := clientcmd.NewDefaultClientConfigLoadingRules() loadingRules.DefaultClientConfig = &clientcmd.DefaultClientConfig - overrides := clientcmd.ConfigOverrides{} kflags := clientcmd.RecommendedConfigOverrideFlags("") RootCmd.PersistentFlags().StringVar(&loadingRules.ExplicitPath, "kubeconfig", "", "Path to a kube config. Only required if out-of-cluster") clientcmd.BindOverrideFlags(&overrides, RootCmd.PersistentFlags(), kflags) @@ -108,6 +108,16 @@ var RootCmd = &cobra.Command{ }, } +// clientConfig.Namespace() is broken in client-go 3.0: +// namespace in config erroneously overrides explicit --namespace +func defaultNamespace(c clientcmd.ClientConfig) (string, error) { + if overrides.Context.Namespace != "" { + return overrides.Context.Namespace, nil + } + ns, _, err := c.Namespace() + return ns, err +} + func logLevel(verbosity int) log.Level { switch verbosity { case 0: diff --git a/cmd/update.go b/cmd/update.go index 987df5ae..41b104bd 100644 --- a/cmd/update.go +++ b/cmd/update.go @@ -91,7 +91,7 @@ local configuration. Accepts JSON, YAML, or Jsonnet.`, return err } - c.DefaultNamespace, _, err = clientConfig.Namespace() + c.DefaultNamespace, err = defaultNamespace(clientConfig) if err != nil { return err } -- GitLab