Skip to content

Commit ac6b4ac

Browse files
jiachengxukevindelgado
authored andcommitted
Implement NewPredicateFuncs to create predicate functions from a filter function
1 parent 13c2680 commit ac6b4ac

File tree

2 files changed

+75
-0
lines changed

2 files changed

+75
-0
lines changed

pkg/predicate/predicate.go

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

1919
import (
20+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
21+
"k8s.io/apimachinery/pkg/runtime"
22+
2023
"sigs.k8s.io/controller-runtime/pkg/event"
2124
logf "sigs.k8s.io/controller-runtime/pkg/internal/log"
2225
)
@@ -91,6 +94,26 @@ func (p Funcs) Generic(e event.GenericEvent) bool {
9194
return true
9295
}
9396

97+
// NewPredicateFuncs returns a predicate funcs that applies the given filter function
98+
// on CREATE, UPDATE, DELETE and GENERIC events. For UPDATE events, the filter is applied
99+
// to the new object.
100+
func NewPredicateFuncs(filter func(meta metav1.Object, object runtime.Object) bool) Funcs {
101+
return Funcs{
102+
CreateFunc: func(e event.CreateEvent) bool {
103+
return filter(e.Meta, e.Object)
104+
},
105+
UpdateFunc: func(e event.UpdateEvent) bool {
106+
return filter(e.MetaNew, e.ObjectNew)
107+
},
108+
DeleteFunc: func(e event.DeleteEvent) bool {
109+
return filter(e.Meta, e.Object)
110+
},
111+
GenericFunc: func(e event.GenericEvent) bool {
112+
return filter(e.Meta, e.Object)
113+
},
114+
}
115+
}
116+
94117
// ResourceVersionChangedPredicate implements a default update predicate function on resource version change
95118
type ResourceVersionChangedPredicate struct {
96119
Funcs

pkg/predicate/predicate_test.go

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ import (
2121
. "github.com/onsi/gomega"
2222
corev1 "k8s.io/api/core/v1"
2323
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
24+
"k8s.io/apimachinery/pkg/runtime"
25+
2426
"sigs.k8s.io/controller-runtime/pkg/event"
2527
"sigs.k8s.io/controller-runtime/pkg/predicate"
2628
)
@@ -491,4 +493,54 @@ var _ = Describe("Predicate", func() {
491493
})
492494
})
493495
})
496+
497+
Describe("NewPredicateFuncs with a namespace filter function", func() {
498+
byNamespaceFilter := func(namespace string) func(m metav1.Object, object runtime.Object) bool {
499+
return func(m metav1.Object, object runtime.Object) bool {
500+
return m.GetNamespace() == namespace
501+
}
502+
}
503+
byNamespaceFuncs := predicate.NewPredicateFuncs(byNamespaceFilter("biz"))
504+
Context("Where the namespace is matching", func() {
505+
It("should return true", func() {
506+
new := &corev1.Pod{
507+
ObjectMeta: metav1.ObjectMeta{
508+
Name: "baz",
509+
Namespace: "biz",
510+
}}
511+
512+
old := &corev1.Pod{
513+
ObjectMeta: metav1.ObjectMeta{
514+
Name: "baz",
515+
Namespace: "biz",
516+
}}
517+
passEvt1 := event.UpdateEvent{MetaOld: old.GetObjectMeta(), ObjectOld: old, MetaNew: new.GetObjectMeta()}
518+
Expect(byNamespaceFuncs.Create(event.CreateEvent{Meta: new.GetObjectMeta(), Object: new})).To(BeTrue())
519+
Expect(byNamespaceFuncs.Delete(event.DeleteEvent{Meta: old.GetObjectMeta(), Object: old})).To(BeTrue())
520+
Expect(byNamespaceFuncs.Generic(event.GenericEvent{Meta: new.GetObjectMeta(), Object: new})).To(BeTrue())
521+
Expect(byNamespaceFuncs.Update(passEvt1)).To(BeTrue())
522+
})
523+
})
524+
525+
Context("Where the namespace is not matching", func() {
526+
It("should return false", func() {
527+
new := &corev1.Pod{
528+
ObjectMeta: metav1.ObjectMeta{
529+
Name: "baz",
530+
Namespace: "bizz",
531+
}}
532+
533+
old := &corev1.Pod{
534+
ObjectMeta: metav1.ObjectMeta{
535+
Name: "baz",
536+
Namespace: "biz",
537+
}}
538+
failEvt1 := event.UpdateEvent{MetaOld: old.GetObjectMeta(), ObjectOld: old, MetaNew: new.GetObjectMeta()}
539+
Expect(byNamespaceFuncs.Create(event.CreateEvent{Meta: new.GetObjectMeta(), Object: new})).To(BeFalse())
540+
Expect(byNamespaceFuncs.Delete(event.DeleteEvent{Meta: new.GetObjectMeta(), Object: new})).To(BeFalse())
541+
Expect(byNamespaceFuncs.Generic(event.GenericEvent{Meta: new.GetObjectMeta(), Object: new})).To(BeFalse())
542+
Expect(byNamespaceFuncs.Update(failEvt1)).To(BeFalse())
543+
})
544+
})
545+
})
494546
})

0 commit comments

Comments
 (0)