@@ -17,14 +17,9 @@ import (
17
17
"k8s.io/apimachinery/pkg/runtime"
18
18
"k8s.io/apimachinery/pkg/runtime/schema"
19
19
"k8s.io/apimachinery/pkg/types"
20
- "k8s.io/client-go/discovery"
21
- "k8s.io/utils/ptr"
22
20
"pkg.package-operator.run/boxcutter"
23
21
"pkg.package-operator.run/boxcutter/machinery"
24
22
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"
28
23
ctrl "sigs.k8s.io/controller-runtime"
29
24
"sigs.k8s.io/controller-runtime/pkg/builder"
30
25
"sigs.k8s.io/controller-runtime/pkg/client"
@@ -39,68 +34,21 @@ import (
39
34
40
35
const (
41
36
ClusterExtensionRevisionOwnerLabel = "olm.operatorframework.io/owner"
42
- boxcutterSystemPrefixFieldOwner = "olm.operatorframework.io"
43
37
clusterExtensionRevisionTeardownFinalizer = "olm.operatorframework.io/teardown"
44
38
)
45
39
46
40
// ClusterExtensionRevisionReconciler actions individual snapshots of ClusterExtensions,
47
41
// as part of the boxcutter integration.
48
42
type 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
57
45
}
58
46
59
47
type RevisionEngine interface {
60
48
Teardown (ctx context.Context , rev machinerytypes.Revision , opts ... machinerytypes.RevisionTeardownOption ) (machinery.RevisionTeardownResult , error )
61
49
Reconcile (ctx context.Context , rev machinerytypes.Revision , opts ... machinerytypes.RevisionReconcileOption ) (machinery.RevisionResult , error )
62
50
}
63
51
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
-
104
52
//+kubebuilder:rbac:groups=olm.operatorframework.io,resources=clusterextensionrevisions,verbs=get;list;watch;update;patch;create;delete
105
53
//+kubebuilder:rbac:groups=olm.operatorframework.io,resources=clusterextensionrevisions/status,verbs=update;patch
106
54
//+kubebuilder:rbac:groups=olm.operatorframework.io,resources=clusterextensionrevisions/finalizers,verbs=update
@@ -120,18 +68,7 @@ func (c *ClusterExtensionRevisionReconciler) Reconcile(ctx context.Context, req
120
68
121
69
controller , ok := getControllingClusterExtension (rev )
122
70
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
135
72
return ctrl.Result {}, c .removeFinalizer (ctx , rev , clusterExtensionRevisionTeardownFinalizer )
136
73
}
137
74
@@ -143,47 +80,20 @@ func (c *ClusterExtensionRevisionReconciler) reconcile(ctx context.Context, ce *
143
80
144
81
revision , opts , previous := toBoxcutterRevision (ce .Name , rev )
145
82
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
-
169
83
if ! rev .DeletionTimestamp .IsZero () ||
170
84
rev .Spec .LifecycleState == ocv1 .ClusterExtensionRevisionLifecycleStateArchived {
171
85
//
172
86
// Teardown
173
87
//
174
- tres , err := re .Teardown (ctx , * revision )
88
+ tres , err := c . RevisionEngine .Teardown (ctx , * revision )
175
89
if err != nil {
176
90
return ctrl.Result {}, fmt .Errorf ("revision teardown: %w" , err )
177
91
}
178
92
179
93
l .Info ("teardown report" , "report" , tres .String ())
180
-
181
94
if ! tres .IsComplete () {
182
95
return ctrl.Result {}, nil
183
96
}
184
- if err := c .RevisionManager .HandleDeletion (ctx , ce , rev ); err != nil {
185
- return ctrl.Result {}, fmt .Errorf ("get cache: %w" , err )
186
- }
187
97
return ctrl.Result {}, c .removeFinalizer (ctx , rev , clusterExtensionRevisionTeardownFinalizer )
188
98
}
189
99
@@ -193,7 +103,7 @@ func (c *ClusterExtensionRevisionReconciler) reconcile(ctx context.Context, ce *
193
103
if err := c .ensureFinalizer (ctx , rev , clusterExtensionRevisionTeardownFinalizer ); err != nil {
194
104
return ctrl.Result {}, err
195
105
}
196
- rres , err := re .Reconcile (ctx , * revision , opts ... )
106
+ rres , err := c . RevisionEngine .Reconcile (ctx , * revision , opts ... )
197
107
if err != nil {
198
108
return ctrl.Result {}, fmt .Errorf ("revision reconcile: %w" , err )
199
109
}
@@ -294,14 +204,18 @@ func (c *ClusterExtensionRevisionReconciler) reconcile(ctx context.Context, ce *
294
204
return ctrl.Result {}, c .Client .Status ().Update (ctx , rev )
295
205
}
296
206
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 {
298
212
return ctrl .NewControllerManagedBy (mgr ).
299
213
For (
300
214
& ocv1.ClusterExtensionRevision {},
301
215
builder .WithPredicates (predicate.ResourceVersionChangedPredicate {}),
302
216
).
303
217
WatchesRawSource (
304
- c . RevisionManager .Source (
218
+ sourcerer .Source (
305
219
handler .EnqueueRequestForOwner (mgr .GetScheme (), mgr .GetRESTMapper (), & ocv1.ClusterExtensionRevision {}),
306
220
predicate.ResourceVersionChangedPredicate {},
307
221
),
0 commit comments