6
6
"context"
7
7
"encoding/json"
8
8
"fmt"
9
+ "sigs.k8s.io/controller-runtime/pkg/source"
9
10
"strings"
10
11
"time"
11
12
@@ -17,90 +18,37 @@ import (
17
18
"k8s.io/apimachinery/pkg/runtime"
18
19
"k8s.io/apimachinery/pkg/runtime/schema"
19
20
"k8s.io/apimachinery/pkg/types"
20
- "k8s.io/client-go/discovery"
21
- "k8s.io/utils/ptr"
22
21
"pkg.package-operator.run/boxcutter"
23
22
"pkg.package-operator.run/boxcutter/machinery"
24
23
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
24
ctrl "sigs.k8s.io/controller-runtime"
29
25
"sigs.k8s.io/controller-runtime/pkg/builder"
30
26
"sigs.k8s.io/controller-runtime/pkg/client"
31
27
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
32
28
"sigs.k8s.io/controller-runtime/pkg/handler"
33
29
"sigs.k8s.io/controller-runtime/pkg/log"
34
30
"sigs.k8s.io/controller-runtime/pkg/predicate"
35
- "sigs.k8s.io/controller-runtime/pkg/source"
36
31
37
32
ocv1 "github.com/operator-framework/operator-controller/api/v1"
38
33
)
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
@@ -150,40 +87,20 @@ func (c *ClusterExtensionRevisionReconciler) reconcile(ctx context.Context, ce *
150
87
}
151
88
}
152
89
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
90
if ! rev .DeletionTimestamp .IsZero () ||
170
91
rev .Spec .LifecycleState == ocv1 .ClusterExtensionRevisionLifecycleStateArchived {
171
92
//
172
93
// Teardown
173
94
//
174
- tres , err := re .Teardown (ctx , * revision )
95
+ tres , err := c . RevisionEngine .Teardown (ctx , * revision )
175
96
if err != nil {
176
97
return ctrl.Result {}, fmt .Errorf ("revision teardown: %w" , err )
177
98
}
178
99
179
100
l .Info ("teardown report" , "report" , tres .String ())
180
-
181
101
if ! tres .IsComplete () {
182
102
return ctrl.Result {}, nil
183
103
}
184
- if err := c .RevisionManager .HandleDeletion (ctx , ce , rev ); err != nil {
185
- return ctrl.Result {}, fmt .Errorf ("get cache: %w" , err )
186
- }
187
104
return ctrl.Result {}, c .removeFinalizer (ctx , rev , clusterExtensionRevisionTeardownFinalizer )
188
105
}
189
106
@@ -193,7 +110,7 @@ func (c *ClusterExtensionRevisionReconciler) reconcile(ctx context.Context, ce *
193
110
if err := c .ensureFinalizer (ctx , rev , clusterExtensionRevisionTeardownFinalizer ); err != nil {
194
111
return ctrl.Result {}, err
195
112
}
196
- rres , err := re .Reconcile (ctx , * revision , opts ... )
113
+ rres , err := c . RevisionEngine .Reconcile (ctx , * revision , opts ... )
197
114
if err != nil {
198
115
return ctrl.Result {}, fmt .Errorf ("revision reconcile: %w" , err )
199
116
}
@@ -294,14 +211,18 @@ func (c *ClusterExtensionRevisionReconciler) reconcile(ctx context.Context, ce *
294
211
return ctrl.Result {}, c .Client .Status ().Update (ctx , rev )
295
212
}
296
213
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 {
298
219
return ctrl .NewControllerManagedBy (mgr ).
299
220
For (
300
221
& ocv1.ClusterExtensionRevision {},
301
222
builder .WithPredicates (predicate.ResourceVersionChangedPredicate {}),
302
223
).
303
224
WatchesRawSource (
304
- c . RevisionManager .Source (
225
+ sourcerer .Source (
305
226
handler .EnqueueRequestForOwner (mgr .GetScheme (), mgr .GetRESTMapper (), & ocv1.ClusterExtensionRevision {}),
306
227
predicate.ResourceVersionChangedPredicate {},
307
228
),
0 commit comments