From aaf81e9bdcc6668112f3e55e851fd8524aaef578 Mon Sep 17 00:00:00 2001 From: Adrian Fernandez De La Torre Date: Mon, 8 Sep 2025 16:10:06 +0200 Subject: [PATCH] Populate source-revision across all the resources at apply Signed-off-by: Adrian Fernandez De La Torre --- .../controller/kustomization_controller.go | 22 ++++++++++++++++++- internal/features/features.go | 7 ++++++ main.go | 7 ++++++ 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/internal/controller/kustomization_controller.go b/internal/controller/kustomization_controller.go index 6ab99d7a..9e850c06 100644 --- a/internal/controller/kustomization_controller.go +++ b/internal/controller/kustomization_controller.go @@ -119,6 +119,7 @@ type KustomizationReconciler struct { FailFast bool GroupChangeLog bool StrictSubstitutions bool + EnableRevisionAnnotation bool } func (r *KustomizationReconciler) Reconcile(ctx context.Context, req ctrl.Request) (result ctrl.Result, retErr error) { @@ -812,7 +813,26 @@ func (r *KustomizationReconciler) apply(ctx context.Context, return false, nil, err } - if cmeta := obj.Spec.CommonMetadata; cmeta != nil { + var revisionAnnotations map[string]string + if r.EnableRevisionAnnotation { + if obj.Status.LastAppliedRevision == "" || revision != obj.Status.LastAppliedRevision { + revisionAnnotations = map[string]string{ + fmt.Sprintf("%s/source-revision", eventv1.Group): revision, + } + } + if originRevision != "" && originRevision != obj.Status.LastAppliedOriginRevision { + revisionAnnotations[fmt.Sprintf("%s/source-revision", eventv1.Group)] = originRevision + } + } + + cmeta := obj.Spec.CommonMetadata + if cmeta != nil { + if cmeta.Annotations == nil { + cmeta.Annotations = make(map[string]string) + } + for k, v := range revisionAnnotations { + cmeta.Annotations[k] = v + } ssautil.SetCommonMetadata(objects, cmeta.Labels, cmeta.Annotations) } diff --git a/internal/features/features.go b/internal/features/features.go index 2053384b..feb174e0 100644 --- a/internal/features/features.go +++ b/internal/features/features.go @@ -59,6 +59,10 @@ const ( // ExternalArtifact controls whether the ExternalArtifact source type is enabled. ExternalArtifact = "ExternalArtifact" + + // EnableRevisionAnnotation controls whether source revision annotations + // should be enabled on applied resources. + EnableRevisionAnnotation = "EnableRevisionAnnotation" ) var features = map[string]bool{ @@ -83,6 +87,9 @@ var features = map[string]bool{ // ExternalArtifact // opt-in from v1.7 ExternalArtifact: false, + // EnableRevisionAnnotation + // opt-in from v1.8 + EnableRevisionAnnotation: true, } func init() { diff --git a/main.go b/main.go index a26bb80d..179452a7 100644 --- a/main.go +++ b/main.go @@ -293,6 +293,12 @@ func main() { os.Exit(1) } + enableRevisionAnnotation, err := features.Enabled(features.EnableRevisionAnnotation) + if err != nil { + setupLog.Error(err, "unable to check feature gate "+features.EnableRevisionAnnotation) + os.Exit(1) + } + var tokenCache *pkgcache.TokenCache if tokenCacheOptions.MaxSize > 0 { var err error @@ -330,6 +336,7 @@ func main() { StatusManager: fmt.Sprintf("gotk-%s", controllerName), StrictSubstitutions: strictSubstitutions, TokenCache: tokenCache, + EnableRevisionAnnotation: enableRevisionAnnotation, }).SetupWithManager(ctx, mgr, controller.KustomizationReconcilerOptions{ RateLimiter: runtimeCtrl.GetRateLimiter(rateLimiterOptions), WatchConfigsPredicate: watchConfigsPredicate,