@@ -37,15 +37,15 @@ var getGvk = apiutil.GVKForObject
37
37
38
38
// Builder builds a Controller.
39
39
type Builder struct {
40
- apiType runtime. Object
41
- mgr manager.Manager
42
- predicates []predicate.Predicate
43
- managedObjects []runtime. Object
44
- watchRequest []watchRequest
45
- config * rest.Config
46
- ctrl controller.Controller
47
- ctrlOptions controller.Options
48
- name string
40
+ apiType simpleWatch
41
+ mgr manager.Manager
42
+ globalPredicates []predicate.Predicate
43
+ managedObjects [] simpleWatch
44
+ watchRequest []watchRequest
45
+ config * rest.Config
46
+ ctrl controller.Controller
47
+ ctrlOptions controller.Options
48
+ name string
49
49
}
50
50
51
51
// ControllerManagedBy returns a new controller builder that will be started by the provided Manager
@@ -63,32 +63,46 @@ func (blder *Builder) ForType(apiType runtime.Object) *Builder {
63
63
return blder .For (apiType )
64
64
}
65
65
66
+ // simpleWatch represents the information required to construct a "simple" For
67
+ // or Owns watch.
68
+ type simpleWatch struct {
69
+ item runtime.Object
70
+ predicates []predicate.Predicate
71
+ }
72
+
66
73
// For defines the type of Object being *reconciled*, and configures the ControllerManagedBy to respond to create / delete /
67
74
// update events by *reconciling the object*.
68
75
// This is the equivalent of calling
69
76
// Watches(&source.Kind{Type: apiType}, &handler.EnqueueRequestForObject{})
70
- func (blder * Builder ) For (apiType runtime.Object ) * Builder {
71
- blder .apiType = apiType
77
+ func (blder * Builder ) For (reconciledAPIType runtime.Object , prct ... predicate.Predicate ) * Builder {
78
+ blder .apiType = simpleWatch {
79
+ item : reconciledAPIType ,
80
+ predicates : prct ,
81
+ }
72
82
return blder
73
83
}
74
84
75
85
// Owns defines types of Objects being *generated* by the ControllerManagedBy, and configures the ControllerManagedBy to respond to
76
86
// create / delete / update events by *reconciling the owner object*. This is the equivalent of calling
77
87
// Watches(&source.Kind{Type: <ForType-apiType>}, &handler.EnqueueRequestForOwner{OwnerType: apiType, IsController: true})
78
- func (blder * Builder ) Owns (apiType runtime.Object ) * Builder {
79
- blder .managedObjects = append (blder .managedObjects , apiType )
88
+ func (blder * Builder ) Owns (apiType runtime.Object , prct ... predicate. Predicate ) * Builder {
89
+ blder .managedObjects = append (blder .managedObjects , simpleWatch { item : apiType , predicates : prct } )
80
90
return blder
81
91
}
82
92
93
+ // watchRequest represents the information needed to construct a
94
+ // manually-defined (non-"simple") watch.
83
95
type watchRequest struct {
84
96
src source.Source
85
97
eventhandler handler.EventHandler
98
+ predicates []predicate.Predicate
86
99
}
87
100
88
101
// Watches exposes the lower-level ControllerManagedBy Watches functions through the builder. Consider using
89
102
// Owns or For instead of Watches directly.
90
- func (blder * Builder ) Watches (src source.Source , eventhandler handler.EventHandler ) * Builder {
91
- blder .watchRequest = append (blder .watchRequest , watchRequest {src : src , eventhandler : eventhandler })
103
+ // Specified predicates are registered only for given source.
104
+ func (blder * Builder ) Watches (src source.Source , eventhandler handler.EventHandler , prct ... predicate.Predicate ) * Builder {
105
+ blder .watchRequest = append (blder .watchRequest , watchRequest {src : src , eventhandler : eventhandler , predicates : prct })
92
106
return blder
93
107
}
94
108
@@ -102,9 +116,10 @@ func (blder *Builder) WithConfig(config *rest.Config) *Builder {
102
116
103
117
// WithEventFilter sets the event filters, to filter which create/update/delete/generic events eventually
104
118
// trigger reconciliations. For example, filtering on whether the resource version has changed.
119
+ // Given predicate is added for all watched objects.
105
120
// Defaults to the empty list.
106
121
func (blder * Builder ) WithEventFilter (p predicate.Predicate ) * Builder {
107
- blder .predicates = append (blder .predicates , p )
122
+ blder .globalPredicates = append (blder .globalPredicates , p )
108
123
return blder
109
124
}
110
125
@@ -157,28 +172,33 @@ func (blder *Builder) Build(r reconcile.Reconciler) (controller.Controller, erro
157
172
158
173
func (blder * Builder ) doWatch () error {
159
174
// Reconcile type
160
- src := & source.Kind {Type : blder .apiType }
175
+ src := & source.Kind {Type : blder .apiType . item }
161
176
hdler := & handler.EnqueueRequestForObject {}
162
- err := blder .ctrl .Watch (src , hdler , blder .predicates ... )
177
+ allPredicates := append (blder .globalPredicates , blder .apiType .predicates ... )
178
+ err := blder .ctrl .Watch (src , hdler , allPredicates ... )
163
179
if err != nil {
164
180
return err
165
181
}
166
182
167
183
// Watches the managed types
168
184
for _ , obj := range blder .managedObjects {
169
- src := & source.Kind {Type : obj }
185
+ src := & source.Kind {Type : obj . item }
170
186
hdler := & handler.EnqueueRequestForOwner {
171
- OwnerType : blder .apiType ,
187
+ OwnerType : blder .apiType . item ,
172
188
IsController : true ,
173
189
}
174
- if err := blder .ctrl .Watch (src , hdler , blder .predicates ... ); err != nil {
190
+ allPredicates := append ([]predicate.Predicate (nil ), blder .globalPredicates ... )
191
+ allPredicates = append (allPredicates , obj .predicates ... )
192
+ if err := blder .ctrl .Watch (src , hdler , allPredicates ... ); err != nil {
175
193
return err
176
194
}
177
195
}
178
196
179
197
// Do the watch requests
180
198
for _ , w := range blder .watchRequest {
181
- if err := blder .ctrl .Watch (w .src , w .eventhandler , blder .predicates ... ); err != nil {
199
+ allPredicates := append ([]predicate.Predicate (nil ), blder .globalPredicates ... )
200
+ allPredicates = append (allPredicates , w .predicates ... )
201
+ if err := blder .ctrl .Watch (w .src , w .eventhandler , allPredicates ... ); err != nil {
182
202
return err
183
203
}
184
204
@@ -196,7 +216,7 @@ func (blder *Builder) getControllerName() (string, error) {
196
216
if blder .name != "" {
197
217
return blder .name , nil
198
218
}
199
- gvk , err := getGvk (blder .apiType , blder .mgr .GetScheme ())
219
+ gvk , err := getGvk (blder .apiType . item , blder .mgr .GetScheme ())
200
220
if err != nil {
201
221
return "" , err
202
222
}
0 commit comments