@@ -174,23 +174,24 @@ 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 , _ , err := wh .scheme . ObjectKinds ( obj )
178
- if err != nil {
179
- return nil , fmt .Errorf ("error retriving object kinds for given object : %v" , err )
177
+ gvks := objectGVKs ( wh .scheme , obj )
178
+ if len ( gvks ) == 0 {
179
+ return nil , fmt .Errorf ("error retrieving gvks for object : %v" , obj )
180
180
}
181
181
182
182
var hub conversion.Hub
183
- var isHub , hubFoundAlready bool
183
+ var hubFoundAlready bool
184
184
for _ , gvk := range gvks {
185
185
instance , err := wh .scheme .New (gvk )
186
186
if err != nil {
187
187
return nil , fmt .Errorf ("failed to allocate an instance for gvk %v %v" , gvk , err )
188
188
}
189
- if hub , isHub = instance .(conversion.Hub ); isHub {
189
+ if val , isHub : = instance .(conversion.Hub ); isHub {
190
190
if hubFoundAlready {
191
191
return nil , fmt .Errorf ("multiple hub version defined for %T" , obj )
192
192
}
193
193
hubFoundAlready = true
194
+ hub = val
194
195
}
195
196
}
196
197
return hub , nil
@@ -216,21 +217,21 @@ func (wh *Webhook) allocateDstObject(apiVersion, kind string) (runtime.Object, e
216
217
return obj , nil
217
218
}
218
219
219
- // CheckConvertibility determines if given type is convertible or not. For a type
220
+ // IsConvertible determines if given type is convertible or not. For a type
220
221
// to be convertible, the group-kind needs to have a Hub type defined and all
221
222
// non-hub types must be able to convert to/from Hub.
222
- func CheckConvertibility (scheme * runtime.Scheme , obj runtime.Object ) error {
223
+ func IsConvertible (scheme * runtime.Scheme , obj runtime.Object ) ( bool , error ) {
223
224
var hubs , spokes , nonSpokes []runtime.Object
224
225
225
- gvks , _ , err := scheme . ObjectKinds ( obj )
226
- if err != nil {
227
- return fmt .Errorf ("error retriving object kinds for given object : %v" , err )
226
+ gvks := objectGVKs ( scheme , obj )
227
+ if len ( gvks ) == 0 {
228
+ return false , fmt .Errorf ("error retrieving gvks for object : %v" , obj )
228
229
}
229
230
230
231
for _ , gvk := range gvks {
231
232
instance , err := scheme .New (gvk )
232
233
if err != nil {
233
- return fmt .Errorf ("failed to allocate an instance for gvk %v %v" , gvk , err )
234
+ return false , fmt .Errorf ("failed to allocate an instance for gvk %v %v" , gvk , err )
234
235
}
235
236
236
237
if isHub (instance ) {
@@ -247,32 +248,45 @@ func CheckConvertibility(scheme *runtime.Scheme, obj runtime.Object) error {
247
248
}
248
249
249
250
if len (gvks ) == 1 {
250
- return nil // single version
251
+ return false , nil // single version
251
252
}
252
253
253
254
if len (hubs ) == 0 && len (spokes ) == 0 {
254
255
// multiple version detected with no conversion implementation. This is
255
256
// true for multi-version built-in types.
256
- return nil
257
+ return false , nil
257
258
}
258
259
259
260
if len (hubs ) == 1 && len (nonSpokes ) == 0 { // convertible
260
261
spokeVersions := []string {}
261
262
for _ , sp := range spokes {
262
263
spokeVersions = append (spokeVersions , sp .GetObjectKind ().GroupVersionKind ().String ())
263
264
}
264
- log .V (1 ).Info ("conversion enabled for kind" , "kind" ,
265
- gvks [0 ].GroupKind (), "hub" , hubs [0 ], "spokes" , spokeVersions )
266
- return nil
265
+ return true , nil
267
266
}
268
267
269
- return PartialImplementationError {
268
+ return false , PartialImplementationError {
270
269
hubs : hubs ,
271
270
nonSpokes : nonSpokes ,
272
271
spokes : spokes ,
273
272
}
274
273
}
275
274
275
+ // 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 ()
280
+ knownTypes := scheme .AllKnownTypes ()
281
+
282
+ for gvk := range knownTypes {
283
+ if objGVK .GroupKind () == gvk .GroupKind () {
284
+ gvks = append (gvks , gvk )
285
+ }
286
+ }
287
+ return gvks
288
+ }
289
+
276
290
// PartialImplementationError represents an error due to partial conversion
277
291
// implementation such as hub without spokes, multiple hubs or spokes without hub.
278
292
type PartialImplementationError struct {
0 commit comments