From 33c9ce172eccfedb9cf0176f0388aebca643adec Mon Sep 17 00:00:00 2001 From: cola <45722758+xiangpingjiang@users.noreply.github.com> Date: Wed, 5 Jul 2023 13:44:09 +0800 Subject: [PATCH] cloneset ignore maxSurge when UpdateStrategyPaused=true (#1324) * cloneset ignore maxSurge when UpdateStrategyPaused=true Signed-off-by: pingjaing * add scale down UT case for cloneSet UpdateStrategyPaused=true Signed-off-by: pingjaing * add UTs for cloneSet when UpdateStrategyPaused=true Signed-off-by: pingjiang --------- Signed-off-by: pingjaing Signed-off-by: pingjiang --- .../cloneset/sync/cloneset_sync_utils.go | 4 ++ .../cloneset/sync/cloneset_sync_utils_test.go | 62 +++++++++++++++++++ 2 files changed, 66 insertions(+) diff --git a/pkg/controller/cloneset/sync/cloneset_sync_utils.go b/pkg/controller/cloneset/sync/cloneset_sync_utils.go index e9613560de..9a7bd19649 100644 --- a/pkg/controller/cloneset/sync/cloneset_sync_utils.go +++ b/pkg/controller/cloneset/sync/cloneset_sync_utils.go @@ -104,6 +104,10 @@ func calculateDiffsWithExpectation(cs *appsv1alpha1.CloneSet, pods []*v1.Pod, cu } if cs.Spec.UpdateStrategy.MaxSurge != nil { maxSurge, _ = intstrutil.GetValueFromIntOrPercent(cs.Spec.UpdateStrategy.MaxSurge, replicas, true) + if cs.Spec.UpdateStrategy.Paused { + maxSurge = 0 + klog.V(3).Infof("Because CloneSet(%s/%s) updateStrategy.paused=true, and Set maxSurge=0", cs.Namespace, cs.Name) + } } maxUnavailable, _ = intstrutil.GetValueFromIntOrPercent( intstrutil.ValueOrDefault(cs.Spec.UpdateStrategy.MaxUnavailable, intstrutil.FromString(appsv1alpha1.DefaultCloneSetMaxUnavailable)), replicas, maxSurge == 0) diff --git a/pkg/controller/cloneset/sync/cloneset_sync_utils_test.go b/pkg/controller/cloneset/sync/cloneset_sync_utils_test.go index 8f8641254c..50dd0926b5 100644 --- a/pkg/controller/cloneset/sync/cloneset_sync_utils_test.go +++ b/pkg/controller/cloneset/sync/cloneset_sync_utils_test.go @@ -930,6 +930,58 @@ func TestCalculateDiffsWithExpectation(t *testing.T) { isPodUpdate: revision.IsPodUpdate, expectResult: expectationDiffs{scaleUpNum: 1, scaleUpLimit: 1}, }, + { + name: "[UpdateStrategyPaused=true] scale up pods with maxSurge=3,maxUnavailable=0", + set: setUpdateStrategyPaused(createTestCloneSet(5, intstr.FromInt(0), intstr.FromInt(0), intstr.FromInt(3)), true), + pods: []*v1.Pod{ + createTestPod(oldRevision, appspub.LifecycleStateNormal, true, false), + createTestPod(oldRevision, appspub.LifecycleStateNormal, true, false), + createTestPod(oldRevision, appspub.LifecycleStateNormal, true, false), + }, + expectResult: expectationDiffs{scaleUpNum: 2, scaleUpLimit: 2, updateNum: 3, updateMaxUnavailable: -2}, + }, + { + name: "[UpdateStrategyPaused=true] scale down pods with maxSurge=3,maxUnavailable=0", + set: setUpdateStrategyPaused(createTestCloneSet(3, intstr.FromInt(0), intstr.FromInt(0), intstr.FromInt(3)), true), + pods: []*v1.Pod{ + createTestPod(oldRevision, appspub.LifecycleStateNormal, true, false), + createTestPod(oldRevision, appspub.LifecycleStateNormal, true, false), + createTestPod(oldRevision, appspub.LifecycleStateNormal, true, false), + createTestPod(oldRevision, appspub.LifecycleStateNormal, true, false), + createTestPod(oldRevision, appspub.LifecycleStateNormal, true, false), + }, + expectResult: expectationDiffs{scaleDownNum: 2, scaleDownNumOldRevision: 5, deleteReadyLimit: 2, updateNum: 3, updateMaxUnavailable: 2}, + }, + { + name: "[UpdateStrategyPaused=true] create 0 newRevision pods with maxSurge=3,maxUnavailable=0", + set: setUpdateStrategyPaused(createTestCloneSet(5, intstr.FromInt(0), intstr.FromInt(0), intstr.FromInt(3)), true), + pods: []*v1.Pod{ + createTestPod(oldRevision, appspub.LifecycleStateNormal, true, false), + createTestPod(oldRevision, appspub.LifecycleStateNormal, true, false), + createTestPod(oldRevision, appspub.LifecycleStateNormal, true, false), + createTestPod(oldRevision, appspub.LifecycleStateNormal, true, false), + createTestPod(oldRevision, appspub.LifecycleStateNormal, true, false), + createTestPod(newRevision, appspub.LifecycleStateNormal, false, false), + createTestPod(newRevision, appspub.LifecycleStateNormal, false, false), + createTestPod(newRevision, appspub.LifecycleStateNormal, false, false), + }, + expectResult: expectationDiffs{scaleDownNum: 3, scaleDownNumOldRevision: 5, updateNum: 2, updateMaxUnavailable: 3}, + }, + { + name: "[UpdateStrategyPaused=true] create 0 newRevision pods with maxSurge=3,maxUnavailable=0", + set: setUpdateStrategyPaused(createTestCloneSet(5, intstr.FromInt(2), intstr.FromInt(0), intstr.FromInt(3)), true), + pods: []*v1.Pod{ + createTestPod(oldRevision, appspub.LifecycleStateNormal, true, false), + createTestPod(oldRevision, appspub.LifecycleStateNormal, true, false), + createTestPod(oldRevision, appspub.LifecycleStateNormal, true, false), + createTestPod(oldRevision, appspub.LifecycleStateNormal, true, false), + createTestPod(oldRevision, appspub.LifecycleStateNormal, true, false), + createTestPod(newRevision, appspub.LifecycleStateNormal, false, false), + createTestPod(newRevision, appspub.LifecycleStateNormal, false, false), + createTestPod(newRevision, appspub.LifecycleStateNormal, false, false), + }, + expectResult: expectationDiffs{scaleDownNum: 3, scaleDownNumOldRevision: 3}, + }, } defer utilfeature.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.PreparingUpdateAsUpdate, true)() @@ -992,3 +1044,13 @@ func createTestPod(revisionHash string, lifecycleState appspub.LifecycleStateTyp } return pod } + +func setUpdateStrategyPaused(cs *appsv1alpha1.CloneSet, paused bool) *appsv1alpha1.CloneSet { + cs.Spec.UpdateStrategy = appsv1alpha1.CloneSetUpdateStrategy{ + Partition: cs.Spec.UpdateStrategy.Partition, + MaxSurge: cs.Spec.UpdateStrategy.MaxSurge, + MaxUnavailable: cs.Spec.UpdateStrategy.MaxUnavailable, + Paused: paused, + } + return cs +}