Skip to content

Commit 368f8f6

Browse files
committed
Use new TrackingCache Watch/Free.
Ensure informers are started before reconciling and stopped before removing the finalizer.
1 parent 57382f1 commit 368f8f6

File tree

4 files changed

+42
-17
lines changed

4 files changed

+42
-17
lines changed

cmd/operator-controller/main.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -541,7 +541,8 @@ func run() error {
541541
),
542542
validation.NewRevisionValidator(), mgr.GetClient(),
543543
),
544-
}).SetupWithManager(mgr, trackingCache); err != nil {
544+
TrackingCache: trackingCache,
545+
}).SetupWithManager(mgr); err != nil {
545546
setupLog.Error(err, "unable to create controller", "controller", "ClusterExtensionRevision")
546547
return err
547548
}

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ require (
4343
k8s.io/klog/v2 v2.130.1
4444
k8s.io/kubernetes v1.33.2
4545
k8s.io/utils v0.0.0-20250604170112-4c0f3b243397
46-
pkg.package-operator.run/boxcutter v0.3.0
46+
pkg.package-operator.run/boxcutter v0.4.0
4747
sigs.k8s.io/controller-runtime v0.21.0
4848
sigs.k8s.io/controller-tools v0.18.0
4949
sigs.k8s.io/crdify v0.4.1-0.20250613143457-398e4483fb58

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -764,8 +764,8 @@ k8s.io/utils v0.0.0-20250604170112-4c0f3b243397 h1:hwvWFiBzdWw1FhfY1FooPn3kzWuJ8
764764
k8s.io/utils v0.0.0-20250604170112-4c0f3b243397/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
765765
oras.land/oras-go/v2 v2.6.0 h1:X4ELRsiGkrbeox69+9tzTu492FMUu7zJQW6eJU+I2oc=
766766
oras.land/oras-go/v2 v2.6.0/go.mod h1:magiQDfG6H1O9APp+rOsvCPcW1GD2MM7vgnKY0Y+u1o=
767-
pkg.package-operator.run/boxcutter v0.3.0 h1:Pkfu6jKi7cLINCM1PzLz1rManawxPQFEGflSouqzeww=
768-
pkg.package-operator.run/boxcutter v0.3.0/go.mod h1:Q0TEZgWu6nAhTSI4NbvKulp0v/sxHoAVfRCQeLHV9v8=
767+
pkg.package-operator.run/boxcutter v0.4.0 h1:DNJEOpqgwIlzTgtUapiGvB+vUOcEKBBkeF1c0DIF/Ik=
768+
pkg.package-operator.run/boxcutter v0.4.0/go.mod h1:1lk3NOKdY5T5sQZdfp2yuUatLXgGv/C0qvG0vXGuR5s=
769769
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.33.0 h1:qPrZsv1cwQiFeieFlRqT627fVZ+tyfou/+S5S0H5ua0=
770770
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.33.0/go.mod h1:Ve9uj1L+deCXFrPOk1LpFXqTg7LCFzFso6PA48q/XZw=
771771
sigs.k8s.io/controller-runtime v0.21.0 h1:CYfjpEuicjUecRk+KAeyYh+ouUBn4llGyDYytIGcJS8=

internal/operator-controller/controllers/clusterextensionrevision_controller.go

Lines changed: 37 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -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 (
4243
type 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

4756
type 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+
226250
func (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

Comments
 (0)