@@ -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,7 +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
126
+ obj client.Object
127
+ handler handler.EventHandler
127
128
predicates []predicate.Predicate
128
129
objectProjection objectProjection
129
130
}
@@ -134,13 +135,17 @@ type WatchesInput struct {
134
135
// This is the equivalent of calling
135
136
// WatchesRawSource(source.Kind(cache, object), eventHandler, opts...).
136
137
func (blder * Builder ) Watches (object client.Object , eventHandler handler.EventHandler , opts ... WatchesOption ) * Builder {
137
- input := WatchesInput {}
138
+ input := WatchesInput {
139
+ obj : object ,
140
+ handler : eventHandler ,
141
+ }
138
142
for _ , opt := range opts {
139
143
opt .ApplyToWatches (& input )
140
144
}
141
- src := source .Kind (blder .mgr .GetCache (), object , eventHandler , input .predicates ... )
142
145
143
- return blder .WatchesRawSource (src , opts ... )
146
+ blder .watchesInput = append (blder .watchesInput , input )
147
+
148
+ return blder
144
149
}
145
150
146
151
// WatchesMetadata is the same as Watches, but forces the internal cache to only watch PartialObjectMetadata.
@@ -180,13 +185,9 @@ func (blder *Builder) WatchesMetadata(object client.Object, eventHandler handler
180
185
//
181
186
// STOP! Consider using For(...), Owns(...), Watches(...), WatchesMetadata(...) instead.
182
187
// This method is only exposed for more advanced use cases, most users should use one of the higher level functions.
183
- func (blder * Builder ) WatchesRawSource (src source.Source , opts ... WatchesOption ) * Builder {
184
- input := WatchesInput {src : src }
185
- for _ , opt := range opts {
186
- opt .ApplyToWatches (& input )
187
- }
188
+ func (blder * Builder ) WatchesRawSource (src source.Source ) * Builder {
189
+ blder .rawSources = append (blder .rawSources , src )
188
190
189
- blder .watchesInput = append (blder .watchesInput , input )
190
191
return blder
191
192
}
192
193
@@ -312,22 +313,22 @@ func (blder *Builder) doWatch() error {
312
313
}
313
314
314
315
// Do the watch requests
315
- if len (blder .watchesInput ) == 0 && blder .forInput .object == nil {
316
+ if len (blder .watchesInput ) == 0 && blder .forInput .object == nil && len ( blder . rawSources ) == 0 {
316
317
return errors .New ("there are no watches configured, controller will never get triggered. Use For(), Owns() or Watches() to set them up" )
317
318
}
318
319
allPredicates := append ([]predicate.Predicate (nil ), blder .globalPredicates ... )
319
320
for _ , w := range blder .watchesInput {
320
- // If the source of this watch is of type Kind, project it.
321
- if srcKind , ok := w .src .(* internalsource.Kind ); ok {
322
- allPredicates := append (allPredicates , w .predicates ... )
323
- typeForSrc , err := blder .project (srcKind .Type , w .objectProjection )
324
- if err != nil {
325
- return err
326
- }
327
- srcKind .Type = typeForSrc
328
- srcKind .Predicates = append (srcKind .Predicates , allPredicates ... )
321
+ projected , err := blder .project (w .obj , w .objectProjection )
322
+ if err != nil {
323
+ return fmt .Errorf ("failed to project for %T: %w" , w .obj , err )
329
324
}
330
- if err := blder .ctrl .Watch (w .src ); err != nil {
325
+ allPredicates := append (allPredicates , w .predicates ... )
326
+ if err := blder .ctrl .Watch (source .Kind (blder .mgr .GetCache (), projected , w .handler , allPredicates ... )); err != nil {
327
+ return err
328
+ }
329
+ }
330
+ for _ , src := range blder .rawSources {
331
+ if err := blder .ctrl .Watch (src ); err != nil {
331
332
return err
332
333
}
333
334
}
0 commit comments