From 4168425fe642a61cff45767d4a0bb88916e2d753 Mon Sep 17 00:00:00 2001 From: Zijie You <1289941426@qq.com> Date: Wed, 24 Jul 2024 16:30:46 +0800 Subject: [PATCH] update equalResourcesInPlaceFields logic --- .../instanceset/in_place_update_util.go | 20 ++++++++++++++++- .../instanceset/in_place_update_util_test.go | 22 +++++++++++++++++++ 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/pkg/controller/instanceset/in_place_update_util.go b/pkg/controller/instanceset/in_place_update_util.go index 92c78de4f56..140f21441c6 100644 --- a/pkg/controller/instanceset/in_place_update_util.go +++ b/pkg/controller/instanceset/in_place_update_util.go @@ -259,7 +259,10 @@ func equalBasicInPlaceFields(old, new *corev1.Pod) bool { func equalResourcesInPlaceFields(old, new *corev1.Pod) bool { if len(old.Spec.Containers) != len(new.Spec.Containers) { - return false + if len(old.Spec.Containers) < len(new.Spec.Containers) { + return false + } + return isContainerInjected(old.Spec.Containers, new.Spec.Containers) } for _, nc := range new.Spec.Containers { index := slices.IndexFunc(old.Spec.Containers, func(oc corev1.Container) bool { @@ -336,6 +339,21 @@ func getPodUpdatePolicy(its *workloads.InstanceSet, pod *corev1.Pod) (PodUpdateP return NoOpsPolicy, nil } +func isContainerInjected(ocs, ncs []corev1.Container) bool { + for _, nc := range ncs { + index := slices.IndexFunc(ocs, func(oc corev1.Container) bool { + return nc.Name == oc.Name + }) + if index < 0 { + return false + } + if nc.Image != ocs[index].Image { + return false + } + } + return true +} + // IsPodUpdated tells whether the pod's spec is as expected in the InstanceSet. // This function is meant to replace the old fashion `GetPodRevision(pod) == updateRevision`, // as the pod template revision has been redefined in instanceset. diff --git a/pkg/controller/instanceset/in_place_update_util_test.go b/pkg/controller/instanceset/in_place_update_util_test.go index b4fd74d0873..38506823986 100644 --- a/pkg/controller/instanceset/in_place_update_util_test.go +++ b/pkg/controller/instanceset/in_place_update_util_test.go @@ -198,6 +198,28 @@ var _ = Describe("instance util test", func() { policy, err = getPodUpdatePolicy(its, pod5) Expect(err).Should(BeNil()) Expect(policy).Should(Equal(NoOpsPolicy)) + + By("build a pod without revision updated, with IgnorePodVerticalScaling disabled") + pod6 := pod1.DeepCopy() + pod6.Spec.Containers = append(pod6.Spec.Containers, corev1.Container{ + Name: "sidecar1", + Image: "bar2", + Ports: []corev1.ContainerPort{ + { + Name: "my-svc", + Protocol: corev1.ProtocolTCP, + ContainerPort: 54321, + }, + }, + }) + randStr = rand.String(16) + mergeMap(&map[string]string{key: randStr}, &pod6.Annotations) + ignorePodVerticalScaling = viper.GetBool(FeatureGateIgnorePodVerticalScaling) + defer viper.Set(FeatureGateIgnorePodVerticalScaling, ignorePodVerticalScaling) + viper.Set(FeatureGateIgnorePodVerticalScaling, false) + policy, err = getPodUpdatePolicy(its, pod6) + Expect(err).Should(BeNil()) + Expect(policy).Should(Equal(InPlaceUpdatePolicy)) }) }) })