66 "context"
77 "encoding/json"
88 "fmt"
9+ "sigs.k8s.io/controller-runtime/pkg/source"
910 "strings"
1011 "time"
1112
@@ -17,90 +18,37 @@ import (
1718 "k8s.io/apimachinery/pkg/runtime"
1819 "k8s.io/apimachinery/pkg/runtime/schema"
1920 "k8s.io/apimachinery/pkg/types"
20- "k8s.io/client-go/discovery"
21- "k8s.io/utils/ptr"
2221 "pkg.package-operator.run/boxcutter"
2322 "pkg.package-operator.run/boxcutter/machinery"
2423 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"
2824 ctrl "sigs.k8s.io/controller-runtime"
2925 "sigs.k8s.io/controller-runtime/pkg/builder"
3026 "sigs.k8s.io/controller-runtime/pkg/client"
3127 "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
3228 "sigs.k8s.io/controller-runtime/pkg/handler"
3329 "sigs.k8s.io/controller-runtime/pkg/log"
3430 "sigs.k8s.io/controller-runtime/pkg/predicate"
35- "sigs.k8s.io/controller-runtime/pkg/source"
3631
3732 ocv1 "github.com/operator-framework/operator-controller/api/v1"
3833)
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
@@ -150,40 +87,20 @@ func (c *ClusterExtensionRevisionReconciler) reconcile(ctx context.Context, ce *
15087 }
15188 }
15289
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-
16990 if ! rev .DeletionTimestamp .IsZero () ||
17091 rev .Spec .LifecycleState == ocv1 .ClusterExtensionRevisionLifecycleStateArchived {
17192 //
17293 // Teardown
17394 //
174- tres , err := re .Teardown (ctx , * revision )
95+ tres , err := c . RevisionEngine .Teardown (ctx , * revision )
17596 if err != nil {
17697 return ctrl.Result {}, fmt .Errorf ("revision teardown: %w" , err )
17798 }
17899
179100 l .Info ("teardown report" , "report" , tres .String ())
180-
181101 if ! tres .IsComplete () {
182102 return ctrl.Result {}, nil
183103 }
184- if err := c .RevisionManager .HandleDeletion (ctx , ce , rev ); err != nil {
185- return ctrl.Result {}, fmt .Errorf ("get cache: %w" , err )
186- }
187104 return ctrl.Result {}, c .removeFinalizer (ctx , rev , clusterExtensionRevisionTeardownFinalizer )
188105 }
189106
@@ -193,7 +110,7 @@ func (c *ClusterExtensionRevisionReconciler) reconcile(ctx context.Context, ce *
193110 if err := c .ensureFinalizer (ctx , rev , clusterExtensionRevisionTeardownFinalizer ); err != nil {
194111 return ctrl.Result {}, err
195112 }
196- rres , err := re .Reconcile (ctx , * revision , opts ... )
113+ rres , err := c . RevisionEngine .Reconcile (ctx , * revision , opts ... )
197114 if err != nil {
198115 return ctrl.Result {}, fmt .Errorf ("revision reconcile: %w" , err )
199116 }
@@ -294,14 +211,18 @@ func (c *ClusterExtensionRevisionReconciler) reconcile(ctx context.Context, ce *
294211 return ctrl.Result {}, c .Client .Status ().Update (ctx , rev )
295212}
296213
297- func (c * ClusterExtensionRevisionReconciler ) SetupWithManager (mgr ctrl.Manager ) error {
214+ type Sourcerer interface {
215+ Source (handler handler.EventHandler , predicates ... predicate.Predicate ) source.Source
216+ }
217+
218+ func (c * ClusterExtensionRevisionReconciler ) SetupWithManager (mgr ctrl.Manager , sourcerer Sourcerer ) error {
298219 return ctrl .NewControllerManagedBy (mgr ).
299220 For (
300221 & ocv1.ClusterExtensionRevision {},
301222 builder .WithPredicates (predicate.ResourceVersionChangedPredicate {}),
302223 ).
303224 WatchesRawSource (
304- c . RevisionManager .Source (
225+ sourcerer .Source (
305226 handler .EnqueueRequestForOwner (mgr .GetScheme (), mgr .GetRESTMapper (), & ocv1.ClusterExtensionRevision {}),
306227 predicate.ResourceVersionChangedPredicate {},
307228 ),
0 commit comments