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.
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.

View File

@ -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)
}
})
}

View File

@ -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) {

View File

@ -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 {

View File

@ -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)

View File

@ -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)
}