Skip to content

Commit 2ba4d33

Browse files
author
fanzhangio
committed
Implement predicate
1 parent 875e0e1 commit 2ba4d33

File tree

3 files changed

+170
-2
lines changed

3 files changed

+170
-2
lines changed

pkg/predicate/predicate.go

Lines changed: 36 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 log = logf.KBLog.WithName("predicate").WithName("eventFilters")
2025

2126
// Predicate filters events before enqueuing the keys.
2227
type Predicate interface {
@@ -34,6 +39,7 @@ type Predicate interface {
3439
}
3540

3641
var _ Predicate = Funcs{}
42+
var _ Predicate = ResourceVersionChangedPredicate{}
3743

3844
// Funcs is a function that implements Predicate.
3945
type Funcs struct {
@@ -81,3 +87,32 @@ func (p Funcs) Generic(e event.GenericEvent) bool {
8187
}
8288
return true
8389
}
90+
91+
// ResourceVersionChangedPredicate implements a default update predicate function on resource version change
92+
type ResourceVersionChangedPredicate struct {
93+
Funcs
94+
}
95+
96+
// Update implements default UpdateEvent filter for validating resource version change
97+
func (ResourceVersionChangedPredicate) Update(e event.UpdateEvent) bool {
98+
if e.MetaOld == nil {
99+
log.Error(nil, "UpdateEvent has no old metadata", "UpdateEvent", e)
100+
return false
101+
}
102+
if e.ObjectOld == nil {
103+
log.Error(nil, "GenericEvent has no old runtime object to update", "GenericEvent", e)
104+
return false
105+
}
106+
if e.ObjectNew == nil {
107+
log.Error(nil, "GenericEvent has no new runtime object for update", "GenericEvent", e)
108+
return false
109+
}
110+
if e.MetaNew == nil {
111+
log.Error(nil, "UpdateEvent has no new metadata", "UpdateEvent", e)
112+
return false
113+
}
114+
if e.MetaNew.GetResourceVersion() == e.MetaOld.GetResourceVersion() {
115+
return false
116+
}
117+
return true
118+
}

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: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,4 +175,137 @@ var _ = Describe("Predicate", func() {
175175
close(done)
176176
})
177177
})
178+
179+
Describe("When checking a ResourceVersionChangedPredicate", func() {
180+
instance := predicate.ResourceVersionChangedPredicate{}
181+
182+
Context("Where the old object doesn't have a ResourceVersion or metadata", func() {
183+
It("should return false", func() {
184+
new := &corev1.Pod{
185+
ObjectMeta: metav1.ObjectMeta{
186+
Name: "baz",
187+
Namespace: "biz",
188+
ResourceVersion: "1",
189+
}}
190+
191+
failEvnt := event.UpdateEvent{
192+
MetaNew: new.GetObjectMeta(),
193+
ObjectNew: new,
194+
}
195+
Expect(instance.Create(event.CreateEvent{})).Should(BeTrue())
196+
Expect(instance.Delete(event.DeleteEvent{})).Should(BeTrue())
197+
Expect(instance.Generic(event.GenericEvent{})).Should(BeTrue())
198+
Expect(instance.Update(failEvnt)).Should(BeFalse())
199+
})
200+
})
201+
202+
Context("Where the new object doesn't have a ResourceVersion or metadata", func() {
203+
It("should return false", func() {
204+
old := &corev1.Pod{
205+
ObjectMeta: metav1.ObjectMeta{
206+
Name: "baz",
207+
Namespace: "biz",
208+
ResourceVersion: "1",
209+
}}
210+
211+
failEvnt := event.UpdateEvent{
212+
MetaOld: old.GetObjectMeta(),
213+
ObjectOld: old,
214+
}
215+
Expect(instance.Create(event.CreateEvent{})).Should(BeTrue())
216+
Expect(instance.Delete(event.DeleteEvent{})).Should(BeTrue())
217+
Expect(instance.Generic(event.GenericEvent{})).Should(BeTrue())
218+
Expect(instance.Update(failEvnt)).Should(BeFalse())
219+
Expect(instance.Update(failEvnt)).Should(BeFalse())
220+
})
221+
})
222+
223+
Context("Where the ResourceVersion hasn't changed", func() {
224+
It("should return false", func() {
225+
new := &corev1.Pod{
226+
ObjectMeta: metav1.ObjectMeta{
227+
Name: "baz",
228+
Namespace: "biz",
229+
ResourceVersion: "v1",
230+
}}
231+
232+
old := &corev1.Pod{
233+
ObjectMeta: metav1.ObjectMeta{
234+
Name: "baz",
235+
Namespace: "biz",
236+
ResourceVersion: "v1",
237+
}}
238+
239+
failEvnt := event.UpdateEvent{
240+
MetaOld: old.GetObjectMeta(),
241+
ObjectOld: old,
242+
MetaNew: new.GetObjectMeta(),
243+
ObjectNew: new,
244+
}
245+
Expect(instance.Create(event.CreateEvent{})).Should(BeTrue())
246+
Expect(instance.Delete(event.DeleteEvent{})).Should(BeTrue())
247+
Expect(instance.Generic(event.GenericEvent{})).Should(BeTrue())
248+
Expect(instance.Update(failEvnt)).Should(BeFalse())
249+
Expect(instance.Update(failEvnt)).Should(BeFalse())
250+
})
251+
})
252+
253+
Context("Where the ResourceVersion has changed", func() {
254+
It("should return true", func() {
255+
new := &corev1.Pod{
256+
ObjectMeta: metav1.ObjectMeta{
257+
Name: "baz",
258+
Namespace: "biz",
259+
ResourceVersion: "v1",
260+
}}
261+
262+
old := &corev1.Pod{
263+
ObjectMeta: metav1.ObjectMeta{
264+
Name: "baz",
265+
Namespace: "biz",
266+
ResourceVersion: "v2",
267+
}}
268+
passEvt := event.UpdateEvent{
269+
MetaOld: old.GetObjectMeta(),
270+
ObjectOld: old,
271+
MetaNew: new.GetObjectMeta(),
272+
ObjectNew: new,
273+
}
274+
Expect(instance.Create(event.CreateEvent{})).Should(BeTrue())
275+
Expect(instance.Delete(event.DeleteEvent{})).Should(BeTrue())
276+
Expect(instance.Generic(event.GenericEvent{})).Should(BeTrue())
277+
Expect(instance.Update(passEvt)).Should(BeTrue())
278+
})
279+
})
280+
281+
Context("Where the objects or metadata are missing", func() {
282+
283+
It("should return false", func() {
284+
new := &corev1.Pod{
285+
ObjectMeta: metav1.ObjectMeta{
286+
Name: "baz",
287+
Namespace: "biz",
288+
ResourceVersion: "v1",
289+
}}
290+
291+
old := &corev1.Pod{
292+
ObjectMeta: metav1.ObjectMeta{
293+
Name: "baz",
294+
Namespace: "biz",
295+
ResourceVersion: "v1",
296+
}}
297+
298+
failEvt1 := event.UpdateEvent{MetaOld: old.GetObjectMeta(), ObjectOld: old, MetaNew: new.GetObjectMeta()}
299+
failEvt2 := event.UpdateEvent{MetaOld: old.GetObjectMeta(), MetaNew: new.GetObjectMeta(), ObjectNew: new}
300+
failEvt3 := event.UpdateEvent{MetaOld: old.GetObjectMeta(), ObjectOld: old, ObjectNew: new}
301+
Expect(instance.Create(event.CreateEvent{})).Should(BeTrue())
302+
Expect(instance.Delete(event.DeleteEvent{})).Should(BeTrue())
303+
Expect(instance.Generic(event.GenericEvent{})).Should(BeTrue())
304+
Expect(instance.Update(failEvt1)).Should(BeFalse())
305+
Expect(instance.Update(failEvt2)).Should(BeFalse())
306+
Expect(instance.Update(failEvt3)).Should(BeFalse())
307+
})
308+
})
309+
310+
})
178311
})

0 commit comments

Comments
 (0)