k9s/internal/watch/pod_mx_test.go

91 lines
2.2 KiB
Go

package watch
import (
"strconv"
"testing"
"github.com/rs/zerolog"
"gotest.tools/assert"
v1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/resource"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
mv1beta1 "k8s.io/metrics/pkg/apis/metrics/v1beta1"
)
func init() {
zerolog.SetGlobalLevel(zerolog.Disabled)
}
func TestMxResourceDiff(t *testing.T) {
uu := map[string]struct {
r1, r2 v1.ResourceList
e bool
}{
"same": {makeRes("0m", "0Mi"), makeRes("0m", "0Mi"), false},
"omem": {makeRes("0m", "10Mi"), makeRes("0m", "1Mi"), true},
"nmem": {makeRes("0m", "0Mi"), makeRes("0m", "1Mi"), true},
"ocpu": {makeRes("1m", "0Mi"), makeRes("0m", "0Mi"), true},
"ncpu": {makeRes("1m", "0Mi"), makeRes("2m", "0Mi"), true},
}
for k, v := range uu {
t.Run(k, func(t *testing.T) {
assert.Equal(t, v.e, resourceDiff(v.r1, v.r2))
})
}
}
func TestMxDeltas(t *testing.T) {
uu := map[string]struct {
m1, m2 *mv1beta1.PodMetrics
e bool
}{
"same": {makePodMxCo("p1", "1m", "0Mi", 1), makePodMxCo("p1", "1m", "0Mi", 1), false},
"dcpu": {makePodMxCo("p1", "10m", "0Mi", 1), makePodMxCo("p1", "0m", "0Mi", 1), true},
"dmem": {makePodMxCo("p1", "0m", "10Mi", 1), makePodMxCo("p1", "0m", "0Mi", 1), true},
"dco": {makePodMxCo("p1", "0m", "10Mi", 1), makePodMxCo("p1", "0m", "0Mi", 2), true},
}
var p PodMxWatcher
for k, v := range uu {
t.Run(k, func(t *testing.T) {
assert.Equal(t, v.e, p.deltas(v.m1, v.m2))
})
}
}
// ----------------------------------------------------------------------------
// Helpers...
func makeRes(c, m string) v1.ResourceList {
cpu, _ := resource.ParseQuantity(c)
mem, _ := resource.ParseQuantity(m)
return v1.ResourceList{
v1.ResourceCPU: cpu,
v1.ResourceMemory: mem,
}
}
func makePodMxCo(name, cpu, mem string, co int) *mv1beta1.PodMetrics {
mx := makePodMx(name)
for i := 0; i < co; i++ {
mx.Containers = append(
mx.Containers,
mv1beta1.ContainerMetrics{
Name: "c" + strconv.Itoa(i),
Usage: makeRes(cpu, mem)})
}
return mx
}
func makePodMx(name string) *mv1beta1.PodMetrics {
return &mv1beta1.PodMetrics{
ObjectMeta: metav1.ObjectMeta{
Name: name,
Namespace: "default",
},
}
}