From 0b7629d2cc293d804c0b7d6ea0df54c8cb4f2c9c Mon Sep 17 00:00:00 2001 From: Peter Hunt Date: Tue, 15 Feb 2022 16:29:12 -0500 Subject: [PATCH] kubelet/stats: add unit test for when container logs are found Signed-off-by: Peter Hunt --- .../stats/cadvisor_stats_provider_test.go | 106 ++++++++++++++++++ 1 file changed, 106 insertions(+) diff --git a/pkg/kubelet/stats/cadvisor_stats_provider_test.go b/pkg/kubelet/stats/cadvisor_stats_provider_test.go index 96a3f81abfc..9cc560d6a89 100644 --- a/pkg/kubelet/stats/cadvisor_stats_provider_test.go +++ b/pkg/kubelet/stats/cadvisor_stats_provider_test.go @@ -30,9 +30,12 @@ import ( cadvisortest "k8s.io/kubernetes/pkg/kubelet/cadvisor/testing" kubecontainer "k8s.io/kubernetes/pkg/kubelet/container" containertest "k8s.io/kubernetes/pkg/kubelet/container/testing" + kubecontainertest "k8s.io/kubernetes/pkg/kubelet/container/testing" + "k8s.io/kubernetes/pkg/kubelet/kuberuntime" "k8s.io/kubernetes/pkg/kubelet/leaky" serverstats "k8s.io/kubernetes/pkg/kubelet/server/stats" statustest "k8s.io/kubernetes/pkg/kubelet/status/testing" + "k8s.io/kubernetes/pkg/volume" ) func TestFilterTerminatedContainerInfoAndAssembleByPodCgroupKey(t *testing.T) { @@ -510,3 +513,106 @@ func TestCadvisorImagesFsStats(t *testing.T) { assert.Equal(imageFsInfo.Inodes, stats.Inodes) assert.Equal(*imageFsInfo.Inodes-*imageFsInfo.InodesFree, *stats.InodesUsed) } + +func TestCadvisorListPodStatsWhenContainerLogFound(t *testing.T) { + const ( + namespace0 = "test0" + ) + const ( + seedRoot = 0 + seedRuntime = 100 + seedKubelet = 200 + seedMisc = 300 + seedPod0Infra = 1000 + seedPod0Container0 = 0 + seedPod0Container1 = 0 + ) + const ( + pName0 = "pod0" + ) + const ( + cName00 = "c0" + cName01 = "c1" + ) + const ( + rootfsCapacity = uint64(10000000) + rootfsAvailable = uint64(5000000) + rootfsInodesFree = uint64(1000) + rootfsInodes = uint64(2000) + imagefsCapacity = uint64(20000000) + imagefsAvailable = uint64(8000000) + imagefsInodesFree = uint64(2000) + imagefsInodes = uint64(4000) + ) + + prf0 := statsapi.PodReference{Name: pName0, Namespace: namespace0, UID: "UID" + pName0} + infos := map[string]cadvisorapiv2.ContainerInfo{ + "/": getTestContainerInfo(seedRoot, "", "", ""), + "/docker-daemon": getTestContainerInfo(seedRuntime, "", "", ""), + "/kubelet": getTestContainerInfo(seedKubelet, "", "", ""), + "/system": getTestContainerInfo(seedMisc, "", "", ""), + // Pod0 - Namespace0 + "/pod0-i": getTestContainerInfo(seedPod0Infra, pName0, namespace0, leaky.PodInfraContainerName), + "/pod0-c0": getTestContainerInfo(seedPod0Container0, pName0, namespace0, cName00), + "/pod0-c1": getTestContainerInfo(seedPod0Container1, pName0, namespace0, cName01), + } + + containerLogStats0 := makeFakeLogStats(0) + containerLogStats1 := makeFakeLogStats(0) + fakeStats := map[string]*volume.Metrics{ + kuberuntime.BuildContainerLogsDirectory(prf0.Namespace, prf0.Name, types.UID(prf0.UID), cName00): containerLogStats0, + kuberuntime.BuildContainerLogsDirectory(prf0.Namespace, prf0.Name, types.UID(prf0.UID), cName01): containerLogStats1, + } + fakeStatsSlice := []*volume.Metrics{containerLogStats0, containerLogStats1} + fakeOS := &kubecontainertest.FakeOS{} + + freeRootfsInodes := rootfsInodesFree + totalRootfsInodes := rootfsInodes + rootfs := cadvisorapiv2.FsInfo{ + Capacity: rootfsCapacity, + Available: rootfsAvailable, + InodesFree: &freeRootfsInodes, + Inodes: &totalRootfsInodes, + } + + freeImagefsInodes := imagefsInodesFree + totalImagefsInodes := imagefsInodes + imagefs := cadvisorapiv2.FsInfo{ + Capacity: imagefsCapacity, + Available: imagefsAvailable, + InodesFree: &freeImagefsInodes, + Inodes: &totalImagefsInodes, + } + + options := cadvisorapiv2.RequestOptions{ + IdType: cadvisorapiv2.TypeName, + Count: 2, + Recursive: true, + } + + mockCtrl := gomock.NewController(t) + defer mockCtrl.Finish() + + mockCadvisor := cadvisortest.NewMockInterface(mockCtrl) + mockCadvisor.EXPECT().ContainerInfoV2("/", options).Return(infos, nil) + mockCadvisor.EXPECT().RootFsInfo().Return(rootfs, nil) + mockCadvisor.EXPECT().ImagesFsInfo().Return(imagefs, nil) + + mockRuntime := containertest.NewMockRuntime(mockCtrl) + mockRuntime.EXPECT().ImageStats().Return(&kubecontainer.ImageStats{TotalStorageBytes: 123}, nil).AnyTimes() + + volumeStats := serverstats.PodVolumeStats{} + p0Time := metav1.Now() + mockStatus := statustest.NewMockPodStatusProvider(mockCtrl) + mockStatus.EXPECT().GetPodStatus(types.UID("UID"+pName0)).Return(v1.PodStatus{StartTime: &p0Time}, true) + + resourceAnalyzer := &fakeResourceAnalyzer{podVolumeStats: volumeStats} + + p := NewCadvisorStatsProvider(mockCadvisor, resourceAnalyzer, nil, nil, mockRuntime, mockStatus, NewFakeHostStatsProviderWithData(fakeStats, fakeOS)) + pods, err := p.ListPodStats() + assert.NoError(t, err) + + assert.Equal(t, 1, len(pods)) + // Validate Pod0 Results + checkEphemeralStats(t, "Pod0", []int{seedPod0Container0, seedPod0Container1}, nil, fakeStatsSlice, pods[0].EphemeralStorage) +}