diff --git a/vertical-pod-autoscaler/pkg/admission-controller/resource/pod/recommendation/recommendation_provider.go b/vertical-pod-autoscaler/pkg/admission-controller/resource/pod/recommendation/recommendation_provider.go index 827116d5b053..f7ae5ac759d1 100644 --- a/vertical-pod-autoscaler/pkg/admission-controller/resource/pod/recommendation/recommendation_provider.go +++ b/vertical-pod-autoscaler/pkg/admission-controller/resource/pod/recommendation/recommendation_provider.go @@ -81,6 +81,13 @@ func GetContainersResources(pod *core.Pod, vpaResourcePolicy *vpa_types.PodResou // If the recommendation only contains CPU or Memory (if the VPA was configured this way), we need to make sure we "backfill" the other. // Only do this when the addAll flag is true. if addAll { + if resources[i].Requests == nil { + resources[i].Requests = core.ResourceList{} + } + if resources[i].Limits == nil { + resources[i].Limits = core.ResourceList{} + } + cpuRequest, hasCpuRequest := container.Resources.Requests[core.ResourceCPU] if _, ok := resources[i].Requests[core.ResourceCPU]; !ok && hasCpuRequest { resources[i].Requests[core.ResourceCPU] = cpuRequest diff --git a/vertical-pod-autoscaler/pkg/admission-controller/resource/pod/recommendation/recommendation_provider_test.go b/vertical-pod-autoscaler/pkg/admission-controller/resource/pod/recommendation/recommendation_provider_test.go index eb698e585cd7..8c7809d48821 100644 --- a/vertical-pod-autoscaler/pkg/admission-controller/resource/pod/recommendation/recommendation_provider_test.go +++ b/vertical-pod-autoscaler/pkg/admission-controller/resource/pod/recommendation/recommendation_provider_test.go @@ -423,6 +423,20 @@ func TestGetContainersResources(t *testing.T) { expectedCPULimit: mustParseResourcePointer("20"), addAll: true, }, + { + name: "CPU only recommendation, only CPU request and limit set, ContainerControlledValuesRequestOnly", + container: test.Container().WithName("container"). + WithCPURequest(resource.MustParse("1")). + WithCPULimit(resource.MustParse("10")). + Get(), + vpa: test.VerticalPodAutoscaler().WithContainer("container"). + WithControlledValues("container", vpa_types.ContainerControlledValuesRequestsOnly). + WithTargetResource(apiv1.ResourceCPU, "2"). + Get(), + expectedCPU: mustParseResourcePointer("2"), + expectedCPULimit: mustParseResourcePointer("10"), + addAll: true, + }, { name: "Memory only recommendation, request and limits set", container: test.Container().WithName("container").WithCPURequest(resource.MustParse("1")).WithMemRequest(resource.MustParse("1M")).WithCPULimit(resource.MustParse("10")).WithMemLimit(resource.MustParse("10M")).Get(), @@ -456,6 +470,20 @@ func TestGetContainersResources(t *testing.T) { expectedMemLimit: mustParseResourcePointer("20M"), addAll: true, }, + { + name: "Memory only recommendation, only memory request and limit set, ContainerControlledValuesRequestOnly", + container: test.Container().WithName("container"). + WithMemRequest(resource.MustParse("1M")). + WithMemLimit(resource.MustParse("10M")). + Get(), + vpa: test.VerticalPodAutoscaler().WithContainer("container"). + WithControlledValues("container", vpa_types.ContainerControlledValuesRequestsOnly). + WithTargetResource(apiv1.ResourceMemory, "2M"). + Get(), + expectedMem: mustParseResourcePointer("2M"), + expectedMemLimit: mustParseResourcePointer("10M"), + addAll: true, + }, { name: "CPU and Memory recommendation, request and limits set, addAll false", container: test.Container().WithName("container").WithCPURequest(resource.MustParse("1")).WithMemRequest(resource.MustParse("1M")).WithCPULimit(resource.MustParse("10")).WithMemLimit(resource.MustParse("10M")).Get(),