diff --git a/pkg/predicate/predicate.go b/pkg/predicate/predicate.go index fc59d89ba3..8608e22ac6 100644 --- a/pkg/predicate/predicate.go +++ b/pkg/predicate/predicate.go @@ -24,6 +24,7 @@ import ( "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/event" logf "sigs.k8s.io/controller-runtime/pkg/internal/log" + "sigs.k8s.io/controller-runtime/pkg/runtime/inject" ) var log = logf.RuntimeLog.WithName("predicate").WithName("eventFilters") @@ -239,6 +240,15 @@ type and struct { predicates []Predicate } +func (a and) InjectFunc(f inject.Func) error { + for _, p := range a.predicates { + if err := f(p); err != nil { + return err + } + } + return nil +} + func (a and) Create(e event.CreateEvent) bool { for _, p := range a.predicates { if !p.Create(e) { @@ -284,6 +294,15 @@ type or struct { predicates []Predicate } +func (o or) InjectFunc(f inject.Func) error { + for _, p := range o.predicates { + if err := f(p); err != nil { + return err + } + } + return nil +} + func (o or) Create(e event.CreateEvent) bool { for _, p := range o.predicates { if p.Create(e) { diff --git a/pkg/predicate/predicate_test.go b/pkg/predicate/predicate_test.go index 005d170a66..f545139871 100644 --- a/pkg/predicate/predicate_test.go +++ b/pkg/predicate/predicate_test.go @@ -21,6 +21,7 @@ import ( . "github.com/onsi/gomega" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "sigs.k8s.io/controller-runtime/pkg/runtime/inject" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/event" @@ -827,6 +828,13 @@ var _ = Describe("Predicate", func() { } passFuncs := funcs(true) failFuncs := funcs(false) + + var injectFunc inject.Func + injectFunc = func(i interface{}) error { + _, err := inject.InjectorInto(injectFunc, i) + return err + } + Describe("When checking an And predicate", func() { It("should return false when one of its predicates returns false", func() { a := predicate.And(passFuncs, failFuncs) @@ -842,6 +850,12 @@ var _ = Describe("Predicate", func() { Expect(a.Delete(event.DeleteEvent{})).To(BeTrue()) Expect(a.Generic(event.GenericEvent{})).To(BeTrue()) }) + It("should inject into its predicates", func() { + prct := &injectablePredicate{} + a := predicate.And(prct) + Expect(injectFunc(a)).To(Succeed()) + Expect(prct.injected).To(BeTrue()) + }) }) Describe("When checking an Or predicate", func() { It("should return true when one of its predicates returns true", func() { @@ -858,6 +872,12 @@ var _ = Describe("Predicate", func() { Expect(o.Delete(event.DeleteEvent{})).To(BeFalse()) Expect(o.Generic(event.GenericEvent{})).To(BeFalse()) }) + It("should inject into its predicates", func() { + prct := &injectablePredicate{} + a := predicate.Or(prct) + Expect(injectFunc(a)).To(Succeed()) + Expect(prct.injected).To(BeTrue()) + }) }) }) @@ -942,3 +962,13 @@ var _ = Describe("Predicate", func() { }) }) }) + +type injectablePredicate struct { + injected bool + predicate.Funcs +} + +func (i *injectablePredicate) InjectFunc(f inject.Func) error { + i.injected = true + return nil +}