Skip to content

Commit 641aa1c

Browse files
committed
update controllers
1 parent 41394b6 commit 641aa1c

7 files changed

+85
-74
lines changed

pkg/controller/operators/adoption_controller.go

+43-30
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package operators
22

33
import (
44
"context"
5+
"fmt"
56
"sync"
67

78
"github.com/go-logr/logr"
@@ -45,9 +46,7 @@ type AdoptionReconciler struct {
4546
// SetupWithManager adds the operator reconciler to the given controller manager.
4647
func (r *AdoptionReconciler) SetupWithManager(mgr ctrl.Manager) error {
4748
// Trigger operator events from the events of their compoenents.
48-
enqueueSub := &handler.EnqueueRequestsFromMapFunc{
49-
ToRequests: handler.ToRequestsFunc(r.mapToSubscriptions),
50-
}
49+
enqueueSub := handler.EnqueueRequestsFromMapFunc(r.mapToSubscriptions)
5150

5251
// Create multiple controllers for resource types that require automatic adoption
5352
err := ctrl.NewControllerManagedBy(mgr).
@@ -60,12 +59,8 @@ func (r *AdoptionReconciler) SetupWithManager(mgr ctrl.Manager) error {
6059
}
6160

6261
var (
63-
enqueueCSV = &handler.EnqueueRequestsFromMapFunc{
64-
ToRequests: handler.ToRequestsFunc(r.mapToClusterServiceVersions),
65-
}
66-
enqueueProviders = &handler.EnqueueRequestsFromMapFunc{
67-
ToRequests: handler.ToRequestsFunc(r.mapToProviders),
68-
}
62+
enqueueCSV = handler.EnqueueRequestsFromMapFunc(r.mapToClusterServiceVersions)
63+
enqueueProviders = handler.EnqueueRequestsFromMapFunc(r.mapToProviders)
6964
)
7065
err = ctrl.NewControllerManagedBy(mgr).
7166
For(&operatorsv1alpha1.ClusterServiceVersion{}).
@@ -113,13 +108,12 @@ func NewAdoptionReconciler(cli client.Client, log logr.Logger, scheme *runtime.S
113108
}
114109

115110
// ReconcileSubscription labels the CSVs installed by a Subscription as components of an operator named after the subscribed package and install namespace.
116-
func (r *AdoptionReconciler) ReconcileSubscription(req ctrl.Request) (reconcile.Result, error) {
111+
func (r *AdoptionReconciler) ReconcileSubscription(ctx context.Context, req ctrl.Request) (reconcile.Result, error) {
117112
// Set up a convenient log object so we don't have to type request over and over again
118113
log := r.log.WithValues("request", req)
119114
log.V(4).Info("reconciling subscription")
120115

121116
// Fetch the Subscription from the cache
122-
ctx := context.TODO()
123117
in := &operatorsv1alpha1.Subscription{}
124118
if err := r.Get(ctx, req.NamespacedName, in); err != nil {
125119
if apierrors.IsNotFound(err) {
@@ -176,13 +170,12 @@ func (r *AdoptionReconciler) ReconcileSubscription(req ctrl.Request) (reconcile.
176170
}
177171

178172
// ReconcileClusterServiceVersion projects the component labels of a given CSV onto all resources owned by it.
179-
func (r *AdoptionReconciler) ReconcileClusterServiceVersion(req ctrl.Request) (reconcile.Result, error) {
173+
func (r *AdoptionReconciler) ReconcileClusterServiceVersion(ctx context.Context, req ctrl.Request) (reconcile.Result, error) {
180174
// Set up a convenient log object so we don't have to type request over and over again
181175
log := r.log.WithValues("request", req)
182176
log.V(4).Info("reconciling csv")
183177

184178
// Fetch the CSV from the cache
185-
ctx := context.TODO()
186179
in := &operatorsv1alpha1.ClusterServiceVersion{}
187180
if err := r.Get(ctx, req.NamespacedName, in); err != nil {
188181
if apierrors.IsNotFound(err) {
@@ -265,15 +258,20 @@ func (r *AdoptionReconciler) adopt(ctx context.Context, operator *decorators.Ope
265258
return nil
266259
}
267260

268-
if err := r.Get(ctx, types.NamespacedName{Namespace: m.GetNamespace(), Name: m.GetName()}, component); err != nil {
261+
cObj, ok := component.(client.Object)
262+
if !ok {
263+
return fmt.Errorf("Unable to typecast runtime.Object to client.Object")
264+
}
265+
266+
if err := r.Get(ctx, types.NamespacedName{Namespace: m.GetNamespace(), Name: m.GetName()}, cObj); err != nil {
269267
if apierrors.IsNotFound(err) {
270268
r.log.Error(err, "component not found")
271269
err = nil
272270
}
273271

274272
return err
275273
}
276-
candidate := component.DeepCopyObject()
274+
candidate := cObj.DeepCopyObject()
277275

278276
adopted, err := operator.AdoptComponent(candidate)
279277
if err != nil {
@@ -282,14 +280,21 @@ func (r *AdoptionReconciler) adopt(ctx context.Context, operator *decorators.Ope
282280

283281
if adopted {
284282
// Only update if freshly adopted
285-
r.log.Info("component adopted", "component", candidate)
286-
return r.Patch(ctx, candidate, client.MergeFrom(component))
283+
pCObj, ok := candidate.(client.Object)
284+
if !ok {
285+
return fmt.Errorf("Unable to typecast runtime.Object to client.Object")
286+
}
287+
return r.Patch(ctx, pCObj, client.MergeFrom(cObj))
287288
}
288289

289290
return nil
290291
}
291292

292293
func (r *AdoptionReconciler) disown(ctx context.Context, operator *decorators.Operator, component runtime.Object) error {
294+
cObj, ok := component.(client.Object)
295+
if !ok {
296+
return fmt.Errorf("Unable to typecast runtime.Object to client.Object")
297+
}
293298
candidate := component.DeepCopyObject()
294299
disowned, err := operator.DisownComponent(candidate)
295300
if err != nil {
@@ -303,7 +308,11 @@ func (r *AdoptionReconciler) disown(ctx context.Context, operator *decorators.Op
303308

304309
// Only update if freshly disowned
305310
r.log.V(4).Info("component disowned", "component", candidate)
306-
return r.Patch(ctx, candidate, client.MergeFrom(component))
311+
uCObj, ok := candidate.(client.Object)
312+
if !ok {
313+
return fmt.Errorf("Unable to typecast runtime.Object to client.Object")
314+
}
315+
return r.Patch(ctx, uCObj, client.MergeFrom(cObj))
307316
}
308317

309318
func (r *AdoptionReconciler) adoptees(ctx context.Context, operator decorators.Operator, csv *operatorsv1alpha1.ClusterServiceVersion) ([]runtime.Object, error) {
@@ -335,7 +344,11 @@ func (r *AdoptionReconciler) adoptees(ctx context.Context, operator decorators.O
335344
}
336345
opt := client.MatchingLabelsSelector{Selector: selector}
337346
for _, list := range componentLists {
338-
if err := r.List(ctx, list, opt); err != nil {
347+
cList, ok := list.(client.ObjectList)
348+
if !ok {
349+
return nil, fmt.Errorf("Unable to typecast runtime.Object to client.ObjectList")
350+
}
351+
if err := r.List(ctx, cList, opt); err != nil {
339352
return nil, err
340353
}
341354
}
@@ -415,16 +428,16 @@ func (r *AdoptionReconciler) adoptInstallPlan(ctx context.Context, operator *dec
415428
return utilerrors.NewAggregate(errs)
416429
}
417430

418-
func (r *AdoptionReconciler) mapToSubscriptions(obj handler.MapObject) (requests []reconcile.Request) {
419-
if obj.Meta == nil {
431+
func (r *AdoptionReconciler) mapToSubscriptions(obj client.Object) (requests []reconcile.Request) {
432+
if obj == nil {
420433
return
421434
}
422435

423436
// Requeue all Subscriptions in the resource namespace
424437
// The Subscription reconciler will sort out the important changes
425438
ctx := context.TODO()
426439
subs := &operatorsv1alpha1.SubscriptionList{}
427-
if err := r.List(ctx, subs, client.InNamespace(obj.Meta.GetNamespace())); err != nil {
440+
if err := r.List(ctx, subs, client.InNamespace(obj.GetNamespace())); err != nil {
428441
r.log.Error(err, "error listing subscriptions")
429442
}
430443

@@ -444,15 +457,15 @@ func (r *AdoptionReconciler) mapToSubscriptions(obj handler.MapObject) (requests
444457
return
445458
}
446459

447-
func (r *AdoptionReconciler) mapToClusterServiceVersions(obj handler.MapObject) (requests []reconcile.Request) {
448-
if obj.Meta == nil {
460+
func (r *AdoptionReconciler) mapToClusterServiceVersions(obj client.Object) (requests []reconcile.Request) {
461+
if obj == nil {
449462
return
450463
}
451464

452465
// Get all owner CSV from owner labels if cluster scoped
453-
namespace := obj.Meta.GetNamespace()
466+
namespace := obj.GetNamespace()
454467
if namespace == metav1.NamespaceAll {
455-
name, ns, ok := ownerutil.GetOwnerByKindLabel(obj.Meta, operatorsv1alpha1.ClusterServiceVersionKind)
468+
name, ns, ok := ownerutil.GetOwnerByKindLabel(obj, operatorsv1alpha1.ClusterServiceVersionKind)
456469
if ok {
457470
nsn := types.NamespacedName{Namespace: ns, Name: name}
458471
requests = append(requests, reconcile.Request{NamespacedName: nsn})
@@ -461,7 +474,7 @@ func (r *AdoptionReconciler) mapToClusterServiceVersions(obj handler.MapObject)
461474
}
462475

463476
// Get all owner CSVs from OwnerReferences
464-
owners := ownerutil.GetOwnersByKind(obj.Meta, operatorsv1alpha1.ClusterServiceVersionKind)
477+
owners := ownerutil.GetOwnersByKind(obj, operatorsv1alpha1.ClusterServiceVersionKind)
465478
for _, owner := range owners {
466479
nsn := types.NamespacedName{Namespace: namespace, Name: owner.Name}
467480
requests = append(requests, reconcile.Request{NamespacedName: nsn})
@@ -470,8 +483,8 @@ func (r *AdoptionReconciler) mapToClusterServiceVersions(obj handler.MapObject)
470483
return
471484
}
472485

473-
func (r *AdoptionReconciler) mapToProviders(obj handler.MapObject) (requests []reconcile.Request) {
474-
if obj.Meta == nil {
486+
func (r *AdoptionReconciler) mapToProviders(obj client.Object) (requests []reconcile.Request) {
487+
if obj == nil {
475488
return nil
476489
}
477490

@@ -489,7 +502,7 @@ func (r *AdoptionReconciler) mapToProviders(obj handler.MapObject) (requests []r
489502
NamespacedName: types.NamespacedName{Namespace: csv.GetNamespace(), Name: csv.GetName()},
490503
}
491504
for _, provided := range csv.Spec.CustomResourceDefinitions.Owned {
492-
if provided.Name == obj.Meta.GetName() {
505+
if provided.Name == obj.GetName() {
493506
requests = append(requests, request)
494507
break
495508
}

pkg/controller/operators/adoption_controller_test.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@ import (
1212
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
1313
apierrors "k8s.io/apimachinery/pkg/api/errors"
1414
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
15-
"k8s.io/apimachinery/pkg/runtime"
1615
"k8s.io/client-go/tools/reference"
1716
apiregistrationv1 "k8s.io/kube-aggregator/pkg/apis/apiregistration/v1"
17+
"sigs.k8s.io/controller-runtime/pkg/client"
1818

1919
operatorsv1alpha1 "github.com/operator-framework/api/pkg/operators/v1alpha1"
2020
"github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/decorators"
@@ -33,11 +33,11 @@ var _ = Describe("Adoption Controller", func() {
3333

3434
Describe("Component label generation", func() {
3535
var (
36-
created []runtime.Object
36+
created []client.Object
3737
)
3838

3939
BeforeEach(func() {
40-
created = []runtime.Object{}
40+
created = []client.Object{}
4141
})
4242

4343
JustAfterEach(func() {

pkg/controller/operators/operator_controller.go

+12-10
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package operators
22

33
import (
44
"context"
5+
"fmt"
56
"sync"
67

78
"github.com/go-logr/logr"
@@ -58,10 +59,7 @@ type OperatorReconciler struct {
5859
// SetupWithManager adds the operator reconciler to the given controller manager.
5960
func (r *OperatorReconciler) SetupWithManager(mgr ctrl.Manager) error {
6061
// Trigger operator events from the events of their compoenents.
61-
enqueueOperator := &handler.EnqueueRequestsFromMapFunc{
62-
ToRequests: handler.ToRequestsFunc(r.mapComponentRequests),
63-
}
64-
62+
enqueueOperator := handler.EnqueueRequestsFromMapFunc(r.mapComponentRequests)
6563
// Note: If we want to support resources composed of custom resources, we need to figure out how
6664
// to dynamically add resource types to watch.
6765
return ctrl.NewControllerManagedBy(mgr).
@@ -110,13 +108,12 @@ func NewOperatorReconciler(cli client.Client, log logr.Logger, scheme *runtime.S
110108
// Implement reconcile.Reconciler so the controller can reconcile objects
111109
var _ reconcile.Reconciler = &OperatorReconciler{}
112110

113-
func (r *OperatorReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {
111+
func (r *OperatorReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
114112
// Set up a convenient log object so we don't have to type request over and over again
115113
log := r.log.WithValues("request", req)
116114
log.V(1).Info("reconciling operator")
117115

118116
// Get the Operator
119-
ctx := context.TODO()
120117
create := false
121118
name := req.NamespacedName.Name
122119
in := &operatorsv1.Operator{}
@@ -210,7 +207,11 @@ func (r *OperatorReconciler) listComponents(ctx context.Context, selector labels
210207

211208
opt := client.MatchingLabelsSelector{Selector: selector}
212209
for _, list := range componentLists {
213-
if err := r.List(ctx, list, opt); err != nil {
210+
cList, ok := list.(client.ObjectList)
211+
if !ok {
212+
return nil, fmt.Errorf("Unable to typecast runtime.Object to client.ObjectList")
213+
}
214+
if err := r.List(ctx, cList, opt); err != nil {
214215
return nil, err
215216
}
216217
}
@@ -245,13 +246,14 @@ func (r *OperatorReconciler) unsetLastResourceVersion(name types.NamespacedName)
245246
delete(r.lastResourceVersion, name)
246247
}
247248

248-
func (r *OperatorReconciler) mapComponentRequests(obj handler.MapObject) []reconcile.Request {
249+
func (r *OperatorReconciler) mapComponentRequests(obj client.Object) []reconcile.Request {
249250
var requests []reconcile.Request
250-
if obj.Meta == nil {
251+
if obj == nil {
251252
return requests
252253
}
253254

254-
for _, name := range decorators.OperatorNames(obj.Meta.GetLabels()) {
255+
labels := decorators.OperatorNames(obj.GetLabels())
256+
for _, name := range labels {
255257
// unset the last recorded resource version so the Operator will reconcile
256258
r.unsetLastResourceVersion(name)
257259
requests = append(requests, reconcile.Request{NamespacedName: name})

pkg/controller/operators/operator_controller_test.go

+6-5
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1111
"k8s.io/apimachinery/pkg/runtime"
1212
"k8s.io/apimachinery/pkg/types"
13+
"sigs.k8s.io/controller-runtime/pkg/client"
1314

1415
operatorsv1 "github.com/operator-framework/api/pkg/operators/v1"
1516
"github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/decorators"
@@ -83,16 +84,16 @@ var _ = Describe("Operator Controller", func() {
8384
)
8485

8586
for _, obj := range objs {
86-
Expect(k8sClient.Create(ctx, obj)).To(Succeed())
87+
Expect(k8sClient.Create(ctx, obj.(client.Object))).To(Succeed())
8788
}
8889

8990
expectedRefs = toRefs(scheme, objs...)
9091
})
9192

9293
AfterEach(func() {
9394
for _, obj := range objs {
94-
Expect(k8sClient.Get(ctx, testobj.NamespacedName(obj), obj)).To(Succeed())
95-
Expect(k8sClient.Delete(ctx, obj, deleteOpts)).To(Succeed())
95+
Expect(k8sClient.Get(ctx, testobj.NamespacedName(obj), obj.(client.Object))).To(Succeed())
96+
Expect(k8sClient.Delete(ctx, obj.(client.Object), deleteOpts)).To(Succeed())
9697
}
9798
})
9899

@@ -125,7 +126,7 @@ var _ = Describe("Operator Controller", func() {
125126
)
126127

127128
for _, obj := range newObjs {
128-
Expect(k8sClient.Create(ctx, obj)).To(Succeed())
129+
Expect(k8sClient.Create(ctx, obj.(client.Object))).To(Succeed())
129130
}
130131

131132
objs = append(objs, newObjs...)
@@ -143,7 +144,7 @@ var _ = Describe("Operator Controller", func() {
143144
Context("when component labels are removed", func() {
144145
BeforeEach(func() {
145146
for _, obj := range testobj.StripLabel(expectedKey, objs...) {
146-
Expect(k8sClient.Update(ctx, obj)).To(Succeed())
147+
Expect(k8sClient.Update(ctx, obj.(client.Object))).To(Succeed())
147148
}
148149
})
149150

pkg/controller/operators/operatorcondition_controller_test.go

+9-10
Original file line numberDiff line numberDiff line change
@@ -45,30 +45,29 @@ var _ = Describe("OperatorCondition", func() {
4545
Context("The OperatorCondition Reconciler", func() {
4646
var (
4747
ctx context.Context
48-
namespace string
49-
namespacedName types.NamespacedName
5048
operatorCondition *operatorsv1.OperatorCondition
49+
namespace *corev1.Namespace
50+
namespacedName types.NamespacedName
5151
)
5252

5353
BeforeEach(func() {
5454
ctx = context.Background()
55-
namespace = genName("ns-")
56-
ns := &corev1.Namespace{
55+
namespace = &corev1.Namespace{
5756
ObjectMeta: metav1.ObjectMeta{
58-
GenerateName: namespace,
57+
Name: genName("ns-"),
5958
},
6059
}
61-
Expect(k8sClient.Create(ctx, ns)).To(Succeed())
60+
Expect(k8sClient.Create(ctx, namespace)).To(Succeed())
6261

63-
namespacedName = types.NamespacedName{Name: "test", Namespace: namespace}
62+
namespacedName = types.NamespacedName{Name: "test", Namespace: namespace.GetName()}
6463

6564
// Create the deployment
6665
labels := map[string]string{
6766
"foo": "bar",
6867
}
6968
deployment := &appsv1.Deployment{ObjectMeta: metav1.ObjectMeta{
7069
Name: "deployment",
71-
Namespace: namespacedName.Namespace,
70+
Namespace: namespace.GetName(),
7271
},
7372
Spec: appsv1.DeploymentSpec{
7473
Selector: &metav1.LabelSelector{
@@ -77,7 +76,7 @@ var _ = Describe("OperatorCondition", func() {
7776
Template: corev1.PodTemplateSpec{
7877
ObjectMeta: metav1.ObjectMeta{
7978
GenerateName: "nginx-",
80-
Namespace: namespacedName.Namespace,
79+
Namespace: namespace.GetName(),
8180
Labels: labels,
8281
},
8382
Spec: corev1.PodSpec{
@@ -192,7 +191,7 @@ var _ = Describe("OperatorCondition", func() {
192191
It("appends the OPERATOR_CONDITION_NAME environment variable to the containers in the deployments", func() {
193192
deployment := &appsv1.Deployment{}
194193
Eventually(func() error {
195-
err := k8sClient.Get(ctx, types.NamespacedName{Name: operatorCondition.Spec.Deployments[0], Namespace: namespace}, deployment)
194+
err := k8sClient.Get(ctx, types.NamespacedName{Name: operatorCondition.Spec.Deployments[0], Namespace: namespace.GetName()}, deployment)
196195
if err != nil {
197196
return err
198197
}

0 commit comments

Comments
 (0)