...
1
2
3
4
19
20 package stats
21
22 import (
23 "context"
24 "testing"
25 "time"
26
27 gomock "github.com/golang/mock/gomock"
28 fuzz "github.com/google/gofuzz"
29 "github.com/stretchr/testify/assert"
30
31 v1 "k8s.io/api/core/v1"
32 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
33 statsapi "k8s.io/kubelet/pkg/apis/stats/v1alpha1"
34 "k8s.io/kubernetes/pkg/kubelet/cm"
35 statstest "k8s.io/kubernetes/pkg/kubelet/server/stats/testing"
36 )
37
38 func TestSummaryProvider(t *testing.T) {
39 var (
40 ctx = context.Background()
41 podStats = []statsapi.PodStats{*getPodStats()}
42 imageFsStats = getFsStats()
43 rootFsStats = getFsStats()
44 node = &v1.Node{ObjectMeta: metav1.ObjectMeta{Name: "test-node"}}
45 nodeConfig = cm.NodeConfig{}
46 cgroupRoot = "/kubepods"
47 cgroupStatsMap = map[string]struct {
48 cs *statsapi.ContainerStats
49 ns *statsapi.NetworkStats
50 }{
51 "/": {cs: getContainerStats()},
52 "/pods": {cs: getContainerStats()},
53 }
54 )
55
56 assert := assert.New(t)
57
58 mockCtrl := gomock.NewController(t)
59 defer mockCtrl.Finish()
60
61 mockStatsProvider := statstest.NewMockProvider(mockCtrl)
62 mockStatsProvider.EXPECT().GetNode().Return(node, nil).AnyTimes()
63 mockStatsProvider.EXPECT().GetNodeConfig().Return(nodeConfig).AnyTimes()
64 mockStatsProvider.EXPECT().GetPodCgroupRoot().Return(cgroupRoot).AnyTimes()
65 mockStatsProvider.EXPECT().ListPodStats(ctx).Return(podStats, nil).AnyTimes()
66 mockStatsProvider.EXPECT().ListPodStatsAndUpdateCPUNanoCoreUsage(ctx).Return(podStats, nil).AnyTimes()
67 mockStatsProvider.EXPECT().ImageFsStats(ctx).Return(imageFsStats, imageFsStats, nil).AnyTimes()
68 mockStatsProvider.EXPECT().RootFsStats().Return(rootFsStats, nil).AnyTimes()
69 mockStatsProvider.EXPECT().RlimitStats().Return(nil, nil).AnyTimes()
70 mockStatsProvider.EXPECT().GetCgroupStats("/", true).Return(cgroupStatsMap["/"].cs, cgroupStatsMap["/"].ns, nil).AnyTimes()
71
72 kubeletCreationTime := metav1.Now()
73 systemBootTime := metav1.Now()
74 provider := summaryProviderImpl{kubeletCreationTime: kubeletCreationTime, systemBootTime: systemBootTime, provider: mockStatsProvider}
75 summary, err := provider.Get(ctx, true)
76 assert.NoError(err)
77
78 assert.Equal(summary.Node.NodeName, "test-node")
79 assert.Equal(summary.Node.StartTime, systemBootTime)
80 assert.Equal(summary.Node.CPU, cgroupStatsMap["/"].cs.CPU)
81 assert.Equal(summary.Node.Memory, cgroupStatsMap["/"].cs.Memory)
82 assert.Equal(summary.Node.Network, cgroupStatsMap["/"].ns)
83 assert.Equal(summary.Node.Fs, rootFsStats)
84 assert.Equal(summary.Node.Runtime, &statsapi.RuntimeStats{ContainerFs: imageFsStats, ImageFs: imageFsStats})
85
86 assert.Equal(len(summary.Node.SystemContainers), 1)
87 assert.Equal(summary.Node.SystemContainers[0].Name, "pods")
88 assert.Equal(summary.Node.SystemContainers[0].CPU.UsageCoreNanoSeconds, podStats[0].CPU.UsageCoreNanoSeconds)
89 assert.Equal(summary.Node.SystemContainers[0].CPU.UsageNanoCores, podStats[0].CPU.UsageNanoCores)
90 assert.Equal(summary.Node.SystemContainers[0].Memory.WorkingSetBytes, podStats[0].Memory.WorkingSetBytes)
91 assert.Equal(summary.Node.SystemContainers[0].Memory.UsageBytes, podStats[0].Memory.UsageBytes)
92 assert.Equal(summary.Node.SystemContainers[0].Memory.AvailableBytes, podStats[0].Memory.AvailableBytes)
93 assert.Equal(summary.Pods, podStats)
94 }
95
96 func getFsStats() *statsapi.FsStats {
97 f := fuzz.New().NilChance(0)
98 v := &statsapi.FsStats{}
99 f.Fuzz(v)
100 return v
101 }
102
103 func getContainerStats() *statsapi.ContainerStats {
104 f := fuzz.New().NilChance(0)
105 v := &statsapi.ContainerStats{}
106 f.Fuzz(v)
107 return v
108 }
109
110 func getPodStats() *statsapi.PodStats {
111 containerStats := getContainerStats()
112 podStats := statsapi.PodStats{
113 PodRef: statsapi.PodReference{Name: "test-pod", Namespace: "test-namespace", UID: "UID_test-pod"},
114 StartTime: metav1.NewTime(time.Now()),
115 Containers: []statsapi.ContainerStats{*containerStats},
116 CPU: containerStats.CPU,
117 Memory: containerStats.Memory,
118 }
119
120 return &podStats
121 }
122
View as plain text