From 968af32a15d98b7ccd446634514cb3e39fc031c0 Mon Sep 17 00:00:00 2001 From: Johannes Aubart Date: Wed, 17 Sep 2025 13:35:33 +0200 Subject: [PATCH 1/2] feat: add exact name predicate --- pkg/controller/predicates.go | 14 ++++++++++++++ pkg/controller/predicates_test.go | 16 ++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/pkg/controller/predicates.go b/pkg/controller/predicates.go index 3bb0f2f..ccfa764 100644 --- a/pkg/controller/predicates.go +++ b/pkg/controller/predicates.go @@ -217,3 +217,17 @@ func (p StatusChangedPredicate) Update(e event.UpdateEvent) bool { } return !reflect.DeepEqual(oldStatus, newStatus) } + +//////////////////////////////////// +/// IDENTITY MATCHING PREDICATES /// +//////////////////////////////////// + +// ExactNamePredicate returns true if the object's name and namespace exactly match the specified values. +func ExactNamePredicate(name, namespace string) predicate.Predicate { + return predicate.NewPredicateFuncs(func(obj client.Object) bool { + if obj == nil { + return false + } + return obj.GetName() == name && obj.GetNamespace() == namespace + }) +} diff --git a/pkg/controller/predicates_test.go b/pkg/controller/predicates_test.go index 010f93e..e338b6b 100644 --- a/pkg/controller/predicates_test.go +++ b/pkg/controller/predicates_test.go @@ -234,6 +234,22 @@ var _ = Describe("Predicates", func() { }) + Context("Identity", func() { + + It("should match resources with the specified identity", func() { + p := ctrlutils.ExactNamePredicate("foo", "bar") + e := event.CreateEvent{Object: base} + Expect(p.Create(e)).To(BeTrue()) + + p2 := ctrlutils.ExactNamePredicate("foo", "") + Expect(p2.Create(e)).To(BeFalse()) + + p3 := ctrlutils.ExactNamePredicate("foo", "baz") + Expect(p3.Create(e)).To(BeFalse()) + }) + + }) + }) func updateEvent(old, new client.Object) event.UpdateEvent { From e61b0c717bdec6fac2163eebe6b8a3306bb6ef4d Mon Sep 17 00:00:00 2001 From: Johannes Aubart Date: Wed, 17 Sep 2025 13:38:14 +0200 Subject: [PATCH 2/2] allow namespace wildcard for exact name predicate --- pkg/controller/predicates.go | 3 ++- pkg/controller/predicates_test.go | 3 +++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/pkg/controller/predicates.go b/pkg/controller/predicates.go index ccfa764..feadd11 100644 --- a/pkg/controller/predicates.go +++ b/pkg/controller/predicates.go @@ -223,11 +223,12 @@ func (p StatusChangedPredicate) Update(e event.UpdateEvent) bool { //////////////////////////////////// // ExactNamePredicate returns true if the object's name and namespace exactly match the specified values. +// The namespace can be set to '*' to match any namespace. func ExactNamePredicate(name, namespace string) predicate.Predicate { return predicate.NewPredicateFuncs(func(obj client.Object) bool { if obj == nil { return false } - return obj.GetName() == name && obj.GetNamespace() == namespace + return obj.GetName() == name && (namespace == "*" || obj.GetNamespace() == namespace) }) } diff --git a/pkg/controller/predicates_test.go b/pkg/controller/predicates_test.go index e338b6b..4e15a36 100644 --- a/pkg/controller/predicates_test.go +++ b/pkg/controller/predicates_test.go @@ -246,6 +246,9 @@ var _ = Describe("Predicates", func() { p3 := ctrlutils.ExactNamePredicate("foo", "baz") Expect(p3.Create(e)).To(BeFalse()) + + p4 := ctrlutils.ExactNamePredicate("foo", "*") + Expect(p4.Create(e)).To(BeTrue()) }) })