diff --git a/internal/config/alias.go b/internal/config/alias.go index f1f9477d..04265498 100644 --- a/internal/config/alias.go +++ b/internal/config/alias.go @@ -2,7 +2,6 @@ package config import ( "io/ioutil" - "os" "path/filepath" "sync" @@ -32,72 +31,6 @@ func NewAliases() *Aliases { } } -func (a *Aliases) loadDefaults() { - const ( - contexts = "contexts" - portFwds = "portforwards" - benchmarks = "benchmarks" - dumps = "screendumps" - groups = "groups" - users = "users" - ) - - a.mx.Lock() - defer a.mx.Unlock() - - a.Alias["dp"] = "apps/v1/deployments" - a.Alias["sec"] = "v1/secrets" - a.Alias["jo"] = "batch/v1/jobs" - a.Alias["cr"] = "rbac.authorization.k8s.io/v1/clusterroles" - a.Alias["crb"] = "rbac.authorization.k8s.io/v1/clusterrolebindings" - a.Alias["ro"] = "rbac.authorization.k8s.io/v1/roles" - a.Alias["rb"] = "rbac.authorization.k8s.io/v1/rolebindings" - a.Alias["np"] = "networking.k8s.io/v1/networkpolicies" - { - a.Alias["ctx"] = contexts - a.Alias[contexts] = contexts - a.Alias["context"] = contexts - } - { - a.Alias["usr"] = users - a.Alias[users] = users - a.Alias["user"] = users - } - { - a.Alias["grp"] = groups - a.Alias["group"] = groups - a.Alias[groups] = groups - } - { - a.Alias["pf"] = portFwds - a.Alias[portFwds] = portFwds - a.Alias["portforward"] = portFwds - } - { - a.Alias["be"] = benchmarks - a.Alias["benchmark"] = benchmarks - a.Alias[benchmarks] = benchmarks - } - { - a.Alias["sd"] = dumps - a.Alias["screendump"] = dumps - a.Alias[dumps] = dumps - } -} - -// Load K9s aliases. -func (a *Aliases) Load() error { - a.loadDefaults() - - _, err := os.Stat(K9sAlias) - if os.IsNotExist(err) { - log.Debug().Err(err).Msgf("No custom aliases found") - return nil - } - - return a.LoadAliases(K9sAlias) -} - // ShortNames return all shortnames. func (a *Aliases) ShortNames() ShortNames { a.mx.RLock() diff --git a/internal/model/flash_test.go b/internal/model/flash_test.go index 2c0561ed..d6b00053 100644 --- a/internal/model/flash_test.go +++ b/internal/model/flash_test.go @@ -41,10 +41,11 @@ func TestFlash(t *testing.T) { } time.Sleep(5 * delay) - s, _, l, m := v.getMetrics() + s, c, l, m := v.getMetrics() assert.Equal(t, 1, s) assert.Equal(t, u.level, l) assert.Equal(t, u.e, m) + assert.Equal(t, 1, c) }) } } diff --git a/internal/render/pdb.go b/internal/render/pdb.go index fb94eed4..0f03b26e 100644 --- a/internal/render/pdb.go +++ b/internal/render/pdb.go @@ -79,16 +79,19 @@ func (p PodDisruptionBudget) Render(o interface{}, ns string, r *Row) error { strconv.Itoa(int(pdb.Status.DesiredHealthy)), strconv.Itoa(int(pdb.Status.ExpectedPods)), mapToStr(pdb.Labels), - asStatus(p.diagnose(pdb.Spec.MinAvailable.IntVal, pdb.Status.CurrentHealthy)), + asStatus(p.diagnose(pdb.Spec.MinAvailable, pdb.Status.CurrentHealthy)), toAge(pdb.ObjectMeta.CreationTimestamp), ) return nil } -func (PodDisruptionBudget) diagnose(min, healthy int32) error { - if min > healthy { - return fmt.Errorf("expected %d but got %d", min, healthy) +func (PodDisruptionBudget) diagnose(min *intstr.IntOrString, healthy int32) error { + if min == nil { + return nil + } + if min.IntVal > healthy { + return fmt.Errorf("expected %d but got %d", min.IntVal, healthy) } return nil } diff --git a/internal/view/container.go b/internal/view/container.go index ceb18da4..c60a0f56 100644 --- a/internal/view/container.go +++ b/internal/view/container.go @@ -3,7 +3,6 @@ package view import ( "errors" "fmt" - "net" "strings" "github.com/derailed/k9s/internal/client" @@ -155,11 +154,3 @@ func (c *Container) isForwardable(path string) ([]string, bool) { return pp, true } - -func tryListenPort(port string) error { - server, err := net.Listen("tcp", fmt.Sprintf(":%s", port)) - if err != nil { - return err - } - return server.Close() -} diff --git a/internal/view/container_test.go b/internal/view/container_test.go index 732c35e9..8eb22a04 100644 --- a/internal/view/container_test.go +++ b/internal/view/container_test.go @@ -13,5 +13,5 @@ func TestContainerNew(t *testing.T) { assert.Nil(t, c.Init(makeCtx())) assert.Equal(t, "Containers", c.Name()) - assert.Equal(t, 15, len(c.Hints())) + assert.Equal(t, 16, len(c.Hints())) } diff --git a/internal/view/help_test.go b/internal/view/help_test.go index 77be3a80..e02ac736 100644 --- a/internal/view/help_test.go +++ b/internal/view/help_test.go @@ -21,8 +21,7 @@ func TestHelp(t *testing.T) { v := view.NewHelp() assert.Nil(t, v.Init(ctx)) - assert.Equal(t, 21, v.GetRowCount()) - assert.Equal(t, 22, v.GetRowCount()) + assert.Equal(t, 23, v.GetRowCount()) assert.Equal(t, 8, v.GetColumnCount()) assert.Equal(t, "", strings.TrimSpace(v.GetCell(1, 0).Text)) assert.Equal(t, "Attach", strings.TrimSpace(v.GetCell(1, 1).Text)) diff --git a/internal/view/pf_extender.go b/internal/view/pf_extender.go index 2907f2a8..9f68f781 100644 --- a/internal/view/pf_extender.go +++ b/internal/view/pf_extender.go @@ -3,6 +3,7 @@ package view import ( "errors" "fmt" + "net" "strconv" "github.com/derailed/k9s/internal/client" @@ -71,6 +72,14 @@ func (p *PortForwardExtender) fetchPodName(path string) (string, error) { // ---------------------------------------------------------------------------- // Helpers... +func tryListenPort(port string) error { + server, err := net.Listen("tcp", fmt.Sprintf(":%s", port)) + if err != nil { + return err + } + return server.Close() +} + func runForward(v ResourceViewer, pf watch.Forwarder, f *portforward.PortForwarder) { v.App().factory.AddForwarder(pf) @@ -92,7 +101,11 @@ func runForward(v ResourceViewer, pf watch.Forwarder, f *portforward.PortForward } func startFwdCB(v ResourceViewer, path, co string, t client.PortTunnel) { - log.Debug().Msgf("CURRENT-FWD %#v", v.App().factory.Forwarders()) + err := tryListenPort(t.LocalPort) + if err != nil { + v.App().Flash().Err(err) + return + } if _, ok := v.App().factory.ForwarderFor(dao.PortForwardID(path, co)); ok { v.App().Flash().Err(errors.New("A port-forward is already active on this pod")) diff --git a/internal/view/pod.go b/internal/view/pod.go index a9f8712c..8b3b5726 100644 --- a/internal/view/pod.go +++ b/internal/view/pod.go @@ -138,7 +138,7 @@ func (p *Pod) attachCmd(evt *tcell.EventKey) *tcell.EventKey { } row := p.GetTable().GetSelectedRowIndex() - status := ui.TrimCell(p.GetTable().SelectTable, row, p.GetTable().NameColIndex()+2) + status := ui.TrimCell(p.GetTable().SelectTable, row, p.GetTable().NameColIndex()+3) if status != render.Running { p.App().Flash().Errf("%s is not in a running state", path) return nil @@ -230,35 +230,21 @@ func resumeAttachIn(a *App, c model.Component, path, co string) { } func attachIn(a *App, path, co string) { - args := computeAttachArgs(path, co, a.Config.K9s.CurrentContext, a.Conn().Config().Flags().KubeConfig) - + args := buildShellArgs("attach", path, co, a.Config.K9s.CurrentContext, a.Conn().Config().Flags().KubeConfig) c := color.New(color.BgGreen).Add(color.FgBlack).Add(color.Bold) if !runK(a, shellOpts{clear: true, banner: c.Sprintf(bannerFmt, path, co), args: args}) { a.Flash().Err(errors.New("Attach exec failed")) } - } func computeShellArgs(path, co, context string, kcfg *string) []string { - args := make([]string, 0, 15) - args = append(args, "exec", "-it") - args = append(args, "--context", context) - ns, po := client.Namespaced(path) - args = append(args, "-n", ns) - args = append(args, po) - if kcfg != nil && *kcfg != "" { - args = append(args, "--kubeconfig", *kcfg) - } - if co != "" { - args = append(args, "-c", co) - } - + args := buildShellArgs("exec", path, co, context, kcfg) return append(args, "--", "sh", "-c", shellCheck) } -func computeAttachArgs(path, co, context string, kcfg *string) []string { +func buildShellArgs(cmd, path, co, context string, kcfg *string) []string { args := make([]string, 0, 15) - args = append(args, "attach", "-it") + args = append(args, cmd, "-it") args = append(args, "--context", context) ns, po := client.Namespaced(path) args = append(args, "-n", ns) @@ -269,7 +255,7 @@ func computeAttachArgs(path, co, context string, kcfg *string) []string { if co != "" { args = append(args, "-c", co) } - + return args } diff --git a/internal/view/pod_test.go b/internal/view/pod_test.go index 28ddaae8..cc1fe784 100644 --- a/internal/view/pod_test.go +++ b/internal/view/pod_test.go @@ -16,8 +16,7 @@ func TestPodNew(t *testing.T) { assert.Nil(t, po.Init(makeCtx())) assert.Equal(t, "Pods", po.Name()) - assert.Equal(t, 20, len(po.Hints())) - assert.Equal(t, 21, len(po.Hints())) + assert.Equal(t, 22, len(po.Hints())) } // Helpers...