Skip to content

Commit 5ef5ed9

Browse files
authored
Merge pull request #1121 from VenkatRamaraju/filter-predicate
✨ Added the LabelSelectorPredicate function for filtering events
2 parents 1095de6 + 1ee9470 commit 5ef5ed9

File tree

2 files changed

+45
-0
lines changed

2 files changed

+45
-0
lines changed

pkg/predicate/predicate.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ limitations under the License.
1717
package predicate
1818

1919
import (
20+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
21+
"k8s.io/apimachinery/pkg/labels"
2022
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
2123
"sigs.k8s.io/controller-runtime/pkg/event"
2224
logf "sigs.k8s.io/controller-runtime/pkg/internal/log"
@@ -268,3 +270,15 @@ func (o or) Generic(e event.GenericEvent) bool {
268270
}
269271
return false
270272
}
273+
274+
// LabelSelectorPredicate constructs a Predicate from a LabelSelector.
275+
// Only objects matching the LabelSelector will be admitted.
276+
func LabelSelectorPredicate(s metav1.LabelSelector) (Predicate, error) {
277+
selector, err := metav1.LabelSelectorAsSelector(&s)
278+
if err != nil {
279+
return Funcs{}, err
280+
}
281+
return NewPredicateFuncs(func(o controllerutil.Object) bool {
282+
return selector.Matches(labels.Set(o.GetLabels()))
283+
}), nil
284+
}

pkg/predicate/predicate_test.go

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -516,4 +516,35 @@ var _ = Describe("Predicate", func() {
516516
})
517517
})
518518
})
519+
520+
Describe("When checking a LabelSelectorPredicate", func() {
521+
instance, err := predicate.LabelSelectorPredicate(metav1.LabelSelector{MatchLabels: map[string]string{"foo": "bar"}})
522+
if err != nil {
523+
Fail("Improper Label Selector passed during predicate instantiation.")
524+
}
525+
526+
Context("When the Selector does not match the event labels", func() {
527+
It("should return false", func() {
528+
failMatch := &corev1.Pod{}
529+
Expect(instance.Create(event.CreateEvent{Object: failMatch})).To(BeFalse())
530+
Expect(instance.Delete(event.DeleteEvent{Object: failMatch})).To(BeFalse())
531+
Expect(instance.Generic(event.GenericEvent{Object: failMatch})).To(BeFalse())
532+
Expect(instance.Update(event.UpdateEvent{ObjectNew: failMatch})).To(BeFalse())
533+
})
534+
})
535+
536+
Context("When the Selector matches the event labels", func() {
537+
It("should return true", func() {
538+
successMatch := &corev1.Pod{
539+
ObjectMeta: metav1.ObjectMeta{
540+
Labels: map[string]string{"foo": "bar"},
541+
},
542+
}
543+
Expect(instance.Create(event.CreateEvent{Object: successMatch})).To(BeTrue())
544+
Expect(instance.Delete(event.DeleteEvent{Object: successMatch})).To(BeTrue())
545+
Expect(instance.Generic(event.GenericEvent{Object: successMatch})).To(BeTrue())
546+
Expect(instance.Update(event.UpdateEvent{ObjectNew: successMatch})).To(BeTrue())
547+
})
548+
})
549+
})
519550
})

0 commit comments

Comments
 (0)