Skip to content

Commit e5d4aad

Browse files
author
Per Goncalves da Silva
committed
Refactor revision controller and add unit tests"
Signed-off-by: Per Goncalves da Silva <[email protected]>
1 parent 2e35363 commit e5d4aad

File tree

5 files changed

+678
-34
lines changed

5 files changed

+678
-34
lines changed

cmd/operator-controller/main.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -534,9 +534,9 @@ func run() error {
534534
}
535535

536536
if err = (&controllers.ClusterExtensionRevisionReconciler{
537-
Client: cl,
538-
AccessManager: accessManager,
539-
RevisionEngineGetter: controllers.OLMRevisionEngineGetter{
537+
Client: cl,
538+
RevisionManager: &controllers.OLMRevisionEngineGetter{
539+
AccessManager: accessManager,
540540
Scheme: mgr.GetScheme(),
541541
RestMapper: mgr.GetRESTMapper(),
542542
DiscoveryClient: discoveryClient,

internal/operator-controller/applier/boxcutter_test.go

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -485,14 +485,10 @@ func TestBoxcutter_Apply(t *testing.T) {
485485
for _, tc := range testCases {
486486
t.Run(tc.name, func(t *testing.T) {
487487
// Setup
488-
fakeClientBuilder := fake.NewClientBuilder().WithScheme(testScheme).WithObjects(tc.existingObjs...)
489-
fakeClient := fakeClientBuilder.Build()
490-
491-
// Special handling for the create error test
492-
var testClient client.Client = fakeClient
488+
fakeClient := fake.NewClientBuilder().WithScheme(testScheme).WithObjects(tc.existingObjs...).Build()
493489

494490
boxcutter := &applier.Boxcutter{
495-
Client: testClient,
491+
Client: fakeClient,
496492
Scheme: testScheme,
497493
RevisionGenerator: tc.mockBuilder,
498494
}

internal/operator-controller/controllers/clusterextensionrevision_controller.go

Lines changed: 29 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import (
66
"context"
77
"encoding/json"
88
"fmt"
9-
types2 "pkg.package-operator.run/boxcutter/machinery/types"
109
"strings"
1110
"time"
1211

@@ -22,6 +21,7 @@ import (
2221
"k8s.io/utils/ptr"
2322
"pkg.package-operator.run/boxcutter"
2423
"pkg.package-operator.run/boxcutter/machinery"
24+
machinerytypes "pkg.package-operator.run/boxcutter/machinery/types"
2525
"pkg.package-operator.run/boxcutter/managedcache"
2626
"pkg.package-operator.run/boxcutter/ownerhandling"
2727
"pkg.package-operator.run/boxcutter/validation"
@@ -38,18 +38,16 @@ import (
3838
)
3939

4040
const (
41-
ClusterExtensionRevisionOwnerLabel = "olm.operatorframework.io/owner"
42-
41+
ClusterExtensionRevisionOwnerLabel = "olm.operatorframework.io/owner"
4342
boxcutterSystemPrefixFieldOwner = "olm.operatorframework.io"
4443
clusterExtensionRevisionTeardownFinalizer = "olm.operatorframework.io/teardown"
4544
)
4645

4746
// ClusterExtensionRevisionReconciler actions individual snapshots of ClusterExtensions,
4847
// as part of the boxcutter integration.
4948
type ClusterExtensionRevisionReconciler struct {
50-
Client client.Client
51-
AccessManager AccessManager
52-
RevisionEngineGetter RevisionEngineGetter
49+
Client client.Client
50+
RevisionManager RevisionManager
5351
}
5452

5553
type AccessManager interface {
@@ -59,21 +57,28 @@ type AccessManager interface {
5957
}
6058

6159
type RevisionEngine interface {
62-
Teardown(ctx context.Context, rev types2.Revision, opts ...types2.RevisionTeardownOption) (machinery.RevisionTeardownResult, error)
63-
Reconcile(ctx context.Context, rev types2.Revision, opts ...types2.RevisionReconcileOption) (machinery.RevisionResult, error)
60+
Teardown(ctx context.Context, rev machinerytypes.Revision, opts ...machinerytypes.RevisionTeardownOption) (machinery.RevisionTeardownResult, error)
61+
Reconcile(ctx context.Context, rev machinerytypes.Revision, opts ...machinerytypes.RevisionReconcileOption) (machinery.RevisionResult, error)
6462
}
6563

66-
type RevisionEngineGetter interface {
67-
GetRevisionEngineWithAccessor(accessor managedcache.Accessor) RevisionEngine
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
6868
}
6969

7070
type OLMRevisionEngineGetter struct {
7171
DiscoveryClient *discovery.DiscoveryClient
7272
Scheme *runtime.Scheme
7373
RestMapper meta.RESTMapper
74+
AccessManager AccessManager
7475
}
7576

76-
func (r *OLMRevisionEngineGetter) GetRevisionEngineWithAccessor(accessor managedcache.Accessor) RevisionEngine {
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+
}
7782
return machinery.NewRevisionEngine(
7883
machinery.NewPhaseEngine(
7984
machinery.NewObjectEngine(
@@ -85,7 +90,15 @@ func (r *OLMRevisionEngineGetter) GetRevisionEngineWithAccessor(accessor managed
8590
validation.NewClusterPhaseValidator(r.RestMapper, accessor),
8691
),
8792
validation.NewRevisionValidator(), accessor,
88-
)
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...)
89102
}
90103

91104
//+kubebuilder:rbac:groups=olm.operatorframework.io,resources=clusterextensionrevisions,verbs=get;list;watch;update;patch;create;delete
@@ -148,12 +161,7 @@ func (c *ClusterExtensionRevisionReconciler) reconcile(ctx context.Context, ce *
148161
}
149162
}
150163

151-
accessor, err := c.AccessManager.GetWithUser(ctx, ce, rev, objects)
152-
if err != nil {
153-
return ctrl.Result{}, fmt.Errorf("get cache: %w", err)
154-
}
155-
156-
re, err := c.RevisionEngineGetter.GetRevisionEngineWithAccessor(accessor)
164+
re, err := c.RevisionManager.GetScopedRevisionEngine(ctx, ce, rev, objects)
157165
if err != nil {
158166
return ctrl.Result{}, err
159167
}
@@ -173,7 +181,7 @@ func (c *ClusterExtensionRevisionReconciler) reconcile(ctx context.Context, ce *
173181
if !tres.IsComplete() {
174182
return ctrl.Result{}, nil
175183
}
176-
if err := c.AccessManager.FreeWithUser(ctx, ce, rev); err != nil {
184+
if err := c.RevisionManager.HandleDeletion(ctx, ce, rev); err != nil {
177185
return ctrl.Result{}, fmt.Errorf("get cache: %w", err)
178186
}
179187
return ctrl.Result{}, c.removeFinalizer(ctx, rev, clusterExtensionRevisionTeardownFinalizer)
@@ -209,7 +217,7 @@ func (c *ClusterExtensionRevisionReconciler) reconcile(ctx context.Context, ce *
209217
// Archive other revisions.
210218
for _, a := range previous {
211219
if err := c.Client.Patch(ctx, a, client.RawPatch(
212-
types.MergePatchType, []byte(`{"data":{"state":"Archived"}}`))); err != nil {
220+
types.MergePatchType, []byte(`{"spec":{"lifecycleState":"Archived"}}`))); err != nil {
213221
return ctrl.Result{}, fmt.Errorf("archive previous Revision: %w", err)
214222
}
215223
}
@@ -293,7 +301,7 @@ func (c *ClusterExtensionRevisionReconciler) SetupWithManager(mgr ctrl.Manager)
293301
builder.WithPredicates(predicate.ResourceVersionChangedPredicate{}),
294302
).
295303
WatchesRawSource(
296-
c.AccessManager.Source(
304+
c.RevisionManager.Source(
297305
handler.EnqueueRequestForOwner(mgr.GetScheme(), mgr.GetRESTMapper(), &ocv1.ClusterExtensionRevision{}),
298306
predicate.ResourceVersionChangedPredicate{},
299307
),

0 commit comments

Comments
 (0)