@@ -174,7 +174,10 @@ func (wh *Webhook) convertViaHub(src, dst conversion.Convertible) error {
174
174
175
175
// getHub returns an instance of the Hub for passed-in object's group/kind.
176
176
func (wh * Webhook ) getHub (obj runtime.Object ) (conversion.Hub , error ) {
177
- gvks := objectGVKs (wh .scheme , obj )
177
+ gvks , err := objectGVKs (wh .scheme , obj )
178
+ if err != nil {
179
+ return nil , err
180
+ }
178
181
if len (gvks ) == 0 {
179
182
return nil , fmt .Errorf ("error retrieving gvks for object : %v" , obj )
180
183
}
@@ -223,7 +226,10 @@ func (wh *Webhook) allocateDstObject(apiVersion, kind string) (runtime.Object, e
223
226
func IsConvertible (scheme * runtime.Scheme , obj runtime.Object ) (bool , error ) {
224
227
var hubs , spokes , nonSpokes []runtime.Object
225
228
226
- gvks := objectGVKs (scheme , obj )
229
+ gvks , err := objectGVKs (scheme , obj )
230
+ if err != nil {
231
+ return false , err
232
+ }
227
233
if len (gvks ) == 0 {
228
234
return false , fmt .Errorf ("error retrieving gvks for object : %v" , obj )
229
235
}
@@ -273,18 +279,27 @@ func IsConvertible(scheme *runtime.Scheme, obj runtime.Object) (bool, error) {
273
279
}
274
280
275
281
// objectGVKs returns all (Group,Version,Kind) for the Group/Kind of given object.
276
- func objectGVKs (scheme * runtime.Scheme , obj runtime.Object ) []schema.GroupVersionKind {
277
- var gvks []schema.GroupVersionKind
278
-
279
- objGVK := obj .GetObjectKind ().GroupVersionKind ()
282
+ func objectGVKs (scheme * runtime.Scheme , obj runtime.Object ) ([]schema.GroupVersionKind , error ) {
283
+ // NB: we should not use `obj.GetObjectKind().GroupVersionKind()` to get the
284
+ // GVK here, since it is parsed from apiVersion and kind fields and it may
285
+ // return empty GVK if obj is an uninitialized object.
286
+ objGVKs , _ , err := scheme .ObjectKinds (obj )
287
+ if err != nil {
288
+ return nil , err
289
+ }
290
+ if len (objGVKs ) != 1 {
291
+ return nil , fmt .Errorf ("expect to get only one GVK for %v" , obj )
292
+ }
293
+ objGVK := objGVKs [0 ]
280
294
knownTypes := scheme .AllKnownTypes ()
281
295
296
+ var gvks []schema.GroupVersionKind
282
297
for gvk := range knownTypes {
283
298
if objGVK .GroupKind () == gvk .GroupKind () {
284
299
gvks = append (gvks , gvk )
285
300
}
286
301
}
287
- return gvks
302
+ return gvks , nil
288
303
}
289
304
290
305
// PartialImplementationError represents an error due to partial conversion
0 commit comments