@@ -17,6 +17,7 @@ import (
1717 "k8s.io/apimachinery/pkg/runtime"
1818 "k8s.io/apimachinery/pkg/runtime/schema"
1919 "k8s.io/apimachinery/pkg/types"
20+ "k8s.io/apimachinery/pkg/util/sets"
2021 "pkg.package-operator.run/boxcutter"
2122 "pkg.package-operator.run/boxcutter/machinery"
2223 machinerytypes "pkg.package-operator.run/boxcutter/machinery/types"
@@ -42,6 +43,14 @@ const (
4243type ClusterExtensionRevisionReconciler struct {
4344 Client client.Client
4445 RevisionEngine RevisionEngine
46+ TrackingCache trackingCache
47+ }
48+
49+ type trackingCache interface {
50+ client.Reader
51+ Source (handler handler.EventHandler , predicates ... predicate.Predicate ) source.Source
52+ Watch (ctx context.Context , user client.Object , gvks sets.Set [schema.GroupVersionKind ]) error
53+ Free (ctx context.Context , user client.Object ) error
4554}
4655
4756type RevisionEngine interface {
@@ -66,19 +75,13 @@ func (c *ClusterExtensionRevisionReconciler) Reconcile(ctx context.Context, req
6675 l .Info ("reconcile starting" )
6776 defer l .Info ("reconcile ending" )
6877
69- controller , ok := getControllingClusterExtension (rev )
70- if ! ok {
71- // TODO: clean up all the deletion logic for the case where orphaned CEV are created for reasons
72- return ctrl.Result {}, c .removeFinalizer (ctx , rev , clusterExtensionRevisionTeardownFinalizer )
73- }
74-
75- return c .reconcile (ctx , controller , rev )
78+ return c .reconcile (ctx , rev )
7679}
7780
78- func (c * ClusterExtensionRevisionReconciler ) reconcile (ctx context.Context , ce * ocv1. ClusterExtension , rev * ocv1.ClusterExtensionRevision ) (ctrl.Result , error ) {
81+ func (c * ClusterExtensionRevisionReconciler ) reconcile (ctx context.Context , rev * ocv1.ClusterExtensionRevision ) (ctrl.Result , error ) {
7982 l := log .FromContext (ctx )
8083
81- revision , opts , previous := toBoxcutterRevision (ce . Name , rev )
84+ revision , opts , previous := toBoxcutterRevision (rev )
8285
8386 if ! rev .DeletionTimestamp .IsZero () ||
8487 rev .Spec .LifecycleState == ocv1 .ClusterExtensionRevisionLifecycleStateArchived {
@@ -94,6 +97,10 @@ func (c *ClusterExtensionRevisionReconciler) reconcile(ctx context.Context, ce *
9497 if ! tres .IsComplete () {
9598 return ctrl.Result {}, nil
9699 }
100+
101+ if err := c .TrackingCache .Free (ctx , rev ); err != nil {
102+ return ctrl.Result {}, err
103+ }
97104 return ctrl.Result {}, c .removeFinalizer (ctx , rev , clusterExtensionRevisionTeardownFinalizer )
98105 }
99106
@@ -103,6 +110,9 @@ func (c *ClusterExtensionRevisionReconciler) reconcile(ctx context.Context, ce *
103110 if err := c .ensureFinalizer (ctx , rev , clusterExtensionRevisionTeardownFinalizer ); err != nil {
104111 return ctrl.Result {}, err
105112 }
113+ if err := c .establishWatch (ctx , rev , revision ); err != nil {
114+ return ctrl.Result {}, err
115+ }
106116 rres , err := c .RevisionEngine .Reconcile (ctx , * revision , opts ... )
107117 if err != nil {
108118 return ctrl.Result {}, fmt .Errorf ("revision reconcile: %w" , err )
@@ -208,21 +218,35 @@ type Sourcerer interface {
208218 Source (handler handler.EventHandler , predicates ... predicate.Predicate ) source.Source
209219}
210220
211- func (c * ClusterExtensionRevisionReconciler ) SetupWithManager (mgr ctrl.Manager , sourcerer Sourcerer ) error {
221+ func (c * ClusterExtensionRevisionReconciler ) SetupWithManager (mgr ctrl.Manager ) error {
212222 return ctrl .NewControllerManagedBy (mgr ).
213223 For (
214224 & ocv1.ClusterExtensionRevision {},
215225 builder .WithPredicates (predicate.ResourceVersionChangedPredicate {}),
216226 ).
217227 WatchesRawSource (
218- sourcerer .Source (
228+ c . TrackingCache .Source (
219229 handler .EnqueueRequestForOwner (mgr .GetScheme (), mgr .GetRESTMapper (), & ocv1.ClusterExtensionRevision {}),
220230 predicate.ResourceVersionChangedPredicate {},
221231 ),
222232 ).
223233 Complete (c )
224234}
225235
236+ func (c * ClusterExtensionRevisionReconciler ) establishWatch (
237+ ctx context.Context , rev * ocv1.ClusterExtensionRevision ,
238+ boxcutterRev * boxcutter.Revision ,
239+ ) error {
240+ gvks := sets .New [schema.GroupVersionKind ]()
241+ for _ , phase := range boxcutterRev .Phases {
242+ for _ , obj := range phase .Objects {
243+ gvks .Insert (obj .GroupVersionKind ())
244+ }
245+ }
246+
247+ return c .TrackingCache .Watch (ctx , rev , gvks )
248+ }
249+
226250func (c * ClusterExtensionRevisionReconciler ) ensureFinalizer (
227251 ctx context.Context , obj client.Object , finalizer string ,
228252) error {
@@ -289,7 +313,7 @@ func getControllingClusterExtension(obj client.Object) (*ocv1.ClusterExtension,
289313 return nil , false
290314}
291315
292- func toBoxcutterRevision (clusterExtensionName string , rev * ocv1.ClusterExtensionRevision ) (* boxcutter.Revision , []boxcutter.RevisionReconcileOption , []client.Object ) {
316+ func toBoxcutterRevision (rev * ocv1.ClusterExtensionRevision ) (* boxcutter.Revision , []boxcutter.RevisionReconcileOption , []client.Object ) {
293317 r := & boxcutter.Revision {
294318 Name : rev .Name ,
295319 Owner : rev ,
@@ -304,7 +328,7 @@ func toBoxcutterRevision(clusterExtensionName string, rev *ocv1.ClusterExtension
304328 if labels == nil {
305329 labels = map [string ]string {}
306330 }
307- labels [ClusterExtensionRevisionOwnerLabel ] = clusterExtensionName
331+ labels [ClusterExtensionRevisionOwnerLabel ] = rev . Labels [ ClusterExtensionRevisionOwnerLabel ]
308332 obj .SetLabels (labels )
309333
310334 phase .Objects = append (phase .Objects , obj )
0 commit comments