don't override aliases

mine
Gustavo Paiva 2019-10-06 15:47:08 -03:00
parent 7a613255d4
commit 9f941105a0
6 changed files with 75 additions and 29 deletions

View File

@ -79,13 +79,13 @@ func (a Aliases) Get(k string) (string, bool) {
} }
// Define declares a new alias. // Define declares a new alias.
func (a Aliases) Define(args ...string) { func (a Aliases) Define(alias, command string) {
if len(args)%2 != 0 { if _, ok := a.Alias[alias]; ok {
panic("Invalid alias definition. You must specify pairs") // Don't override aliases. Take order of alias registration as precedence.
} return
for i := 0; i < len(args); i += 2 {
a.Alias[args[i]] = args[i+1]
} }
a.Alias[alias] = command
} }
// LoadAliases loads alias from a given file. // LoadAliases loads alias from a given file.

View File

@ -8,22 +8,61 @@ import (
) )
func TestAliasDefine(t *testing.T) { func TestAliasDefine(t *testing.T) {
uu := map[string]struct { type aliasDef struct {
aa []string cmd string
}{ aliases []string
"one": {[]string{"blee", "duh"}},
"multi": {[]string{"blee", "duh", "fred", "zorg"}},
} }
for k, u := range uu { tts := []struct {
t.Run(k, func(t *testing.T) { name string
a := config.NewAliases() aliases []aliasDef
a.Define(u.aa...) registeredCommands map[string]string
for i := 0; i < len(u.aa); i += 2 { }{
v, ok := a.Get(u.aa[i]) {
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.True(t, ok)
assert.Equal(t, u.aa[i+1], v) assert.Equal(t, cmd, v, "Wrong command for alias "+alias)
} }
}) })
} }

View File

@ -3,6 +3,7 @@ package resource
import ( import (
"bytes" "bytes"
"context" "context"
"errors"
"path" "path"
"github.com/derailed/k9s/internal/k8s" "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. // 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 // Get a resource by name
func (b *Base) Get(path string) (Columnar, error) { func (b *Base) Get(path string) (Columnar, error) {

View File

@ -1,6 +1,7 @@
package resource package resource
import ( import (
"errors"
"time" "time"
"github.com/derailed/k9s/internal/k8s" "github.com/derailed/k9s/internal/k8s"
@ -89,11 +90,12 @@ func (r *CustomResourceDefinition) Fields(ns string) Row {
} }
// ExtFields returns extended fields. // ExtFields returns extended fields.
func (r *CustomResourceDefinition) ExtFields(m *TypeMeta) { func (r *CustomResourceDefinition) ExtFields() (*TypeMeta, error) {
m := &TypeMeta{}
i := r.instance i := r.instance
spec, ok := i.Object["spec"].(map[string]interface{}) spec, ok := i.Object["spec"].(map[string]interface{})
if !ok { if !ok {
return return nil, errors.New("missing crd specs")
} }
if meta, ok := i.Object["metadata"].(map[string]interface{}); ok { 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)) m.Namespaced = isNamespaced(spec["scope"].(string))
names, ok := spec["names"].(map[string]interface{}) names, ok := spec["names"].(map[string]interface{})
if !ok { if !ok {
return return nil, errors.New("missing crd names")
} }
m.Kind = names["kind"].(string) m.Kind = names["kind"].(string)
m.Singular, m.Plural = names["singular"].(string), names["plural"].(string) m.Singular, m.Plural = names["singular"].(string), names["plural"].(string)
@ -114,6 +116,7 @@ func (r *CustomResourceDefinition) ExtFields(m *TypeMeta) {
} else { } else {
m.ShortNames = nil m.ShortNames = nil
} }
return m, nil
} }
func isNamespaced(scope string) bool { func isNamespaced(scope string) bool {

View File

@ -90,7 +90,7 @@ type (
Columnar interface { Columnar interface {
Header(ns string) Row Header(ns string) Row
Fields(ns string) Row Fields(ns string) Row
ExtFields(*TypeMeta) ExtFields() (*TypeMeta, error)
Name() string Name() string
SetPodMetrics(*mv1beta1.PodMetrics) SetPodMetrics(*mv1beta1.PodMetrics)
SetNodeMetrics(*mv1beta1.NodeMetrics) SetNodeMetrics(*mv1beta1.NodeMetrics)

View File

@ -51,9 +51,12 @@ func allCRDs(c k8s.Connection, vv viewers) {
} }
t := time.Now() t := time.Now()
var meta resource.TypeMeta
for _, crd := range crds { 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) gvr := k8s.NewGVR(meta.Group, meta.Version, meta.Plural)
gvrs := gvr.String() gvrs := gvr.String()
@ -141,10 +144,8 @@ func load(c k8s.Connection, vv viewers) {
cmd.gvr = gvr.String() cmd.gvr = gvr.String()
vv[gvr.String()] = cmd vv[gvr.String()] = cmd
gvrStr := gvr.String() gvrStr := gvr.String()
aliases.Define( aliases.Define(strings.ToLower(res.Kind), gvrStr)
strings.ToLower(res.Kind), gvrStr, aliases.Define(res.Name, gvrStr)
res.Name, gvrStr,
)
if len(res.SingularName) > 0 { if len(res.SingularName) > 0 {
aliases.Define(res.SingularName, gvrStr) aliases.Define(res.SingularName, gvrStr)
} }