Skip to content

Commit b3f1de0

Browse files
author
Per Goncalves da Silva
committed
Remove access manager and dynamic cache
Signed-off-by: Per Goncalves da Silva <pegoncal@redhat.com>
1 parent 111f8bc commit b3f1de0

File tree

2 files changed

+40
-130
lines changed

2 files changed

+40
-130
lines changed

cmd/operator-controller/main.go

Lines changed: 28 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@ import (
2525
"net/http"
2626
"os"
2727
"path/filepath"
28+
"pkg.package-operator.run/boxcutter/machinery"
29+
"pkg.package-operator.run/boxcutter/ownerhandling"
30+
"pkg.package-operator.run/boxcutter/validation"
2831
"strings"
2932
"time"
3033

@@ -34,13 +37,11 @@ import (
3437
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
3538
apiextensionsv1client "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1"
3639
k8slabels "k8s.io/apimachinery/pkg/labels"
37-
"k8s.io/apimachinery/pkg/selection"
3840
k8stypes "k8s.io/apimachinery/pkg/types"
3941
apimachineryrand "k8s.io/apimachinery/pkg/util/rand"
4042
"k8s.io/client-go/discovery"
4143
corev1client "k8s.io/client-go/kubernetes/typed/core/v1"
4244
_ "k8s.io/client-go/plugin/pkg/client/auth"
43-
"k8s.io/client-go/rest"
4445
"k8s.io/klog/v2"
4546
"k8s.io/utils/ptr"
4647
"pkg.package-operator.run/boxcutter/managedcache"
@@ -500,54 +501,42 @@ func run() error {
500501

501502
if features.OperatorControllerFeatureGate.Enabled(features.BoxcutterRuntime) {
502503
// Boxcutter
504+
const (
505+
boxcutterSystemPrefixFieldOwner = "olm.operatorframework.io"
506+
)
507+
503508
discoveryClient, err := discovery.NewDiscoveryClientForConfig(restConfig)
504509
if err != nil {
505510
setupLog.Error(err, "unable to create discovery client")
506511
return err
507512
}
508-
mapFunc := func(ctx context.Context, ce *ocv1.ClusterExtension, c *rest.Config, o crcache.Options) (*rest.Config, crcache.Options, error) {
509-
saKey := client.ObjectKey{
510-
Name: ce.Spec.ServiceAccount.Name,
511-
Namespace: ce.Spec.Namespace,
512-
}
513-
saConfig := rest.AnonymousClientConfig(c)
514-
saConfig.Wrap(func(rt http.RoundTripper) http.RoundTripper {
515-
return &authentication.TokenInjectingRoundTripper{
516-
Tripper: rt,
517-
TokenGetter: tokenGetter,
518-
Key: saKey,
519-
}
520-
})
521513

522-
// Cache scoping
523-
req1, err := k8slabels.NewRequirement(
524-
controllers.ClusterExtensionRevisionOwnerLabel, selection.Equals, []string{ce.Name})
525-
if err != nil {
526-
return nil, o, err
527-
}
528-
o.DefaultLabelSelector = k8slabels.NewSelector().Add(*req1)
529-
530-
return saConfig, o, nil
531-
}
532-
533-
accessManager := managedcache.NewObjectBoundAccessManager(
534-
ctrl.Log.WithName("accessmanager"), mapFunc, restConfig, crcache.Options{
514+
trackingCache, err := managedcache.NewTrackingCache(
515+
ctrl.Log.WithName("accessmanager"),
516+
restConfig,
517+
crcache.Options{
535518
Scheme: mgr.GetScheme(), Mapper: mgr.GetRESTMapper(),
536-
})
537-
if err := mgr.Add(accessManager); err != nil {
538-
setupLog.Error(err, "unable to register AccessManager")
539-
return err
519+
},
520+
)
521+
if err != nil {
522+
setupLog.Error(err, "unable to create boxcutter tracking cache")
540523
}
541524

542525
if err = (&controllers.ClusterExtensionRevisionReconciler{
543526
Client: cl,
544-
RevisionManager: &controllers.OLMRevisionEngineGetter{
545-
AccessManager: accessManager,
546-
Scheme: mgr.GetScheme(),
547-
RestMapper: mgr.GetRESTMapper(),
548-
DiscoveryClient: discoveryClient,
549-
},
550-
}).SetupWithManager(mgr); err != nil {
527+
RevisionEngine: machinery.NewRevisionEngine(
528+
machinery.NewPhaseEngine(
529+
machinery.NewObjectEngine(
530+
mgr.GetScheme(), trackingCache, mgr.GetClient(),
531+
ownerhandling.NewNative(mgr.GetScheme()),
532+
machinery.NewComparator(ownerhandling.NewNative(mgr.GetScheme()), discoveryClient, mgr.GetScheme(), boxcutterSystemPrefixFieldOwner),
533+
boxcutterSystemPrefixFieldOwner, boxcutterSystemPrefixFieldOwner,
534+
),
535+
validation.NewClusterPhaseValidator(mgr.GetRESTMapper(), mgr.GetClient()),
536+
),
537+
validation.NewRevisionValidator(), mgr.GetClient(),
538+
),
539+
}).SetupWithManager(mgr, trackingCache); err != nil {
551540
setupLog.Error(err, "unable to create controller", "controller", "ClusterExtension")
552541
return err
553542
}

internal/operator-controller/controllers/clusterextensionrevision_controller.go

Lines changed: 12 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
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

4035
const (
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.
4842
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
5745
}
5846

5947
type 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

Comments
 (0)