diff --git a/pkg/api/pod/util.go b/pkg/api/pod/util.go index 1d1a211a28e..2e425c93cd5 100644 --- a/pkg/api/pod/util.go +++ b/pkg/api/pod/util.go @@ -1255,6 +1255,11 @@ func hasInvalidLabelValueInAffinitySelector(spec *api.PodSpec) bool { } func MarkPodProposedForResize(oldPod, newPod *api.Pod) { + if len(newPod.Spec.Containers) != len(oldPod.Spec.Containers) { + // Update is invalid: ignore changes and let validation handle it + return + } + for i, c := range newPod.Spec.Containers { if c.Resources.Requests == nil { continue diff --git a/pkg/api/pod/util_test.go b/pkg/api/pod/util_test.go index c94005283a4..a99deac1a4c 100644 --- a/pkg/api/pod/util_test.go +++ b/pkg/api/pod/util_test.go @@ -3036,6 +3036,189 @@ func TestMarkPodProposedForResize(t *testing.T) { }, }, }, + { + desc: "the number of containers in the pod has increased; no action should be taken.", + newPod: &api.Pod{ + Spec: api.PodSpec{ + Containers: []api.Container{ + { + Name: "c1", + Image: "image", + Resources: api.ResourceRequirements{ + Requests: api.ResourceList{api.ResourceCPU: resource.MustParse("100m")}, + Limits: api.ResourceList{api.ResourceCPU: resource.MustParse("200m")}, + }, + }, + { + Name: "c2", + Image: "image", + Resources: api.ResourceRequirements{ + Requests: api.ResourceList{api.ResourceCPU: resource.MustParse("300m")}, + Limits: api.ResourceList{api.ResourceCPU: resource.MustParse("400m")}, + }, + }, + }, + }, + Status: api.PodStatus{ + ContainerStatuses: []api.ContainerStatus{ + { + Name: "c1", + Image: "image", + AllocatedResources: api.ResourceList{api.ResourceCPU: resource.MustParse("100m")}, + }, + { + Name: "c2", + Image: "image", + AllocatedResources: api.ResourceList{api.ResourceCPU: resource.MustParse("200m")}, + }, + }, + }, + }, + oldPod: &api.Pod{ + Spec: api.PodSpec{ + Containers: []api.Container{ + { + Name: "c1", + Image: "image", + Resources: api.ResourceRequirements{ + Requests: api.ResourceList{api.ResourceCPU: resource.MustParse("100m")}, + Limits: api.ResourceList{api.ResourceCPU: resource.MustParse("200m")}, + }, + }, + }, + }, + Status: api.PodStatus{ + ContainerStatuses: []api.ContainerStatus{ + { + Name: "c1", + Image: "image", + AllocatedResources: api.ResourceList{api.ResourceCPU: resource.MustParse("100m")}, + }, + }, + }, + }, + expectedPod: &api.Pod{ + Spec: api.PodSpec{ + Containers: []api.Container{ + { + Name: "c1", + Image: "image", + Resources: api.ResourceRequirements{ + Requests: api.ResourceList{api.ResourceCPU: resource.MustParse("100m")}, + Limits: api.ResourceList{api.ResourceCPU: resource.MustParse("200m")}, + }, + }, + { + Name: "c2", + Image: "image", + Resources: api.ResourceRequirements{ + Requests: api.ResourceList{api.ResourceCPU: resource.MustParse("300m")}, + Limits: api.ResourceList{api.ResourceCPU: resource.MustParse("400m")}, + }, + }, + }, + }, + Status: api.PodStatus{ + ContainerStatuses: []api.ContainerStatus{ + { + Name: "c1", + Image: "image", + AllocatedResources: api.ResourceList{api.ResourceCPU: resource.MustParse("100m")}, + }, + { + Name: "c2", + Image: "image", + AllocatedResources: api.ResourceList{api.ResourceCPU: resource.MustParse("200m")}, + }, + }, + }, + }, + }, + { + desc: "the number of containers in the pod has decreased; no action should be taken.", + newPod: &api.Pod{ + Spec: api.PodSpec{ + Containers: []api.Container{ + { + Name: "c1", + Image: "image", + Resources: api.ResourceRequirements{ + Requests: api.ResourceList{api.ResourceCPU: resource.MustParse("100m")}, + Limits: api.ResourceList{api.ResourceCPU: resource.MustParse("200m")}, + }, + }, + }, + }, + Status: api.PodStatus{ + ContainerStatuses: []api.ContainerStatus{ + { + Name: "c1", + Image: "image", + AllocatedResources: api.ResourceList{api.ResourceCPU: resource.MustParse("100m")}, + }, + }, + }, + }, + oldPod: &api.Pod{ + Spec: api.PodSpec{ + Containers: []api.Container{ + { + Name: "c1", + Image: "image", + Resources: api.ResourceRequirements{ + Requests: api.ResourceList{api.ResourceCPU: resource.MustParse("100m")}, + Limits: api.ResourceList{api.ResourceCPU: resource.MustParse("200m")}, + }, + }, + { + Name: "c2", + Image: "image", + Resources: api.ResourceRequirements{ + Requests: api.ResourceList{api.ResourceCPU: resource.MustParse("200m")}, + Limits: api.ResourceList{api.ResourceCPU: resource.MustParse("300m")}, + }, + }, + }, + }, + Status: api.PodStatus{ + ContainerStatuses: []api.ContainerStatus{ + { + Name: "c1", + Image: "image", + AllocatedResources: api.ResourceList{api.ResourceCPU: resource.MustParse("100m")}, + }, + { + Name: "c2", + Image: "image", + AllocatedResources: api.ResourceList{api.ResourceCPU: resource.MustParse("200m")}, + }, + }, + }, + }, + expectedPod: &api.Pod{ + Spec: api.PodSpec{ + Containers: []api.Container{ + { + Name: "c1", + Image: "image", + Resources: api.ResourceRequirements{ + Requests: api.ResourceList{api.ResourceCPU: resource.MustParse("100m")}, + Limits: api.ResourceList{api.ResourceCPU: resource.MustParse("200m")}, + }, + }, + }, + }, + Status: api.PodStatus{ + ContainerStatuses: []api.ContainerStatus{ + { + Name: "c1", + Image: "image", + AllocatedResources: api.ResourceList{api.ResourceCPU: resource.MustParse("100m")}, + }, + }, + }, + }, + }, } for _, tc := range testCases { t.Run(tc.desc, func(t *testing.T) {