From 9f941105a0e351c3d7ada395779b68939c739d13 Mon Sep 17 00:00:00 2001 From: Gustavo Paiva Date: Sun, 6 Oct 2019 15:47:08 -0300 Subject: [PATCH] don't override aliases --- internal/config/alias.go | 12 +++---- internal/config/alias_test.go | 63 ++++++++++++++++++++++++++++------- internal/resource/base.go | 5 ++- internal/resource/crd.go | 9 +++-- internal/resource/list.go | 2 +- internal/views/registrar.go | 13 ++++---- 6 files changed, 75 insertions(+), 29 deletions(-) diff --git a/internal/config/alias.go b/internal/config/alias.go index 57cefb08..b5833dbe 100644 --- a/internal/config/alias.go +++ b/internal/config/alias.go @@ -79,13 +79,13 @@ func (a Aliases) Get(k string) (string, bool) { } // Define declares a new alias. -func (a Aliases) Define(args ...string) { - if len(args)%2 != 0 { - panic("Invalid alias definition. You must specify pairs") - } - for i := 0; i < len(args); i += 2 { - a.Alias[args[i]] = args[i+1] +func (a Aliases) Define(alias, command string) { + if _, ok := a.Alias[alias]; ok { + // Don't override aliases. Take order of alias registration as precedence. + return } + + a.Alias[alias] = command } // LoadAliases loads alias from a given file. diff --git a/internal/config/alias_test.go b/internal/config/alias_test.go index ccb04c18..228ee615 100644 --- a/internal/config/alias_test.go +++ b/internal/config/alias_test.go @@ -8,22 +8,61 @@ import ( ) func TestAliasDefine(t *testing.T) { - uu := map[string]struct { - aa []string - }{ - "one": {[]string{"blee", "duh"}}, - "multi": {[]string{"blee", "duh", "fred", "zorg"}}, + type aliasDef struct { + cmd string + aliases []string } - for k, u := range uu { - t.Run(k, func(t *testing.T) { - a := config.NewAliases() - a.Define(u.aa...) - for i := 0; i < len(u.aa); i += 2 { - v, ok := a.Get(u.aa[i]) + tts := []struct { + name string + aliases []aliasDef + registeredCommands map[string]string + }{ + { + name: "simple aliases", + aliases: []aliasDef{ + { + cmd: "one", + aliases: []string{"blee", "duh"}, + }, + }, + registeredCommands: map[string]string{ + "blee": "one", + "duh": "one", + }, + }, + { + name: "duplicated aliases", + aliases: []aliasDef{ + { + cmd: "one", + aliases: []string{"blee", "duh"}, + }, { + cmd: "two", + aliases: []string{"blee", "duh", "fred", "zorg"}, + }, + }, + registeredCommands: map[string]string{ + "blee": "one", + "duh": "one", + "fred": "two", + "zorg": "two", + }, + }, + } + for _, tt := range tts { + t.Run(tt.name, func(t *testing.T) { + configAlias := config.NewAliases() + for _, aliases := range tt.aliases { + for _, a := range aliases.aliases { + configAlias.Define(a, aliases.cmd) + } + } + for alias, cmd := range tt.registeredCommands { + v, ok := configAlias.Get(alias) assert.True(t, ok) - assert.Equal(t, u.aa[i+1], v) + assert.Equal(t, cmd, v, "Wrong command for alias "+alias) } }) } diff --git a/internal/resource/base.go b/internal/resource/base.go index 2274dac3..14b6dd4d 100644 --- a/internal/resource/base.go +++ b/internal/resource/base.go @@ -3,6 +3,7 @@ package resource import ( "bytes" "context" + "errors" "path" "github.com/derailed/k9s/internal/k8s" @@ -100,7 +101,9 @@ func (*Base) NumCols(n string) map[string]bool { } // ExtFields returns extended fields in relation to headers. -func (*Base) ExtFields(*TypeMeta) {} +func (*Base) ExtFields() (*TypeMeta, error) { + return nil, errors.New("Base does not have extended fields.") +} // Get a resource by name func (b *Base) Get(path string) (Columnar, error) { diff --git a/internal/resource/crd.go b/internal/resource/crd.go index aca6d4d6..fea637a5 100644 --- a/internal/resource/crd.go +++ b/internal/resource/crd.go @@ -1,6 +1,7 @@ package resource import ( + "errors" "time" "github.com/derailed/k9s/internal/k8s" @@ -89,11 +90,12 @@ func (r *CustomResourceDefinition) Fields(ns string) Row { } // ExtFields returns extended fields. -func (r *CustomResourceDefinition) ExtFields(m *TypeMeta) { +func (r *CustomResourceDefinition) ExtFields() (*TypeMeta, error) { + m := &TypeMeta{} i := r.instance spec, ok := i.Object["spec"].(map[string]interface{}) if !ok { - return + return nil, errors.New("missing crd specs") } if meta, ok := i.Object["metadata"].(map[string]interface{}); ok { @@ -103,7 +105,7 @@ func (r *CustomResourceDefinition) ExtFields(m *TypeMeta) { m.Namespaced = isNamespaced(spec["scope"].(string)) names, ok := spec["names"].(map[string]interface{}) if !ok { - return + return nil, errors.New("missing crd names") } m.Kind = names["kind"].(string) m.Singular, m.Plural = names["singular"].(string), names["plural"].(string) @@ -114,6 +116,7 @@ func (r *CustomResourceDefinition) ExtFields(m *TypeMeta) { } else { m.ShortNames = nil } + return m, nil } func isNamespaced(scope string) bool { diff --git a/internal/resource/list.go b/internal/resource/list.go index b56571f2..ade21bf2 100644 --- a/internal/resource/list.go +++ b/internal/resource/list.go @@ -90,7 +90,7 @@ type ( Columnar interface { Header(ns string) Row Fields(ns string) Row - ExtFields(*TypeMeta) + ExtFields() (*TypeMeta, error) Name() string SetPodMetrics(*mv1beta1.PodMetrics) SetNodeMetrics(*mv1beta1.NodeMetrics) diff --git a/internal/views/registrar.go b/internal/views/registrar.go index e510b914..8ffe9bfc 100644 --- a/internal/views/registrar.go +++ b/internal/views/registrar.go @@ -51,9 +51,12 @@ func allCRDs(c k8s.Connection, vv viewers) { } t := time.Now() - var meta resource.TypeMeta for _, crd := range crds { - crd.ExtFields(&meta) + meta, err := crd.ExtFields() + if err != nil { + log.Error().Err(err).Msgf("Error getting extended fields from %s", crd.Name()) + continue + } gvr := k8s.NewGVR(meta.Group, meta.Version, meta.Plural) gvrs := gvr.String() @@ -141,10 +144,8 @@ func load(c k8s.Connection, vv viewers) { cmd.gvr = gvr.String() vv[gvr.String()] = cmd gvrStr := gvr.String() - aliases.Define( - strings.ToLower(res.Kind), gvrStr, - res.Name, gvrStr, - ) + aliases.Define(strings.ToLower(res.Kind), gvrStr) + aliases.Define(res.Name, gvrStr) if len(res.SingularName) > 0 { aliases.Define(res.SingularName, gvrStr) }