@@ -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"
@@ -56,6 +55,7 @@ const (
56
55
type Builder struct {
57
56
forInput ForInput
58
57
ownsInput []OwnsInput
58
+ rawSources []source.Source
59
59
watchesInput []WatchesInput
60
60
mgr manager.Manager
61
61
globalPredicates []predicate.Predicate
@@ -123,8 +123,8 @@ func (blder *Builder) Owns(object client.Object, opts ...OwnsOption) *Builder {
123
123
124
124
// WatchesInput represents the information set by Watches method.
125
125
type WatchesInput struct {
126
- src source. Source
127
- eventHandler handler.EventHandler
126
+ obj client. Object
127
+ handler handler.EventHandler
128
128
predicates []predicate.Predicate
129
129
objectProjection objectProjection
130
130
}
@@ -133,10 +133,19 @@ type WatchesInput struct {
133
133
// update events by *reconciling the object* with the given EventHandler.
134
134
//
135
135
// This is the equivalent of calling
136
- // WatchesRawSource(source.Kind(cache, object) , eventHandler, opts ...).
136
+ // WatchesRawSource(source.Kind(cache, object, eventHandler, predicates ...) ).
137
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 ... )
138
+ input := WatchesInput {
139
+ obj : object ,
140
+ handler : eventHandler ,
141
+ }
142
+ for _ , opt := range opts {
143
+ opt .ApplyToWatches (& input )
144
+ }
145
+
146
+ blder .watchesInput = append (blder .watchesInput , input )
147
+
148
+ return blder
140
149
}
141
150
142
151
// WatchesMetadata is the same as Watches, but forces the internal cache to only watch PartialObjectMetadata.
@@ -176,13 +185,11 @@ func (blder *Builder) WatchesMetadata(object client.Object, eventHandler handler
176
185
//
177
186
// STOP! Consider using For(...), Owns(...), Watches(...), WatchesMetadata(...) instead.
178
187
// This method is only exposed for more advanced use cases, most users should use one of the 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
- }
188
+ //
189
+ // WatchesRawSource does not respect predicates configured through WithEventFilter.
190
+ func (blder * Builder ) WatchesRawSource (src source.Source ) * Builder {
191
+ blder .rawSources = append (blder .rawSources , src )
184
192
185
- blder .watchesInput = append (blder .watchesInput , input )
186
193
return blder
187
194
}
188
195
@@ -272,11 +279,11 @@ func (blder *Builder) doWatch() error {
272
279
if err != nil {
273
280
return err
274
281
}
275
- src := source .Kind (blder .mgr .GetCache (), obj )
276
282
hdler := & handler.EnqueueRequestForObject {}
277
283
allPredicates := append ([]predicate.Predicate (nil ), blder .globalPredicates ... )
278
284
allPredicates = append (allPredicates , blder .forInput .predicates ... )
279
- if err := blder .ctrl .Watch (src , hdler , allPredicates ... ); err != nil {
285
+ src := source .Kind (blder .mgr .GetCache (), obj , hdler , allPredicates ... )
286
+ if err := blder .ctrl .Watch (src ); err != nil {
280
287
return err
281
288
}
282
289
}
@@ -290,7 +297,6 @@ func (blder *Builder) doWatch() error {
290
297
if err != nil {
291
298
return err
292
299
}
293
- src := source .Kind (blder .mgr .GetCache (), obj )
294
300
opts := []handler.OwnerOption {}
295
301
if ! own .matchEveryOwner {
296
302
opts = append (opts , handler .OnlyControllerOwner ())
@@ -302,27 +308,29 @@ func (blder *Builder) doWatch() error {
302
308
)
303
309
allPredicates := append ([]predicate.Predicate (nil ), blder .globalPredicates ... )
304
310
allPredicates = append (allPredicates , own .predicates ... )
305
- if err := blder .ctrl .Watch (src , hdler , allPredicates ... ); err != nil {
311
+ src := source .Kind (blder .mgr .GetCache (), obj , hdler , allPredicates ... )
312
+ if err := blder .ctrl .Watch (src ); err != nil {
306
313
return err
307
314
}
308
315
}
309
316
310
317
// Do the watch requests
311
- if len (blder .watchesInput ) == 0 && blder .forInput .object == nil {
312
- return errors .New ("there are no watches configured, controller will never get triggered. Use For(), Owns() or Watches () to set them up" )
318
+ if len (blder .watchesInput ) == 0 && blder .forInput .object == nil && len ( blder . rawSources ) == 0 {
319
+ return errors .New ("there are no watches configured, controller will never get triggered. Use For(), Owns(), Watches() or WatchesRawSource () to set them up" )
313
320
}
314
321
for _ , w := range blder .watchesInput {
315
- // If the source of this watch is of type Kind, project it.
316
- if srcKind , ok := w .src .(* internalsource.Kind ); ok {
317
- typeForSrc , err := blder .project (srcKind .Type , w .objectProjection )
318
- if err != nil {
319
- return err
320
- }
321
- srcKind .Type = typeForSrc
322
+ projected , err := blder .project (w .obj , w .objectProjection )
323
+ if err != nil {
324
+ return fmt .Errorf ("failed to project for %T: %w" , w .obj , err )
322
325
}
323
326
allPredicates := append ([]predicate.Predicate (nil ), blder .globalPredicates ... )
324
327
allPredicates = append (allPredicates , w .predicates ... )
325
- if err := blder .ctrl .Watch (w .src , w .eventHandler , allPredicates ... ); err != nil {
328
+ if err := blder .ctrl .Watch (source .Kind (blder .mgr .GetCache (), projected , w .handler , allPredicates ... )); err != nil {
329
+ return err
330
+ }
331
+ }
332
+ for _ , src := range blder .rawSources {
333
+ if err := blder .ctrl .Watch (src ); err != nil {
326
334
return err
327
335
}
328
336
}
0 commit comments