@@ -22,7 +22,6 @@ import (
2222 "strings"
2323
2424 "github.com/go-logr/logr"
25- metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2625 "k8s.io/apimachinery/pkg/runtime/schema"
2726 "k8s.io/klog/v2"
2827
@@ -197,18 +196,16 @@ func (blder *Builder) Build(r reconcile.Reconciler) (controller.Controller, erro
197196 return blder .ctrl , nil
198197}
199198
200- func (blder * Builder ) project (obj client.Object , proj objectProjection ) (client.Object , error ) {
199+ func (blder * Builder ) project (obj client.Object , proj objectProjection ) (source.Source , error ) {
200+ src := source .Kind (blder .mgr .GetCache (), obj )
201201 switch proj {
202202 case projectAsNormal :
203- return obj , nil
203+ return src , nil
204204 case projectAsMetadata :
205- metaObj := & metav1.PartialObjectMetadata {}
206- gvk , err := getGvk (obj , blder .mgr .GetScheme ())
207- if err != nil {
208- return nil , fmt .Errorf ("unable to determine GVK of %T for a metadata-only watch: %w" , obj , err )
205+ if err := source .KindAsPartialMetadata (src , blder .mgr .GetScheme ()); err != nil {
206+ return nil , err
209207 }
210- metaObj .SetGroupVersionKind (gvk )
211- return metaObj , nil
208+ return src , nil
212209 default :
213210 panic (fmt .Sprintf ("unexpected projection type %v on type %T, should not be possible since this is an internal field" , proj , obj ))
214211 }
@@ -217,11 +214,10 @@ func (blder *Builder) project(obj client.Object, proj objectProjection) (client.
217214func (blder * Builder ) doWatch () error {
218215 // Reconcile type
219216 if blder .forInput .object != nil {
220- typeForSrc , err := blder .project (blder .forInput .object , blder .forInput .objectProjection )
217+ src , err := blder .project (blder .forInput .object , blder .forInput .objectProjection )
221218 if err != nil {
222219 return err
223220 }
224- src := & source.Kind {Type : typeForSrc }
225221 hdler := & handler.EnqueueRequestForObject {}
226222 allPredicates := append (blder .globalPredicates , blder .forInput .predicates ... )
227223 if err := blder .ctrl .Watch (src , hdler , allPredicates ... ); err != nil {
@@ -234,15 +230,15 @@ func (blder *Builder) doWatch() error {
234230 return errors .New ("Owns() can only be used together with For()" )
235231 }
236232 for _ , own := range blder .ownsInput {
237- typeForSrc , err := blder .project (own .object , own .objectProjection )
233+ src , err := blder .project (own .object , own .objectProjection )
238234 if err != nil {
239235 return err
240236 }
241- src := & source. Kind { Type : typeForSrc }
242- hdler := & handler. EnqueueRequestForOwner {
243- OwnerType : blder .forInput .object ,
244- IsController : true ,
245- }
237+ hdler := handler . EnqueueRequestForOwner (
238+ blder . mgr . GetScheme (), blder . mgr . GetRESTMapper (),
239+ blder .forInput .object ,
240+ handler . OnlyControllerOwner () ,
241+ )
246242 allPredicates := append ([]predicate.Predicate (nil ), blder .globalPredicates ... )
247243 allPredicates = append (allPredicates , own .predicates ... )
248244 if err := blder .ctrl .Watch (src , hdler , allPredicates ... ); err != nil {
@@ -259,12 +255,12 @@ func (blder *Builder) doWatch() error {
259255 allPredicates = append (allPredicates , w .predicates ... )
260256
261257 // If the source of this watch is of type *source.Kind, project it.
262- if srckind , ok := w .src .(* source.Kind ); ok {
263- typeForSrc , err := blder .project (srckind .Type , w .objectProjection )
264- if err != nil {
265- return err
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+ }
266263 }
267- srckind .Type = typeForSrc
268264 }
269265
270266 if err := blder .ctrl .Watch (w .src , w .eventhandler , allPredicates ... ); err != nil {
0 commit comments