@@ -15,13 +15,13 @@ import (
15
15
sourcev1 "github.com/fluxcd/source-controller/api/v1beta2"
16
16
"github.com/gitops-tools/pkg/sets"
17
17
"github.com/go-logr/logr"
18
+ corev1 "k8s.io/api/core/v1"
18
19
apierrors "k8s.io/apimachinery/pkg/api/errors"
19
20
"k8s.io/apimachinery/pkg/api/meta"
20
21
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
21
22
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
22
23
"k8s.io/apimachinery/pkg/labels"
23
24
"k8s.io/apimachinery/pkg/runtime"
24
- "k8s.io/apimachinery/pkg/types"
25
25
"k8s.io/client-go/rest"
26
26
"sigs.k8s.io/cli-utils/pkg/object"
27
27
ctrl "sigs.k8s.io/controller-runtime"
@@ -45,6 +45,8 @@ var accessor = meta.NewAccessor()
45
45
const (
46
46
gitRepositoryIndexKey string = ".metadata.gitRepository"
47
47
imagePolicyIndexKey string = ".metadata.imagePolicy"
48
+ configMapIndexKey string = ".metadata.configMap"
49
+ secretIndexKey string = ".metadata.secret"
48
50
)
49
51
50
52
type eventRecorder interface {
@@ -308,12 +310,30 @@ func (r *GitOpsSetReconciler) SetupWithManager(mgr ctrl.Manager) error {
308
310
return fmt .Errorf ("failed setting index fields: %w" , err )
309
311
}
310
312
313
+ if err := mgr .GetCache ().IndexField (
314
+ context .TODO (), & templatesv1.GitOpsSet {}, configMapIndexKey , indexConfig ("ConfigMap" )); err != nil {
315
+ return fmt .Errorf ("failed setting index fields: %w" , err )
316
+ }
317
+
318
+ if err := mgr .GetCache ().IndexField (
319
+ context .TODO (), & templatesv1.GitOpsSet {}, secretIndexKey , indexConfig ("Secret" )); err != nil {
320
+ return fmt .Errorf ("failed setting index fields: %w" , err )
321
+ }
322
+
311
323
builder := ctrl .NewControllerManagedBy (mgr ).
312
324
For (& templatesv1.GitOpsSet {}, builder .WithPredicates (
313
325
predicate .Or (predicate.GenerationChangedPredicate {}, predicates.ReconcileRequestedPredicate {}))).
314
326
Watches (
315
327
& source.Kind {Type : & sourcev1.GitRepository {}},
316
328
handler .EnqueueRequestsFromMapFunc (r .gitRepositoryToGitOpsSet ),
329
+ ).
330
+ Watches (
331
+ & source.Kind {Type : & corev1.ConfigMap {}},
332
+ handler .EnqueueRequestsFromMapFunc (r .configMapToGitOpsSet ),
333
+ ).
334
+ Watches (
335
+ & source.Kind {Type : & corev1.Secret {}},
336
+ handler .EnqueueRequestsFromMapFunc (r .secretToGitOpsSet ),
317
337
)
318
338
319
339
// Only watch for GitopsCluster objects if the Cluster generator is enabled.
@@ -360,7 +380,7 @@ func (r *GitOpsSetReconciler) gitOpsClusterToGitOpsSet(o client.Object) []reconc
360
380
var result []reconcile.Request
361
381
for _ , v := range list .Items {
362
382
if matchCluster (gitOpsCluster , & v ) {
363
- result = append (result , reconcile.Request {NamespacedName : types. NamespacedName { Name : v . GetName (), Namespace : v . GetNamespace ()} })
383
+ result = append (result , reconcile.Request {NamespacedName : client . ObjectKeyFromObject ( & v ) })
364
384
}
365
385
}
366
386
@@ -439,41 +459,39 @@ func selectorMatchesCluster(labelSelector metav1.LabelSelector, cluster *cluster
439
459
func (r * GitOpsSetReconciler ) gitRepositoryToGitOpsSet (obj client.Object ) []reconcile.Request {
440
460
// TODO: Store the applied version of GitRepositories in the Status, and don't
441
461
// retrigger if the commit-id isn't different.
442
- ctx := context .Background ()
443
- var list templatesv1.GitOpsSetList
444
-
445
- if err := r .List (ctx , & list , client.MatchingFields {
446
- gitRepositoryIndexKey : client .ObjectKeyFromObject (obj ).String (),
447
- }); err != nil {
448
- return nil
449
- }
450
-
451
- result := []reconcile.Request {}
452
- for _ , v := range list .Items {
453
- result = append (result , reconcile.Request {NamespacedName : types.NamespacedName {Name : v .GetName (), Namespace : v .GetNamespace ()}})
454
- }
455
-
456
- return result
462
+ return r .queryIndexedGitOpsSets (gitRepositoryIndexKey , obj )
457
463
}
458
464
459
465
func (r * GitOpsSetReconciler ) imagePolicyToGitOpsSet (obj client.Object ) []reconcile.Request {
466
+ return r .queryIndexedGitOpsSets (imagePolicyIndexKey , obj )
467
+ }
468
+
469
+ func (r * GitOpsSetReconciler ) queryIndexedGitOpsSets (key string , obj client.Object ) []reconcile.Request {
460
470
ctx := context .Background ()
461
471
var list templatesv1.GitOpsSetList
462
472
463
- if err := r .List (ctx , & list , client. MatchingFields {
464
- imagePolicyIndexKey : client .ObjectKeyFromObject (obj ).String (),
465
- } ); err != nil {
473
+ if err := r .List (ctx , & list ,
474
+ client. MatchingFields { key : client .ObjectKeyFromObject (obj ).String ()} ,
475
+ client . InNamespace ( obj . GetNamespace ()) ); err != nil {
466
476
return nil
467
477
}
468
478
469
479
result := []reconcile.Request {}
470
- for _ , v := range list .Items {
471
- result = append (result , reconcile.Request {NamespacedName : types. NamespacedName { Name : v . GetName (), Namespace : v . GetNamespace ()} })
480
+ for i := range list .Items {
481
+ result = append (result , reconcile.Request {NamespacedName : client . ObjectKeyFromObject ( & list . Items [ i ]) })
472
482
}
473
483
474
484
return result
475
485
}
476
486
487
+ func (r * GitOpsSetReconciler ) configMapToGitOpsSet (obj client.Object ) []reconcile.Request {
488
+ return r .queryIndexedGitOpsSets (configMapIndexKey , obj )
489
+ }
490
+
491
+ func (r * GitOpsSetReconciler ) secretToGitOpsSet (obj client.Object ) []reconcile.Request {
492
+ return r .queryIndexedGitOpsSets (secretIndexKey , obj )
493
+ }
494
+
477
495
func (r * GitOpsSetReconciler ) makeImpersonationClient (namespace , serviceAccountName string ) (client.Client , error ) {
478
496
copyCfg := rest .CopyConfig (r .Config )
479
497
@@ -516,6 +534,40 @@ func indexGitRepositories(o client.Object) []string {
516
534
return referencedNames
517
535
}
518
536
537
+ func indexConfig (kind string ) func (o client.Object ) []string {
538
+ return func (o client.Object ) []string {
539
+ ks , ok := o .(* templatesv1.GitOpsSet )
540
+ if ! ok {
541
+ panic (fmt .Sprintf ("Expected a GitOpsSet, got %T" , o ))
542
+ }
543
+
544
+ referencedResources := []* templatesv1.ConfigGenerator {}
545
+ for _ , gen := range ks .Spec .Generators {
546
+ if gen .Config != nil && gen .Config .Kind == kind {
547
+ referencedResources = append (referencedResources , gen .Config )
548
+ }
549
+ if gen .Matrix != nil && gen .Matrix .Generators != nil {
550
+ for _ , matrixGen := range gen .Matrix .Generators {
551
+ if matrixGen .Config != nil && matrixGen .Config .Kind == kind {
552
+ referencedResources = append (referencedResources , matrixGen .Config )
553
+ }
554
+ }
555
+ }
556
+ }
557
+
558
+ if len (referencedResources ) == 0 {
559
+ return nil
560
+ }
561
+
562
+ referencedNames := []string {}
563
+ for _ , grg := range referencedResources {
564
+ referencedNames = append (referencedNames , fmt .Sprintf ("%s/%s" , ks .GetNamespace (), grg .Name ))
565
+ }
566
+
567
+ return referencedNames
568
+ }
569
+ }
570
+
519
571
func indexImagePolicies (o client.Object ) []string {
520
572
ks , ok := o .(* templatesv1.GitOpsSet )
521
573
if ! ok {
0 commit comments