mirror of
				https://github.com/optim-enterprises-bv/kubernetes.git
				synced 2025-11-04 04:08:16 +00:00 
			
		
		
		
	Merge pull request #26044 from smarterclayton/multiversion_encode
Automatic merge from submit-queue Guarantee that Encode handles nested objects again
This commit is contained in:
		@@ -28,11 +28,11 @@ import (
 | 
			
		||||
 | 
			
		||||
type fakeConvertor struct{}
 | 
			
		||||
 | 
			
		||||
func (fakeConvertor) Convert(in, out interface{}) error {
 | 
			
		||||
func (fakeConvertor) Convert(in, out, context interface{}) error {
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (fakeConvertor) ConvertToVersion(in runtime.Object, _ unversioned.GroupVersion) (runtime.Object, error) {
 | 
			
		||||
func (fakeConvertor) ConvertToVersion(in runtime.Object, _ runtime.GroupVersioner) (runtime.Object, error) {
 | 
			
		||||
	return in, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -106,7 +106,7 @@ func BenchmarkEncodeCodecFromInternalProtobuf(b *testing.B) {
 | 
			
		||||
	width := len(items)
 | 
			
		||||
	encodable := make([]api.Pod, width)
 | 
			
		||||
	for i := range items {
 | 
			
		||||
		if err := api.Scheme.Convert(&items[i], &encodable[i]); err != nil {
 | 
			
		||||
		if err := api.Scheme.Convert(&items[i], &encodable[i], nil); err != nil {
 | 
			
		||||
			b.Fatal(err)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -43,7 +43,6 @@ import (
 | 
			
		||||
	"k8s.io/kubernetes/pkg/conversion"
 | 
			
		||||
	"k8s.io/kubernetes/pkg/runtime"
 | 
			
		||||
	"k8s.io/kubernetes/pkg/runtime/serializer/streaming"
 | 
			
		||||
	"k8s.io/kubernetes/pkg/runtime/serializer/versioning"
 | 
			
		||||
	"k8s.io/kubernetes/pkg/util/diff"
 | 
			
		||||
	"k8s.io/kubernetes/pkg/util/sets"
 | 
			
		||||
	"k8s.io/kubernetes/pkg/watch"
 | 
			
		||||
@@ -93,7 +92,11 @@ func roundTrip(t *testing.T, codec runtime.Codec, item runtime.Object) {
 | 
			
		||||
	name := reflect.TypeOf(item).Elem().Name()
 | 
			
		||||
	data, err := runtime.Encode(codec, item)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Errorf("%v: %v (%s)", name, err, printer.Sprintf("%#v", item))
 | 
			
		||||
		if runtime.IsNotRegisteredError(err) {
 | 
			
		||||
			t.Logf("%v: not registered: %v (%s)", name, err, printer.Sprintf("%#v", item))
 | 
			
		||||
		} else {
 | 
			
		||||
			t.Errorf("%v: %v (%s)", name, err, printer.Sprintf("%#v", item))
 | 
			
		||||
		}
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@@ -181,10 +184,14 @@ func TestSetControllerConversion(t *testing.T) {
 | 
			
		||||
		t.Fatalf("unexpected encoding error: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	decoder := api.Codecs.UniversalDecoder(*extGroup.GroupVersion(), *defaultGroup.GroupVersion())
 | 
			
		||||
	if err := versioning.EnableCrossGroupDecoding(decoder, extGroup.GroupVersion().Group, defaultGroup.GroupVersion().Group); err != nil {
 | 
			
		||||
		t.Fatalf("unexpected error while enabling cross-group decoding: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
	decoder := api.Codecs.DecoderToVersion(
 | 
			
		||||
		api.Codecs.UniversalDeserializer(),
 | 
			
		||||
		runtime.NewMultiGroupVersioner(
 | 
			
		||||
			*defaultGroup.GroupVersion(),
 | 
			
		||||
			unversioned.GroupKind{Group: defaultGroup.GroupVersion().Group},
 | 
			
		||||
			unversioned.GroupKind{Group: extGroup.GroupVersion().Group},
 | 
			
		||||
		),
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	t.Logf("rs.v1beta1.extensions -> rc._internal")
 | 
			
		||||
	if err := runtime.DecodeInto(decoder, data, rc); err != nil {
 | 
			
		||||
@@ -475,7 +482,7 @@ func BenchmarkEncodeCodecFromInternal(b *testing.B) {
 | 
			
		||||
	width := len(items)
 | 
			
		||||
	encodable := make([]api.Pod, width)
 | 
			
		||||
	for i := range items {
 | 
			
		||||
		if err := api.Scheme.Convert(&items[i], &encodable[i]); err != nil {
 | 
			
		||||
		if err := api.Scheme.Convert(&items[i], &encodable[i], nil); err != nil {
 | 
			
		||||
			b.Fatal(err)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -281,7 +281,7 @@ func (g TestGroup) Codec() runtime.Codec {
 | 
			
		||||
	if serializer.Serializer == nil {
 | 
			
		||||
		return api.Codecs.LegacyCodec(g.externalGroupVersion)
 | 
			
		||||
	}
 | 
			
		||||
	return api.Codecs.CodecForVersions(serializer, api.Codecs.UniversalDeserializer(), []unversioned.GroupVersion{g.externalGroupVersion}, nil)
 | 
			
		||||
	return api.Codecs.CodecForVersions(serializer, api.Codecs.UniversalDeserializer(), unversioned.GroupVersions{g.externalGroupVersion}, nil)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NegotiatedSerializer returns the negotiated serializer for the server.
 | 
			
		||||
@@ -309,7 +309,7 @@ func (g TestGroup) StorageCodec() runtime.Codec {
 | 
			
		||||
	}
 | 
			
		||||
	ds := recognizer.NewDecoder(s, api.Codecs.UniversalDeserializer())
 | 
			
		||||
 | 
			
		||||
	return api.Codecs.CodecForVersions(s, ds, []unversioned.GroupVersion{g.externalGroupVersion}, nil)
 | 
			
		||||
	return api.Codecs.CodecForVersions(s, ds, unversioned.GroupVersions{g.externalGroupVersion}, nil)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Converter returns the api.Scheme for the API version to test against, as set by the
 | 
			
		||||
@@ -393,7 +393,7 @@ func (g TestGroup) RESTMapper() meta.RESTMapper {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ExternalGroupVersions returns all external group versions allowed for the server.
 | 
			
		||||
func ExternalGroupVersions() []unversioned.GroupVersion {
 | 
			
		||||
func ExternalGroupVersions() unversioned.GroupVersions {
 | 
			
		||||
	versions := []unversioned.GroupVersion{}
 | 
			
		||||
	for _, g := range Groups {
 | 
			
		||||
		gv := g.GroupVersion()
 | 
			
		||||
 
 | 
			
		||||
@@ -179,6 +179,25 @@ func (gv GroupVersion) String() string {
 | 
			
		||||
	return gv.Version
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// KindForGroupVersionKinds identifies the preferred GroupVersionKind out of a list. It returns ok false
 | 
			
		||||
// if none of the options match the group. It prefers a match to group and version over just group.
 | 
			
		||||
// TODO: Move GroupVersion to a package under pkg/runtime, since it's used by scheme.
 | 
			
		||||
// TODO: Introduce an adapter type between GroupVersion and runtime.GroupVersioner, and use LegacyCodec(GroupVersion)
 | 
			
		||||
//   in fewer places.
 | 
			
		||||
func (gv GroupVersion) KindForGroupVersionKinds(kinds []GroupVersionKind) (target GroupVersionKind, ok bool) {
 | 
			
		||||
	for _, gvk := range kinds {
 | 
			
		||||
		if gvk.Group == gv.Group && gvk.Version == gv.Version {
 | 
			
		||||
			return gvk, true
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	for _, gvk := range kinds {
 | 
			
		||||
		if gvk.Group == gv.Group {
 | 
			
		||||
			return gv.WithKind(gvk.Kind), true
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return GroupVersionKind{}, false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ParseGroupVersion turns "group/version" string into a GroupVersion struct. It reports error
 | 
			
		||||
// if it cannot parse the string.
 | 
			
		||||
func ParseGroupVersion(gv string) (GroupVersion, error) {
 | 
			
		||||
@@ -241,6 +260,25 @@ func (gv *GroupVersion) UnmarshalText(value []byte) error {
 | 
			
		||||
	return gv.unmarshal(value)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GroupVersions can be used to represent a set of desired group versions.
 | 
			
		||||
// TODO: Move GroupVersions to a package under pkg/runtime, since it's used by scheme.
 | 
			
		||||
// TODO: Introduce an adapter type between GroupVersions and runtime.GroupVersioner, and use LegacyCodec(GroupVersion)
 | 
			
		||||
//   in fewer places.
 | 
			
		||||
type GroupVersions []GroupVersion
 | 
			
		||||
 | 
			
		||||
// KindForGroupVersionKinds identifies the preferred GroupVersionKind out of a list. It returns ok false
 | 
			
		||||
// if none of the options match the group.
 | 
			
		||||
func (gvs GroupVersions) KindForGroupVersionKinds(kinds []GroupVersionKind) (target GroupVersionKind, ok bool) {
 | 
			
		||||
	for _, gv := range gvs {
 | 
			
		||||
		target, ok := gv.KindForGroupVersionKinds(kinds)
 | 
			
		||||
		if !ok {
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		return target, true
 | 
			
		||||
	}
 | 
			
		||||
	return GroupVersionKind{}, false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ToAPIVersionAndKind is a convenience method for satisfying runtime.Object on types that
 | 
			
		||||
// do not use TypeMeta.
 | 
			
		||||
func (gvk *GroupVersionKind) ToAPIVersionAndKind() (string, string) {
 | 
			
		||||
 
 | 
			
		||||
@@ -127,7 +127,7 @@ func TestPodSpecConversion(t *testing.T) {
 | 
			
		||||
		ServiceAccountName: name,
 | 
			
		||||
	}
 | 
			
		||||
	v := versioned.PodSpec{}
 | 
			
		||||
	if err := api.Scheme.Convert(i, &v); err != nil {
 | 
			
		||||
	if err := api.Scheme.Convert(i, &v, nil); err != nil {
 | 
			
		||||
		t.Fatalf("unexpected error: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
	if v.ServiceAccountName != name {
 | 
			
		||||
@@ -152,7 +152,7 @@ func TestPodSpecConversion(t *testing.T) {
 | 
			
		||||
	}
 | 
			
		||||
	for k, v := range testCases {
 | 
			
		||||
		got := api.PodSpec{}
 | 
			
		||||
		err := api.Scheme.Convert(v, &got)
 | 
			
		||||
		err := api.Scheme.Convert(v, &got, nil)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			t.Fatalf("unexpected error for case %d: %v", k, err)
 | 
			
		||||
		}
 | 
			
		||||
@@ -206,7 +206,7 @@ func TestResourceListConversion(t *testing.T) {
 | 
			
		||||
 | 
			
		||||
	for i, test := range tests {
 | 
			
		||||
		output := api.ResourceList{}
 | 
			
		||||
		err := api.Scheme.Convert(&test.input, &output)
 | 
			
		||||
		err := api.Scheme.Convert(&test.input, &output, nil)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			t.Fatalf("unexpected error for case %d: %v", i, err)
 | 
			
		||||
		}
 | 
			
		||||
 
 | 
			
		||||
@@ -40,7 +40,7 @@ func roundTrip(t *testing.T, obj runtime.Object) runtime.Object {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	obj3 := reflect.New(reflect.TypeOf(obj).Elem()).Interface().(runtime.Object)
 | 
			
		||||
	err = api.Scheme.Convert(obj2, obj3)
 | 
			
		||||
	err = api.Scheme.Convert(obj2, obj3, nil)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Errorf("%v\nSource: %#v", err, obj2)
 | 
			
		||||
		return nil
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user