Skip to content

Commit 1edb051

Browse files
author
fanzhangio
committed
Implement predicate
1 parent e205778 commit 1edb051

File tree

3 files changed

+143
-2
lines changed

3 files changed

+143
-2
lines changed

pkg/predicate/predicate.go

Lines changed: 68 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,12 @@ limitations under the License.
1616

1717
package predicate
1818

19-
import "sigs.k8s.io/controller-runtime/pkg/event"
19+
import (
20+
"sigs.k8s.io/controller-runtime/pkg/event"
21+
logf "sigs.k8s.io/controller-runtime/pkg/runtime/log"
22+
)
23+
24+
var predicateLog = logf.KBLog.WithName("predicate").WithName("eventFilters")
2025

2126
// Predicate filters events before enqueuing the keys.
2227
type Predicate interface {
@@ -35,6 +40,16 @@ type Predicate interface {
3540

3641
var _ Predicate = Funcs{}
3742

43+
// DefaultPredicate returns a set of default predicate functions
44+
func DefaultPredicate() Funcs {
45+
return Funcs{
46+
CreateFunc: defaultCreateFunc,
47+
DeleteFunc: defaultDeleteFunc,
48+
UpdateFunc: defaultUpdateFunc,
49+
GenericFunc: defaultGeneric,
50+
}
51+
}
52+
3853
// Funcs is a function that implements Predicate.
3954
type Funcs struct {
4055
// Create returns true if the Create event should be processed
@@ -81,3 +96,55 @@ func (p Funcs) Generic(e event.GenericEvent) bool {
8196
}
8297
return true
8398
}
99+
100+
func defaultCreateFunc(e event.CreateEvent) bool {
101+
if e.Meta == nil {
102+
predicateLog.Error(nil, "CreateEvent has no metadata", "CreateEvent", e)
103+
return false
104+
}
105+
if e.Object == nil {
106+
predicateLog.Error(nil, "CreateEvent has no runtime object", "CreateEvent", e)
107+
return false
108+
}
109+
return true
110+
}
111+
112+
func defaultDeleteFunc(e event.DeleteEvent) bool {
113+
if e.Meta == nil {
114+
predicateLog.Error(nil, "CreateEvent has no object", "CreateEvent", e)
115+
return false
116+
}
117+
return true
118+
}
119+
120+
func defaultUpdateFunc(e event.UpdateEvent) bool {
121+
if e.MetaOld == nil {
122+
predicateLog.Error(nil, "UpdateEvent has no old metadata", "UpdateEvent", e)
123+
return false
124+
}
125+
if e.ObjectOld == nil {
126+
predicateLog.Error(nil, "GenericEvent has no old runtime object to update", "GenericEvent", e)
127+
return false
128+
}
129+
if e.ObjectNew == nil {
130+
predicateLog.Error(nil, "GenericEvent has no new runtime object for update", "GenericEvent", e)
131+
return false
132+
}
133+
if e.MetaNew == nil {
134+
predicateLog.Error(nil, "UpdateEvent has no new metadata", "UpdateEvent", e)
135+
return false
136+
}
137+
return true
138+
}
139+
140+
func defaultGeneric(e event.GenericEvent) bool {
141+
if e.Meta == nil {
142+
predicateLog.Error(nil, "GenericEvent has no metadata", "GenericEvent", e)
143+
return false
144+
}
145+
if e.Object == nil {
146+
predicateLog.Error(nil, "GenericEvent has no runtime object", "GenericEvent", e)
147+
return false
148+
}
149+
return true
150+
}

pkg/predicate/predicate_suite_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
1414
limitations under the License.
1515
*/
1616

17-
package predicate
17+
package predicate_test
1818

1919
import (
2020
"testing"

pkg/predicate/predicate_test.go

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,4 +175,78 @@ var _ = Describe("Predicate", func() {
175175
close(done)
176176
})
177177
})
178+
179+
Describe("Default predicate funcs", func() {
180+
181+
defaultFuncs := predicate.DefaultPredicate()
182+
183+
It("should call defaultCreateFunc", func() {
184+
By("Return true if the create event should be proccessed")
185+
passEvt := event.CreateEvent{
186+
Meta: pod.GetObjectMeta(),
187+
Object: pod,
188+
}
189+
Expect(defaultFuncs.Create(passEvt)).To(BeTrue())
190+
191+
By("Return false if the create event should not be proccessed")
192+
failEvt1 := event.CreateEvent{Meta: pod.GetObjectMeta()}
193+
Expect(defaultFuncs.Create(failEvt1)).To(BeFalse())
194+
failEvt2 := event.CreateEvent{Object: pod}
195+
Expect(defaultFuncs.Create(failEvt2)).To(BeFalse())
196+
})
197+
198+
It("should call defaultDeleteFunc", func() {
199+
By("Return true if the delete event should be proccessed")
200+
passEvt := event.DeleteEvent{
201+
Meta: pod.GetObjectMeta(),
202+
Object: pod,
203+
}
204+
Expect(defaultFuncs.Delete(passEvt)).To(BeTrue())
205+
By("Return false if the delete event should not be proccessed")
206+
failEvt := event.DeleteEvent{}
207+
Expect(defaultFuncs.Delete(failEvt)).To(BeFalse())
208+
209+
})
210+
211+
It("should call defaultUpdateFunc", func() {
212+
newPod := pod.DeepCopy()
213+
newPod.Name = "baz2"
214+
newPod.Namespace = "biz2"
215+
216+
By("Return true if the update event should be proccessed")
217+
passEvt := event.UpdateEvent{
218+
MetaOld: pod.GetObjectMeta(),
219+
ObjectOld: pod,
220+
MetaNew: newPod.GetObjectMeta(),
221+
ObjectNew: newPod,
222+
}
223+
Expect(defaultFuncs.Update(passEvt)).To(BeTrue())
224+
By("Return false if the udpate event should not be proccessed")
225+
failEvt1 := event.UpdateEvent{}
226+
failEvt2 := event.UpdateEvent{MetaOld: pod.GetObjectMeta()}
227+
failEvt3 := event.UpdateEvent{MetaOld: pod.GetObjectMeta(), ObjectOld: pod}
228+
failEvt4 := event.UpdateEvent{MetaOld: pod.GetObjectMeta(), ObjectOld: pod, MetaNew: newPod.GetObjectMeta()}
229+
failEvt5 := event.UpdateEvent{MetaOld: pod.GetObjectMeta(), ObjectOld: pod, ObjectNew: newPod}
230+
Expect(defaultFuncs.Update(failEvt1)).To(BeFalse())
231+
Expect(defaultFuncs.Update(failEvt2)).To(BeFalse())
232+
Expect(defaultFuncs.Update(failEvt3)).To(BeFalse())
233+
Expect(defaultFuncs.Update(failEvt4)).To(BeFalse())
234+
Expect(defaultFuncs.Update(failEvt5)).To(BeFalse())
235+
})
236+
237+
It("should call defaultGeneric", func() {
238+
By("Return true if the generic event should be proccessed")
239+
passEvt := event.GenericEvent{
240+
Meta: pod.GetObjectMeta(),
241+
Object: pod,
242+
}
243+
Expect(defaultFuncs.Generic(passEvt)).To(BeTrue())
244+
By("Return false if the generic event should not be proccessed")
245+
failEvt1 := event.GenericEvent{Meta: pod.GetObjectMeta()}
246+
Expect(defaultFuncs.Generic(failEvt1)).To(BeFalse())
247+
failEvt2 := event.GenericEvent{Object: pod}
248+
Expect(defaultFuncs.Generic(failEvt2)).To(BeFalse())
249+
})
250+
})
251+
178252
})

0 commit comments

Comments
 (0)