@@ -17,14 +17,9 @@ import (
1717 "k8s.io/apimachinery/pkg/runtime"
1818 "k8s.io/apimachinery/pkg/runtime/schema"
1919 "k8s.io/apimachinery/pkg/types"
20- "k8s.io/client-go/discovery"
21- "k8s.io/utils/ptr"
2220 "pkg.package-operator.run/boxcutter"
2321 "pkg.package-operator.run/boxcutter/machinery"
2422 machinerytypes "pkg.package-operator.run/boxcutter/machinery/types"
25- "pkg.package-operator.run/boxcutter/managedcache"
26- "pkg.package-operator.run/boxcutter/ownerhandling"
27- "pkg.package-operator.run/boxcutter/validation"
2823 ctrl "sigs.k8s.io/controller-runtime"
2924 "sigs.k8s.io/controller-runtime/pkg/builder"
3025 "sigs.k8s.io/controller-runtime/pkg/client"
@@ -39,68 +34,21 @@ import (
3934
4035const (
4136 ClusterExtensionRevisionOwnerLabel = "olm.operatorframework.io/owner"
42- boxcutterSystemPrefixFieldOwner = "olm.operatorframework.io"
4337 clusterExtensionRevisionTeardownFinalizer = "olm.operatorframework.io/teardown"
4438)
4539
4640// ClusterExtensionRevisionReconciler actions individual snapshots of ClusterExtensions,
4741// as part of the boxcutter integration.
4842type ClusterExtensionRevisionReconciler struct {
49- Client client.Client
50- RevisionManager RevisionManager
51- }
52-
53- type AccessManager interface {
54- GetWithUser (ctx context.Context , owner * ocv1.ClusterExtension , user client.Object , usedFor []client.Object ) (managedcache.Accessor , error )
55- FreeWithUser (ctx context.Context , owner * ocv1.ClusterExtension , user client.Object ) error
56- Source (handler.EventHandler , ... predicate.Predicate ) source.Source
43+ Client client.Client
44+ RevisionEngine RevisionEngine
5745}
5846
5947type RevisionEngine interface {
6048 Teardown (ctx context.Context , rev machinerytypes.Revision , opts ... machinerytypes.RevisionTeardownOption ) (machinery.RevisionTeardownResult , error )
6149 Reconcile (ctx context.Context , rev machinerytypes.Revision , opts ... machinerytypes.RevisionReconcileOption ) (machinery.RevisionResult , error )
6250}
6351
64- type RevisionManager interface {
65- GetScopedRevisionEngine (ctx context.Context , owner * ocv1.ClusterExtension , user client.Object , usedFor []client.Object ) (RevisionEngine , error )
66- HandleDeletion (ctx context.Context , owner * ocv1.ClusterExtension , user client.Object ) error
67- Source (handler.EventHandler , ... predicate.Predicate ) source.Source
68- }
69-
70- type OLMRevisionEngineGetter struct {
71- DiscoveryClient discovery.DiscoveryInterface
72- Scheme * runtime.Scheme
73- RestMapper meta.RESTMapper
74- AccessManager AccessManager
75- }
76-
77- func (r * OLMRevisionEngineGetter ) GetScopedRevisionEngine (ctx context.Context , owner * ocv1.ClusterExtension , user client.Object , usedFor []client.Object ) (RevisionEngine , error ) {
78- accessor , err := r .AccessManager .GetWithUser (ctx , owner , user , usedFor )
79- if err != nil {
80- return nil , fmt .Errorf ("get cache: %w" , err )
81- }
82- return machinery .NewRevisionEngine (
83- machinery .NewPhaseEngine (
84- machinery .NewObjectEngine (
85- r .Scheme , accessor , accessor ,
86- ownerhandling .NewNative (r .Scheme ),
87- machinery .NewComparator (ownerhandling .NewNative (r .Scheme ), r .DiscoveryClient , r .Scheme , boxcutterSystemPrefixFieldOwner ),
88- boxcutterSystemPrefixFieldOwner , boxcutterSystemPrefixFieldOwner ,
89- ),
90- validation .NewClusterPhaseValidator (r .RestMapper , accessor ),
91- ),
92- validation .NewRevisionValidator (), accessor ,
93- ), nil
94- }
95-
96- func (r * OLMRevisionEngineGetter ) HandleDeletion (ctx context.Context , owner * ocv1.ClusterExtension , user client.Object ) error {
97- return r .AccessManager .FreeWithUser (ctx , owner , user )
98- }
99-
100- func (r * OLMRevisionEngineGetter ) Source (eventHandler handler.EventHandler , p ... predicate.Predicate ) source.Source {
101- return r .AccessManager .Source (eventHandler , p ... )
102- }
103-
10452//+kubebuilder:rbac:groups=olm.operatorframework.io,resources=clusterextensionrevisions,verbs=get;list;watch;update;patch;create;delete
10553//+kubebuilder:rbac:groups=olm.operatorframework.io,resources=clusterextensionrevisions/status,verbs=update;patch
10654//+kubebuilder:rbac:groups=olm.operatorframework.io,resources=clusterextensionrevisions/finalizers,verbs=update
@@ -120,18 +68,7 @@ func (c *ClusterExtensionRevisionReconciler) Reconcile(ctx context.Context, req
12068
12169 controller , ok := getControllingClusterExtension (rev )
12270 if ! ok {
123- // ClusterExtension revisions can't exist without a ClusterExtension in control.
124- // This situation can only appear if the ClusterExtension object has been deleted with --cascade=Orphan.
125- // To not leave unactionable resources on the cluster, we are going to just
126- // reap the revision reverences and propagate the Orphan deletion.
127- if rev .DeletionTimestamp .IsZero () {
128- return ctrl.Result {}, client .IgnoreNotFound (
129- c .Client .Delete (ctx , rev , client .PropagationPolicy (metav1 .DeletePropagationOrphan ), client.Preconditions {
130- UID : ptr .To (rev .GetUID ()),
131- ResourceVersion : ptr .To (rev .GetResourceVersion ()),
132- }),
133- )
134- }
71+ // TODO: clean up all the deletion logic for the case where orphaned CEV are created for reasons
13572 return ctrl.Result {}, c .removeFinalizer (ctx , rev , clusterExtensionRevisionTeardownFinalizer )
13673 }
13774
@@ -143,47 +80,20 @@ func (c *ClusterExtensionRevisionReconciler) reconcile(ctx context.Context, ce *
14380
14481 revision , opts , previous := toBoxcutterRevision (ce .Name , rev )
14582
146- var objects []client.Object
147- for _ , phase := range revision .GetPhases () {
148- for _ , pobj := range phase .GetObjects () {
149- objects = append (objects , & pobj )
150- }
151- }
152-
153- // THIS IS STUPID, PLEASE FIX!
154- // Revisions need individual finalizers on the ClusterExtension to prevent its premature deletion.
155- if rev .DeletionTimestamp .IsZero () &&
156- rev .Spec .LifecycleState != ocv1 .ClusterExtensionRevisionLifecycleStateArchived {
157- // We can't lookup the complete ClusterExtension when it's already deleted.
158- // This only works when the controller-manager is not restarted during teardown.
159- if err := c .Client .Get (ctx , client .ObjectKeyFromObject (ce ), ce ); err != nil {
160- return ctrl.Result {}, err
161- }
162- }
163-
164- re , err := c .RevisionManager .GetScopedRevisionEngine (ctx , ce , rev , objects )
165- if err != nil {
166- return ctrl.Result {}, err
167- }
168-
16983 if ! rev .DeletionTimestamp .IsZero () ||
17084 rev .Spec .LifecycleState == ocv1 .ClusterExtensionRevisionLifecycleStateArchived {
17185 //
17286 // Teardown
17387 //
174- tres , err := re .Teardown (ctx , * revision )
88+ tres , err := c . RevisionEngine .Teardown (ctx , * revision )
17589 if err != nil {
17690 return ctrl.Result {}, fmt .Errorf ("revision teardown: %w" , err )
17791 }
17892
17993 l .Info ("teardown report" , "report" , tres .String ())
180-
18194 if ! tres .IsComplete () {
18295 return ctrl.Result {}, nil
18396 }
184- if err := c .RevisionManager .HandleDeletion (ctx , ce , rev ); err != nil {
185- return ctrl.Result {}, fmt .Errorf ("get cache: %w" , err )
186- }
18797 return ctrl.Result {}, c .removeFinalizer (ctx , rev , clusterExtensionRevisionTeardownFinalizer )
18898 }
18999
@@ -193,7 +103,7 @@ func (c *ClusterExtensionRevisionReconciler) reconcile(ctx context.Context, ce *
193103 if err := c .ensureFinalizer (ctx , rev , clusterExtensionRevisionTeardownFinalizer ); err != nil {
194104 return ctrl.Result {}, err
195105 }
196- rres , err := re .Reconcile (ctx , * revision , opts ... )
106+ rres , err := c . RevisionEngine .Reconcile (ctx , * revision , opts ... )
197107 if err != nil {
198108 return ctrl.Result {}, fmt .Errorf ("revision reconcile: %w" , err )
199109 }
@@ -294,14 +204,18 @@ func (c *ClusterExtensionRevisionReconciler) reconcile(ctx context.Context, ce *
294204 return ctrl.Result {}, c .Client .Status ().Update (ctx , rev )
295205}
296206
297- func (c * ClusterExtensionRevisionReconciler ) SetupWithManager (mgr ctrl.Manager ) error {
207+ type Sourcerer interface {
208+ Source (handler handler.EventHandler , predicates ... predicate.Predicate ) source.Source
209+ }
210+
211+ func (c * ClusterExtensionRevisionReconciler ) SetupWithManager (mgr ctrl.Manager , sourcerer Sourcerer ) error {
298212 return ctrl .NewControllerManagedBy (mgr ).
299213 For (
300214 & ocv1.ClusterExtensionRevision {},
301215 builder .WithPredicates (predicate.ResourceVersionChangedPredicate {}),
302216 ).
303217 WatchesRawSource (
304- c . RevisionManager .Source (
218+ sourcerer .Source (
305219 handler .EnqueueRequestForOwner (mgr .GetScheme (), mgr .GetRESTMapper (), & ocv1.ClusterExtensionRevision {}),
306220 predicate.ResourceVersionChangedPredicate {},
307221 ),
0 commit comments