@@ -22,7 +22,6 @@ import (
22
22
"strings"
23
23
24
24
"github.com/go-logr/logr"
25
- metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
26
25
"k8s.io/apimachinery/pkg/runtime/schema"
27
26
"k8s.io/klog/v2"
28
27
@@ -197,18 +196,16 @@ func (blder *Builder) Build(r reconcile.Reconciler) (controller.Controller, erro
197
196
return blder .ctrl , nil
198
197
}
199
198
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 )
201
201
switch proj {
202
202
case projectAsNormal :
203
- return obj , nil
203
+ return src , nil
204
204
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
209
207
}
210
- metaObj .SetGroupVersionKind (gvk )
211
- return metaObj , nil
208
+ return src , nil
212
209
default :
213
210
panic (fmt .Sprintf ("unexpected projection type %v on type %T, should not be possible since this is an internal field" , proj , obj ))
214
211
}
@@ -217,11 +214,10 @@ func (blder *Builder) project(obj client.Object, proj objectProjection) (client.
217
214
func (blder * Builder ) doWatch () error {
218
215
// Reconcile type
219
216
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 )
221
218
if err != nil {
222
219
return err
223
220
}
224
- src := & source.Kind {Type : typeForSrc }
225
221
hdler := & handler.EnqueueRequestForObject {}
226
222
allPredicates := append (blder .globalPredicates , blder .forInput .predicates ... )
227
223
if err := blder .ctrl .Watch (src , hdler , allPredicates ... ); err != nil {
@@ -234,15 +230,15 @@ func (blder *Builder) doWatch() error {
234
230
return errors .New ("Owns() can only be used together with For()" )
235
231
}
236
232
for _ , own := range blder .ownsInput {
237
- typeForSrc , err := blder .project (own .object , own .objectProjection )
233
+ src , err := blder .project (own .object , own .objectProjection )
238
234
if err != nil {
239
235
return err
240
236
}
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
+ )
246
242
allPredicates := append ([]predicate.Predicate (nil ), blder .globalPredicates ... )
247
243
allPredicates = append (allPredicates , own .predicates ... )
248
244
if err := blder .ctrl .Watch (src , hdler , allPredicates ... ); err != nil {
@@ -259,12 +255,12 @@ func (blder *Builder) doWatch() error {
259
255
allPredicates = append (allPredicates , w .predicates ... )
260
256
261
257
// 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
+ }
266
263
}
267
- srckind .Type = typeForSrc
268
264
}
269
265
270
266
if err := blder .ctrl .Watch (w .src , w .eventhandler , allPredicates ... ); err != nil {
0 commit comments