diff --git a/pkg/controllers/backendrouting/backendrouting_controller.go b/pkg/controllers/backendrouting/backendrouting_controller.go index 93e55f2..6b2a635 100644 --- a/pkg/controllers/backendrouting/backendrouting_controller.go +++ b/pkg/controllers/backendrouting/backendrouting_controller.go @@ -20,6 +20,7 @@ import ( "time" "github.com/go-logr/logr" + "github.com/samber/lo" "k8s.io/apimachinery/pkg/api/equality" "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/api/meta" @@ -257,10 +258,9 @@ func (b *BackendRoutingReconciler) syncInClusterBackends(ctx context.Context, sy // ensure canary and stable backends canaryConfig := obj.Spec.ForkedBackends.Canary.DeepCopy() - if canaryConfig.ExtraLabelSelector == nil { - canaryConfig.ExtraLabelSelector = make(map[string]string) - } - canaryConfig.ExtraLabelSelector[rolloutapi.LabelTrafficLane] = rolloutapi.LabelValueTrafficLaneCanary + canaryConfig.ExtraLabelSelector = lo.Assign(canaryConfig.ExtraLabelSelector, map[string]string{ + rolloutapi.LabelTrafficLane: rolloutapi.LabelValueTrafficLaneCanary, + }) err := b.ensureBackendResource(ctx, syncCtx, *canaryConfig) if err != nil { return err @@ -269,10 +269,9 @@ func (b *BackendRoutingReconciler) syncInClusterBackends(ctx context.Context, sy syncCtx.NewStatus.Backends.Canary.Conditions.Ready = ptr.To(true) stableConfig := obj.Spec.ForkedBackends.Stable.DeepCopy() - if stableConfig.ExtraLabelSelector == nil { - stableConfig.ExtraLabelSelector = make(map[string]string) - } - stableConfig.ExtraLabelSelector[rolloutapi.LabelTrafficLane] = rolloutapi.LabelValueTrafficLaneStable + stableConfig.ExtraLabelSelector = lo.Assign(stableConfig.ExtraLabelSelector, map[string]string{ + rolloutapi.LabelTrafficLane: rolloutapi.LabelValueTrafficLaneStable, + }) err = b.ensureBackendResource(ctx, syncCtx, *stableConfig) if err != nil { return err @@ -346,12 +345,13 @@ func (b *BackendRoutingReconciler) ensureBackendResource(ctx context.Context, sy // need to create newBackendObj := backendStore.Fork(syncCtx.BackendObject, config) // add label - labels := newBackendObj.GetLabels() - if labels == nil { - labels = make(map[string]string) - } - labels[rolloutapi.LabelTemporaryResource] = "true" - newBackendObj.SetLabels(labels) + newBackendObj.SetLabels(lo.Assign( + newBackendObj.GetLabels(), + config.ExtraLabelSelector, + map[string]string{ + rolloutapi.LabelCanaryResource: "true", + }, + )) err = b.Client.Create(ctx, newBackendObj) if err != nil { diff --git a/pkg/controllers/backendrouting/backendrouting_controller_test.go b/pkg/controllers/backendrouting/backendrouting_controller_test.go index 60a545d..3fb3d24 100644 --- a/pkg/controllers/backendrouting/backendrouting_controller_test.go +++ b/pkg/controllers/backendrouting/backendrouting_controller_test.go @@ -416,9 +416,9 @@ func (s *BackendRoutingControllerTestSuite) Test_ForBackends() { } s.Require().Equal(rolloutapi.LabelValueTrafficLaneStable, stableSVC.Spec.Selector[rolloutapi.LabelTrafficLane]) - s.Require().Contains(stableSVC.Labels, rolloutapi.LabelTemporaryResource) + s.Require().Contains(stableSVC.Labels, rolloutapi.LabelCanaryResource) s.Require().Equal(rolloutapi.LabelValueTrafficLaneCanary, canarySVC.Spec.Selector[rolloutapi.LabelTrafficLane]) - s.Require().Contains(canarySVC.Labels, rolloutapi.LabelTemporaryResource) + s.Require().Contains(canarySVC.Labels, rolloutapi.LabelCanaryResource) return true }, 60*time.Second, 5*time.Second, "stable and canary should be created") @@ -577,9 +577,7 @@ func (s *BackendRoutingControllerTestSuite) Test_Route() { if err != nil { return false } - - s.Require().Contains(ingress.Labels, rolloutapi.LabelCanary) - s.Require().Contains(ingress.Labels, rolloutapi.LabelTemporaryResource) + s.Require().Contains(ingress.Labels, rolloutapi.LabelCanaryResource) return true }, 60*time.Second, 5*time.Second, "canary ingress should be ready") diff --git a/pkg/controllers/rolloutrun/control/control.go b/pkg/controllers/rolloutrun/control/control.go index bc48d55..58b81e9 100644 --- a/pkg/controllers/rolloutrun/control/control.go +++ b/pkg/controllers/rolloutrun/control/control.go @@ -272,7 +272,7 @@ func (c *CanaryReleaseControl) canaryObject(stable *workload.Info) (client.Objec func (c *CanaryReleaseControl) applyCanaryDefaults(canaryObj client.Object) { controllerutil.AddFinalizer(canaryObj, rolloutapi.FinalizerCanaryResourceProtection) utils.MutateLabels(canaryObj, func(labels map[string]string) { - labels[rolloutapi.LabelCanary] = "true" + labels[rolloutapi.LabelCanaryResource] = "true" }) } diff --git a/pkg/controllers/rolloutrun/executor/canary.go b/pkg/controllers/rolloutrun/executor/canary.go index df0c5f3..4bc85ee 100644 --- a/pkg/controllers/rolloutrun/executor/canary.go +++ b/pkg/controllers/rolloutrun/executor/canary.go @@ -195,7 +195,7 @@ func (e *canaryExecutor) doCanary(ctx *ExecutorContext) (bool, time.Duration, er logger.Info("about to create canary resources and check") canaryWorkloads := make([]*workload.Info, 0) - patch := appendBuiltinPodTemplateMetadataPatch(rolloutRun.Spec.Canary.TemplateMetadataPatch) + patch := appendBuiltinTemplateMetadataPatch(rolloutRun.Spec.Canary.TemplateMetadataPatch) changed := false releaseControl := control.NewCanaryReleaseControl(ctx.Accessor, ctx.Client) @@ -245,7 +245,7 @@ func (e *canaryExecutor) doCanary(ctx *ExecutorContext) (bool, time.Duration, er return true, retryImmediately, nil } -func appendBuiltinPodTemplateMetadataPatch(patch *rolloutv1alpha1.MetadataPatch) *rolloutv1alpha1.MetadataPatch { +func appendBuiltinTemplateMetadataPatch(patch *rolloutv1alpha1.MetadataPatch) *rolloutv1alpha1.MetadataPatch { if patch == nil { patch = &rolloutv1alpha1.MetadataPatch{} } @@ -254,7 +254,7 @@ func appendBuiltinPodTemplateMetadataPatch(patch *rolloutv1alpha1.MetadataPatch) patch.Labels = map[string]string{} } - patch.Labels[rolloutapi.LabelCanary] = "true" + patch.Labels[rolloutapi.LabelCanaryResource] = "true" patch.Labels[rolloutapi.LabelTrafficLane] = rolloutapi.LabelValueTrafficLaneCanary return patch } diff --git a/pkg/features/rolloutclasspredicate/predicate.go b/pkg/features/rolloutclasspredicate/predicate.go index 761fc6a..4d22463 100644 --- a/pkg/features/rolloutclasspredicate/predicate.go +++ b/pkg/features/rolloutclasspredicate/predicate.go @@ -4,10 +4,11 @@ import ( "os" "kusionstack.io/kube-api/rollout" - "kusionstack.io/rollout/pkg/features" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/event" "sigs.k8s.io/controller-runtime/pkg/predicate" + + "kusionstack.io/rollout/pkg/features" ) var RolloutClassMatchesPredicate = predicate.Funcs{ diff --git a/pkg/trafficrouting/backend/inferencepool/accessor.go b/pkg/trafficrouting/backend/inferencepool/accessor.go index d5d7b3b..4e4f632 100644 --- a/pkg/trafficrouting/backend/inferencepool/accessor.go +++ b/pkg/trafficrouting/backend/inferencepool/accessor.go @@ -1,7 +1,6 @@ package inferencepool import ( - rolloutapi "kusionstack.io/kube-api/rollout" rolloutv1alpha1 "kusionstack.io/kube-api/rollout/v1alpha1" "sigs.k8s.io/controller-runtime/pkg/client" gwapiv1alpha2 "sigs.k8s.io/gateway-api-inference-extension/api/v1alpha2" @@ -30,10 +29,6 @@ func (b *accessorImpl) Fork(origin client.Object, config rolloutv1alpha1.ForkedB forkedObj := &gwapiv1alpha2.InferencePool{} // fork metadata forkedObj.ObjectMeta = backend.ForkObjectMeta(obj, config.Name) - if forkedObj.Labels == nil { - forkedObj.Labels = make(map[string]string) - } - forkedObj.Labels[rolloutapi.LabelTemporaryResource] = "true" // fork spec forkedObj.Spec = *obj.Spec.DeepCopy() // change spec @@ -42,7 +37,6 @@ func (b *accessorImpl) Fork(origin client.Object, config rolloutv1alpha1.ForkedB } for k, v := range config.ExtraLabelSelector { forkedObj.Spec.Selector[gwapiv1alpha2.LabelKey(k)] = gwapiv1alpha2.LabelValue(v) - forkedObj.Labels[k] = v } return forkedObj } diff --git a/pkg/trafficrouting/backend/service/accessor.go b/pkg/trafficrouting/backend/service/accessor.go index 216023e..3aff9f4 100644 --- a/pkg/trafficrouting/backend/service/accessor.go +++ b/pkg/trafficrouting/backend/service/accessor.go @@ -15,10 +15,8 @@ package service import ( - "maps" - + "github.com/samber/lo" corev1 "k8s.io/api/core/v1" - rolloutapi "kusionstack.io/kube-api/rollout" rolloutv1alpha1 "kusionstack.io/kube-api/rollout/v1alpha1" "sigs.k8s.io/controller-runtime/pkg/client" @@ -45,19 +43,10 @@ func (s *accessorImpl) Fork(origin client.Object, config rolloutv1alpha1.ForkedB forkedObj := &corev1.Service{} // fork metadata forkedObj.ObjectMeta = backend.ForkObjectMeta(obj, config.Name) - if forkedObj.Labels == nil { - forkedObj.Labels = make(map[string]string) - } - maps.Copy(forkedObj.Labels, config.ExtraLabelSelector) - forkedObj.Labels[rolloutapi.LabelTemporaryResource] = "true" // fork spec forkedObj.Spec.Ports = obj.Spec.Ports forkedObj.Spec.Type = obj.Spec.Type - forkedObj.Spec.Selector = obj.Spec.Selector - if forkedObj.Spec.Selector == nil { - forkedObj.Spec.Selector = make(map[string]string) - } - // change selector - maps.Copy(forkedObj.Spec.Selector, config.ExtraLabelSelector) + // merge selector + forkedObj.Spec.Selector = lo.Assign(obj.Spec.Selector, config.ExtraLabelSelector) return forkedObj } diff --git a/pkg/trafficrouting/route/httproute/route.go b/pkg/trafficrouting/route/httproute/route.go index 8826e31..d9601fd 100644 --- a/pkg/trafficrouting/route/httproute/route.go +++ b/pkg/trafficrouting/route/httproute/route.go @@ -29,7 +29,6 @@ func New() route.Route { } } - func (r *routeImpl) GetController(client client.Client, br *rolloutv1alpha1.BackendRouting, route client.Object, routeStatus rolloutv1alpha1.BackendRouteStatus) (route.RouteController, error) { routeObj, ok := route.(*gatewayapiv1.HTTPRoute) if !ok { diff --git a/pkg/trafficrouting/route/ingress/control.go b/pkg/trafficrouting/route/ingress/control.go index 1f133a2..ccb1d8e 100644 --- a/pkg/trafficrouting/route/ingress/control.go +++ b/pkg/trafficrouting/route/ingress/control.go @@ -150,8 +150,7 @@ func (c *ingressControl) AddCanary(ctx context.Context) error { if canaryIgs.Labels == nil { canaryIgs.Labels = make(map[string]string) } - canaryIgs.Labels[rolloutapi.LabelCanary] = "true" - canaryIgs.Labels[rolloutapi.LabelTemporaryResource] = "true" + canaryIgs.Labels[rolloutapi.LabelCanaryResource] = "true" return nil }) diff --git a/pkg/webhook/mutating/pod/pod_mutating.go b/pkg/webhook/mutating/pod/pod_mutating.go index b432eed..8b57a72 100644 --- a/pkg/webhook/mutating/pod/pod_mutating.go +++ b/pkg/webhook/mutating/pod/pod_mutating.go @@ -99,7 +99,7 @@ func (h *mutatingHandler) Handle(ctx context.Context, req admission.Request) adm // update pod annotations if needed progressingInfosMutator := &progressinginfos.ProgressingInfoMutator{ - ProgressingInfosAnnotationKey: rollout.AnnoPodRolloutProgressingInfos, + ProgressingInfosAnnotationKey: rollout.AnnoRolloutProgressingInfos, } if changed := progressingInfosMutator.MutatePogressingInfo(pod, owners); !changed { return admission.Allowed("Not changed") diff --git a/pkg/workload/util.go b/pkg/workload/util.go index b3e7244..4fffe54 100644 --- a/pkg/workload/util.go +++ b/pkg/workload/util.go @@ -105,7 +105,7 @@ func IsProgressing(workload client.Object) bool { } func IsCanary(workload client.Object) bool { - canaryValue := workload.GetLabels()[rolloutapi.LabelCanary] + canaryValue := workload.GetLabels()[rolloutapi.LabelCanaryResource] return canaryValue == "true" }