@@ -30,7 +30,6 @@ import (
3030 "sigs.k8s.io/controller-runtime/pkg/client/apiutil"
3131 "sigs.k8s.io/controller-runtime/pkg/controller"
3232 "sigs.k8s.io/controller-runtime/pkg/handler"
33- internalsource "sigs.k8s.io/controller-runtime/pkg/internal/source"
3433 "sigs.k8s.io/controller-runtime/pkg/manager"
3534 "sigs.k8s.io/controller-runtime/pkg/predicate"
3635 "sigs.k8s.io/controller-runtime/pkg/reconcile"
@@ -56,6 +55,7 @@ const (
5655type Builder struct {
5756 forInput ForInput
5857 ownsInput []OwnsInput
58+ rawSources []source.Source
5959 watchesInput []WatchesInput
6060 mgr manager.Manager
6161 globalPredicates []predicate.Predicate
@@ -123,7 +123,8 @@ func (blder *Builder) Owns(object client.Object, opts ...OwnsOption) *Builder {
123123
124124// WatchesInput represents the information set by Watches method.
125125type WatchesInput struct {
126- src source.Source
126+ obj client.Object
127+ handler handler.EventHandler
127128 predicates []predicate.Predicate
128129 objectProjection objectProjection
129130}
@@ -134,13 +135,17 @@ type WatchesInput struct {
134135// This is the equivalent of calling
135136// WatchesRawSource(source.Kind(cache, object), eventHandler, opts...).
136137func (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+ }
138142 for _ , opt := range opts {
139143 opt .ApplyToWatches (& input )
140144 }
141- src := source .Kind (blder .mgr .GetCache (), object , eventHandler , input .predicates ... )
142145
143- return blder .WatchesRawSource (src , opts ... )
146+ blder .watchesInput = append (blder .watchesInput , input )
147+
148+ return blder
144149}
145150
146151// 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
180185//
181186// STOP! Consider using For(...), Owns(...), Watches(...), WatchesMetadata(...) instead.
182187// 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 )
188190
189- blder .watchesInput = append (blder .watchesInput , input )
190191 return blder
191192}
192193
@@ -312,22 +313,22 @@ func (blder *Builder) doWatch() error {
312313 }
313314
314315 // 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 {
316317 return errors .New ("there are no watches configured, controller will never get triggered. Use For(), Owns() or Watches() to set them up" )
317318 }
318319 allPredicates := append ([]predicate.Predicate (nil ), blder .globalPredicates ... )
319320 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 )
329324 }
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 {
331332 return err
332333 }
333334 }
0 commit comments