Skip to content

Commit 71298f1

Browse files
authored
Pass label selector predicate to the Secret Watch and handler (#443)
* Pass label selector predicate to the Secret Watch and handler * Simplify watcher predicate setup * Fix typo
1 parent 1065e37 commit 71298f1

File tree

2 files changed

+69
-24
lines changed

2 files changed

+69
-24
lines changed

pkg/reconciler/reconciler.go

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ type Reconciler struct {
7474
log logr.Logger
7575
gvk *schema.GroupVersionKind
7676
chrt *chart.Chart
77-
selectorPredicate predicate.Predicate
77+
labelSelector metav1.LabelSelector
7878
overrideValues map[string]string
7979
skipDependentWatches bool
8080
maxConcurrentReconciles int
@@ -523,15 +523,11 @@ func WithValueMapper(m values.Mapper) Option {
523523
}
524524
}
525525

526-
// WithSelector is an Option that configures the reconciler to creates a
527-
// predicate that is used to filter resources based on the specified selector
526+
// WithSelector is an Option that configures label selector for the reconciler.
527+
// The label selector is used to filter watch resources.
528528
func WithSelector(s metav1.LabelSelector) Option {
529529
return func(r *Reconciler) error {
530-
p, err := predicate.LabelSelectorPredicate(s)
531-
if err != nil {
532-
return err
533-
}
534-
r.selectorPredicate = p
530+
r.labelSelector = s
535531
return nil
536532
}
537533
}
@@ -1028,8 +1024,13 @@ func (r *Reconciler) setupWatches(mgr ctrl.Manager, c controller.Controller) err
10281024
obj.SetGroupVersionKind(*r.gvk)
10291025

10301026
var preds []predicate.Predicate
1031-
if r.selectorPredicate != nil {
1032-
preds = append(preds, r.selectorPredicate)
1027+
1028+
if r.labelSelector.MatchLabels != nil {
1029+
selectorPredicate, err := predicate.LabelSelectorPredicate(r.labelSelector)
1030+
if err != nil {
1031+
return err
1032+
}
1033+
preds = append(preds, selectorPredicate)
10331034
}
10341035

10351036
if err := c.Watch(
@@ -1053,13 +1054,14 @@ func (r *Reconciler) setupWatches(mgr ctrl.Manager, c controller.Controller) err
10531054
if err := c.Watch(
10541055
source.Kind(
10551056
mgr.GetCache(),
1056-
secret,
1057-
handler.TypedEnqueueRequestForOwner[*corev1.Secret](
1057+
client.Object(secret),
1058+
handler.TypedEnqueueRequestForOwner[client.Object](
10581059
mgr.GetScheme(),
10591060
mgr.GetRESTMapper(),
10601061
obj,
10611062
handler.OnlyControllerOwner(),
10621063
),
1064+
preds...,
10631065
),
10641066
); err != nil {
10651067
return err

pkg/reconciler/reconciler_test.go

Lines changed: 55 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ import (
5353
"sigs.k8s.io/controller-runtime/pkg/log/zap"
5454
"sigs.k8s.io/controller-runtime/pkg/manager"
5555
metricsserver "sigs.k8s.io/controller-runtime/pkg/metrics/server"
56+
"sigs.k8s.io/controller-runtime/pkg/predicate"
5657
"sigs.k8s.io/controller-runtime/pkg/reconcile"
5758
"sigs.k8s.io/controller-runtime/pkg/source"
5859
"sigs.k8s.io/yaml"
@@ -449,18 +450,21 @@ var _ = Describe("Reconciler", func() {
449450

450451
selector := metav1.LabelSelector{MatchLabels: map[string]string{"foo": "bar"}}
451452
Expect(WithSelector(selector)(r)).To(Succeed())
452-
Expect(r.selectorPredicate).NotTo(BeNil())
453-
454-
Expect(r.selectorPredicate.Create(event.CreateEvent{Object: objLabeled})).To(BeTrue())
455-
Expect(r.selectorPredicate.Update(event.UpdateEvent{ObjectOld: objUnlabeled, ObjectNew: objLabeled})).To(BeTrue())
456-
Expect(r.selectorPredicate.Delete(event.DeleteEvent{Object: objLabeled})).To(BeTrue())
457-
Expect(r.selectorPredicate.Generic(event.GenericEvent{Object: objLabeled})).To(BeTrue())
458-
459-
Expect(r.selectorPredicate.Create(event.CreateEvent{Object: objUnlabeled})).To(BeFalse())
460-
Expect(r.selectorPredicate.Update(event.UpdateEvent{ObjectOld: objLabeled, ObjectNew: objUnlabeled})).To(BeFalse())
461-
Expect(r.selectorPredicate.Update(event.UpdateEvent{ObjectOld: objUnlabeled, ObjectNew: objUnlabeled})).To(BeFalse())
462-
Expect(r.selectorPredicate.Delete(event.DeleteEvent{Object: objUnlabeled})).To(BeFalse())
463-
Expect(r.selectorPredicate.Generic(event.GenericEvent{Object: objUnlabeled})).To(BeFalse())
453+
Expect(r.labelSelector).NotTo(BeNil())
454+
455+
selectorPredicate, err := predicate.LabelSelectorPredicate(r.labelSelector)
456+
Expect(err).ToNot(HaveOccurred())
457+
458+
Expect(selectorPredicate.Create(event.CreateEvent{Object: objLabeled})).To(BeTrue())
459+
Expect(selectorPredicate.Update(event.UpdateEvent{ObjectOld: objUnlabeled, ObjectNew: objLabeled})).To(BeTrue())
460+
Expect(selectorPredicate.Delete(event.DeleteEvent{Object: objLabeled})).To(BeTrue())
461+
Expect(selectorPredicate.Generic(event.GenericEvent{Object: objLabeled})).To(BeTrue())
462+
463+
Expect(selectorPredicate.Create(event.CreateEvent{Object: objUnlabeled})).To(BeFalse())
464+
Expect(selectorPredicate.Update(event.UpdateEvent{ObjectOld: objLabeled, ObjectNew: objUnlabeled})).To(BeFalse())
465+
Expect(selectorPredicate.Update(event.UpdateEvent{ObjectOld: objUnlabeled, ObjectNew: objUnlabeled})).To(BeFalse())
466+
Expect(selectorPredicate.Delete(event.DeleteEvent{Object: objUnlabeled})).To(BeFalse())
467+
Expect(selectorPredicate.Generic(event.GenericEvent{Object: objUnlabeled})).To(BeFalse())
464468
})
465469
})
466470
})
@@ -1488,6 +1492,45 @@ var _ = Describe("Reconciler", func() {
14881492
})
14891493
})
14901494
})
1495+
When("label selector set", func() {
1496+
It("reconcile only matching CR", func() {
1497+
By("adding selector to the reconciler", func() {
1498+
selectorFoo := metav1.LabelSelector{MatchLabels: map[string]string{"app": "foo"}}
1499+
Expect(WithSelector(selectorFoo)(r)).To(Succeed())
1500+
})
1501+
1502+
By("adding not matching label to the CR", func() {
1503+
Expect(mgr.GetClient().Get(ctx, objKey, obj)).To(Succeed())
1504+
obj.SetLabels(map[string]string{"app": "bar"})
1505+
Expect(mgr.GetClient().Update(ctx, obj)).To(Succeed())
1506+
})
1507+
1508+
By("reconciling skipped and no actions for the release", func() {
1509+
res, err := r.Reconcile(ctx, req)
1510+
Expect(res).To(Equal(reconcile.Result{}))
1511+
Expect(err).ToNot(HaveOccurred())
1512+
})
1513+
1514+
By("verifying the release has not changed", func() {
1515+
rel, err := ac.Get(obj.GetName())
1516+
Expect(err).ToNot(HaveOccurred())
1517+
Expect(rel).NotTo(BeNil())
1518+
Expect(*rel).To(Equal(*currentRelease))
1519+
})
1520+
1521+
By("adding matching label to the CR", func() {
1522+
Expect(mgr.GetClient().Get(ctx, objKey, obj)).To(Succeed())
1523+
obj.SetLabels(map[string]string{"app": "foo"})
1524+
Expect(mgr.GetClient().Update(ctx, obj)).To(Succeed())
1525+
})
1526+
1527+
By("successfully reconciling with correct labels", func() {
1528+
res, err := r.Reconcile(ctx, req)
1529+
Expect(res).To(Equal(reconcile.Result{}))
1530+
Expect(err).ToNot(HaveOccurred())
1531+
})
1532+
})
1533+
})
14911534
})
14921535
})
14931536
})

0 commit comments

Comments
 (0)