diff --git a/pkg/controller/batchrelease/control/apis.go b/pkg/controller/batchrelease/control/apis.go index 43ccd268..4a65cc0b 100644 --- a/pkg/controller/batchrelease/control/apis.go +++ b/pkg/controller/batchrelease/control/apis.go @@ -18,7 +18,7 @@ package control import "k8s.io/apimachinery/pkg/util/intstr" -// OriginalDeploymentStrategy stores part of the fileds of a workload, +// OriginalDeploymentStrategy stores part of the fields of a workload, // so that it can be restored when finalizing. // It is only used for BlueGreen Release // Similar to DeploymentStrategy, it is an annotation used in workload diff --git a/pkg/controller/batchrelease/control/bluegreenstyle/cloneset/control.go b/pkg/controller/batchrelease/control/bluegreenstyle/cloneset/control.go index 9fabff31..a15d0fa5 100644 --- a/pkg/controller/batchrelease/control/bluegreenstyle/cloneset/control.go +++ b/pkg/controller/batchrelease/control/bluegreenstyle/cloneset/control.go @@ -27,6 +27,7 @@ import ( "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/intstr" "k8s.io/klog/v2" + utilpointer "k8s.io/utils/pointer" "sigs.k8s.io/controller-runtime/pkg/client" "github.com/openkruise/rollouts/api/v1beta1" @@ -109,6 +110,7 @@ func (rc *realController) Initialize(release *v1beta1.BatchRelease) error { patchData.UpdateMaxSurge(&maxSurge) patchData.UpdateMaxUnavailable(&maxUnavailable) patchData.UpdateMinReadySeconds(v1beta1.MaxReadySeconds) + patchData.UpdateProgressDeadlineSeconds(utilpointer.Int32(v1beta1.MaxProgressSeconds)) klog.InfoS("Initialize: try to update cloneset", "cloneset", klog.KObj(rc.object), "patchData", patchData.String()) return rc.client.Patch(context.TODO(), util.GetEmptyObjectWithKey(rc.object), patchData) } @@ -153,6 +155,7 @@ func (rc *realController) Finalize(release *v1beta1.BatchRelease) error { } patchData := patch.NewClonesetPatch() patchData.UpdateMinReadySeconds(setting.MinReadySeconds) + patchData.UpdateProgressDeadlineSeconds(setting.ProgressDeadlineSeconds) patchData.UpdateMaxSurge(setting.MaxSurge) patchData.UpdateMaxUnavailable(setting.MaxUnavailable) patchData.DeleteAnnotation(v1beta1.OriginalDeploymentStrategyAnnotation) diff --git a/pkg/controller/batchrelease/control/util.go b/pkg/controller/batchrelease/control/util.go index f8e5b672..e56fdf3f 100644 --- a/pkg/controller/batchrelease/control/util.go +++ b/pkg/controller/batchrelease/control/util.go @@ -92,8 +92,8 @@ func ValidateReadyForBlueGreenRelease(object client.Object) error { return fmt.Errorf("cloneSet strategy type is not ReCreate") } // MinReadySeconds and ProgressDeadlineSeconds must be set - if o.Spec.MinReadySeconds != v1beta1.MaxReadySeconds { - return fmt.Errorf("cloneSet strategy minReadySeconds is not MaxReadySeconds") + if o.Spec.MinReadySeconds != v1beta1.MaxReadySeconds || o.Spec.ProgressDeadlineSeconds == nil || *o.Spec.ProgressDeadlineSeconds != v1beta1.MaxProgressSeconds { + return fmt.Errorf("cloneSet strategy minReadySeconds or progressDeadlineSeconds is not MaxReadySeconds or MaxProgressSeconds") } default: @@ -198,6 +198,8 @@ func InitOriginalSetting(setting *OriginalDeploymentStrategy, object client.Obje } if setting.ProgressDeadlineSeconds == nil { // cloneset is planned to support progressDeadlineSeconds field + setting.ProgressDeadlineSeconds = getIntPtrOrDefault(o.Spec.ProgressDeadlineSeconds, 600) + changeLogs = append(changeLogs, fmt.Sprintf("progressDeadlineSeconds changed from nil to %d", *setting.ProgressDeadlineSeconds)) } if setting.MinReadySeconds == 0 { setting.MinReadySeconds = o.Spec.MinReadySeconds diff --git a/pkg/util/patch/patch_utils.go b/pkg/util/patch/patch_utils.go index 25b8da15..caecde16 100644 --- a/pkg/util/patch/patch_utils.go +++ b/pkg/util/patch/patch_utils.go @@ -311,6 +311,18 @@ func (s *ClonesetPatch) UpdateMinReadySeconds(seconds int32) *ClonesetPatch { return s } +func (s *ClonesetPatch) UpdateProgressDeadlineSeconds(seconds *int32) *ClonesetPatch { + switch s.PatchType { + case types.StrategicMergePatchType, types.MergePatchType: + if _, ok := s.PatchData["spec"]; !ok { + s.PatchData["spec"] = make(map[string]interface{}) + } + spec := s.PatchData["spec"].(map[string]interface{}) + spec["progressDeadlineSeconds"] = seconds + } + return s +} + func (s *ClonesetPatch) UpdatePaused(paused bool) *ClonesetPatch { switch s.PatchType { case types.StrategicMergePatchType, types.MergePatchType: