k9s/internal/watch/pod_mx_test.go

137 lines
3.2 KiB
Go

package watch
import (
"sync"
"testing"
"github.com/rs/zerolog"
"gotest.tools/assert"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
mv1beta1 "k8s.io/metrics/pkg/apis/metrics/v1beta1"
v1beta1 "k8s.io/metrics/pkg/apis/metrics/v1beta1"
)
func init() {
zerolog.SetGlobalLevel(zerolog.Disabled)
}
func TestPodMXList(t *testing.T) {
cmo := NewMockConnection()
po := NewPodMetrics(cmo, "")
o := po.List("", metav1.ListOptions{})
assert.Assert(t, len(o) == 0)
}
func TestPodMXGet(t *testing.T) {
cmo := NewMockConnection()
po := NewPodMetrics(cmo, "")
o, err := po.Get("", metav1.GetOptions{})
assert.ErrorContains(t, err, "No pod metrics")
assert.Assert(t, o == nil)
}
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("p2", "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 := range uu {
u := uu[k]
t.Run(k, func(t *testing.T) {
assert.Equal(t, u.e, p.deltas(u.m1, u.m2))
})
}
}
func TestPodMXRun(t *testing.T) {
cmo := NewMockConnection()
w := newPodMxWatcher(cmo, "")
var wg sync.WaitGroup
wg.Add(1)
go func() {
defer wg.Done()
w.Run()
}()
w.Stop()
wg.Wait()
}
func TestPodMXUpdate(t *testing.T) {
cmo := NewMockConnection()
po := newPodMxWatcher(cmo, "default")
po.cache = map[string]runtime.Object{
"default/p1": makePodMX("p1", "11m", "11Mi"),
}
mxx := &mv1beta1.PodMetricsList{
Items: []mv1beta1.PodMetrics{
*makePodMX("p2", "10m", "10Mi"),
},
}
po.update(mxx, false)
pmx := po.cache["default/p2"].(*mv1beta1.PodMetrics)
assert.Equal(t, toQty("10m"), *pmx.Containers[0].Usage.Cpu())
assert.Equal(t, toQty("10Mi"), *pmx.Containers[0].Usage.Memory())
}
func TestPodMXUpdateNoChange(t *testing.T) {
cmo := NewMockConnection()
po := newPodMxWatcher(cmo, "default")
po.cache = map[string]runtime.Object{
"default/p1": makePodMX("p1", "10m", "10Mi"),
}
mxx := &mv1beta1.PodMetricsList{
Items: []mv1beta1.PodMetrics{
*makePodMX("p1", "10m", "10Mi"),
},
}
po.update(mxx, false)
pmx := po.cache["default/p1"].(*mv1beta1.PodMetrics)
assert.Equal(t, toQty("10m"), *pmx.Containers[0].Usage.Cpu())
assert.Equal(t, toQty("10Mi"), *pmx.Containers[0].Usage.Memory())
}
func TestPodMXDelete(t *testing.T) {
cmo := NewMockConnection()
po := newPodMxWatcher(cmo, "default")
po.cache = map[string]runtime.Object{
"default/p1": makePodMX("p1", "11m", "11Mi"),
}
mxx := &mv1beta1.PodMetricsList{}
po.update(mxx, false)
assert.Equal(t, 0, len(po.cache))
}
// ----------------------------------------------------------------------------
// Helpers...
func makePodMX(name, cpu, mem string) *v1beta1.PodMetrics {
return &v1beta1.PodMetrics{
ObjectMeta: metav1.ObjectMeta{
Name: name,
Namespace: "default",
},
Containers: []v1beta1.ContainerMetrics{
{Name: "i1", Usage: makeRes(cpu, mem)},
{Name: "c1", Usage: makeRes(cpu, mem)},
},
}
}