Merge pull request #347 from paivagustavo/sort-node-roles

sort node roles
mine
Fernand Galiana 2019-10-14 09:36:20 -06:00 committed by GitHub
commit 3f96d15d7b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 69 additions and 33 deletions

View File

@ -3,10 +3,11 @@ package resource
import ( import (
"strings" "strings"
"k8s.io/apimachinery/pkg/util/sets"
"github.com/derailed/k9s/internal/k8s" "github.com/derailed/k9s/internal/k8s"
"github.com/rs/zerolog/log" "github.com/rs/zerolog/log"
v1 "k8s.io/api/core/v1" v1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/util/sets"
mv1beta1 "k8s.io/metrics/pkg/apis/metrics/v1beta1" mv1beta1 "k8s.io/metrics/pkg/apis/metrics/v1beta1"
) )
@ -143,13 +144,13 @@ func (r *Node) Fields(ns string) Row {
sta := make([]string, 10) sta := make([]string, 10)
r.status(no.Status, no.Spec.Unschedulable, sta) r.status(no.Status, no.Spec.Unschedulable, sta)
ro := make([]string, 10) ro := sets.NewString()
r.nodeRoles(no, ro) r.findNodeRoles(no, &ro)
return append(ff, return append(ff,
no.Name, no.Name,
join(sta, ","), join(sta, ","),
join(ro, ","), join(ro.List(), ","),
no.Status.NodeInfo.KubeletVersion, no.Status.NodeInfo.KubeletVersion,
no.Status.NodeInfo.KernelVersion, no.Status.NodeInfo.KernelVersion,
iIP, iIP,
@ -203,28 +204,23 @@ func gatherNodeMX(no *v1.Node, mx *mv1beta1.NodeMetrics) (c metric, a metric, p
return return
} }
func withPerc(v, p string) string { func (_ *Node) findNodeRoles(no *v1.Node, roles *sets.String) []string {
return v + " (" + p + ")" for k, v := range no.Labels {
}
func (*Node) nodeRoles(node *v1.Node, res []string) {
index := 0
for k, v := range node.Labels {
switch { switch {
case strings.HasPrefix(k, labelNodeRolePrefix): case strings.HasPrefix(k, labelNodeRolePrefix):
if role := strings.TrimPrefix(k, labelNodeRolePrefix); len(role) > 0 { if role := strings.TrimPrefix(k, labelNodeRolePrefix); len(role) > 0 {
res[index] = role roles.Insert(role)
index++
} }
case k == nodeLabelRole && v != "": case k == nodeLabelRole && v != "":
res[index] = v roles.Insert(v)
index++
} }
} }
if empty(res) { if roles.Len() == 0 {
res[index] = MissingValue roles.Insert(MissingValue)
} }
return roles.List()
} }
func (*Node) getIPs(addrs []v1.NodeAddress) (iIP, eIP string) { func (*Node) getIPs(addrs []v1.NodeAddress) (iIP, eIP string) {
@ -271,22 +267,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) { func (r *Node) podsResources(name string) (v1.ResourceList, v1.ResourceList, error) {
reqs, limits := v1.ResourceList{}, v1.ResourceList{} reqs, limits := v1.ResourceList{}, v1.ResourceList{}
pods, err := r.Connection.NodePods(name) pods, err := r.Connection.NodePods(name)

View File

@ -3,6 +3,8 @@ package resource
import ( import (
"testing" "testing"
"k8s.io/apimachinery/pkg/util/sets"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
v1 "k8s.io/api/core/v1" v1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@ -34,6 +36,60 @@ 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{
"kubernetes.io/role": "master",
"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",
"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{"<none>"},
},
}
no := NewNode(nil)
for _, u := range uu {
roles := sets.NewString()
no.findNodeRoles(&u.node, &roles)
assert.Equal(t, u.roles, roles.List())
}
}
func BenchmarkNodeFields(b *testing.B) { func BenchmarkNodeFields(b *testing.B) {
n := NewNode(nil) n := NewNode(nil)
no := makeNode() no := makeNode()