From a7bfe0e638e329d60cd5724bac0670c95db9412f Mon Sep 17 00:00:00 2001 From: Gustavo Paiva Date: Wed, 9 Oct 2019 01:46:18 -0300 Subject: [PATCH 1/2] sort node roles --- internal/resource/no.go | 39 ++++++-------------------------- internal/resource/no_int_test.go | 37 ++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 32 deletions(-) diff --git a/internal/resource/no.go b/internal/resource/no.go index a4e34352..8b87cb86 100644 --- a/internal/resource/no.go +++ b/internal/resource/no.go @@ -143,8 +143,7 @@ func (r *Node) Fields(ns string) Row { sta := make([]string, 10) r.status(no.Status, no.Spec.Unschedulable, sta) - ro := make([]string, 10) - r.nodeRoles(no, ro) + ro := r.findNodeRoles(no) return append(ff, no.Name, @@ -203,28 +202,20 @@ func gatherNodeMX(no *v1.Node, mx *mv1beta1.NodeMetrics) (c metric, a metric, p return } -func withPerc(v, p string) string { - return v + " (" + p + ")" -} - -func (*Node) nodeRoles(node *v1.Node, res []string) { - index := 0 - for k, v := range node.Labels { +func (_ *Node) findNodeRoles(no *v1.Node) []string { + roles := sets.NewString() + for k, v := range no.Labels { switch { case strings.HasPrefix(k, labelNodeRolePrefix): if role := strings.TrimPrefix(k, labelNodeRolePrefix); len(role) > 0 { - res[index] = role - index++ + roles.Insert(role) } case k == nodeLabelRole && v != "": - res[index] = v - index++ + roles.Insert(v) } } - if empty(res) { - res[index] = MissingValue - } + return roles.List() } func (*Node) getIPs(addrs []v1.NodeAddress) (iIP, eIP string) { @@ -271,22 +262,6 @@ func (*Node) status(status v1.NodeStatus, exempt bool, res []string) { } } -func findNodeRoles(no *v1.Node) []string { - roles := sets.NewString() - for k, v := range no.Labels { - switch { - case strings.HasPrefix(k, labelNodeRolePrefix): - if role := strings.TrimPrefix(k, labelNodeRolePrefix); len(role) > 0 { - roles.Insert(role) - } - case k == nodeLabelRole && v != "": - roles.Insert(v) - } - } - - return roles.List() -} - func (r *Node) podsResources(name string) (v1.ResourceList, v1.ResourceList, error) { reqs, limits := v1.ResourceList{}, v1.ResourceList{} pods, err := r.Connection.NodePods(name) diff --git a/internal/resource/no_int_test.go b/internal/resource/no_int_test.go index 477998b6..170b8b4d 100644 --- a/internal/resource/no_int_test.go +++ b/internal/resource/no_int_test.go @@ -34,6 +34,43 @@ func TestNodeStatus(t *testing.T) { } } +func TestNodeRoles(t *testing.T) { + uu := []struct { + node v1.Node + roles []string + }{ + { + node: v1.Node{ + ObjectMeta: metav1.ObjectMeta{ + Labels: map[string]string{ + "node-role.kubernetes.io/master": "true", + "node-role.kubernetes.io/worker": "true", + }, + }, + }, + roles: []string{"master", "worker"}, + }, + + { + node: v1.Node{ + ObjectMeta: metav1.ObjectMeta{ + Labels: map[string]string{ + "node-role.kubernetes.io/worker": "true", + "node-role.kubernetes.io/master": "true", + }, + }, + }, + roles: []string{"master", "worker"}, + }, + } + + no := NewNode(nil) + for _, u := range uu { + roles := no.findNodeRoles(&u.node) + assert.Equal(t, u.roles, roles) + } +} + func BenchmarkNodeFields(b *testing.B) { n := NewNode(nil) no := makeNode() From 616b068c0dc88ae6aba09c3c2a6c609a85196a29 Mon Sep 17 00:00:00 2001 From: Gustavo Paiva Date: Mon, 14 Oct 2019 01:27:44 -0300 Subject: [PATCH 2/2] receive sets.String as parameter and improve tests. --- internal/resource/no.go | 15 ++++++++++----- internal/resource/no_int_test.go | 27 +++++++++++++++++++++++---- 2 files changed, 33 insertions(+), 9 deletions(-) diff --git a/internal/resource/no.go b/internal/resource/no.go index 8b87cb86..b94b9be8 100644 --- a/internal/resource/no.go +++ b/internal/resource/no.go @@ -3,10 +3,11 @@ package resource import ( "strings" + "k8s.io/apimachinery/pkg/util/sets" + "github.com/derailed/k9s/internal/k8s" "github.com/rs/zerolog/log" v1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/util/sets" mv1beta1 "k8s.io/metrics/pkg/apis/metrics/v1beta1" ) @@ -143,12 +144,13 @@ func (r *Node) Fields(ns string) Row { sta := make([]string, 10) r.status(no.Status, no.Spec.Unschedulable, sta) - ro := r.findNodeRoles(no) + ro := sets.NewString() + r.findNodeRoles(no, &ro) return append(ff, no.Name, join(sta, ","), - join(ro, ","), + join(ro.List(), ","), no.Status.NodeInfo.KubeletVersion, no.Status.NodeInfo.KernelVersion, iIP, @@ -202,8 +204,7 @@ func gatherNodeMX(no *v1.Node, mx *mv1beta1.NodeMetrics) (c metric, a metric, p return } -func (_ *Node) findNodeRoles(no *v1.Node) []string { - roles := sets.NewString() +func (_ *Node) findNodeRoles(no *v1.Node, roles *sets.String) []string { for k, v := range no.Labels { switch { case strings.HasPrefix(k, labelNodeRolePrefix): @@ -215,6 +216,10 @@ func (_ *Node) findNodeRoles(no *v1.Node) []string { } } + if roles.Len() == 0 { + roles.Insert(MissingValue) + } + return roles.List() } diff --git a/internal/resource/no_int_test.go b/internal/resource/no_int_test.go index 170b8b4d..c6e9460c 100644 --- a/internal/resource/no_int_test.go +++ b/internal/resource/no_int_test.go @@ -3,6 +3,8 @@ package resource import ( "testing" + "k8s.io/apimachinery/pkg/util/sets" + "github.com/stretchr/testify/assert" v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -43,7 +45,7 @@ func TestNodeRoles(t *testing.T) { node: v1.Node{ ObjectMeta: metav1.ObjectMeta{ Labels: map[string]string{ - "node-role.kubernetes.io/master": "true", + "kubernetes.io/role": "master", "node-role.kubernetes.io/worker": "true", }, }, @@ -56,18 +58,35 @@ func TestNodeRoles(t *testing.T) { ObjectMeta: metav1.ObjectMeta{ Labels: map[string]string{ "node-role.kubernetes.io/worker": "true", - "node-role.kubernetes.io/master": "true", + "kubernetes.io/role": "master", }, }, }, roles: []string{"master", "worker"}, }, + + { + node: v1.Node{ + ObjectMeta: metav1.ObjectMeta{ + Labels: map[string]string{ + "kubernetes.io/role": "worker", + }, + }, + }, + roles: []string{"worker"}, + }, + + { + node: v1.Node{}, + roles: []string{""}, + }, } no := NewNode(nil) for _, u := range uu { - roles := no.findNodeRoles(&u.node) - assert.Equal(t, u.roles, roles) + roles := sets.NewString() + no.findNodeRoles(&u.node, &roles) + assert.Equal(t, u.roles, roles.List()) } }