@@ -30,7 +30,6 @@ import (
30
30
"sigs.k8s.io/controller-runtime/pkg/client/apiutil"
31
31
"sigs.k8s.io/controller-runtime/pkg/controller"
32
32
"sigs.k8s.io/controller-runtime/pkg/handler"
33
- internalsource "sigs.k8s.io/controller-runtime/pkg/internal/source"
34
33
"sigs.k8s.io/controller-runtime/pkg/manager"
35
34
"sigs.k8s.io/controller-runtime/pkg/predicate"
36
35
"sigs.k8s.io/controller-runtime/pkg/reconcile"
@@ -54,14 +53,15 @@ const (
54
53
55
54
// Builder builds a Controller.
56
55
type Builder struct {
57
- forInput ForInput
58
- ownsInput []OwnsInput
59
- watchesInput []WatchesInput
60
- mgr manager.Manager
61
- globalPredicates []predicate.Predicate
62
- ctrl controller.Controller
63
- ctrlOptions controller.Options
64
- name string
56
+ forInput ForInput
57
+ ownsInput []OwnsInput
58
+ watchesObjectInput []WatchesObjectInput
59
+ watchesSourceInput []WatchesSourceInput
60
+ mgr manager.Manager
61
+ globalPredicates []predicate.Predicate
62
+ ctrl controller.Controller
63
+ ctrlOptions controller.Options
64
+ name string
65
65
}
66
66
67
67
// ControllerManagedBy returns a new controller builder that will be started by the provided Manager.
@@ -121,9 +121,9 @@ func (blder *Builder) Owns(object client.Object, opts ...OwnsOption) *Builder {
121
121
return blder
122
122
}
123
123
124
- // WatchesInput represents the information set by Watches method.
125
- type WatchesInput struct {
126
- src source. Source
124
+ // WatchesObjectInput represents the information set by Watches method.
125
+ type WatchesObjectInput struct {
126
+ object client. Object
127
127
eventhandler handler.EventHandler
128
128
predicates []predicate.Predicate
129
129
objectProjection objectProjection
@@ -134,9 +134,14 @@ type WatchesInput struct {
134
134
//
135
135
// This is the equivalent of calling
136
136
// WatchesRawSource(source.Kind(scheme, object), eventhandler, opts...).
137
- func (blder * Builder ) Watches (object client.Object , eventhandler handler.EventHandler , opts ... WatchesOption ) * Builder {
138
- src := source .Kind (blder .mgr .GetCache (), object )
139
- return blder .WatchesRawSource (src , eventhandler , opts ... )
137
+ func (blder * Builder ) Watches (object client.Object , eventhandler handler.EventHandler , opts ... WatchesObjectOption ) * Builder {
138
+ input := WatchesObjectInput {object : object , eventhandler : eventhandler }
139
+ for _ , opt := range opts {
140
+ opt .ApplyToObjectWatches (& input )
141
+ }
142
+
143
+ blder .watchesObjectInput = append (blder .watchesObjectInput , input )
144
+ return blder
140
145
}
141
146
142
147
// WatchesMetadata is the same as Watches, but forces the internal cache to only watch PartialObjectMetadata.
@@ -166,23 +171,24 @@ func (blder *Builder) Watches(object client.Object, eventhandler handler.EventHa
166
171
// In the first case, controller-runtime will create another cache for the
167
172
// concrete type on top of the metadata cache; this increases memory
168
173
// consumption and leads to race conditions as caches are not in sync.
169
- func (blder * Builder ) WatchesMetadata (object client.Object , eventhandler handler.EventHandler , opts ... WatchesOption ) * Builder {
174
+ func (blder * Builder ) WatchesMetadata (object client.Object , eventhandler handler.EventHandler , opts ... WatchesObjectOption ) * Builder {
170
175
opts = append (opts , OnlyMetadata )
171
176
return blder .Watches (object , eventhandler , opts ... )
172
177
}
173
178
179
+ // WatchesSourceInput represents the information set by Watches method.
180
+ type WatchesSourceInput struct {
181
+ src source.Source
182
+ }
183
+
174
184
// WatchesRawSource exposes the lower-level ControllerManagedBy Watches functions through the builder.
175
185
// Specified predicates are registered only for given source.
176
186
//
177
187
// STOP! Consider using For(...), Owns(...), Watches(...), WatchesMetadata(...) instead.
178
188
// This method is only exposed for more advanced use cases, most users should use higher level functions.
179
- func (blder * Builder ) WatchesRawSource (src source.Source , eventhandler handler.EventHandler , opts ... WatchesOption ) * Builder {
180
- input := WatchesInput {src : src , eventhandler : eventhandler }
181
- for _ , opt := range opts {
182
- opt .ApplyToWatches (& input )
183
- }
184
-
185
- blder .watchesInput = append (blder .watchesInput , input )
189
+ // This method does generally disregard all the global configuration set by the builder.
190
+ func (blder * Builder ) WatchesRawSource (src source.Source ) * Builder {
191
+ blder .watchesSourceInput = append (blder .watchesSourceInput , WatchesSourceInput {src : src })
186
192
return blder
187
193
}
188
194
@@ -272,10 +278,15 @@ func (blder *Builder) doWatch() error {
272
278
if err != nil {
273
279
return err
274
280
}
275
- src := source .Kind (blder .mgr .GetCache (), obj )
276
- hdler := & handler.EnqueueRequestForObject {}
277
- allPredicates := append (blder .globalPredicates , blder .forInput .predicates ... )
278
- if err := blder .ctrl .Watch (src , hdler , allPredicates ... ); err != nil {
281
+ allPredicates := append ([]predicate.Predicate (nil ), blder .globalPredicates ... )
282
+ allPredicates = append (allPredicates , blder .forInput .predicates ... )
283
+ src := source .Kind (
284
+ blder .mgr .GetCache (),
285
+ obj ,
286
+ & handler.EnqueueRequestForObject {},
287
+ allPredicates ... ,
288
+ )
289
+ if err := blder .ctrl .Watch (src ); err != nil {
279
290
return err
280
291
}
281
292
}
@@ -289,7 +300,6 @@ func (blder *Builder) doWatch() error {
289
300
if err != nil {
290
301
return err
291
302
}
292
- src := source .Kind (blder .mgr .GetCache (), obj )
293
303
opts := []handler.OwnerOption {}
294
304
if ! own .matchEveryOwner {
295
305
opts = append (opts , handler .OnlyControllerOwner ())
@@ -301,32 +311,37 @@ func (blder *Builder) doWatch() error {
301
311
)
302
312
allPredicates := append ([]predicate.Predicate (nil ), blder .globalPredicates ... )
303
313
allPredicates = append (allPredicates , own .predicates ... )
304
- if err := blder .ctrl .Watch (src , hdler , allPredicates ... ); err != nil {
314
+ src := source .Kind (blder .mgr .GetCache (), obj , hdler , allPredicates ... )
315
+ if err := blder .ctrl .Watch (src ); err != nil {
305
316
return err
306
317
}
307
318
}
308
319
309
320
// Do the watch requests
310
- if len (blder .watchesInput ) == 0 && blder .forInput .object == nil {
321
+ if len (blder .watchesObjectInput ) == 0 && len ( blder . watchesSourceInput ) == 0 && blder .forInput .object == nil {
311
322
return errors .New ("there are no watches configured, controller will never get triggered. Use For(), Owns() or Watches() to set them up" )
312
323
}
313
- for _ , w := range blder .watchesInput {
324
+
325
+ for _ , w := range blder .watchesObjectInput {
326
+ obj , err := blder .project (w .object , w .objectProjection )
327
+ if err != nil {
328
+ return err
329
+ }
330
+
314
331
allPredicates := append ([]predicate.Predicate (nil ), blder .globalPredicates ... )
315
332
allPredicates = append (allPredicates , w .predicates ... )
316
-
317
- // If the source of this watch is of type Kind, project it.
318
- if srckind , ok := w .src .(* internalsource.Kind ); ok {
319
- typeForSrc , err := blder .project (srckind .Type , w .objectProjection )
320
- if err != nil {
321
- return err
322
- }
323
- srckind .Type = typeForSrc
333
+ src := source .Kind (blder .mgr .GetCache (), obj , w .eventhandler , allPredicates ... )
334
+ if err := blder .ctrl .Watch (src ); err != nil {
335
+ return err
324
336
}
337
+ }
325
338
326
- if err := blder .ctrl .Watch (w .src , w .eventhandler , allPredicates ... ); err != nil {
339
+ for _ , w := range blder .watchesSourceInput {
340
+ if err := blder .ctrl .Watch (w .src ); err != nil {
327
341
return err
328
342
}
329
343
}
344
+
330
345
return nil
331
346
}
332
347
0 commit comments