@@ -70,6 +70,7 @@ import (
7070 kustomizev1 "github.com/fluxcd/kustomize-controller/api/v1"
7171 "github.com/fluxcd/kustomize-controller/internal/decryptor"
7272 "github.com/fluxcd/kustomize-controller/internal/inventory"
73+ "github.com/fluxcd/kustomize-controller/internal/pkg"
7374)
7475
7576// +kubebuilder:rbac:groups=kustomize.toolkit.fluxcd.io,resources=kustomizations,verbs=get;list;watch;create;update;patch;delete
@@ -193,7 +194,7 @@ func (r *KustomizationReconciler) Reconcile(ctx context.Context, req ctrl.Reques
193194 time .Since (reconcileStart ).String (),
194195 obj .Spec .Interval .Duration .String ())
195196 log .Info (msg , "revision" , obj .Status .LastAttemptedRevision )
196- r .event (obj , obj .Status .LastAppliedRevision , eventv1 .EventSeverityInfo , msg ,
197+ r .event (obj , obj .Status .LastAppliedRevision , obj . Status . LastAppliedOriginRevision , eventv1 .EventSeverityInfo , msg ,
197198 map [string ]string {
198199 kustomizev1 .GroupVersion .Group + "/" + eventv1 .MetaCommitStatusKey : eventv1 .MetaCommitStatusUpdateValue ,
199200 })
@@ -234,7 +235,7 @@ func (r *KustomizationReconciler) Reconcile(ctx context.Context, req ctrl.Reques
234235 if acl .IsAccessDenied (err ) {
235236 conditions .MarkFalse (obj , meta .ReadyCondition , apiacl .AccessDeniedReason , "%s" , err )
236237 log .Error (err , "Access denied to cross-namespace source" )
237- r .event (obj , "unknown " , eventv1 .EventSeverityError , err .Error (), nil )
238+ r .event (obj , "" , " " , eventv1 .EventSeverityError , err .Error (), nil )
238239 return ctrl.Result {RequeueAfter : obj .GetRetryInterval ()}, nil
239240 }
240241
@@ -249,14 +250,16 @@ func (r *KustomizationReconciler) Reconcile(ctx context.Context, req ctrl.Reques
249250 log .Info (msg )
250251 return ctrl.Result {RequeueAfter : r .requeueDependency }, nil
251252 }
253+ revision := artifactSource .GetArtifact ().Revision
254+ originRevision := getOriginRevision (artifactSource )
252255
253256 // Check dependencies and requeue the reconciliation if the check fails.
254257 if len (obj .Spec .DependsOn ) > 0 {
255258 if err := r .checkDependencies (ctx , obj , artifactSource ); err != nil {
256259 conditions .MarkFalse (obj , meta .ReadyCondition , meta .DependencyNotReadyReason , "%s" , err )
257260 msg := fmt .Sprintf ("Dependencies do not meet ready condition, retrying in %s" , r .requeueDependency .String ())
258261 log .Info (msg )
259- r .event (obj , artifactSource . GetArtifact (). Revision , eventv1 .EventSeverityInfo , msg , nil )
262+ r .event (obj , revision , originRevision , eventv1 .EventSeverityInfo , msg , nil )
260263 return ctrl.Result {RequeueAfter : r .requeueDependency }, nil
261264 }
262265 log .Info ("All dependencies are ready, proceeding with reconciliation" )
@@ -279,8 +282,8 @@ func (r *KustomizationReconciler) Reconcile(ctx context.Context, req ctrl.Reques
279282 time .Since (reconcileStart ).String (),
280283 obj .GetRetryInterval ().String ()),
281284 "revision" ,
282- artifactSource . GetArtifact (). Revision )
283- r .event (obj , artifactSource . GetArtifact (). Revision , eventv1 .EventSeverityError ,
285+ revision )
286+ r .event (obj , revision , originRevision , eventv1 .EventSeverityError ,
284287 reconcileErr .Error (), nil )
285288 return ctrl.Result {RequeueAfter : obj .GetRetryInterval ()}, nil
286289 }
@@ -298,6 +301,7 @@ func (r *KustomizationReconciler) reconcile(
298301
299302 // Update status with the reconciliation progress.
300303 revision := src .GetArtifact ().Revision
304+ originRevision := getOriginRevision (src )
301305 progressingMsg := fmt .Sprintf ("Fetching manifests for revision %s with a timeout of %s" , revision , obj .GetTimeout ().String ())
302306 conditions .MarkUnknown (obj , meta .ReadyCondition , meta .ProgressingReason , "%s" , "Reconciliation in progress" )
303307 conditions .MarkReconciling (obj , meta .ProgressingReason , "%s" , progressingMsg )
@@ -419,7 +423,7 @@ func (r *KustomizationReconciler) reconcile(
419423 }
420424
421425 // Validate and apply resources in stages.
422- drifted , changeSet , err := r .apply (ctx , resourceManager , obj , revision , objects )
426+ drifted , changeSet , err := r .apply (ctx , resourceManager , obj , revision , originRevision , objects )
423427 if err != nil {
424428 conditions .MarkFalse (obj , meta .ReadyCondition , meta .ReconciliationFailedReason , "%s" , err )
425429 return err
@@ -444,7 +448,7 @@ func (r *KustomizationReconciler) reconcile(
444448 }
445449
446450 // Run garbage collection for stale resources that do not have pruning disabled.
447- if _ , err := r .prune (ctx , resourceManager , obj , revision , staleObjects ); err != nil {
451+ if _ , err := r .prune (ctx , resourceManager , obj , revision , originRevision , staleObjects ); err != nil {
448452 conditions .MarkFalse (obj , meta .ReadyCondition , meta .PruneFailedReason , "%s" , err )
449453 return err
450454 }
@@ -456,15 +460,17 @@ func (r *KustomizationReconciler) reconcile(
456460 patcher ,
457461 obj ,
458462 revision ,
463+ originRevision ,
459464 isNewRevision ,
460465 drifted ,
461466 changeSet .ToObjMetadataSet ()); err != nil {
462467 conditions .MarkFalse (obj , meta .ReadyCondition , meta .HealthCheckFailedReason , "%s" , err )
463468 return err
464469 }
465470
466- // Set last applied revision .
471+ // Set last applied revisions .
467472 obj .Status .LastAppliedRevision = revision
473+ obj .Status .LastAppliedOriginRevision = originRevision
468474
469475 // Mark the object as ready.
470476 conditions .MarkTrue (obj ,
@@ -656,6 +662,7 @@ func (r *KustomizationReconciler) apply(ctx context.Context,
656662 manager * ssa.ResourceManager ,
657663 obj * kustomizev1.Kustomization ,
658664 revision string ,
665+ originRevision string ,
659666 objects []* unstructured.Unstructured ) (bool , * ssa.ChangeSet , error ) {
660667 log := ctrl .LoggerFrom (ctx )
661668
@@ -841,7 +848,7 @@ func (r *KustomizationReconciler) apply(ctx context.Context,
841848 // emit event only if the server-side apply resulted in changes
842849 applyLog := strings .TrimSuffix (changeSetLog .String (), "\n " )
843850 if applyLog != "" {
844- r .event (obj , revision , eventv1 .EventSeverityInfo , applyLog , nil )
851+ r .event (obj , revision , originRevision , eventv1 .EventSeverityInfo , applyLog , nil )
845852 }
846853
847854 return applyLog != "" , resultSet , nil
@@ -852,6 +859,7 @@ func (r *KustomizationReconciler) checkHealth(ctx context.Context,
852859 patcher * patch.SerialPatcher ,
853860 obj * kustomizev1.Kustomization ,
854861 revision string ,
862+ originRevision string ,
855863 isNewRevision bool ,
856864 drifted bool ,
857865 objects object.ObjMetadataSet ) error {
@@ -910,7 +918,7 @@ func (r *KustomizationReconciler) checkHealth(ctx context.Context,
910918 // Emit recovery event if the previous health check failed.
911919 msg := fmt .Sprintf ("Health check passed in %s" , time .Since (checkStart ).String ())
912920 if ! wasHealthy || (isNewRevision && drifted ) {
913- r .event (obj , revision , eventv1 .EventSeverityInfo , msg , nil )
921+ r .event (obj , revision , originRevision , eventv1 .EventSeverityInfo , msg , nil )
914922 }
915923
916924 conditions .MarkTrue (obj , meta .HealthyCondition , meta .SucceededReason , "%s" , msg )
@@ -925,6 +933,7 @@ func (r *KustomizationReconciler) prune(ctx context.Context,
925933 manager * ssa.ResourceManager ,
926934 obj * kustomizev1.Kustomization ,
927935 revision string ,
936+ originRevision string ,
928937 objects []* unstructured.Unstructured ) (bool , error ) {
929938 if ! obj .Spec .Prune {
930939 return false , nil
@@ -949,7 +958,7 @@ func (r *KustomizationReconciler) prune(ctx context.Context,
949958 // emit event only if the prune operation resulted in changes
950959 if changeSet != nil && len (changeSet .Entries ) > 0 {
951960 log .Info (fmt .Sprintf ("garbage collection completed: %s" , changeSet .String ()))
952- r .event (obj , revision , eventv1 .EventSeverityInfo , changeSet .String (), nil )
961+ r .event (obj , revision , originRevision , eventv1 .EventSeverityInfo , changeSet .String (), nil )
953962 return true , nil
954963 }
955964
@@ -1004,19 +1013,19 @@ func (r *KustomizationReconciler) finalize(ctx context.Context,
10041013
10051014 changeSet , err := resourceManager .DeleteAll (ctx , objects , opts )
10061015 if err != nil {
1007- r .event (obj , obj .Status .LastAppliedRevision , eventv1 .EventSeverityError , "pruning for deleted resource failed" , nil )
1016+ r .event (obj , obj .Status .LastAppliedRevision , obj . Status . LastAppliedOriginRevision , eventv1 .EventSeverityError , "pruning for deleted resource failed" , nil )
10081017 // Return the error so we retry the failed garbage collection
10091018 return ctrl.Result {}, err
10101019 }
10111020
10121021 if changeSet != nil && len (changeSet .Entries ) > 0 {
1013- r .event (obj , obj .Status .LastAppliedRevision , eventv1 .EventSeverityInfo , changeSet .String (), nil )
1022+ r .event (obj , obj .Status .LastAppliedRevision , obj . Status . LastAppliedOriginRevision , eventv1 .EventSeverityInfo , changeSet .String (), nil )
10141023 }
10151024 } else {
10161025 // when the account to impersonate is gone, log the stale objects and continue with the finalization
10171026 msg := fmt .Sprintf ("unable to prune objects: \n %s" , ssautil .FmtUnstructuredList (objects ))
10181027 log .Error (fmt .Errorf ("skiping pruning, failed to find account to impersonate" ), msg )
1019- r .event (obj , obj .Status .LastAppliedRevision , eventv1 .EventSeverityError , msg , nil )
1028+ r .event (obj , obj .Status .LastAppliedRevision , obj . Status . LastAppliedOriginRevision , eventv1 .EventSeverityError , msg , nil )
10201029 }
10211030 }
10221031
@@ -1027,13 +1036,16 @@ func (r *KustomizationReconciler) finalize(ctx context.Context,
10271036}
10281037
10291038func (r * KustomizationReconciler ) event (obj * kustomizev1.Kustomization ,
1030- revision , severity , msg string ,
1039+ revision , originRevision , severity , msg string ,
10311040 metadata map [string ]string ) {
10321041 if metadata == nil {
10331042 metadata = map [string ]string {}
10341043 }
10351044 if revision != "" {
1036- metadata [kustomizev1 .GroupVersion .Group + "/revision" ] = revision
1045+ metadata [kustomizev1 .GroupVersion .Group + "/" + eventv1 .MetaRevisionKey ] = revision
1046+ }
1047+ if originRevision != "" {
1048+ metadata [kustomizev1 .GroupVersion .Group + "/" + eventv1 .MetaOriginRevisionKey ] = originRevision
10371049 }
10381050
10391051 reason := severity
@@ -1108,3 +1120,14 @@ func (r *KustomizationReconciler) patch(ctx context.Context,
11081120
11091121 return nil
11101122}
1123+
1124+ // getOriginRevision returns the origin revision of the source artifact,
1125+ // or the empty string if it's not present, or if the artifact itself
1126+ // is not present.
1127+ func getOriginRevision (src sourcev1.Source ) string {
1128+ a := src .GetArtifact ()
1129+ if a == nil {
1130+ return ""
1131+ }
1132+ return a .Metadata [pkg .OCIArtifactOriginRevisionAnnotation ]
1133+ }
0 commit comments