diff --git a/go.sum b/go.sum index 2b24975..e9c0315 100644 --- a/go.sum +++ b/go.sum @@ -1021,8 +1021,6 @@ k8s.io/sample-apiserver v0.22.2/go.mod h1:h+/DIV5EmuNq4vfPr5TSXy9mIBVXXlPAKQMPbj k8s.io/system-validators v1.5.0/go.mod h1:bPldcLgkIUK22ALflnsXk8pvkTEndYdNuaHH6gRrl0Q= k8s.io/utils v0.0.0-20240102154912-e7106e64919e h1:eQ/4ljkx21sObifjzXwlPKpdGLrCfRziVtos3ofG/sQ= k8s.io/utils v0.0.0-20240102154912-e7106e64919e/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= -kusionstack.io/kube-api v0.7.4 h1:9fM+SZtYvuVn5L/DuG7oAC+Z17uSDAeVbiAfjugI3SQ= -kusionstack.io/kube-api v0.7.4/go.mod h1:e1jtrQH2LK5fD2nTyfIXG6nYrYbU8VXShRxTRwVPaLk= kusionstack.io/kube-api v0.7.5-0.20251222101808-6d5bc2b4ac64 h1:iXxFN0KuDBLRlTs5lJgFBSitzSVn9kiV2l0uZZZo6Dg= kusionstack.io/kube-api v0.7.5-0.20251222101808-6d5bc2b4ac64/go.mod h1:e1jtrQH2LK5fD2nTyfIXG6nYrYbU8VXShRxTRwVPaLk= kusionstack.io/kube-utils v0.2.1-0.20251125083928-1134a582b341 h1:dnMtHJvIpU3338WpqGiNN2qXWZFiXaoiuzR9jwhvWpg= diff --git a/pkg/controllers/rollout/event_handler.go b/pkg/controllers/rollout/event_handler.go index 385d06c..13aa7a2 100644 --- a/pkg/controllers/rollout/event_handler.go +++ b/pkg/controllers/rollout/event_handler.go @@ -19,9 +19,11 @@ import ( "reflect" "github.com/go-logr/logr" + "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/types" + "kusionstack.io/kube-api/rollout" rolloutv1alpha1 "kusionstack.io/kube-api/rollout/v1alpha1" "kusionstack.io/kube-utils/multicluster/clusterinfo" "sigs.k8s.io/controller-runtime/pkg/client" @@ -71,32 +73,44 @@ func getRolloutForWorkload( logger logr.Logger, workloadInfo *workload.Info, ) (*rolloutv1alpha1.Rollout, error) { - rList := &rolloutv1alpha1.RolloutList{} ctx := clusterinfo.WithCluster(context.TODO(), clusterinfo.Fed) + + // fast path: get rollout by name from workload annotation + if rolloutName := workloadInfo.Annotations[rollout.AnnoRolloutName]; rolloutName != "" { + r := &rolloutv1alpha1.Rollout{} + if err := reader.Get(ctx, types.NamespacedName{Namespace: workloadInfo.Namespace, Name: rolloutName}, r); err != nil { + if errors.IsNotFound(err) { + return nil, nil + } + return nil, err + } + return r, nil + } + + // fallback: list rollouts and match + rList := &rolloutv1alpha1.RolloutList{} if err := reader.List(ctx, rList, client.InNamespace(workloadInfo.Namespace)); err != nil { logger.Error(err, "failed to list rollouts") return nil, err } for i := range rList.Items { - rollout := rList.Items[i] - workloadRef := rollout.Spec.WorkloadRef + rolloutObj := rList.Items[i] + workloadRef := rolloutObj.Spec.WorkloadRef refGV, err := schema.ParseGroupVersion(workloadRef.APIVersion) if err != nil { - logger.Error(err, "failed to parse rollout workload ref group version", "rollout", rollout.Name, "apiVersion", workloadRef.APIVersion) + logger.Error(err, "failed to parse rollout workload ref group version", "rollout", rolloutObj.Name, "apiVersion", workloadRef.APIVersion) continue } refGVK := refGV.WithKind(workloadRef.Kind) if !reflect.DeepEqual(refGVK, workloadInfo.GroupVersionKind) { - // group version kind not match - // logger.Info("gvk not match", "gvk", workloadInfo.GVK.String(), "refGVK", refGVK) continue } macher := workload.MatchAsMatcher(workloadRef.Match) if macher.Matches(workloadInfo.ClusterName, workloadInfo.Name, workloadInfo.Labels) { - return &rollout, nil + return &rolloutObj, nil } } @@ -122,12 +136,12 @@ func enqueueRolloutForStrategyHandler( } name := strategy.GetName() - for _, rollout := range rList.Items { - if rollout.Spec.StrategyRef == name { + for _, rolloutObj := range rList.Items { + if rolloutObj.Spec.StrategyRef == name { result = append(result, reconcile.Request{ NamespacedName: types.NamespacedName{ - Namespace: rollout.Namespace, - Name: rollout.Name, + Namespace: rolloutObj.Namespace, + Name: rolloutObj.Name, }, }) } diff --git a/pkg/workload/info.go b/pkg/workload/info.go index 2b9074b..7598bae 100644 --- a/pkg/workload/info.go +++ b/pkg/workload/info.go @@ -80,10 +80,11 @@ func NewInfo(cluster string, gvk schema.GroupVersionKind, obj client.Object, sta return &Info{ ClusterName: cluster, ObjectMeta: metav1.ObjectMeta{ - Namespace: obj.GetNamespace(), - Name: obj.GetName(), - Labels: obj.GetLabels(), - Generation: obj.GetGeneration(), + Namespace: obj.GetNamespace(), + Name: obj.GetName(), + Labels: obj.GetLabels(), + Generation: obj.GetGeneration(), + Annotations: obj.GetAnnotations(), }, GroupVersionKind: gvk, Status: status,