@@ -26,8 +26,13 @@ import (
26
26
"k8s.io/client-go/util/workqueue"
27
27
)
28
28
29
+ var (
30
+ ResourceVersionChanged = ResourceVersionChangedPredicate {}
31
+ )
32
+
29
33
// MappingEnqueuingFnProvider provides Fns to map objects to name/namespace keys and enqueue them as messages
30
34
type MappingEnqueuingFnProvider struct {
35
+ Predicate Predicate
31
36
// Map maps an object to a key that can be enqueued
32
37
Map func (interface {}) string
33
38
}
@@ -109,3 +114,64 @@ func MapToSelf(obj interface{}) string {
109
114
110
115
// ObjToKey returns a string namespace/name key for an object
111
116
type ObjToKey func (interface {}) string
117
+
118
+ type Predicate interface {
119
+ HandleUpdate (old , new interface {}) bool
120
+ HandleDelete (obj interface {}) bool
121
+ HandleCreate (obj interface {}) bool
122
+ }
123
+
124
+ type TrueMixin struct {}
125
+
126
+ func (TrueMixin ) HandleUpdate (old , new interface {}) bool {
127
+ return true
128
+ }
129
+
130
+ func (TrueMixin ) HandleDelete (obj interface {}) bool {
131
+ return true
132
+ }
133
+
134
+ func (TrueMixin ) HandleCreate (obj interface {}) bool {
135
+ return true
136
+ }
137
+
138
+ type FalseMixin struct {}
139
+
140
+ func (FalseMixin ) HandleUpdate (old , new interface {}) bool {
141
+ return false
142
+ }
143
+
144
+ func (FalseMixin ) HandleDelete (obj interface {}) bool {
145
+ return false
146
+ }
147
+
148
+ func (FalseMixin ) HandleCreate (obj interface {}) bool {
149
+ return false
150
+ }
151
+
152
+ type ConditionalMappingHandler struct {
153
+ MappingEnqueuingFnProvider
154
+ }
155
+
156
+ type ResourceVersionChangedPredicate struct {
157
+ TrueMixin
158
+ }
159
+
160
+ func (ResourceVersionChangedPredicate ) HandleUpdate (old , new interface {}) bool {
161
+ oldObject , ok := old .(metav1.Object )
162
+ if ! ok {
163
+ fmt .Errorf ("Cannot handle %T because old is not an Object: %v\n " , oldObject , oldObject )
164
+ return false
165
+ }
166
+ newObject , ok := new .(metav1.Object )
167
+ if ! ok {
168
+ fmt .Errorf ("Cannot handle %T because new is not an Object: %v\n " , newObject , newObject )
169
+ return false
170
+ }
171
+
172
+ if oldObject .GetResourceVersion () == newObject .GetResourceVersion () {
173
+ // Periodic resync will send update events for all resources Deployments.
174
+ return false
175
+ }
176
+ return true
177
+ }
0 commit comments