@@ -59,9 +59,14 @@ func (r *AdoptionReconciler) SetupWithManager(mgr ctrl.Manager) error {
59
59
return err
60
60
}
61
61
62
- enqueueCSV := & handler.EnqueueRequestsFromMapFunc {
63
- ToRequests : handler .ToRequestsFunc (r .mapToClusterServiceVersions ),
64
- }
62
+ var (
63
+ enqueueCSV = & handler.EnqueueRequestsFromMapFunc {
64
+ ToRequests : handler .ToRequestsFunc (r .mapToClusterServiceVersions ),
65
+ }
66
+ enqueueProviders = & handler.EnqueueRequestsFromMapFunc {
67
+ ToRequests : handler .ToRequestsFunc (r .mapToProviders ),
68
+ }
69
+ )
65
70
err = ctrl .NewControllerManagedBy (mgr ).
66
71
For (& operatorsv1alpha1.ClusterServiceVersion {}).
67
72
Watches (& source.Kind {Type : & appsv1.Deployment {}}, enqueueCSV ).
@@ -74,7 +79,7 @@ func (r *AdoptionReconciler) SetupWithManager(mgr ctrl.Manager) error {
74
79
Watches (& source.Kind {Type : & rbacv1.RoleBinding {}}, enqueueCSV ).
75
80
Watches (& source.Kind {Type : & rbacv1.ClusterRole {}}, enqueueCSV ).
76
81
Watches (& source.Kind {Type : & rbacv1.ClusterRoleBinding {}}, enqueueCSV ).
77
- Watches (& source.Kind {Type : & apiextensionsv1.CustomResourceDefinition {}}, enqueueCSV ).
82
+ Watches (& source.Kind {Type : & apiextensionsv1.CustomResourceDefinition {}}, enqueueProviders ).
78
83
Watches (& source.Kind {Type : & apiregistrationv1.APIService {}}, enqueueCSV ).
79
84
Watches (& source.Kind {Type : & operatorsv1alpha1.Subscription {}}, enqueueCSV ).
80
85
Complete (reconcile .Func (r .ReconcileClusterServiceVersion ))
@@ -110,7 +115,7 @@ func NewAdoptionReconciler(cli client.Client, log logr.Logger, scheme *runtime.S
110
115
func (r * AdoptionReconciler ) ReconcileSubscription (req ctrl.Request ) (reconcile.Result , error ) {
111
116
// Set up a convenient log object so we don't have to type request over and over again
112
117
log := r .log .WithValues ("request" , req )
113
- log .V (1 ).Info ("reconciling subscription" )
118
+ log .V (4 ).Info ("reconciling subscription" )
114
119
115
120
// Fetch the Subscription from the cache
116
121
ctx := context .TODO ()
@@ -173,7 +178,7 @@ func (r *AdoptionReconciler) ReconcileSubscription(req ctrl.Request) (reconcile.
173
178
func (r * AdoptionReconciler ) ReconcileClusterServiceVersion (req ctrl.Request ) (reconcile.Result , error ) {
174
179
// Set up a convenient log object so we don't have to type request over and over again
175
180
log := r .log .WithValues ("request" , req )
176
- log .V (1 ).Info ("reconciling ClusterServiceVersion " )
181
+ log .V (4 ).Info ("reconciling csv " )
177
182
178
183
// Fetch the CSV from the cache
179
184
ctx := context .TODO ()
@@ -228,7 +233,6 @@ func (r *AdoptionReconciler) adoptComponents(ctx context.Context, csv *operators
228
233
defer mu .Unlock ()
229
234
errs = append (errs , err )
230
235
}()
231
- continue
232
236
}
233
237
234
238
for _ , component := range components {
@@ -371,11 +375,7 @@ func (r *AdoptionReconciler) adoptees(ctx context.Context, operator decorators.O
371
375
components = append (components , crd )
372
376
}
373
377
374
- if err := utilerrors .NewAggregate (errs ); err != nil {
375
- return nil , err
376
- }
377
-
378
- return components , nil
378
+ return components , utilerrors .NewAggregate (errs )
379
379
}
380
380
381
381
func (r * AdoptionReconciler ) adoptInstallPlan (ctx context.Context , operator * decorators.Operator , latest * operatorsv1alpha1.InstallPlan ) error {
@@ -423,12 +423,20 @@ func (r *AdoptionReconciler) mapToSubscriptions(obj handler.MapObject) (requests
423
423
ctx := context .TODO ()
424
424
subs := & operatorsv1alpha1.SubscriptionList {}
425
425
if err := r .List (ctx , subs , client .InNamespace (obj .Meta .GetNamespace ())); err != nil {
426
- r .log .Error (err , "couldn't list subscriptions" )
426
+ r .log .Error (err , "error listing subscriptions" )
427
427
}
428
428
429
+ visited := map [types.NamespacedName ]struct {}{}
429
430
for _ , sub := range subs .Items {
430
431
nsn := types.NamespacedName {Namespace : sub .GetNamespace (), Name : sub .GetName ()}
432
+
433
+ if _ , ok := visited [nsn ]; ok {
434
+ // Already requested
435
+ continue
436
+ }
437
+
431
438
requests = append (requests , reconcile.Request {NamespacedName : nsn })
439
+ visited [nsn ] = struct {}{}
432
440
}
433
441
434
442
return
@@ -440,24 +448,51 @@ func (r *AdoptionReconciler) mapToClusterServiceVersions(obj handler.MapObject)
440
448
}
441
449
442
450
// Get all owner CSV from owner labels if cluster scoped
443
- if obj .Meta .GetNamespace () == metav1 .NamespaceAll {
451
+ namespace := obj .Meta .GetNamespace ()
452
+ if namespace == metav1 .NamespaceAll {
444
453
name , ns , ok := ownerutil .GetOwnerByKindLabel (obj .Meta , operatorsv1alpha1 .ClusterServiceVersionKind )
445
454
if ok {
446
455
nsn := types.NamespacedName {Namespace : ns , Name : name }
447
456
requests = append (requests , reconcile.Request {NamespacedName : nsn })
448
457
}
449
-
450
458
return
451
459
}
452
460
453
461
// Get all owner CSVs from OwnerReferences
454
462
owners := ownerutil .GetOwnersByKind (obj .Meta , operatorsv1alpha1 .ClusterServiceVersionKind )
455
463
for _ , owner := range owners {
456
- nsn := types.NamespacedName {Namespace : obj . Meta . GetNamespace () , Name : owner .Name }
464
+ nsn := types.NamespacedName {Namespace : namespace , Name : owner .Name }
457
465
requests = append (requests , reconcile.Request {NamespacedName : nsn })
458
466
}
459
467
460
- // TODO(njhale): Requeue CSVs on CRD changes
468
+ return
469
+ }
470
+
471
+ func (r * AdoptionReconciler ) mapToProviders (obj handler.MapObject ) (requests []reconcile.Request ) {
472
+ if obj .Meta == nil {
473
+ return nil
474
+ }
475
+
476
+ var (
477
+ ctx = context .TODO ()
478
+ csvs = & operatorsv1alpha1.ClusterServiceVersionList {}
479
+ )
480
+ if err := r .List (ctx , csvs ); err != nil {
481
+ r .log .Error (err , "error listing csvs" )
482
+ return
483
+ }
484
+
485
+ for _ , csv := range csvs .Items {
486
+ request := reconcile.Request {
487
+ NamespacedName : types.NamespacedName {Namespace : csv .GetNamespace (), Name : csv .GetName ()},
488
+ }
489
+ for _ , provided := range csv .Spec .CustomResourceDefinitions .Owned {
490
+ if provided .Name == obj .Meta .GetName () {
491
+ requests = append (requests , request )
492
+ break
493
+ }
494
+ }
495
+ }
461
496
462
497
return
463
498
}
0 commit comments