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