diff --git a/cmd/kubens/list.go b/cmd/kubens/list.go index 1b27b72..c468199 100644 --- a/cmd/kubens/list.go +++ b/cmd/kubens/list.go @@ -54,15 +54,7 @@ func queryNamespaces(kc *kubeconfig.Kubeconfig) ([]string, error) { return []string{"ns1", "ns2"}, nil } - b, err := kc.Bytes() - if err != nil { - return nil, errors.Wrap(err, "failed to convert in-memory kubeconfig to yaml") - } - cfg, err := clientcmd.RESTConfigFromKubeConfig(b) - if err != nil { - return nil, errors.Wrap(err, "failed to initialize config") - } - clientset, err := kubernetes.NewForConfig(cfg) + clientset, err := newKubernetesClientSet(kc) if err != nil { return nil, errors.Wrap(err, "failed to initialize k8s REST client") } @@ -87,3 +79,15 @@ func queryNamespaces(kc *kubeconfig.Kubeconfig) ([]string, error) { } return out, nil } + +func newKubernetesClientSet(kc *kubeconfig.Kubeconfig) (*kubernetes.Clientset, error) { + b, err := kc.Bytes() + if err != nil { + return nil, errors.Wrap(err, "failed to convert in-memory kubeconfig to yaml") + } + cfg, err := clientcmd.RESTConfigFromKubeConfig(b) + if err != nil { + return nil, errors.Wrap(err, "failed to initialize config") + } + return kubernetes.NewForConfig(cfg) +} diff --git a/cmd/kubens/switch.go b/cmd/kubens/switch.go index 71bf729..216f6c2 100644 --- a/cmd/kubens/switch.go +++ b/cmd/kubens/switch.go @@ -2,8 +2,11 @@ package main import ( "io" + "os" "github.com/pkg/errors" + errors2 "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "github.com/ahmetb/kubectx/internal/cmdutil" "github.com/ahmetb/kubectx/internal/kubeconfig" @@ -75,14 +78,20 @@ func switchNamespace(kc *kubeconfig.Kubeconfig, ns string) (string, error) { } func namespaceExists(kc *kubeconfig.Kubeconfig, ns string) (bool, error) { - nses, err := queryNamespaces(kc) + // for tests + if os.Getenv("_MOCK_NAMESPACES") != "" { + return ns == "ns1" || ns == "ns2", nil + } + + clientset, err := newKubernetesClientSet(kc) if err != nil { - return false, err + return false, errors.Wrap(err, "failed to initialize k8s REST client") } - for _, v := range nses { - if v == ns { - return true, nil - } + + namespace, err := clientset.CoreV1().Namespaces().Get(ns, metav1.GetOptions{}) + if errors2.IsNotFound(err) { + return false, nil } - return false, nil + return namespace != nil, errors.Wrapf(err, "failed to query "+ + "namespace %q from k8s API", ns) }