diff --git a/go.mod b/go.mod index 0551a1fb..9e95ef21 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.16 replace ( github.com/docker/distribution => github.com/docker/distribution v0.0.0-20191216044856-a8371794149d github.com/docker/docker => github.com/moby/moby v17.12.0-ce-rc1.0.20200618181300-9dc6525e6118+incompatible - github.com/gdamore/tcell/v2 => github.com/derailed/tcell/v2 v2.2.1-rc.1 + github.com/gdamore/tcell/v2 => github.com/derailed/tcell/v2 v2.2.1-rc.6 ) require ( diff --git a/go.sum b/go.sum index ac396ffd..9a8a736d 100644 --- a/go.sum +++ b/go.sum @@ -191,8 +191,8 @@ github.com/denisenkom/go-mssqldb v0.0.0-20191001013358-cfbb681360f0/go.mod h1:xb github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0= github.com/derailed/popeye v0.9.0 h1:0zP4BAzo94RUjrUkzgF962v0zL9B3xyopd7kU7tMxuc= github.com/derailed/popeye v0.9.0/go.mod h1:g3hudQlbEEChCA7U44fA+utTM9xQpD4pINUMQaiq5Gs= -github.com/derailed/tcell/v2 v2.2.1-rc.1 h1:7VaxT1ydvWq5Ys/YASbPRO/02kzwdBOdzMLe2H1/Gds= -github.com/derailed/tcell/v2 v2.2.1-rc.1/go.mod h1:0qLNzFYW8f0XhbEkwYtmnT8HYs3o4kuMsdkLEUKfAX0= +github.com/derailed/tcell/v2 v2.2.1-rc.6 h1:4OYLuVMZKuw6j/1dTao2dPhoMAZVsb9uKG65yW749pM= +github.com/derailed/tcell/v2 v2.2.1-rc.6/go.mod h1:0qLNzFYW8f0XhbEkwYtmnT8HYs3o4kuMsdkLEUKfAX0= github.com/derailed/tview v0.6.1 h1:dB+9bO7r6a1Yg1HE+XNJj61hioauJnGBFq2biC5bjAk= github.com/derailed/tview v0.6.1/go.mod h1:5Wjopun0Jw3zxOFtafwc/GlrkFJix1hZz1oQetWpnwE= github.com/dgrijalva/jwt-go v0.0.0-20170104182250-a601269ab70c/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= diff --git a/internal/config/config.go b/internal/config/config.go index c8fce1e9..6b65fa58 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -76,7 +76,6 @@ func (c *Config) Refine(flags *genericclioptions.ConfigFlags, k9sFlags *Flags) e if err != nil { return err } - if isSet(flags.Context) { c.K9s.CurrentContext = *flags.Context } else { @@ -91,10 +90,11 @@ func (c *Config) Refine(flags *genericclioptions.ConfigFlags, k9sFlags *Flags) e return fmt.Errorf("The specified context %q does not exists in kubeconfig", c.K9s.CurrentContext) } c.K9s.CurrentCluster = context.Cluster + c.K9s.ActivateCluster() var ns string var override bool - if IsBoolSet(k9sFlags.AllNamespaces) { + if k9sFlags != nil && IsBoolSet(k9sFlags.AllNamespaces) { ns, override = client.NamespaceAll, true } else if isSet(flags.Namespace) { ns, override = *flags.Namespace, true @@ -129,11 +129,19 @@ func (c *Config) CurrentCluster() *Cluster { // ActiveNamespace returns the active namespace in the current cluster. func (c *Config) ActiveNamespace() string { - if cl := c.CurrentCluster(); cl != nil { - if cl.Namespace != nil { - return cl.Namespace.Active - } + if c.K9s.Clusters == nil { + log.Warn().Msgf("No context detected returning default namespace") + return "default" } + cl := c.CurrentCluster() + if cl == nil { + cl = NewCluster() + c.K9s.Clusters[c.K9s.CurrentCluster] = cl + } + if cl.Namespace != nil { + return cl.Namespace.Active + } + return "default" } @@ -197,7 +205,9 @@ func (c *Config) GetConnection() client.Connection { // SetConnection set an api server connection. func (c *Config) SetConnection(conn client.Connection) { c.client = conn - c.client.Config().OverrideNS = c.overrideNS + if c.client != nil && c.client.Config() != nil { + c.client.Config().OverrideNS = c.overrideNS + } } // Load K9s configuration from file diff --git a/internal/config/config_test.go b/internal/config/config_test.go index 7e1f9437..eb6ec179 100644 --- a/internal/config/config_test.go +++ b/internal/config/config_test.go @@ -18,20 +18,20 @@ func init() { } func TestConfigRefine(t *testing.T) { - cfgFile, ctx, cluster, ns := "testdata/kubeconfig-test.yml", "test", "c1", "ns1" + cfgFile, ctx, cluster, ns := "testdata/kubeconfig-test.yml", "test2", "cluster2", "ns2" uu := map[string]struct { flags *genericclioptions.ConfigFlags issue bool context, cluster, namespace string }{ - "kubeconfig": { + "plain": { flags: &genericclioptions.ConfigFlags{KubeConfig: &cfgFile}, issue: false, - context: "test", - cluster: "testCluster", - namespace: "testNS", + context: "test1", + cluster: "cluster1", + namespace: "ns1", }, - "override": { + "overrideNS": { flags: &genericclioptions.ConfigFlags{ KubeConfig: &cfgFile, Context: &ctx, @@ -62,8 +62,8 @@ func TestConfigRefine(t *testing.T) { mk := NewMockKubeSettings() m.When(mk.NamespaceNames(namespaces())).ThenReturn([]string{"default"}) cfg := config.NewConfig(mk) - err := cfg.Refine(u.flags) + err := cfg.Refine(u.flags, nil) if u.issue { assert.NotNil(t, err) } else { diff --git a/internal/config/k9s.go b/internal/config/k9s.go index 9a04d3a4..6556246a 100644 --- a/internal/config/k9s.go +++ b/internal/config/k9s.go @@ -43,6 +43,13 @@ func NewK9s() *K9s { } } +func (k *K9s) ActivateCluster() { + if _, ok := k.Clusters[k.CurrentCluster]; ok { + return + } + k.Clusters[k.CurrentCluster] = NewCluster() +} + // OverrideRefreshRate set the refresh rate manually. func (k *K9s) OverrideRefreshRate(r int) { k.manualRefreshRate = r diff --git a/internal/config/testdata/kubeconfig-test.yml b/internal/config/testdata/kubeconfig-test.yml index b66deb2b..a3c72a7a 100644 --- a/internal/config/testdata/kubeconfig-test.yml +++ b/internal/config/testdata/kubeconfig-test.yml @@ -1,20 +1,29 @@ apiVersion: v1 kind: Config clusters: -- cluster: - certificate-authority: /Users/test/ca.crt - server: https://1.2.3.4:8443 - name: testCluster + - cluster: + certificate-authority: /Users/test/ca.crt + server: https://1.2.3.4:8443 + name: testCluster contexts: -- context: - cluster: testCluster - user: testUser - namespace: testNS - name: test -current-context: test + - context: + cluster: cluster1 + user: user1 + namespace: ns1 + name: test1 + - context: + cluster: cluster2 + user: user2 + namespace: ns2 + name: test2 +current-context: test1 preferences: {} users: -- name: testUser - user: - client-certificate: /Users/test/client.crt - client-key: /Users/test/client.key + - name: user1 + user: + client-certificate: /Users/test/client.crt + client-key: /Users/test/client.key + - name: user2 + user: + client-certificate: /Users/test/client.crt + client-key: /Users/test/client.key