@@ -28,24 +28,19 @@ import (
28
28
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
29
29
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
30
30
"k8s.io/apimachinery/pkg/runtime"
31
- "k8s.io/apimachinery/pkg/types"
32
31
"k8s.io/apimachinery/pkg/util/yaml"
33
32
ctrl "sigs.k8s.io/controller-runtime"
34
33
"sigs.k8s.io/controller-runtime/pkg/builder"
35
34
"sigs.k8s.io/controller-runtime/pkg/client"
36
35
"sigs.k8s.io/controller-runtime/pkg/controller"
37
36
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
38
- "sigs.k8s.io/controller-runtime/pkg/handler"
39
37
"sigs.k8s.io/controller-runtime/pkg/log"
40
38
"sigs.k8s.io/controller-runtime/pkg/predicate"
41
- "sigs.k8s.io/controller-runtime/pkg/reconcile"
42
39
"sort"
43
40
"strings"
44
41
"sync"
45
42
)
46
43
47
- const forMatrixObjectKey = "spec.matrix.object.ref"
48
-
49
44
// ObjectTemplateReconciler reconciles a ObjectTemplate object
50
45
type ObjectTemplateReconciler struct {
51
46
BaseTemplateReconciler
@@ -95,20 +90,6 @@ func (r *ObjectTemplateReconciler) Reconcile(ctx context.Context, req ctrl.Reque
95
90
return ctrl.Result {}, nil
96
91
}
97
92
98
- for _ , me := range rt .Spec .Matrix {
99
- if me .Object != nil {
100
- gvk , err2 := me .Object .Ref .GroupVersionKind ()
101
- if err2 != nil {
102
- err = err2
103
- return
104
- }
105
- err = r .addWatchForKind (ctx , gvk , forMatrixObjectKey , r .buildWatchEventHandler (forMatrixObjectKey ))
106
- if err != nil {
107
- return
108
- }
109
- }
110
- }
111
-
112
93
patch := client .MergeFrom (rt .DeepCopy ())
113
94
err = r .doReconcile (ctx , & rt )
114
95
if err != nil {
@@ -203,11 +184,25 @@ func (r *ObjectTemplateReconciler) doReconcile(ctx context.Context, rt *template
203
184
var wg sync.WaitGroup
204
185
var mutex sync.Mutex
205
186
206
- objClient , err := r .getClientForObjects (rt .Spec .ServiceAccountName , rt .GetNamespace ())
187
+ objClient , saName , err := r .getClientForObjects (rt .Spec .ServiceAccountName , rt .GetNamespace ())
207
188
if err != nil {
208
189
return err
209
190
}
210
191
192
+ wt := r .watchesUtil .getWatchesForTemplate (client .ObjectKeyFromObject (rt ))
193
+ wt .setClient (objClient , saName )
194
+ newObjects := map [templatesv1alpha1.ObjectRef ]bool {}
195
+ for _ , me := range rt .Spec .Matrix {
196
+ if me .Object != nil {
197
+ newObjects [me .Object .Ref ] = true
198
+ err = wt .addWatchForObject (ctx , me .Object .Ref )
199
+ if err != nil {
200
+ return err
201
+ }
202
+ }
203
+ }
204
+ wt .removeDeletedWatches (newObjects )
205
+
211
206
matrixEntries , err := r .buildMatrixEntries (ctx , rt , objClient )
212
207
if err != nil {
213
208
return err
@@ -429,21 +424,6 @@ func (r *ObjectTemplateReconciler) renderTemplates(j2 *jinja2.Jinja2, rt *templa
429
424
func (r * ObjectTemplateReconciler ) SetupWithManager (mgr ctrl.Manager , concurrent int ) error {
430
425
r .Manager = mgr
431
426
432
- // Index the ObjectTemplate by the objects they are for.
433
- if err := mgr .GetCache ().IndexField (context .TODO (), & templatesv1alpha1.ObjectTemplate {}, forMatrixObjectKey ,
434
- func (object client.Object ) []string {
435
- o := object .(* templatesv1alpha1.ObjectTemplate )
436
- var ret []string
437
- for _ , me := range o .Spec .Matrix {
438
- if me .Object != nil {
439
- ret = append (ret , BuildRefIndexValue (me .Object .Ref , o .GetNamespace ()))
440
- }
441
- }
442
- return ret
443
- }); err != nil {
444
- return fmt .Errorf ("failed setting index fields: %w" , err )
445
- }
446
-
447
427
c , err := ctrl .NewControllerManagedBy (mgr ).
448
428
For (& templatesv1alpha1.ObjectTemplate {}, builder .WithPredicates (
449
429
predicate .Or (predicate.GenerationChangedPredicate {}),
@@ -457,33 +437,16 @@ func (r *ObjectTemplateReconciler) SetupWithManager(mgr ctrl.Manager, concurrent
457
437
}
458
438
r .controller = c
459
439
460
- return nil
461
- }
462
-
463
- func (r * ObjectTemplateReconciler ) buildWatchEventHandler (indexField string ) handler.EventHandler {
464
- return handler .EnqueueRequestsFromMapFunc (func (ctx context.Context , object client.Object ) []reconcile.Request {
465
- var list templatesv1alpha1.ObjectTemplateList
440
+ err = r .watchesUtil .init (r .RawWatchContext , r .controller )
441
+ if err != nil {
442
+ return err
443
+ }
466
444
467
- err := r .List (context .Background (), & list , client.MatchingFields {
468
- indexField : BuildObjectIndexValue (object ),
469
- })
470
- if err != nil {
471
- return nil
472
- }
473
- var reqs []reconcile.Request
474
- for _ , x := range list .Items {
475
- reqs = append (reqs , reconcile.Request {
476
- NamespacedName : types.NamespacedName {
477
- Namespace : x .GetNamespace (),
478
- Name : x .GetName (),
479
- },
480
- })
481
- }
482
- return reqs
483
- })
445
+ return nil
484
446
}
485
447
486
448
func (r * ObjectTemplateReconciler ) finalize (ctx context.Context , obj * templatesv1alpha1.ObjectTemplate ) (ctrl.Result , error ) {
449
+ r .watchesUtil .removeWatchesForTemplate (client .ObjectKeyFromObject (obj ))
487
450
r .doFinalize (ctx , obj )
488
451
489
452
// Remove our finalizer from the list and update it
@@ -503,7 +466,7 @@ func (r *ObjectTemplateReconciler) doFinalize(ctx context.Context, obj *template
503
466
return
504
467
}
505
468
506
- objClient , err := r .getClientForObjects (obj .Spec .ServiceAccountName , obj .GetNamespace ())
469
+ objClient , _ , err := r .getClientForObjects (obj .Spec .ServiceAccountName , obj .GetNamespace ())
507
470
if err != nil {
508
471
log .Error (err , "Failed to create objClient for deletion" )
509
472
return
0 commit comments