diff --git a/pkg/controller/batchrelease/control/bluegreenstyle/control_plane.go b/pkg/controller/batchrelease/control/bluegreenstyle/control_plane.go index 177100f..b36dc21 100644 --- a/pkg/controller/batchrelease/control/bluegreenstyle/control_plane.go +++ b/pkg/controller/batchrelease/control/bluegreenstyle/control_plane.go @@ -21,12 +21,12 @@ import ( "github.com/openkruise/rollouts/pkg/controller/batchrelease/context" "github.com/openkruise/rollouts/pkg/controller/batchrelease/control" "github.com/openkruise/rollouts/pkg/controller/batchrelease/labelpatch" + "github.com/openkruise/rollouts/pkg/feature" "github.com/openkruise/rollouts/pkg/util" + utilfeature "github.com/openkruise/rollouts/pkg/util/feature" "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/types" - "github.com/openkruise/rollouts/pkg/feature" - utilfeature "github.com/openkruise/rollouts/pkg/util/feature" "k8s.io/client-go/tools/record" "k8s.io/klog/v2" "sigs.k8s.io/controller-runtime/pkg/client" @@ -142,9 +142,9 @@ func (rc *realBatchControlPlane) Finalize() error { // If Rollout CR was deleted and our gate is on, skip un-pause if rc.release.DeletionTimestamp != nil && - utilfeature.DefaultMutableFeatureGate.Enabled(feature.KeepDeploymentPausedOnDeletionGate) { + utilfeature.DefaultMutableFeatureGate.Enabled(feature.KeepDeploymentPausedOnDeletionGate) { klog.Infof("BatchRelease(%s/%s) deletion detected; skipping Finalize() because KeepDeploymentPausedOnDeletionGate is enabled", - rc.release.Namespace, rc.release.Name) + rc.release.Namespace, rc.release.Name) return nil } diff --git a/pkg/controller/batchrelease/control/canarystyle/control_plane.go b/pkg/controller/batchrelease/control/canarystyle/control_plane.go index 9367a24..f542a39 100644 --- a/pkg/controller/batchrelease/control/canarystyle/control_plane.go +++ b/pkg/controller/batchrelease/control/canarystyle/control_plane.go @@ -22,11 +22,11 @@ import ( "github.com/openkruise/rollouts/api/v1beta1" "github.com/openkruise/rollouts/pkg/controller/batchrelease/control" "github.com/openkruise/rollouts/pkg/controller/batchrelease/labelpatch" + "github.com/openkruise/rollouts/pkg/feature" "github.com/openkruise/rollouts/pkg/util" + utilfeature "github.com/openkruise/rollouts/pkg/util/feature" "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/types" - "github.com/openkruise/rollouts/pkg/feature" - utilfeature "github.com/openkruise/rollouts/pkg/util/feature" "k8s.io/client-go/tools/record" "k8s.io/klog/v2" "sigs.k8s.io/controller-runtime/pkg/client" @@ -152,32 +152,32 @@ func (rc *realCanaryController) EnsureBatchPodsReadyAndLabeled() error { } func (rc *realCanaryController) Finalize() error { - stable, err := rc.BuildStableController() - if client.IgnoreNotFound(err) != nil { - klog.Errorf("…") - return err - } + stable, err := rc.BuildStableController() + if client.IgnoreNotFound(err) != nil { + klog.Errorf("…") + return err + } - // If Rollout is deleted & gate is on, skip stable.Finalize() - if rc.release.DeletionTimestamp != nil && - utilfeature.DefaultMutableFeatureGate.Enabled(feature.KeepDeploymentPausedOnDeletionGate) { - klog.Infof("… skipping stable.Finalize()") - } else { - if err = stable.Finalize(rc.release); err != nil { - klog.Errorf("… finalize stable err: %v", err) - return err - } - } + // If Rollout is deleted & gate is on, skip stable.Finalize() + if rc.release.DeletionTimestamp != nil && + utilfeature.DefaultMutableFeatureGate.Enabled(feature.KeepDeploymentPausedOnDeletionGate) { + klog.Infof("… skipping stable.Finalize()") + } else { + if err = stable.Finalize(rc.release); err != nil { + klog.Errorf("… finalize stable err: %v", err) + return err + } + } - canary, err := rc.BuildCanaryController(rc.release) - if client.IgnoreNotFound(err) != nil { - klog.Errorf("… build canary err: %v", err) - return err - } - if err = canary.Delete(rc.release); err != nil { - klog.Errorf("… delete canary err: %v", err) - } - return err + canary, err := rc.BuildCanaryController(rc.release) + if client.IgnoreNotFound(err) != nil { + klog.Errorf("… build canary err: %v", err) + return err + } + if err = canary.Delete(rc.release); err != nil { + klog.Errorf("… delete canary err: %v", err) + } + return err } func (rc *realCanaryController) SyncWorkloadInformation() (control.WorkloadEventType, *util.WorkloadInfo, error) { diff --git a/pkg/controller/batchrelease/control/partitionstyle/control_plane.go b/pkg/controller/batchrelease/control/partitionstyle/control_plane.go index 8ba5440..9a7a74b 100644 --- a/pkg/controller/batchrelease/control/partitionstyle/control_plane.go +++ b/pkg/controller/batchrelease/control/partitionstyle/control_plane.go @@ -24,8 +24,8 @@ import ( "github.com/openkruise/rollouts/api/v1beta1" "github.com/openkruise/rollouts/pkg/controller/batchrelease/control" "github.com/openkruise/rollouts/pkg/controller/batchrelease/labelpatch" - "github.com/openkruise/rollouts/pkg/util" "github.com/openkruise/rollouts/pkg/feature" + "github.com/openkruise/rollouts/pkg/util" utilfeature "github.com/openkruise/rollouts/pkg/util/feature" v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/errors" @@ -144,14 +144,14 @@ func (rc *realBatchControlPlane) Finalize() error { if err != nil { return client.IgnoreNotFound(err) } - + // If Rollout CR was deleted and our gate is on, skip un-pause if rc.release.DeletionTimestamp != nil && utilfeature.DefaultMutableFeatureGate.Enabled(feature.KeepDeploymentPausedOnDeletionGate) { klog.Infof("BatchRelease(%s/%s) deletion detected; skipping Finalize() because KeepDeploymentPausedOnDeletionGate is enabled", - rc.release.Namespace, rc.release.Name) + rc.release.Namespace, rc.release.Name) return nil - } - + } + // release workload control info and clean up resources if it needs return controller.Finalize(rc.release) } diff --git a/pkg/controller/rollout/rollout_canary.go b/pkg/controller/rollout/rollout_canary.go index 525222a..c1680d4 100644 --- a/pkg/controller/rollout/rollout_canary.go +++ b/pkg/controller/rollout/rollout_canary.go @@ -24,8 +24,10 @@ import ( "github.com/openkruise/rollouts/api/v1alpha1" "github.com/openkruise/rollouts/api/v1beta1" + "github.com/openkruise/rollouts/pkg/feature" "github.com/openkruise/rollouts/pkg/trafficrouting" "github.com/openkruise/rollouts/pkg/util" + utilfeature "github.com/openkruise/rollouts/pkg/util/feature" corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -73,6 +75,23 @@ func (m *canaryReleaseManager) runCanary(c *RolloutContext) error { if m.doCanaryJump(c) { return nil } + + if utilfeature.DefaultMutableFeatureGate.Enabled(feature.AdvancedDeploymentGate) && + c.Rollout.Spec.Strategy.Canary.EnableExtraWorkloadForCanary { + tr := newTrafficRoutingContext(c) + if !tr.DisableGenerateCanaryService { + klog.Infof("rollout(%s/%s) advancedDeployment: patching stable service for canary", c.Rollout.Namespace, c.Rollout.Name) + retry, err := m.trafficRoutingManager.PatchStableService(tr) + if err != nil { + return err + } else if retry { + expectedTime := time.Now().Add(tr.RecheckDuration) + c.RecheckTime = &expectedTime + return nil + } + } + } + // When the first batch is trafficRouting rolling and the next steps are rolling release, // We need to clean up the canary-related resources first and then rollout the rest of the batch. currentStep := c.Rollout.Spec.Strategy.Canary.Steps[canaryStatus.CurrentStepIndex-1]