diff --git a/pkg/controller/cloneset/sync/cloneset_scale.go b/pkg/controller/cloneset/sync/cloneset_scale.go index fb56c9a0fb..c039f9963e 100644 --- a/pkg/controller/cloneset/sync/cloneset_scale.go +++ b/pkg/controller/cloneset/sync/cloneset_scale.go @@ -70,17 +70,16 @@ func (r *realControl) Scale( // 2. calculate scale numbers diffRes := calculateDiffsWithExpectation(updateCS, pods, currentRevision, updateRevision, revision.IsPodUpdate) updatedPods, notUpdatedPods := clonesetutils.GroupUpdateAndNotUpdatePods(pods, updateRevision) - - if diffRes.scaleUpNum > diffRes.scaleUpLimit { - r.recorder.Event(updateCS, v1.EventTypeWarning, "ScaleUpLimited", fmt.Sprintf("scaleUp is limited because of scaleStrategy.maxUnavailable, limit: %d", diffRes.scaleUpLimit)) + if diffRes.ScaleUpNum > diffRes.ScaleUpLimit { + r.recorder.Event(updateCS, v1.EventTypeWarning, "ScaleUpLimited", fmt.Sprintf("scaleUp is limited because of scaleStrategy.maxUnavailable, limit: %d", diffRes.ScaleUpLimit)) } // 3. scale out - if diffRes.scaleUpNum > 0 { + if diffRes.ScaleUpNum > 0 { // total number of this creation - expectedCreations := diffRes.scaleUpLimit + expectedCreations := diffRes.ScaleUpLimit // lack number of current version - expectedCurrentCreations := diffRes.scaleUpNumOldRevision + expectedCurrentCreations := diffRes.ScaleUpNumOldRevision klog.V(3).InfoS("CloneSet began to scale out pods, including current revision", "cloneSet", klog.KObj(updateCS), "expectedCreations", expectedCreations, "expectedCurrentCreations", expectedCurrentCreations) @@ -108,16 +107,16 @@ func (r *realControl) Scale( // 5. specified delete if podsToDelete := util.DiffPods(podsSpecifiedToDelete, podsInPreDelete); len(podsToDelete) > 0 { newPodsToDelete, oldPodsToDelete := clonesetutils.GroupUpdateAndNotUpdatePods(podsToDelete, updateRevision) - klog.V(3).InfoS("CloneSet tried to delete pods specified", "cloneSet", klog.KObj(updateCS), "deleteReadyLimit", diffRes.deleteReadyLimit, + klog.V(3).InfoS("CloneSet tried to delete pods specified", "cloneSet", klog.KObj(updateCS), "DeleteReadyLimit", diffRes.DeleteReadyLimit, "newPods", util.GetPodNames(newPodsToDelete).List(), "oldPods", util.GetPodNames(oldPodsToDelete).List()) podsCanDelete := make([]*v1.Pod, 0, len(podsToDelete)) for _, pod := range podsToDelete { - if !isPodReady(coreControl, pod) { + if !isPodReady(coreControl, pod, updateCS.Spec.MinReadySeconds) { podsCanDelete = append(podsCanDelete, pod) - } else if diffRes.deleteReadyLimit > 0 { + } else if diffRes.DeleteReadyLimit > 0 { podsCanDelete = append(podsCanDelete, pod) - diffRes.deleteReadyLimit-- + diffRes.DeleteReadyLimit-- } } @@ -127,24 +126,24 @@ func (r *realControl) Scale( } // 6. scale in - if diffRes.scaleDownNum > 0 { + if diffRes.ScaleDownNum > 0 { if numToDelete > 0 { - klog.V(3).InfoS("CloneSet skipped to scale in for deletion", "cloneSet", klog.KObj(updateCS), "scaleDownNum", diffRes.scaleDownNum, + klog.V(3).InfoS("CloneSet skipped to scale in for deletion", "cloneSet", klog.KObj(updateCS), "ScaleDownNum", diffRes.ScaleDownNum, "numToDelete", numToDelete, "specifiedToDelete", len(podsSpecifiedToDelete), "preDelete", len(podsInPreDelete)) return false, nil } - klog.V(3).InfoS("CloneSet began to scale in", "cloneSet", klog.KObj(updateCS), "scaleDownNum", diffRes.scaleDownNum, - "oldRevision", diffRes.scaleDownNumOldRevision, "deleteReadyLimit", diffRes.deleteReadyLimit) + klog.V(3).InfoS("CloneSet began to scale in", "cloneSet", klog.KObj(updateCS), "ScaleDownNum", diffRes.ScaleDownNum, + "oldRevision", diffRes.ScaleDownNumOldRevision, "DeleteReadyLimit", diffRes.DeleteReadyLimit) - podsPreparingToDelete := r.choosePodsToDelete(updateCS, diffRes.scaleDownNum, diffRes.scaleDownNumOldRevision, notUpdatedPods, updatedPods) + podsPreparingToDelete := r.choosePodsToDelete(updateCS, diffRes.ScaleDownNum, diffRes.ScaleDownNumOldRevision, notUpdatedPods, updatedPods) podsToDelete := make([]*v1.Pod, 0, len(podsPreparingToDelete)) for _, pod := range podsPreparingToDelete { - if !isPodReady(coreControl, pod) { + if !isPodReady(coreControl, pod, updateCS.Spec.MinReadySeconds) { podsToDelete = append(podsToDelete, pod) - } else if diffRes.deleteReadyLimit > 0 { + } else if diffRes.DeleteReadyLimit > 0 { podsToDelete = append(podsToDelete, pod) - diffRes.deleteReadyLimit-- + diffRes.DeleteReadyLimit-- } } diff --git a/pkg/controller/cloneset/sync/cloneset_sync_utils.go b/pkg/controller/cloneset/sync/cloneset_sync_utils.go index ee7014735e..fd88fd27a3 100644 --- a/pkg/controller/cloneset/sync/cloneset_sync_utils.go +++ b/pkg/controller/cloneset/sync/cloneset_sync_utils.go @@ -49,39 +49,39 @@ var ( ) type expectationDiffs struct { - // scaleUpNum is a non-negative integer, which indicates the number that should scale up. - scaleUpNum int + // ScaleUpNum is a non-negative integer, which indicates the number that should scale up. + ScaleUpNum int `json:"scaleUpNum"` // scaleNumOldRevision is a non-negative integer, which indicates the number of old revision Pods that should scale up. - // It might be bigger than scaleUpNum, but controller will scale up at most scaleUpNum number of Pods. - scaleUpNumOldRevision int - // scaleDownNum is a non-negative integer, which indicates the number that should scale down. + // It might be bigger than ScaleUpNum, but controller will scale up at most ScaleUpNum number of Pods. + ScaleUpNumOldRevision int `json:"scaleUpNumOldRevision"` + // ScaleDownNum is a non-negative integer, which indicates the number that should scale down. // It has excluded the number of Pods that are already specified to delete. - scaleDownNum int - // scaleDownNumOldRevision is a non-negative integer, which indicates the number of old revision Pods that should scale down. - // It might be bigger than scaleDownNum, but controller will scale down at most scaleDownNum number of Pods. + ScaleDownNum int `json:"scaleDownNum"` + // ScaleDownNumOldRevision is a non-negative integer, which indicates the number of old revision Pods that should scale down. + // It might be bigger than ScaleDownNum, but controller will scale down at most ScaleDownNum number of Pods. // It has excluded the number of old Pods that are already specified to delete. - scaleDownNumOldRevision int + ScaleDownNumOldRevision int `json:"scaleDownNumOldRevision"` - // scaleUpLimit is the limit number of creating Pods when scaling up + // ScaleUpLimit is the limit number of creating Pods when scaling up // it is limited by scaleStrategy.maxUnavailable - scaleUpLimit int - // deleteReadyLimit is the limit number of ready Pods that can be deleted + ScaleUpLimit int `json:"scaleUpLimit"` + // DeleteReadyLimit is the limit number of ready Pods that can be deleted // it is limited by UpdateStrategy.maxUnavailable - deleteReadyLimit int + DeleteReadyLimit int `json:"deleteReadyLimit"` - // useSurge is the number that temporarily expect to be above the desired replicas - useSurge int - // useSurgeOldRevision is part of the useSurge number + // UseSurge is the number that temporarily expect to be above the desired replicas + UseSurge int `json:"useSurge"` + // UseSurgeOldRevision is part of the UseSurge number // it indicates the above number of old revision Pods - useSurgeOldRevision int + UseSurgeOldRevision int `json:"useSurgeOldRevision"` - // updateNum is the diff number that should update + // UpdateNum is the diff number that should update // '0' means no need to update // positive number means need to update more Pods to updateRevision // negative number means need to update more Pods to currentRevision (rollback) - updateNum int - // updateMaxUnavailable is the maximum number of ready Pods that can be updating - updateMaxUnavailable int + UpdateNum int `json:"updateNum"` + // UpdateMaxUnavailable is the maximum number of ready Pods that can be updating + UpdateMaxUnavailable int `json:"updateMaxUnavailable"` } func (e expectationDiffs) isEmpty() bool { @@ -131,7 +131,7 @@ func calculateDiffsWithExpectation(cs *appsv1alpha1.CloneSet, pods []*v1.Pod, cu } klog.V(1).InfoS("Calculate diffs for CloneSet", "cloneSet", klog.KObj(cs), "replicas", replicas, "partition", partition, "maxSurge", maxSurge, "maxUnavailable", maxUnavailable, "allPodCount", len(pods), "newRevisionCount", newRevisionCount, - "newRevisionActiveCount", newRevisionActiveCount, "oldrevisionCount", oldRevisionCount, "oldRevisionActiveCount", oldRevisionActiveCount, + "newRevisionActiveCount", newRevisionActiveCount, "oldRevisionCount", oldRevisionCount, "oldRevisionActiveCount", oldRevisionActiveCount, "unavailableNewRevisionCount", unavailableNewRevisionCount, "unavailableOldRevisionCount", unavailableOldRevisionCount, "preDeletingNewRevisionCount", preDeletingNewRevisionCount, "preDeletingOldRevisionCount", preDeletingOldRevisionCount, "toDeleteNewRevisionCount", toDeleteNewRevisionCount, "toDeleteOldRevisionCount", toDeleteOldRevisionCount, @@ -210,15 +210,22 @@ func calculateDiffsWithExpectation(cs *appsv1alpha1.CloneSet, pods []*v1.Pod, cu // Use surge for old and new revision updating var updateSurge, updateOldRevisionSurge int - if util.IsIntPlusAndMinus(updateOldDiff, updateNewDiff) { + // TODO delete the comments when released + if util.IsIntPlusAndMinus(updateOldDiff, updateNewDiff) || (updateNewDiff == 0 && unavailableNewRevisionCount > 0) { if util.IntAbs(updateOldDiff) <= util.IntAbs(updateNewDiff) { + // 要删的旧 Pod <= 要建的新 Pod,允许建最多要删除旧 Pod 数量的新 Pod(100%,后面会用 maxSurge 限制) updateSurge = util.IntAbs(updateOldDiff) if updateOldDiff < 0 { + // 如果要建旧 Pod,允许新增要新建数量的旧 Pod updateOldRevisionSurge = updateSurge } } else { - updateSurge = util.IntAbs(updateNewDiff) + // 要删的旧 Pod > 要建的新 Pod,不允许再新建 Pod,等待后面删除旧 Pod + //updateSurge = util.IntAbs(updateNewDiff) + // => 改为无论如何都允许新建旧 Pod 数量的新 Pod + updateSurge = util.IntAbs(updateOldDiff) if updateNewDiff > 0 { + // 如果要删新 Pod,保留相等数量的旧 Pod updateOldRevisionSurge = updateSurge } } @@ -226,11 +233,12 @@ func calculateDiffsWithExpectation(cs *appsv1alpha1.CloneSet, pods []*v1.Pod, cu // It is because the controller is designed not to do scale and update in once reconcile if scaleSurge >= updateSurge { - res.useSurge = integer.IntMin(maxSurge, scaleSurge) - res.useSurgeOldRevision = integer.IntMin(res.useSurge, scaleOldRevisionSurge) + res.UseSurge = integer.IntMin(maxSurge, scaleSurge) + res.UseSurgeOldRevision = integer.IntMin(res.UseSurge, scaleOldRevisionSurge) } else { - res.useSurge = integer.IntMin(maxSurge, updateSurge) - res.useSurgeOldRevision = integer.IntMin(res.useSurge, updateOldRevisionSurge) + res.UseSurge = integer.IntMin(maxSurge, updateSurge) + res.UseSurgeOldRevision = integer.IntMin(res.UseSurge, updateOldRevisionSurge) + res.UseSurgeOldRevision = integer.IntMin(res.UseSurgeOldRevision+unavailableNewRevisionCount, oldRevisionActiveCount-partition) } } @@ -241,35 +249,35 @@ func calculateDiffsWithExpectation(cs *appsv1alpha1.CloneSet, pods []*v1.Pod, cu currentTotalCount = currentTotalCount - preDeletingOldRevisionCount - preDeletingNewRevisionCount currentTotalOldCount = currentTotalOldCount - preDeletingOldRevisionCount } - expectedTotalCount := replicas + res.useSurge - expectedTotalOldCount := partition + res.useSurgeOldRevision + expectedTotalCount := replicas + res.UseSurge + expectedTotalOldCount := partition + res.UseSurgeOldRevision // scale up if num := expectedTotalCount - currentTotalCount; num > 0 { - res.scaleUpNum = num - res.scaleUpNumOldRevision = integer.IntMax(expectedTotalOldCount-currentTotalOldCount, 0) + res.ScaleUpNum = num + res.ScaleUpNumOldRevision = integer.IntMax(expectedTotalOldCount-currentTotalOldCount, 0) - res.scaleUpLimit = integer.IntMin(res.scaleUpNum, integer.IntMax(scaleMaxUnavailable-totalUnavailable, 0)) + res.ScaleUpLimit = integer.IntMin(res.ScaleUpNum, integer.IntMax(scaleMaxUnavailable-totalUnavailable, 0)) } // scale down // Note that this should exclude the number of Pods that are already specified to delete. if num := currentTotalCount - toDeleteOldRevisionCount - toDeleteNewRevisionCount - expectedTotalCount; num > 0 { - res.scaleDownNum = num - res.scaleDownNumOldRevision = integer.IntMax(currentTotalOldCount-toDeleteOldRevisionCount-expectedTotalOldCount, 0) + res.ScaleDownNum = num + res.ScaleDownNumOldRevision = integer.IntMax(currentTotalOldCount-toDeleteOldRevisionCount-expectedTotalOldCount, 0) } - if toDeleteNewRevisionCount > 0 || toDeleteOldRevisionCount > 0 || res.scaleDownNum > 0 { - res.deleteReadyLimit = integer.IntMax(maxUnavailable+(len(pods)-replicas)-totalUnavailable, 0) + if toDeleteNewRevisionCount > 0 || toDeleteOldRevisionCount > 0 || res.ScaleDownNum > 0 { + res.DeleteReadyLimit = integer.IntMax(maxUnavailable+(len(pods)-replicas)-totalUnavailable, 0) } // The consistency between scale and update will be guaranteed by syncCloneSet and expectations if util.IntAbs(updateOldDiff) <= util.IntAbs(updateNewDiff) { - res.updateNum = updateOldDiff + res.UpdateNum = updateOldDiff } else { - res.updateNum = 0 - updateNewDiff + res.UpdateNum = 0 - updateNewDiff } - if res.updateNum != 0 { - res.updateMaxUnavailable = maxUnavailable + len(pods) - replicas + if res.UpdateNum != 0 { + res.UpdateMaxUnavailable = maxUnavailable + len(pods) - replicas } return @@ -287,8 +295,8 @@ func isSpecifiedDelete(cs *appsv1alpha1.CloneSet, pod *v1.Pod) bool { return false } -func isPodReady(coreControl clonesetcore.Control, pod *v1.Pod) bool { - return IsPodAvailable(coreControl, pod, 0) +func isPodReady(coreControl clonesetcore.Control, pod *v1.Pod, minReadySeconds int32) bool { + return IsPodAvailable(coreControl, pod, minReadySeconds) } func IsPodAvailable(coreControl clonesetcore.Control, pod *v1.Pod, minReadySeconds int32) bool { diff --git a/pkg/controller/cloneset/sync/cloneset_sync_utils_test.go b/pkg/controller/cloneset/sync/cloneset_sync_utils_test.go index 50dd0926b5..336a76820a 100644 --- a/pkg/controller/cloneset/sync/cloneset_sync_utils_test.go +++ b/pkg/controller/cloneset/sync/cloneset_sync_utils_test.go @@ -17,6 +17,7 @@ limitations under the License. package sync import ( + "flag" "fmt" "reflect" "testing" @@ -30,6 +31,7 @@ import ( v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/util/intstr" + "k8s.io/klog/v2" ) func TestCalculateDiffsWithExpectation(t *testing.T) { @@ -56,7 +58,7 @@ func TestCalculateDiffsWithExpectation(t *testing.T) { name: "increase replicas to 5 (step 1/2)", set: createTestCloneSet(5, intstr.FromInt(0), intstr.FromInt(1), intstr.FromInt(0)), pods: []*v1.Pod{}, - expectResult: expectationDiffs{scaleUpNum: 5, scaleUpLimit: 5}, + expectResult: expectationDiffs{ScaleUpNum: 5, ScaleUpLimit: 5}, }, { name: "increase replicas to 5 (step 2/2)", @@ -80,7 +82,7 @@ func TestCalculateDiffsWithExpectation(t *testing.T) { createTestPod(newRevision, appspub.LifecycleStateNormal, true, false), createTestPod(newRevision, appspub.LifecycleStateNormal, true, false), }, - expectResult: expectationDiffs{deleteReadyLimit: 1}, + expectResult: expectationDiffs{DeleteReadyLimit: 1}, }, { name: "specified delete 1 pod (all ready) (step 2/3)", @@ -91,7 +93,7 @@ func TestCalculateDiffsWithExpectation(t *testing.T) { createTestPod(newRevision, appspub.LifecycleStateNormal, true, false), createTestPod(newRevision, appspub.LifecycleStateNormal, true, false), }, - expectResult: expectationDiffs{scaleUpNum: 1, scaleUpLimit: 1}, + expectResult: expectationDiffs{ScaleUpNum: 1, ScaleUpLimit: 1}, }, { name: "specified delete 1 pod (all ready) (step 3/3)", @@ -115,7 +117,7 @@ func TestCalculateDiffsWithExpectation(t *testing.T) { createTestPod(newRevision, appspub.LifecycleStateNormal, true, false), createTestPod(newRevision, appspub.LifecycleStateNormal, true, false), }, - expectResult: expectationDiffs{deleteReadyLimit: 1}, + expectResult: expectationDiffs{DeleteReadyLimit: 1}, }, { name: "specified delete 2 pod (all ready) (step 2/6)", @@ -126,7 +128,7 @@ func TestCalculateDiffsWithExpectation(t *testing.T) { createTestPod(newRevision, appspub.LifecycleStateNormal, true, false), createTestPod(newRevision, appspub.LifecycleStateNormal, true, false), }, - expectResult: expectationDiffs{scaleUpNum: 1, scaleUpLimit: 1}, + expectResult: expectationDiffs{ScaleUpNum: 1, ScaleUpLimit: 1}, }, { name: "specified delete 2 pod (all ready) (step 3/6)", @@ -150,7 +152,7 @@ func TestCalculateDiffsWithExpectation(t *testing.T) { createTestPod(newRevision, appspub.LifecycleStateNormal, true, false), createTestPod(newRevision, appspub.LifecycleStateNormal, true, false), // new creation }, - expectResult: expectationDiffs{deleteReadyLimit: 1}, + expectResult: expectationDiffs{DeleteReadyLimit: 1}, }, { name: "specified delete 2 pod (all ready) (step 5/6)", @@ -161,7 +163,7 @@ func TestCalculateDiffsWithExpectation(t *testing.T) { createTestPod(newRevision, appspub.LifecycleStateNormal, true, false), createTestPod(newRevision, appspub.LifecycleStateNormal, true, false), }, - expectResult: expectationDiffs{scaleUpNum: 1, scaleUpLimit: 1}, + expectResult: expectationDiffs{ScaleUpNum: 1, ScaleUpLimit: 1}, }, { name: "specified delete 2 pod (all ready) (step 6/6)", @@ -185,7 +187,7 @@ func TestCalculateDiffsWithExpectation(t *testing.T) { createTestPod(newRevision, appspub.LifecycleStateNormal, true, false), createTestPod(newRevision, appspub.LifecycleStateNormal, true, false), }, - expectResult: expectationDiffs{deleteReadyLimit: 2}, + expectResult: expectationDiffs{DeleteReadyLimit: 2}, }, { name: "specified delete 2 pod and replicas to 4 (step 2/3)", @@ -195,7 +197,7 @@ func TestCalculateDiffsWithExpectation(t *testing.T) { createTestPod(newRevision, appspub.LifecycleStateNormal, true, false), createTestPod(newRevision, appspub.LifecycleStateNormal, true, false), }, - expectResult: expectationDiffs{scaleUpNum: 1, scaleUpLimit: 1}, + expectResult: expectationDiffs{ScaleUpNum: 1, ScaleUpLimit: 1}, }, { name: "specified delete 2 pod and replicas to 4 (step 3/3)", @@ -218,7 +220,7 @@ func TestCalculateDiffsWithExpectation(t *testing.T) { createTestPod(oldRevision, appspub.LifecycleStateNormal, true, false), createTestPod(oldRevision, appspub.LifecycleStateNormal, true, false), }, - expectResult: expectationDiffs{updateNum: 2, updateMaxUnavailable: 1}, + expectResult: expectationDiffs{UpdateNum: 2, UpdateMaxUnavailable: 1}, }, { name: "update partition=3 (step 2/3)", @@ -230,7 +232,7 @@ func TestCalculateDiffsWithExpectation(t *testing.T) { createTestPod(oldRevision, appspub.LifecycleStateNormal, true, false), createTestPod(oldRevision, appspub.LifecycleStateNormal, true, false), }, - expectResult: expectationDiffs{updateNum: 1, updateMaxUnavailable: 1}, + expectResult: expectationDiffs{UpdateNum: 1, UpdateMaxUnavailable: 1}, }, { name: "update partition=3 (step 3/3)", @@ -254,7 +256,7 @@ func TestCalculateDiffsWithExpectation(t *testing.T) { createTestPod(newRevision, appspub.LifecycleStateNormal, true, false), createTestPod(oldRevision, appspub.LifecycleStateNormal, true, false), }, - expectResult: expectationDiffs{updateNum: -3, updateMaxUnavailable: 2}, + expectResult: expectationDiffs{UpdateNum: -3, UpdateMaxUnavailable: 2}, }, { name: "rollback partition=4 (step 2/3)", @@ -266,7 +268,7 @@ func TestCalculateDiffsWithExpectation(t *testing.T) { createTestPod(oldRevision, appspub.LifecycleStateNormal, true, false), createTestPod(oldRevision, appspub.LifecycleStateNormal, true, false), }, - expectResult: expectationDiffs{updateNum: -1, updateMaxUnavailable: 2}, + expectResult: expectationDiffs{UpdateNum: -1, UpdateMaxUnavailable: 2}, }, { name: "rollback partition=4 (step 3/3)", @@ -290,7 +292,7 @@ func TestCalculateDiffsWithExpectation(t *testing.T) { createTestPod(newRevision, appspub.LifecycleStateNormal, true, false), createTestPod(newRevision, appspub.LifecycleStateNormal, true, false), }, - expectResult: expectationDiffs{scaleUpNum: 1, useSurge: 1, scaleUpLimit: 1}, + expectResult: expectationDiffs{ScaleUpNum: 1, UseSurge: 1, ScaleUpLimit: 1}, }, { name: "specified delete with maxSurge (step 2/4)", @@ -303,7 +305,7 @@ func TestCalculateDiffsWithExpectation(t *testing.T) { createTestPod(newRevision, appspub.LifecycleStateNormal, true, false), createTestPod(newRevision, appspub.LifecycleStateNormal, false, false), }, - expectResult: expectationDiffs{useSurge: 1}, + expectResult: expectationDiffs{UseSurge: 1}, }, { name: "specified delete with maxSurge (step 3/4)", @@ -316,7 +318,7 @@ func TestCalculateDiffsWithExpectation(t *testing.T) { createTestPod(newRevision, appspub.LifecycleStateNormal, true, false), createTestPod(newRevision, appspub.LifecycleStateNormal, true, false), }, - expectResult: expectationDiffs{deleteReadyLimit: 1, useSurge: 1}, + expectResult: expectationDiffs{DeleteReadyLimit: 1, UseSurge: 1}, }, { name: "specified delete with maxSurge (step 4/4)", @@ -340,7 +342,7 @@ func TestCalculateDiffsWithExpectation(t *testing.T) { createTestPod(oldRevision, appspub.LifecycleStateNormal, true, false), createTestPod(oldRevision, appspub.LifecycleStateNormal, true, false), }, - expectResult: expectationDiffs{scaleUpNum: 1, useSurge: 1, updateNum: 2, updateMaxUnavailable: 1, scaleUpLimit: 1}, + expectResult: expectationDiffs{ScaleUpNum: 1, UseSurge: 1, UpdateNum: 2, UpdateMaxUnavailable: 1, ScaleUpLimit: 1}, }, { name: "update in-place partition=3 with maxSurge (step 2/4)", @@ -353,7 +355,7 @@ func TestCalculateDiffsWithExpectation(t *testing.T) { createTestPod(oldRevision, appspub.LifecycleStateNormal, true, false), createTestPod(newRevision, appspub.LifecycleStateNormal, false, false), // new creation }, - expectResult: expectationDiffs{useSurge: 1, updateNum: 1, updateMaxUnavailable: 2}, + expectResult: expectationDiffs{UseSurge: 1, UpdateNum: 1, UpdateMaxUnavailable: 2}, }, { name: "update in-place partition=3 with maxSurge (step 3/4)", @@ -366,7 +368,7 @@ func TestCalculateDiffsWithExpectation(t *testing.T) { createTestPod(newRevision, appspub.LifecycleStateUpdating, false, false), // new in-place update createTestPod(newRevision, appspub.LifecycleStateNormal, false, false), // new creation }, - expectResult: expectationDiffs{scaleDownNum: 1, scaleDownNumOldRevision: 1, deleteReadyLimit: 0}, + expectResult: expectationDiffs{ScaleDownNum: 1, ScaleDownNumOldRevision: 1, DeleteReadyLimit: 0}, }, { name: "update in-place partition=3 with maxSurge (step 4/4)", @@ -379,7 +381,7 @@ func TestCalculateDiffsWithExpectation(t *testing.T) { createTestPod(newRevision, appspub.LifecycleStateNormal, true, false), // new in-place update createTestPod(newRevision, appspub.LifecycleStateNormal, false, false), // new creation }, - expectResult: expectationDiffs{scaleDownNum: 1, scaleDownNumOldRevision: 1, deleteReadyLimit: 1}, + expectResult: expectationDiffs{ScaleDownNum: 1, ScaleDownNumOldRevision: 1, DeleteReadyLimit: 1}, }, { name: "update recreate partition=3 with maxSurge (step 1/7)", @@ -391,7 +393,7 @@ func TestCalculateDiffsWithExpectation(t *testing.T) { createTestPod(oldRevision, appspub.LifecycleStateNormal, true, false), createTestPod(oldRevision, appspub.LifecycleStateNormal, true, false), }, - expectResult: expectationDiffs{scaleUpNum: 1, useSurge: 1, updateNum: 2, updateMaxUnavailable: 1, scaleUpLimit: 1}, + expectResult: expectationDiffs{ScaleUpNum: 1, UseSurge: 1, UpdateNum: 2, UpdateMaxUnavailable: 1, ScaleUpLimit: 1}, }, { name: "update recreate partition=3 with maxSurge (step 2/7)", @@ -404,7 +406,7 @@ func TestCalculateDiffsWithExpectation(t *testing.T) { createTestPod(oldRevision, appspub.LifecycleStateNormal, true, false), createTestPod(newRevision, appspub.LifecycleStateNormal, false, false), // new creation }, - expectResult: expectationDiffs{useSurge: 1, updateNum: 1, updateMaxUnavailable: 2}, + expectResult: expectationDiffs{UseSurge: 1, UpdateNum: 1, UpdateMaxUnavailable: 2}, }, { name: "update recreate partition=3 with maxSurge (step 3/7)", @@ -417,7 +419,7 @@ func TestCalculateDiffsWithExpectation(t *testing.T) { createTestPod(oldRevision, appspub.LifecycleStateNormal, true, true), // begin to recreate createTestPod(newRevision, appspub.LifecycleStateNormal, false, false), // new creation }, - expectResult: expectationDiffs{useSurge: 1, useSurgeOldRevision: 1, deleteReadyLimit: 1, updateNum: 1, updateMaxUnavailable: 2}, + expectResult: expectationDiffs{UseSurge: 1, UseSurgeOldRevision: 1, DeleteReadyLimit: 1, UpdateNum: 1, UpdateMaxUnavailable: 2}, }, { name: "update recreate partition=3 with maxSurge (step 4/7)", @@ -429,7 +431,7 @@ func TestCalculateDiffsWithExpectation(t *testing.T) { createTestPod(oldRevision, appspub.LifecycleStateNormal, true, false), createTestPod(newRevision, appspub.LifecycleStateNormal, false, false), // new creation }, - expectResult: expectationDiffs{useSurge: 1, scaleUpNum: 1, updateNum: 1, updateMaxUnavailable: 1, scaleUpLimit: 1}, + expectResult: expectationDiffs{UseSurge: 1, ScaleUpNum: 1, UpdateNum: 1, UpdateMaxUnavailable: 1, ScaleUpLimit: 1}, }, { name: "update recreate partition=3 with maxSurge (step 5/7)", @@ -442,7 +444,7 @@ func TestCalculateDiffsWithExpectation(t *testing.T) { createTestPod(newRevision, appspub.LifecycleStateNormal, false, false), // new creation createTestPod(newRevision, appspub.LifecycleStateNormal, false, false), // new creation for update }, - expectResult: expectationDiffs{scaleDownNum: 1, scaleDownNumOldRevision: 1, deleteReadyLimit: 0}, + expectResult: expectationDiffs{ScaleDownNum: 1, ScaleDownNumOldRevision: 1, DeleteReadyLimit: 0}, }, { name: "update recreate partition=3 with maxSurge (step 6/7)", @@ -455,7 +457,7 @@ func TestCalculateDiffsWithExpectation(t *testing.T) { createTestPod(newRevision, appspub.LifecycleStateNormal, true, false), // new creation createTestPod(newRevision, appspub.LifecycleStateNormal, false, false), // new creation for update }, - expectResult: expectationDiffs{scaleDownNum: 1, scaleDownNumOldRevision: 1, deleteReadyLimit: 1}, + expectResult: expectationDiffs{ScaleDownNum: 1, ScaleDownNumOldRevision: 1, DeleteReadyLimit: 1}, }, { name: "update recreate partition=3 with maxSurge (step 7/7)", @@ -479,7 +481,7 @@ func TestCalculateDiffsWithExpectation(t *testing.T) { createTestPod(oldRevision, appspub.LifecycleStateNormal, true, false), createTestPod(oldRevision, appspub.LifecycleStateNormal, true, false), }, - expectResult: expectationDiffs{scaleUpNum: 1, useSurge: 1, updateNum: 1, updateMaxUnavailable: 3, scaleUpLimit: 1}, + expectResult: expectationDiffs{ScaleUpNum: 1, UseSurge: 1, UpdateNum: 1, UpdateMaxUnavailable: 3, ScaleUpLimit: 1}, }, { name: "update recreate partition=99% with maxUnavailable=3, maxSurge=2 (step 2/3)", @@ -492,7 +494,7 @@ func TestCalculateDiffsWithExpectation(t *testing.T) { createTestPod(oldRevision, appspub.LifecycleStateNormal, true, false), createTestPod(newRevision, appspub.LifecycleStateNormal, false, false), // new creation }, - expectResult: expectationDiffs{scaleDownNum: 1, scaleDownNumOldRevision: 1, deleteReadyLimit: 3}, + expectResult: expectationDiffs{ScaleDownNum: 1, ScaleDownNumOldRevision: 1, DeleteReadyLimit: 3}, }, { name: "update recreate partition=99% with maxUnavailable=3, maxSurge=2 (step 3/3)", @@ -516,7 +518,7 @@ func TestCalculateDiffsWithExpectation(t *testing.T) { createTestPod(oldRevision, appspub.LifecycleStateNormal, true, false), createTestPod(oldRevision, appspub.LifecycleStateNormal, true, false), }, - expectResult: expectationDiffs{scaleUpNum: 1, useSurge: 1, updateNum: 1, updateMaxUnavailable: 2, scaleUpLimit: 1}, + expectResult: expectationDiffs{ScaleUpNum: 1, UseSurge: 1, UpdateNum: 1, UpdateMaxUnavailable: 2, ScaleUpLimit: 1}, }, { name: "update recreate partition=99% with maxUnavailable=40%, maxSurge=30% (step 2/3)", @@ -529,7 +531,7 @@ func TestCalculateDiffsWithExpectation(t *testing.T) { createTestPod(oldRevision, appspub.LifecycleStateNormal, true, false), createTestPod(newRevision, appspub.LifecycleStateNormal, false, false), // new creation }, - expectResult: expectationDiffs{scaleDownNum: 1, scaleDownNumOldRevision: 1, deleteReadyLimit: 2}, + expectResult: expectationDiffs{ScaleDownNum: 1, ScaleDownNumOldRevision: 1, DeleteReadyLimit: 2}, }, { name: "update recreate partition=99% with maxUnavailable=40%, maxSurge=30% (step 3/3)", @@ -553,7 +555,7 @@ func TestCalculateDiffsWithExpectation(t *testing.T) { createTestPod(oldRevision, appspub.LifecycleStateNormal, true, false), createTestPod(oldRevision, appspub.LifecycleStateNormal, true, false), }, - expectResult: expectationDiffs{scaleUpNum: 1, useSurge: 1, updateNum: 1, updateMaxUnavailable: 1, scaleUpLimit: 1}, + expectResult: expectationDiffs{ScaleUpNum: 1, UseSurge: 1, UpdateNum: 1, UpdateMaxUnavailable: 1, ScaleUpLimit: 1}, }, { name: "update recreate partition=99% with maxUnavailable=30%, maxSurge=30% (step 2/3)", @@ -566,7 +568,7 @@ func TestCalculateDiffsWithExpectation(t *testing.T) { createTestPod(oldRevision, appspub.LifecycleStateNormal, true, false), createTestPod(newRevision, appspub.LifecycleStateNormal, false, false), // new creation }, - expectResult: expectationDiffs{scaleDownNum: 1, scaleDownNumOldRevision: 1, deleteReadyLimit: 1}, + expectResult: expectationDiffs{ScaleDownNum: 1, ScaleDownNumOldRevision: 1, DeleteReadyLimit: 1}, }, { name: "update recreate partition=99% with maxUnavailable=30%, maxSurge=30% (step 3/3)", @@ -630,7 +632,7 @@ func TestCalculateDiffsWithExpectation(t *testing.T) { createTestPod(newRevision, appspub.LifecycleStateNormal, true, false), }, revisionConsistent: true, - expectResult: expectationDiffs{updateNum: 2, updateMaxUnavailable: 1}, + expectResult: expectationDiffs{UpdateNum: 2, UpdateMaxUnavailable: 1}, }, { name: "allow to update when fail to scale out normally", @@ -642,7 +644,7 @@ func TestCalculateDiffsWithExpectation(t *testing.T) { createTestPod(newRevision, appspub.LifecycleStateNormal, true, false), }, revisionConsistent: true, - expectResult: expectationDiffs{scaleUpNum: 1, updateNum: 1, updateMaxUnavailable: 1, scaleUpLimit: 1}, + expectResult: expectationDiffs{ScaleUpNum: 1, UpdateNum: 1, UpdateMaxUnavailable: 1, ScaleUpLimit: 1}, }, { name: "allow to update when fail to scale in normally", @@ -656,7 +658,7 @@ func TestCalculateDiffsWithExpectation(t *testing.T) { createTestPod(newRevision, appspub.LifecycleStateNormal, true, false), }, revisionConsistent: true, - expectResult: expectationDiffs{scaleDownNum: 1, scaleDownNumOldRevision: 2, deleteReadyLimit: 2, updateNum: 1, updateMaxUnavailable: 2}, + expectResult: expectationDiffs{ScaleDownNum: 1, ScaleDownNumOldRevision: 2, DeleteReadyLimit: 2, UpdateNum: 1, UpdateMaxUnavailable: 2}, }, { name: "disable rollback feature-gate", @@ -675,7 +677,7 @@ func TestCalculateDiffsWithExpectation(t *testing.T) { name: "increase replicas 0 to 5 with scale maxUnavailable = 2", set: setScaleStrategy(createTestCloneSet(5, intstr.FromInt(0), intstr.FromInt(1), intstr.FromInt(0)), intstr.FromInt(2)), pods: []*v1.Pod{}, - expectResult: expectationDiffs{scaleUpNum: 5, scaleUpLimit: 2}, + expectResult: expectationDiffs{ScaleUpNum: 5, ScaleUpLimit: 2}, }, { name: "increase replicas 3 to 6 with scale maxUnavailable = 2, not ready pod = 1", @@ -685,7 +687,7 @@ func TestCalculateDiffsWithExpectation(t *testing.T) { createTestPod(newRevision, appspub.LifecycleStateNormal, true, false), createTestPod(newRevision, appspub.LifecycleStateNormal, false, false), }, - expectResult: expectationDiffs{scaleUpNum: 3, scaleUpLimit: 1}, + expectResult: expectationDiffs{ScaleUpNum: 3, ScaleUpLimit: 1}, }, { name: "increase replicas 3 to 6 with scale maxUnavailable = 2, not ready pod = 2", @@ -695,7 +697,7 @@ func TestCalculateDiffsWithExpectation(t *testing.T) { createTestPod(newRevision, appspub.LifecycleStateNormal, false, false), createTestPod(newRevision, appspub.LifecycleStateNormal, false, false), }, - expectResult: expectationDiffs{scaleUpNum: 3, scaleUpLimit: 0}, + expectResult: expectationDiffs{ScaleUpNum: 3, ScaleUpLimit: 0}, }, { name: "[scalingExcludePreparingDelete=false] specific delete a pod with lifecycle hook (step 1/4)", @@ -705,7 +707,7 @@ func TestCalculateDiffsWithExpectation(t *testing.T) { createTestPod(newRevision, appspub.LifecycleStateNormal, true, false), createTestPod(newRevision, appspub.LifecycleStateNormal, true, true), }, - expectResult: expectationDiffs{deleteReadyLimit: 1}, + expectResult: expectationDiffs{DeleteReadyLimit: 1}, }, { name: "[scalingExcludePreparingDelete=false] specific delete a pod with lifecycle hook (step 2/4)", @@ -724,7 +726,7 @@ func TestCalculateDiffsWithExpectation(t *testing.T) { createTestPod(newRevision, appspub.LifecycleStateNormal, true, false), createTestPod(newRevision, appspub.LifecycleStateNormal, true, false), }, - expectResult: expectationDiffs{scaleUpNum: 1, scaleUpLimit: 1}, + expectResult: expectationDiffs{ScaleUpNum: 1, ScaleUpLimit: 1}, }, { name: "[scalingExcludePreparingDelete=false] specific delete a pod with lifecycle hook (step 4/4)", @@ -745,7 +747,7 @@ func TestCalculateDiffsWithExpectation(t *testing.T) { createTestPod(newRevision, appspub.LifecycleStateNormal, true, false), createTestPod(newRevision, appspub.LifecycleStateNormal, true, true), }, - expectResult: expectationDiffs{deleteReadyLimit: 1}, + expectResult: expectationDiffs{DeleteReadyLimit: 1}, }, { name: "[scalingExcludePreparingDelete=true] specific delete a pod with lifecycle hook (step 2/4)", @@ -756,7 +758,7 @@ func TestCalculateDiffsWithExpectation(t *testing.T) { createTestPod(newRevision, appspub.LifecycleStateNormal, true, false), createTestPod(newRevision, appspub.LifecycleStatePreparingDelete, true, true), }, - expectResult: expectationDiffs{scaleUpNum: 1, scaleUpLimit: 1}, + expectResult: expectationDiffs{ScaleUpNum: 1, ScaleUpLimit: 1}, }, { name: "[scalingExcludePreparingDelete=true] specific delete a pod with lifecycle hook (step 3/4)", @@ -791,7 +793,7 @@ func TestCalculateDiffsWithExpectation(t *testing.T) { createTestPod(newRevision, appspub.LifecycleStateNormal, true, false), createTestPod(newRevision, appspub.LifecycleStateNormal, true, true), }, - expectResult: expectationDiffs{deleteReadyLimit: 1}, + expectResult: expectationDiffs{DeleteReadyLimit: 1}, }, { name: "[scalingExcludePreparingDelete=true] specific delete a pod with lifecycle hook and then cancel (step 2/5)", @@ -802,7 +804,7 @@ func TestCalculateDiffsWithExpectation(t *testing.T) { createTestPod(newRevision, appspub.LifecycleStateNormal, true, false), createTestPod(newRevision, appspub.LifecycleStatePreparingDelete, true, true), }, - expectResult: expectationDiffs{scaleUpNum: 1, scaleUpLimit: 1}, + expectResult: expectationDiffs{ScaleUpNum: 1, ScaleUpLimit: 1}, }, { name: "[scalingExcludePreparingDelete=true] specific delete a pod with lifecycle hook and then cancel (step 3/5)", @@ -826,7 +828,7 @@ func TestCalculateDiffsWithExpectation(t *testing.T) { createTestPod(newRevision, appspub.LifecycleStateNormal, true, false), // it has been changed to normal by managePreparingDelete createTestPod(newRevision, appspub.LifecycleStateNormal, false, false), }, - expectResult: expectationDiffs{scaleDownNum: 1, deleteReadyLimit: 1}, + expectResult: expectationDiffs{ScaleDownNum: 1, DeleteReadyLimit: 1}, }, { name: "[scalingExcludePreparingDelete=true] specific delete a pod with lifecycle hook and then cancel (step 5/5)", @@ -859,7 +861,7 @@ func TestCalculateDiffsWithExpectation(t *testing.T) { createTestPod(newRevision, appspub.LifecycleStateNormal, true, false), createTestPod(newRevision, appspub.LifecycleStateNormal, true, true), }, - expectResult: expectationDiffs{deleteReadyLimit: 2}, + expectResult: expectationDiffs{DeleteReadyLimit: 2}, }, { name: "[scalingExcludePreparingDelete=true] specific scale down with lifecycle hook, then scale up pods (step 3/6)", @@ -881,7 +883,7 @@ func TestCalculateDiffsWithExpectation(t *testing.T) { createTestPod(newRevision, appspub.LifecycleStateNormal, true, false), createTestPod(newRevision, appspub.LifecycleStatePreparingDelete, true, true), }, - expectResult: expectationDiffs{scaleUpNum: 1, scaleUpLimit: 1}, + expectResult: expectationDiffs{ScaleUpNum: 1, ScaleUpLimit: 1}, }, { name: "[scalingExcludePreparingDelete=true] specific scale down with lifecycle hook, then scale up pods (step 5/6)", @@ -916,7 +918,7 @@ func TestCalculateDiffsWithExpectation(t *testing.T) { createTestPod(oldRevision, appspub.LifecycleStateNormal, true, false), }, isPodUpdate: revision.IsPodUpdate, - expectResult: expectationDiffs{scaleUpNum: 1, scaleUpLimit: 1, scaleUpNumOldRevision: 1}, + expectResult: expectationDiffs{ScaleUpNum: 1, ScaleUpLimit: 1, ScaleUpNumOldRevision: 1}, }, { name: "[scalingWithPreparingUpdate=true] scaling up when a preparing pod is not updated, and expected-updated is 2", @@ -928,7 +930,7 @@ func TestCalculateDiffsWithExpectation(t *testing.T) { createTestPod(oldRevision, appspub.LifecycleStateNormal, true, false), }, isPodUpdate: revision.IsPodUpdate, - expectResult: expectationDiffs{scaleUpNum: 1, scaleUpLimit: 1}, + expectResult: expectationDiffs{ScaleUpNum: 1, ScaleUpLimit: 1}, }, { name: "[UpdateStrategyPaused=true] scale up pods with maxSurge=3,maxUnavailable=0", @@ -938,7 +940,7 @@ func TestCalculateDiffsWithExpectation(t *testing.T) { createTestPod(oldRevision, appspub.LifecycleStateNormal, true, false), createTestPod(oldRevision, appspub.LifecycleStateNormal, true, false), }, - expectResult: expectationDiffs{scaleUpNum: 2, scaleUpLimit: 2, updateNum: 3, updateMaxUnavailable: -2}, + expectResult: expectationDiffs{ScaleUpNum: 2, ScaleUpLimit: 2, UpdateNum: 3, UpdateMaxUnavailable: -2}, }, { name: "[UpdateStrategyPaused=true] scale down pods with maxSurge=3,maxUnavailable=0", @@ -950,7 +952,7 @@ func TestCalculateDiffsWithExpectation(t *testing.T) { createTestPod(oldRevision, appspub.LifecycleStateNormal, true, false), createTestPod(oldRevision, appspub.LifecycleStateNormal, true, false), }, - expectResult: expectationDiffs{scaleDownNum: 2, scaleDownNumOldRevision: 5, deleteReadyLimit: 2, updateNum: 3, updateMaxUnavailable: 2}, + expectResult: expectationDiffs{ScaleDownNum: 2, ScaleDownNumOldRevision: 5, DeleteReadyLimit: 2, UpdateNum: 3, UpdateMaxUnavailable: 2}, }, { name: "[UpdateStrategyPaused=true] create 0 newRevision pods with maxSurge=3,maxUnavailable=0", @@ -965,7 +967,7 @@ func TestCalculateDiffsWithExpectation(t *testing.T) { createTestPod(newRevision, appspub.LifecycleStateNormal, false, false), createTestPod(newRevision, appspub.LifecycleStateNormal, false, false), }, - expectResult: expectationDiffs{scaleDownNum: 3, scaleDownNumOldRevision: 5, updateNum: 2, updateMaxUnavailable: 3}, + expectResult: expectationDiffs{ScaleDownNum: 3, ScaleDownNumOldRevision: 5, UpdateNum: 2, UpdateMaxUnavailable: 3}, }, { name: "[UpdateStrategyPaused=true] create 0 newRevision pods with maxSurge=3,maxUnavailable=0", @@ -980,37 +982,45 @@ func TestCalculateDiffsWithExpectation(t *testing.T) { createTestPod(newRevision, appspub.LifecycleStateNormal, false, false), createTestPod(newRevision, appspub.LifecycleStateNormal, false, false), }, - expectResult: expectationDiffs{scaleDownNum: 3, scaleDownNumOldRevision: 3}, + expectResult: expectationDiffs{ScaleDownNum: 3, ScaleDownNumOldRevision: 3}, }, } defer utilfeature.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.PreparingUpdateAsUpdate, true)() - for i := range cases { - t.Run(cases[i].name, func(t *testing.T) { - if cases[i].disableFeatureGate { + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + if tc.disableFeatureGate { _ = utilfeature.DefaultMutableFeatureGate.Set(fmt.Sprintf("%s=false", features.CloneSetPartitionRollback)) } else { _ = utilfeature.DefaultMutableFeatureGate.Set(fmt.Sprintf("%s=true", features.CloneSetPartitionRollback)) } current := oldRevision - if cases[i].revisionConsistent { + if tc.revisionConsistent { current = newRevision } - for key, value := range cases[i].setLabels { - if cases[i].set.Labels == nil { - cases[i].set.Labels = map[string]string{} + for key, value := range tc.setLabels { + if tc.set.Labels == nil { + tc.set.Labels = map[string]string{} } - cases[i].set.Labels[key] = value + tc.set.Labels[key] = value } - res := calculateDiffsWithExpectation(cases[i].set, cases[i].pods, current, newRevision, cases[i].isPodUpdate) - if !reflect.DeepEqual(res, cases[i].expectResult) { - t.Errorf("got %#v, expect %#v", res, cases[i].expectResult) + res := calculateDiffsWithExpectation(tc.set, tc.pods, current, newRevision, tc.isPodUpdate) + if !reflect.DeepEqual(res, tc.expectResult) { + t.Errorf("got %#v, expect %#v", res, tc.expectResult) } }) } } +func TestMain(m *testing.M) { + klog.InitFlags(nil) + _ = flag.Set("v", "5") + flag.Parse() + defer klog.Flush() + m.Run() +} + func createTestCloneSet(replicas int32, partition, maxUnavailable, maxSurge intstr.IntOrString) *appsv1alpha1.CloneSet { return &appsv1alpha1.CloneSet{ Spec: appsv1alpha1.CloneSetSpec{ diff --git a/pkg/controller/cloneset/sync/cloneset_update.go b/pkg/controller/cloneset/sync/cloneset_update.go index 031b55f6dd..3a24664839 100644 --- a/pkg/controller/cloneset/sync/cloneset_update.go +++ b/pkg/controller/cloneset/sync/cloneset_update.go @@ -79,13 +79,13 @@ func (c *realControl) Update(cs *appsv1alpha1.CloneSet, // 2. calculate update diff and the revision to update diffRes := calculateDiffsWithExpectation(cs, pods, currentRevision.Name, updateRevision.Name, nil) - if diffRes.updateNum == 0 { + if diffRes.UpdateNum == 0 { return nil } // 3. find all matched pods can update targetRevision := updateRevision - if diffRes.updateNum < 0 { + if diffRes.UpdateNum < 0 { targetRevision = currentRevision } var waitUpdateIndexes []int @@ -95,7 +95,7 @@ func (c *realControl) Update(cs *appsv1alpha1.CloneSet, } var waitUpdate, canUpdate bool - if diffRes.updateNum > 0 { + if diffRes.UpdateNum > 0 { waitUpdate = !clonesetutils.EqualToRevisionHash("", pod, updateRevision.Name) } else { waitUpdate = clonesetutils.EqualToRevisionHash("", pod, updateRevision.Name) @@ -347,7 +347,7 @@ func SortUpdateIndexes(coreControl clonesetcore.Control, strategy appsv1alpha1.C // limitUpdateIndexes limits all pods waiting update by the maxUnavailable policy, and returns the indexes of pods that can finally update func limitUpdateIndexes(coreControl clonesetcore.Control, minReadySeconds int32, diffRes expectationDiffs, waitUpdateIndexes []int, pods []*v1.Pod, targetRevisionHash string) []int { - updateDiff := util.IntAbs(diffRes.updateNum) + updateDiff := util.IntAbs(diffRes.UpdateNum) if updateDiff < len(waitUpdateIndexes) { waitUpdateIndexes = waitUpdateIndexes[:updateDiff] } @@ -363,14 +363,14 @@ func limitUpdateIndexes(coreControl clonesetcore.Control, minReadySeconds int32, } for _, i := range waitUpdateIndexes { // Make sure unavailable pods in target revision should not be more than maxUnavailable. - if targetRevisionUnavailableCount+canUpdateCount >= diffRes.updateMaxUnavailable { + if targetRevisionUnavailableCount+canUpdateCount >= diffRes.UpdateMaxUnavailable { break } // Make sure unavailable pods in all revisions should not be more than maxUnavailable. // Note that update an old pod that already be unavailable will not increase the unavailable number. if IsPodAvailable(coreControl, pods[i], minReadySeconds) { - if unavailableCount >= diffRes.updateMaxUnavailable { + if unavailableCount >= diffRes.UpdateMaxUnavailable { break } unavailableCount++ diff --git a/pkg/controller/cloneset/sync/cloneset_update_test.go b/pkg/controller/cloneset/sync/cloneset_update_test.go index 7b3bf9a4fc..29909aeee2 100644 --- a/pkg/controller/cloneset/sync/cloneset_update_test.go +++ b/pkg/controller/cloneset/sync/cloneset_update_test.go @@ -1228,10 +1228,10 @@ func TestCalculateUpdateCount(t *testing.T) { var waitUpdateIndexes []int var targetRevision string - if diffRes.updateNum > 0 { + if diffRes.UpdateNum > 0 { waitUpdateIndexes = tc.oldRevisionIndexes targetRevision = updateRevision - } else if diffRes.updateNum < 0 { + } else if diffRes.UpdateNum < 0 { waitUpdateIndexes = newRevisionIndexes targetRevision = currentRevision }