From 07c567a8484ce54bfe13052ca4ee122aa5680cc9 Mon Sep 17 00:00:00 2001 From: vinay kulkarni Date: Thu, 16 Mar 2023 10:44:51 +0000 Subject: [PATCH] Add missing unit test for resource resize policy defaulting --- pkg/apis/core/v1/defaults_test.go | 160 ++++++++++++++++++++++++++++++ 1 file changed, 160 insertions(+) diff --git a/pkg/apis/core/v1/defaults_test.go b/pkg/apis/core/v1/defaults_test.go index 5c9688471e3..4e1979c1907 100644 --- a/pkg/apis/core/v1/defaults_test.go +++ b/pkg/apis/core/v1/defaults_test.go @@ -33,6 +33,7 @@ import ( featuregatetesting "k8s.io/component-base/featuregate/testing" "k8s.io/kubernetes/pkg/api/legacyscheme" corev1 "k8s.io/kubernetes/pkg/apis/core/v1" + "k8s.io/kubernetes/pkg/features" utilpointer "k8s.io/utils/pointer" // ensure types are installed @@ -1906,3 +1907,162 @@ func TestSetDefaultServiceInternalTrafficPolicy(t *testing.T) { }) } } + +func TestSetDefaultResizePolicy(t *testing.T) { + // verify we default to NotRequired restart policy for resize when resources are specified + defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.InPlacePodVerticalScaling, true)() + + for desc, tc := range map[string]struct { + testContainer v1.Container + expectedResizePolicy []v1.ContainerResizePolicy + }{ + "CPU and memory limits are specified": { + testContainer: v1.Container{ + Resources: v1.ResourceRequirements{ + Limits: v1.ResourceList{ + v1.ResourceCPU: resource.MustParse("100m"), + v1.ResourceMemory: resource.MustParse("200Mi"), + }, + }, + }, + expectedResizePolicy: []v1.ContainerResizePolicy{ + { + ResourceName: v1.ResourceCPU, + RestartPolicy: v1.NotRequired, + }, + { + ResourceName: v1.ResourceMemory, + RestartPolicy: v1.NotRequired, + }, + }, + }, + "CPU requests are specified": { + testContainer: v1.Container{ + Resources: v1.ResourceRequirements{ + Requests: v1.ResourceList{ + v1.ResourceCPU: resource.MustParse("100m"), + }, + }, + }, + expectedResizePolicy: []v1.ContainerResizePolicy{ + { + ResourceName: v1.ResourceCPU, + RestartPolicy: v1.NotRequired, + }, + }, + }, + "Memory limits are specified": { + testContainer: v1.Container{ + Resources: v1.ResourceRequirements{ + Limits: v1.ResourceList{ + v1.ResourceMemory: resource.MustParse("200Mi"), + }, + }, + }, + expectedResizePolicy: []v1.ContainerResizePolicy{ + { + ResourceName: v1.ResourceMemory, + RestartPolicy: v1.NotRequired, + }, + }, + }, + "No resources are specified": { + testContainer: v1.Container{Name: "besteffort"}, + expectedResizePolicy: nil, + }, + "CPU and memory limits are specified with restartContainer resize policy for memory": { + testContainer: v1.Container{ + Resources: v1.ResourceRequirements{ + Limits: v1.ResourceList{ + v1.ResourceCPU: resource.MustParse("100m"), + v1.ResourceMemory: resource.MustParse("200Mi"), + }, + }, + ResizePolicy: []v1.ContainerResizePolicy{ + { + ResourceName: v1.ResourceMemory, + RestartPolicy: v1.RestartContainer, + }, + }, + }, + expectedResizePolicy: []v1.ContainerResizePolicy{ + { + ResourceName: v1.ResourceMemory, + RestartPolicy: v1.RestartContainer, + }, + { + ResourceName: v1.ResourceCPU, + RestartPolicy: v1.NotRequired, + }, + }, + }, + "CPU requests and memory limits are specified with restartContainer resize policy for CPU": { + testContainer: v1.Container{ + Resources: v1.ResourceRequirements{ + Limits: v1.ResourceList{ + v1.ResourceMemory: resource.MustParse("200Mi"), + }, + Requests: v1.ResourceList{ + v1.ResourceCPU: resource.MustParse("100m"), + }, + }, + ResizePolicy: []v1.ContainerResizePolicy{ + { + ResourceName: v1.ResourceCPU, + RestartPolicy: v1.RestartContainer, + }, + }, + }, + expectedResizePolicy: []v1.ContainerResizePolicy{ + { + ResourceName: v1.ResourceCPU, + RestartPolicy: v1.RestartContainer, + }, + { + ResourceName: v1.ResourceMemory, + RestartPolicy: v1.NotRequired, + }, + }, + }, + "CPU and memory requests are specified with restartContainer resize policy for both": { + testContainer: v1.Container{ + Resources: v1.ResourceRequirements{ + Requests: v1.ResourceList{ + v1.ResourceCPU: resource.MustParse("100m"), + v1.ResourceMemory: resource.MustParse("200Mi"), + }, + }, + ResizePolicy: []v1.ContainerResizePolicy{ + { + ResourceName: v1.ResourceCPU, + RestartPolicy: v1.RestartContainer, + }, + { + ResourceName: v1.ResourceMemory, + RestartPolicy: v1.RestartContainer, + }, + }, + }, + expectedResizePolicy: []v1.ContainerResizePolicy{ + { + ResourceName: v1.ResourceCPU, + RestartPolicy: v1.RestartContainer, + }, + { + ResourceName: v1.ResourceMemory, + RestartPolicy: v1.RestartContainer, + }, + }, + }, + } { + t.Run(desc, func(t *testing.T) { + testPod := v1.Pod{} + testPod.Spec.Containers = append(testPod.Spec.Containers, tc.testContainer) + output := roundTrip(t, runtime.Object(&testPod)) + pod2 := output.(*v1.Pod) + if diff.ObjectDiff(pod2.Spec.Containers[0].ResizePolicy, tc.expectedResizePolicy) != "" { + t.Errorf("expected resize policy %+v, but got %+v", tc.expectedResizePolicy, pod2.Spec.Containers[0].ResizePolicy) + } + }) + } +}