diff --git a/pkg/runtime/scheme.go b/pkg/runtime/scheme.go index fdd4d1f44fa..0b42feae420 100644 --- a/pkg/runtime/scheme.go +++ b/pkg/runtime/scheme.go @@ -519,6 +519,15 @@ func (s *Scheme) convertToVersion(copy bool, in Object, target GroupVersioner) ( gvk, ok := target.KindForGroupVersionKinds(kinds) if !ok { + // try to see if this type is listed as unversioned (for legacy support) + // TODO: when we move to server API versions, we should completely remove the unversioned concept + if unversionedKind, ok := s.unversionedTypes[t]; ok { + if gvk, ok := target.KindForGroupVersionKinds([]unversioned.GroupVersionKind{unversionedKind}); ok { + return copyAndSetTargetKind(copy, s, in, gvk) + } + return copyAndSetTargetKind(copy, s, in, unversionedKind) + } + // TODO: should this be a typed error? return nil, fmt.Errorf("%v is not suitable for converting to %q", t, target) } diff --git a/pkg/runtime/scheme_test.go b/pkg/runtime/scheme_test.go index 2d71d412714..b51a8aff287 100644 --- a/pkg/runtime/scheme_test.go +++ b/pkg/runtime/scheme_test.go @@ -625,6 +625,17 @@ func TestConvertToVersion(t *testing.T) { A: "test", }, }, + // unversioned type returned when not included in the target types + { + scheme: GetTestScheme(), + in: &UnversionedType{A: "test"}, + gv: unversioned.GroupVersions{{Group: "other", Version: "v2"}}, + same: true, + out: &UnversionedType{ + MyWeirdCustomEmbeddedVersionKindField: MyWeirdCustomEmbeddedVersionKindField{APIVersion: "v1", ObjectKind: "UnversionedType"}, + A: "test", + }, + }, // detected as already being in the target version { scheme: GetTestScheme(),