diff --git a/pkg/kubelet/kuberuntime/kuberuntime_container_linux_test.go b/pkg/kubelet/kuberuntime/kuberuntime_container_linux_test.go index 6eae62de3ec..2cbf83bb621 100644 --- a/pkg/kubelet/kuberuntime/kuberuntime_container_linux_test.go +++ b/pkg/kubelet/kuberuntime/kuberuntime_container_linux_test.go @@ -809,12 +809,13 @@ func TestGenerateLinuxContainerResources(t *testing.T) { } for _, tc := range []struct { - name string - scalingFg bool - limits v1.ResourceList - requests v1.ResourceList - cStatus []v1.ContainerStatus - expected *runtimeapi.LinuxContainerResources + name string + scalingFg bool + limits v1.ResourceList + requests v1.ResourceList + cStatus []v1.ContainerStatus + expected *runtimeapi.LinuxContainerResources + cgroupVersion CgroupVersion }{ { "requests & limits, cpu & memory, guaranteed qos - no container status", @@ -823,6 +824,7 @@ func TestGenerateLinuxContainerResources(t *testing.T) { v1.ResourceList{v1.ResourceCPU: resource.MustParse("250m"), v1.ResourceMemory: resource.MustParse("500Mi")}, []v1.ContainerStatus{}, &runtimeapi.LinuxContainerResources{CpuShares: 256, MemoryLimitInBytes: 524288000, OomScoreAdj: -997}, + cgroupV1, }, { "requests & limits, cpu & memory, burstable qos - no container status", @@ -831,6 +833,7 @@ func TestGenerateLinuxContainerResources(t *testing.T) { v1.ResourceList{v1.ResourceCPU: resource.MustParse("250m"), v1.ResourceMemory: resource.MustParse("500Mi")}, []v1.ContainerStatus{}, &runtimeapi.LinuxContainerResources{CpuShares: 256, MemoryLimitInBytes: 786432000, OomScoreAdj: 970}, + cgroupV1, }, { "best-effort qos - no container status", @@ -839,6 +842,7 @@ func TestGenerateLinuxContainerResources(t *testing.T) { nil, []v1.ContainerStatus{}, &runtimeapi.LinuxContainerResources{CpuShares: 2, OomScoreAdj: 1000}, + cgroupV1, }, { "requests & limits, cpu & memory, guaranteed qos - empty resources container status", @@ -847,6 +851,7 @@ func TestGenerateLinuxContainerResources(t *testing.T) { v1.ResourceList{v1.ResourceCPU: resource.MustParse("250m"), v1.ResourceMemory: resource.MustParse("500Mi")}, []v1.ContainerStatus{{Name: "c1"}}, &runtimeapi.LinuxContainerResources{CpuShares: 256, MemoryLimitInBytes: 524288000, OomScoreAdj: -997}, + cgroupV1, }, { "requests & limits, cpu & memory, burstable qos - empty resources container status", @@ -855,6 +860,7 @@ func TestGenerateLinuxContainerResources(t *testing.T) { v1.ResourceList{v1.ResourceCPU: resource.MustParse("250m"), v1.ResourceMemory: resource.MustParse("500Mi")}, []v1.ContainerStatus{{Name: "c1"}}, &runtimeapi.LinuxContainerResources{CpuShares: 256, MemoryLimitInBytes: 786432000, OomScoreAdj: 999}, + cgroupV1, }, { "best-effort qos - empty resources container status", @@ -863,6 +869,7 @@ func TestGenerateLinuxContainerResources(t *testing.T) { nil, []v1.ContainerStatus{{Name: "c1"}}, &runtimeapi.LinuxContainerResources{CpuShares: 2, OomScoreAdj: 1000}, + cgroupV1, }, { "requests & limits, cpu & memory, guaranteed qos - container status with allocatedResources", @@ -876,6 +883,7 @@ func TestGenerateLinuxContainerResources(t *testing.T) { }, }, &runtimeapi.LinuxContainerResources{CpuShares: 204, MemoryLimitInBytes: 524288000, OomScoreAdj: -997}, + cgroupV1, }, { "requests & limits, cpu & memory, burstable qos - container status with allocatedResources", @@ -889,6 +897,7 @@ func TestGenerateLinuxContainerResources(t *testing.T) { }, }, &runtimeapi.LinuxContainerResources{CpuShares: 256, MemoryLimitInBytes: 786432000, OomScoreAdj: 970}, + cgroupV1, }, { "requests & limits, cpu & memory, guaranteed qos - no container status", @@ -897,6 +906,7 @@ func TestGenerateLinuxContainerResources(t *testing.T) { v1.ResourceList{v1.ResourceCPU: resource.MustParse("250m"), v1.ResourceMemory: resource.MustParse("500Mi")}, []v1.ContainerStatus{}, &runtimeapi.LinuxContainerResources{CpuShares: 256, MemoryLimitInBytes: 524288000, OomScoreAdj: -997}, + cgroupV1, }, { "requests & limits, cpu & memory, burstable qos - container status with allocatedResources", @@ -910,6 +920,7 @@ func TestGenerateLinuxContainerResources(t *testing.T) { }, }, &runtimeapi.LinuxContainerResources{CpuShares: 256, MemoryLimitInBytes: 786432000, OomScoreAdj: 970}, + cgroupV1, }, { "requests & limits, cpu & memory, guaranteed qos - container status with allocatedResources", @@ -923,6 +934,7 @@ func TestGenerateLinuxContainerResources(t *testing.T) { }, }, &runtimeapi.LinuxContainerResources{CpuShares: 204, MemoryLimitInBytes: 524288000, OomScoreAdj: -997}, + cgroupV1, }, { "best-effort qos - no container status", @@ -931,6 +943,135 @@ func TestGenerateLinuxContainerResources(t *testing.T) { nil, []v1.ContainerStatus{}, &runtimeapi.LinuxContainerResources{CpuShares: 2, OomScoreAdj: 1000}, + cgroupV1, + }, + { + "requests & limits, cpu & memory, guaranteed qos - no container status", + true, + v1.ResourceList{v1.ResourceCPU: resource.MustParse("250m"), v1.ResourceMemory: resource.MustParse("500Mi")}, + v1.ResourceList{v1.ResourceCPU: resource.MustParse("250m"), v1.ResourceMemory: resource.MustParse("500Mi")}, + []v1.ContainerStatus{}, + &runtimeapi.LinuxContainerResources{CpuShares: 256, MemoryLimitInBytes: 524288000, OomScoreAdj: -997, Unified: map[string]string{"memory.oom.group": "1"}}, + cgroupV2, + }, + { + "requests & limits, cpu & memory, burstable qos - no container status", + true, + v1.ResourceList{v1.ResourceCPU: resource.MustParse("500m"), v1.ResourceMemory: resource.MustParse("750Mi")}, + v1.ResourceList{v1.ResourceCPU: resource.MustParse("250m"), v1.ResourceMemory: resource.MustParse("500Mi")}, + []v1.ContainerStatus{}, + &runtimeapi.LinuxContainerResources{CpuShares: 256, MemoryLimitInBytes: 786432000, OomScoreAdj: 970, Unified: map[string]string{"memory.oom.group": "1"}}, + cgroupV2, + }, + { + "best-effort qos - no container status", + true, + nil, + nil, + []v1.ContainerStatus{}, + &runtimeapi.LinuxContainerResources{CpuShares: 2, OomScoreAdj: 1000, Unified: map[string]string{"memory.oom.group": "1"}}, + cgroupV2, + }, + { + "requests & limits, cpu & memory, guaranteed qos - empty resources container status", + true, + v1.ResourceList{v1.ResourceCPU: resource.MustParse("250m"), v1.ResourceMemory: resource.MustParse("500Mi")}, + v1.ResourceList{v1.ResourceCPU: resource.MustParse("250m"), v1.ResourceMemory: resource.MustParse("500Mi")}, + []v1.ContainerStatus{{Name: "c1"}}, + &runtimeapi.LinuxContainerResources{CpuShares: 256, MemoryLimitInBytes: 524288000, OomScoreAdj: -997, Unified: map[string]string{"memory.oom.group": "1"}}, + cgroupV2, + }, + { + "requests & limits, cpu & memory, burstable qos - empty resources container status", + true, + v1.ResourceList{v1.ResourceCPU: resource.MustParse("500m"), v1.ResourceMemory: resource.MustParse("750Mi")}, + v1.ResourceList{v1.ResourceCPU: resource.MustParse("250m"), v1.ResourceMemory: resource.MustParse("500Mi")}, + []v1.ContainerStatus{{Name: "c1"}}, + &runtimeapi.LinuxContainerResources{CpuShares: 256, MemoryLimitInBytes: 786432000, OomScoreAdj: 999, Unified: map[string]string{"memory.oom.group": "1"}}, + cgroupV2, + }, + { + "best-effort qos - empty resources container status", + true, + nil, + nil, + []v1.ContainerStatus{{Name: "c1"}}, + &runtimeapi.LinuxContainerResources{CpuShares: 2, OomScoreAdj: 1000, Unified: map[string]string{"memory.oom.group": "1"}}, + cgroupV2, + }, + { + "requests & limits, cpu & memory, guaranteed qos - container status with allocatedResources", + true, + v1.ResourceList{v1.ResourceCPU: resource.MustParse("200m"), v1.ResourceMemory: resource.MustParse("500Mi")}, + v1.ResourceList{v1.ResourceCPU: resource.MustParse("200m"), v1.ResourceMemory: resource.MustParse("500Mi")}, + []v1.ContainerStatus{ + { + Name: "c1", + AllocatedResources: v1.ResourceList{v1.ResourceCPU: resource.MustParse("200m"), v1.ResourceMemory: resource.MustParse("500Mi")}, + }, + }, + &runtimeapi.LinuxContainerResources{CpuShares: 204, MemoryLimitInBytes: 524288000, OomScoreAdj: -997, Unified: map[string]string{"memory.oom.group": "1"}}, + cgroupV2, + }, + { + "requests & limits, cpu & memory, burstable qos - container status with allocatedResources", + true, + v1.ResourceList{v1.ResourceCPU: resource.MustParse("500m"), v1.ResourceMemory: resource.MustParse("750Mi")}, + v1.ResourceList{v1.ResourceCPU: resource.MustParse("250m"), v1.ResourceMemory: resource.MustParse("500Mi")}, + []v1.ContainerStatus{ + { + Name: "c1", + AllocatedResources: v1.ResourceList{v1.ResourceCPU: resource.MustParse("250m"), v1.ResourceMemory: resource.MustParse("500Mi")}, + }, + }, + &runtimeapi.LinuxContainerResources{CpuShares: 256, MemoryLimitInBytes: 786432000, OomScoreAdj: 970, Unified: map[string]string{"memory.oom.group": "1"}}, + cgroupV2, + }, + { + "requests & limits, cpu & memory, guaranteed qos - no container status", + false, + v1.ResourceList{v1.ResourceCPU: resource.MustParse("250m"), v1.ResourceMemory: resource.MustParse("500Mi")}, + v1.ResourceList{v1.ResourceCPU: resource.MustParse("250m"), v1.ResourceMemory: resource.MustParse("500Mi")}, + []v1.ContainerStatus{}, + &runtimeapi.LinuxContainerResources{CpuShares: 256, MemoryLimitInBytes: 524288000, OomScoreAdj: -997, Unified: map[string]string{"memory.oom.group": "1"}}, + cgroupV2, + }, + { + "requests & limits, cpu & memory, burstable qos - container status with allocatedResources", + false, + v1.ResourceList{v1.ResourceCPU: resource.MustParse("500m"), v1.ResourceMemory: resource.MustParse("750Mi")}, + v1.ResourceList{v1.ResourceCPU: resource.MustParse("250m"), v1.ResourceMemory: resource.MustParse("500Mi")}, + []v1.ContainerStatus{ + { + Name: "c1", + AllocatedResources: v1.ResourceList{v1.ResourceCPU: resource.MustParse("250m"), v1.ResourceMemory: resource.MustParse("500Mi")}, + }, + }, + &runtimeapi.LinuxContainerResources{CpuShares: 256, MemoryLimitInBytes: 786432000, OomScoreAdj: 970, Unified: map[string]string{"memory.oom.group": "1"}}, + cgroupV2, + }, + { + "requests & limits, cpu & memory, guaranteed qos - container status with allocatedResources", + false, + v1.ResourceList{v1.ResourceCPU: resource.MustParse("200m"), v1.ResourceMemory: resource.MustParse("500Mi")}, + v1.ResourceList{v1.ResourceCPU: resource.MustParse("200m"), v1.ResourceMemory: resource.MustParse("500Mi")}, + []v1.ContainerStatus{ + { + Name: "c1", + AllocatedResources: v1.ResourceList{v1.ResourceCPU: resource.MustParse("200m"), v1.ResourceMemory: resource.MustParse("500Mi")}, + }, + }, + &runtimeapi.LinuxContainerResources{CpuShares: 204, MemoryLimitInBytes: 524288000, OomScoreAdj: -997, Unified: map[string]string{"memory.oom.group": "1"}}, + cgroupV2, + }, + { + "best-effort qos - no container status", + false, + nil, + nil, + []v1.ContainerStatus{}, + &runtimeapi.LinuxContainerResources{CpuShares: 2, OomScoreAdj: 1000, Unified: map[string]string{"memory.oom.group": "1"}}, + cgroupV2, }, } { t.Run(tc.name, func(t *testing.T) { @@ -938,8 +1079,7 @@ func TestGenerateLinuxContainerResources(t *testing.T) { if tc.scalingFg { featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.InPlacePodVerticalScaling, true) } - - setCgroupVersionDuringTest(cgroupV1) + setCgroupVersionDuringTest(tc.cgroupVersion) pod.Spec.Containers[0].Resources = v1.ResourceRequirements{Limits: tc.limits, Requests: tc.requests} if len(tc.cStatus) > 0 { @@ -952,7 +1092,6 @@ func TestGenerateLinuxContainerResources(t *testing.T) { } }) } - //TODO(vinaykul,InPlacePodVerticalScaling): Add unit tests for cgroup v1 & v2 } func TestGenerateLinuxContainerResourcesWithSwap(t *testing.T) {