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