@@ -22,6 +22,7 @@ import (
2222 "strings"
2323
2424 "github.com/go-logr/logr"
25+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2526 "k8s.io/apimachinery/pkg/runtime/schema"
2627 "k8s.io/klog/v2"
2728
@@ -33,6 +34,7 @@ import (
3334 "sigs.k8s.io/controller-runtime/pkg/predicate"
3435 "sigs.k8s.io/controller-runtime/pkg/reconcile"
3536 "sigs.k8s.io/controller-runtime/pkg/source"
37+ internalsource "sigs.k8s.io/controller-runtime/pkg/source/internal"
3638)
3739
3840// Supporting mocking out functions for testing.
@@ -196,16 +198,18 @@ func (blder *Builder) Build(r reconcile.Reconciler) (controller.Controller, erro
196198 return blder .ctrl , nil
197199}
198200
199- func (blder * Builder ) project (obj client.Object , proj objectProjection ) (source.Source , error ) {
200- src := source .Kind (blder .mgr .GetCache (), obj )
201+ func (blder * Builder ) project (obj client.Object , proj objectProjection ) (client.Object , error ) {
201202 switch proj {
202203 case projectAsNormal :
203- return src , nil
204+ return obj , nil
204205 case projectAsMetadata :
205- if err := source .KindAsPartialMetadata (src , blder .mgr .GetScheme ()); err != nil {
206- return nil , err
206+ metaObj := & metav1.PartialObjectMetadata {}
207+ gvk , err := getGvk (obj , blder .mgr .GetScheme ())
208+ if err != nil {
209+ return nil , fmt .Errorf ("unable to determine GVK of %T for a metadata-only watch: %w" , obj , err )
207210 }
208- return src , nil
211+ metaObj .SetGroupVersionKind (gvk )
212+ return metaObj , nil
209213 default :
210214 panic (fmt .Sprintf ("unexpected projection type %v on type %T, should not be possible since this is an internal field" , proj , obj ))
211215 }
@@ -214,10 +218,11 @@ func (blder *Builder) project(obj client.Object, proj objectProjection) (source.
214218func (blder * Builder ) doWatch () error {
215219 // Reconcile type
216220 if blder .forInput .object != nil {
217- src , err := blder .project (blder .forInput .object , blder .forInput .objectProjection )
221+ obj , err := blder .project (blder .forInput .object , blder .forInput .objectProjection )
218222 if err != nil {
219223 return err
220224 }
225+ src := source .Kind (blder .mgr .GetCache (), obj )
221226 hdler := & handler.EnqueueRequestForObject {}
222227 allPredicates := append (blder .globalPredicates , blder .forInput .predicates ... )
223228 if err := blder .ctrl .Watch (src , hdler , allPredicates ... ); err != nil {
@@ -230,10 +235,11 @@ func (blder *Builder) doWatch() error {
230235 return errors .New ("Owns() can only be used together with For()" )
231236 }
232237 for _ , own := range blder .ownsInput {
233- src , err := blder .project (own .object , own .objectProjection )
238+ obj , err := blder .project (own .object , own .objectProjection )
234239 if err != nil {
235240 return err
236241 }
242+ src := source .Kind (blder .mgr .GetCache (), obj )
237243 hdler := handler .EnqueueRequestForOwner (
238244 blder .mgr .GetScheme (), blder .mgr .GetRESTMapper (),
239245 blder .forInput .object ,
@@ -254,13 +260,13 @@ func (blder *Builder) doWatch() error {
254260 allPredicates := append ([]predicate.Predicate (nil ), blder .globalPredicates ... )
255261 allPredicates = append (allPredicates , w .predicates ... )
256262
257- // If the source of this watch is of type *source.Kind, project it.
258- if srckind , ok := w .src .(source.SyncingSource ); ok {
259- if w .objectProjection == projectAsMetadata {
260- if err := source .KindAsPartialMetadata (srckind , blder .mgr .GetScheme ()); err != nil {
261- return err
262- }
263+ // If the source of this watch is of type Kind, project it.
264+ if srckind , ok := w .src .(* internalsource.Kind ); ok {
265+ typeForSrc , err := blder .project (srckind .Type , w .objectProjection )
266+ if err != nil {
267+ return err
263268 }
269+ srckind .Type = typeForSrc
264270 }
265271
266272 if err := blder .ctrl .Watch (w .src , w .eventhandler , allPredicates ... ); err != nil {
0 commit comments