Skip to content

Commit

Permalink
refactor: convert selector to predicate in WithSelector to catch erro…
Browse files Browse the repository at this point in the history
…r earlier

Signed-off-by: Joe Lanford <joe.lanford@gmail.com>
  • Loading branch information
joelanford committed Feb 28, 2022
1 parent 8150f5d commit 4bbdd2b
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 30 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -76,4 +76,4 @@ jobs:
with:
fetch-depth: 0
- name: Run go-apidiff
uses: joelanford/go-apidiff@master
uses: joelanford/go-apidiff@main
17 changes: 9 additions & 8 deletions pkg/reconciler/reconciler.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ import (
"sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/controller"
"sigs.k8s.io/controller-runtime/pkg/handler"
"sigs.k8s.io/controller-runtime/pkg/predicate"
ctrlpredicate "sigs.k8s.io/controller-runtime/pkg/predicate"
"sigs.k8s.io/controller-runtime/pkg/source"

Expand Down Expand Up @@ -71,7 +72,7 @@ type Reconciler struct {
log logr.Logger
gvk *schema.GroupVersionKind
chrt *chart.Chart
selector *metav1.LabelSelector
selectorPredicate predicate.Predicate
overrideValues map[string]string
skipDependentWatches bool
maxConcurrentReconciles int
Expand Down Expand Up @@ -419,7 +420,11 @@ func WithValueMapper(m values.Mapper) Option {
// predicate that is used to filter resources based on the specified selector
func WithSelector(s metav1.LabelSelector) Option {
return func(r *Reconciler) error {
r.selector = &s
p, err := ctrlpredicate.LabelSelectorPredicate(s)
if err != nil {
return err
}
r.selectorPredicate = p
return nil
}
}
Expand Down Expand Up @@ -819,12 +824,8 @@ func (r *Reconciler) setupWatches(mgr ctrl.Manager, c controller.Controller) err
obj.SetGroupVersionKind(*r.gvk)

var preds []ctrlpredicate.Predicate
if r.selector != nil {
p, err := ctrlpredicate.LabelSelectorPredicate(*r.selector)
if err != nil {
return fmt.Errorf("error constructing predicate from watches selector: %v", err)
}
preds = append(preds, p)
if r.selectorPredicate != nil {
preds = append(preds, r.selectorPredicate)
}

if err := c.Watch(
Expand Down
45 changes: 24 additions & 21 deletions pkg/reconciler/reconciler_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ import (
"k8s.io/client-go/tools/record"
"sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/client/fake"
"sigs.k8s.io/controller-runtime/pkg/event"
"sigs.k8s.io/controller-runtime/pkg/log/zap"
"sigs.k8s.io/controller-runtime/pkg/manager"
"sigs.k8s.io/controller-runtime/pkg/reconcile"
Expand Down Expand Up @@ -381,6 +382,29 @@ var _ = Describe("Reconciler", func() {
Expect(r.valueTranslator.Translate(context.Background(), &unstructured.Unstructured{})).To(Equal(chartutil.Values{"translated": true}))
})
})
var _ = Describe("WithSelector", func() {
It("should set the reconciler selector", func() {
objUnlabeled := &unstructured.Unstructured{}

objLabeled := &unstructured.Unstructured{}
objLabeled.SetLabels(map[string]string{"foo": "bar"})

selector := metav1.LabelSelector{MatchLabels: map[string]string{"foo": "bar"}}
Expect(WithSelector(selector)(r)).To(Succeed())
Expect(r.selectorPredicate).NotTo(BeNil())

Expect(r.selectorPredicate.Create(event.CreateEvent{Object: objLabeled})).To(BeTrue())
Expect(r.selectorPredicate.Update(event.UpdateEvent{ObjectOld: objUnlabeled, ObjectNew: objLabeled})).To(BeTrue())
Expect(r.selectorPredicate.Delete(event.DeleteEvent{Object: objLabeled})).To(BeTrue())
Expect(r.selectorPredicate.Generic(event.GenericEvent{Object: objLabeled})).To(BeTrue())

Expect(r.selectorPredicate.Create(event.CreateEvent{Object: objUnlabeled})).To(BeFalse())
Expect(r.selectorPredicate.Update(event.UpdateEvent{ObjectOld: objLabeled, ObjectNew: objUnlabeled})).To(BeFalse())
Expect(r.selectorPredicate.Update(event.UpdateEvent{ObjectOld: objUnlabeled, ObjectNew: objUnlabeled})).To(BeFalse())
Expect(r.selectorPredicate.Delete(event.DeleteEvent{Object: objUnlabeled})).To(BeFalse())
Expect(r.selectorPredicate.Generic(event.GenericEvent{Object: objUnlabeled})).To(BeFalse())
})
})
})

var _ = Describe("Reconcile", func() {
Expand Down Expand Up @@ -1221,27 +1245,6 @@ var _ = Describe("Reconciler", func() {
})
})
})

var _ = Describe("Test predicate selector", func() {
It("verifying when a valid selector is passed", func() {
selectorPass := metav1.LabelSelector{
MatchLabels: map[string]string{
"testKey": "testValue",
},
}

passPredicate, err := parsePredicateSelector(selectorPass)
Expect(err).NotTo(HaveOccurred())
Expect(passPredicate).NotTo(BeNil())
})

It("verifying there is no error when no predicate is passed", func() {
noSelector := metav1.LabelSelector{}
nilPredicate, err := parsePredicateSelector(noSelector)
Expect(err).NotTo(HaveOccurred())
Expect(nilPredicate).To(BeNil())
})
})
})

func getManagerOrFail() manager.Manager {
Expand Down

0 comments on commit 4bbdd2b

Please sign in to comment.