don't override aliases
parent
7a613255d4
commit
9f941105a0
|
|
@ -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.
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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) {
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue