From c1d932e44a1a16890791df4f5d3f0d5f75b13b53 Mon Sep 17 00:00:00 2001 From: Clayton Coleman Date: Mon, 21 Dec 2015 00:21:26 -0500 Subject: [PATCH] Switch API objects to not register per version codecs Remove Codec from versionInterfaces in meta (RESTMapper is now agnostic to codec and serialization). Register api/latest.Codecs as the codec factory and use latest.Codecs.LegacyCodec(version) as an equvialent to the previous codec. --- .../apis/testgroup/install/install.go | 2 - .../testdata/apis/testgroup/register.go | 2 +- .../testdata/apis/testgroup/v1/register.go | 3 - pkg/api/conversion.go | 5 -- pkg/api/conversion_test.go | 13 ++-- pkg/api/copy_test.go | 2 +- pkg/api/deep_copy_test.go | 8 ++- pkg/api/install/install.go | 9 +-- pkg/api/install/install_test.go | 19 +++++- pkg/api/meta/help.go | 2 +- pkg/api/meta/interfaces.go | 2 - pkg/api/meta/meta_test.go | 12 ++-- pkg/api/meta/restmapper.go | 11 ++-- pkg/api/meta/restmapper_test.go | 39 +----------- pkg/api/register.go | 33 +++++++--- pkg/api/serialization_test.go | 48 ++++++++++---- pkg/api/testapi/testapi.go | 17 +++-- .../testing/compat/compatibility_tester.go | 3 +- pkg/api/testing/fuzzer.go | 9 +-- pkg/api/unversioned/group_version.go | 8 ++- pkg/api/v1/defaults_test.go | 5 +- pkg/api/v1/register.go | 4 -- pkg/api/validation/schema_test.go | 2 +- .../registered/registered_test.go | 62 +++++++++++++++++++ pkg/apis/abac/latest/latest.go | 7 +-- pkg/apis/abac/register.go | 9 ++- pkg/apis/abac/types.go | 2 +- pkg/apis/abac/v0/conversion.go | 2 +- pkg/apis/abac/v0/conversion_test.go | 2 +- pkg/apis/abac/v0/register.go | 6 +- pkg/apis/abac/v1beta1/register.go | 6 +- pkg/apis/authorization/install/install.go | 2 - pkg/apis/authorization/register.go | 2 +- pkg/apis/authorization/v1beta1/register.go | 3 - pkg/apis/componentconfig/decode.go | 33 ---------- pkg/apis/componentconfig/install/install.go | 2 - .../componentconfig/install/install_test.go | 7 ++- pkg/apis/componentconfig/register.go | 2 +- pkg/apis/componentconfig/v1alpha1/register.go | 3 - pkg/apis/extensions/install/install.go | 2 - pkg/apis/extensions/install/install_test.go | 9 ++- pkg/apis/extensions/register.go | 2 +- pkg/apis/extensions/v1beta1/defaults_test.go | 4 +- pkg/apis/extensions/v1beta1/register.go | 3 - pkg/apis/metrics/install/install.go | 2 - pkg/apis/metrics/register.go | 2 +- pkg/apis/metrics/v1alpha1/register.go | 3 - pkg/apiserver/apiserver_test.go | 29 +++++---- pkg/auth/authorizer/abac/abac.go | 3 +- pkg/conversion/unversioned_test.go | 2 +- pkg/genericapiserver/genericapiserver_test.go | 2 +- plugin/pkg/scheduler/api/latest/latest.go | 17 +++-- plugin/pkg/scheduler/api/register.go | 5 +- plugin/pkg/scheduler/api/v1/register.go | 4 -- 54 files changed, 258 insertions(+), 239 deletions(-) delete mode 100644 pkg/apis/componentconfig/decode.go diff --git a/cmd/libs/go2idl/client-gen/testdata/apis/testgroup/install/install.go b/cmd/libs/go2idl/client-gen/testdata/apis/testgroup/install/install.go index 39a4b1bbd16..a3e6ec2c181 100644 --- a/cmd/libs/go2idl/client-gen/testdata/apis/testgroup/install/install.go +++ b/cmd/libs/go2idl/client-gen/testdata/apis/testgroup/install/install.go @@ -68,7 +68,6 @@ func enableVersions(externalVersions []unversioned.GroupVersion) error { groupMeta := apimachinery.GroupMeta{ GroupVersion: preferredExternalVersion, GroupVersions: externalVersions, - Codec: runtime.CodecFor(api.Scheme, preferredExternalVersion), RESTMapper: newRESTMapper(externalVersions), SelfLinker: runtime.SelfLinker(accessor), InterfacesFor: interfacesFor, @@ -97,7 +96,6 @@ func interfacesFor(version unversioned.GroupVersion) (*meta.VersionInterfaces, e switch version { case v1.SchemeGroupVersion: return &meta.VersionInterfaces{ - Codec: v1.Codec, ObjectConvertor: api.Scheme, MetadataAccessor: accessor, }, nil diff --git a/cmd/libs/go2idl/client-gen/testdata/apis/testgroup/register.go b/cmd/libs/go2idl/client-gen/testdata/apis/testgroup/register.go index ec99f0cfe45..f5f7b3192b1 100644 --- a/cmd/libs/go2idl/client-gen/testdata/apis/testgroup/register.go +++ b/cmd/libs/go2idl/client-gen/testdata/apis/testgroup/register.go @@ -22,7 +22,7 @@ import ( "k8s.io/kubernetes/pkg/runtime" ) -var SchemeGroupVersion = unversioned.GroupVersion{Group: "testgroup", Version: ""} +var SchemeGroupVersion = unversioned.GroupVersion{Group: "testgroup", Version: runtime.APIVersionInternal} func AddToScheme(scheme *runtime.Scheme) { // Add the API to Scheme. diff --git a/cmd/libs/go2idl/client-gen/testdata/apis/testgroup/v1/register.go b/cmd/libs/go2idl/client-gen/testdata/apis/testgroup/v1/register.go index 9f6e96ae0a7..6d4698ebdaf 100644 --- a/cmd/libs/go2idl/client-gen/testdata/apis/testgroup/v1/register.go +++ b/cmd/libs/go2idl/client-gen/testdata/apis/testgroup/v1/register.go @@ -17,7 +17,6 @@ limitations under the License. package v1 import ( - "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/api/v1" "k8s.io/kubernetes/pkg/runtime" @@ -25,8 +24,6 @@ import ( var SchemeGroupVersion = unversioned.GroupVersion{Group: "testgroup", Version: "v1"} -var Codec = runtime.CodecFor(api.Scheme, SchemeGroupVersion) - func AddToScheme(scheme *runtime.Scheme) { // Add the API to Scheme. addKnownTypes(scheme) diff --git a/pkg/api/conversion.go b/pkg/api/conversion.go index 46e33a8c183..f6c95d0493f 100644 --- a/pkg/api/conversion.go +++ b/pkg/api/conversion.go @@ -22,14 +22,9 @@ import ( "k8s.io/kubernetes/pkg/conversion" "k8s.io/kubernetes/pkg/fields" "k8s.io/kubernetes/pkg/labels" - "k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/util/intstr" ) -// Codec is the identity codec for this package - it can only convert itself -// to itself. -var Codec = runtime.CodecFor(Scheme, unversioned.GroupVersion{}) - func init() { Scheme.AddDefaultingFuncs( func(obj *ListOptions) { diff --git a/pkg/api/conversion_test.go b/pkg/api/conversion_test.go index 5ac3fac91d1..1af454ef755 100644 --- a/pkg/api/conversion_test.go +++ b/pkg/api/conversion_test.go @@ -22,6 +22,7 @@ import ( "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api/testapi" + "k8s.io/kubernetes/pkg/runtime" ) func BenchmarkPodConversion(b *testing.B) { @@ -30,7 +31,7 @@ func BenchmarkPodConversion(b *testing.B) { b.Fatalf("Unexpected error while reading file: %v", err) } var pod api.Pod - if err := api.Scheme.DecodeInto(data, &pod); err != nil { + if err := runtime.DecodeInto(testapi.Default.Codec(), data, &pod); err != nil { b.Fatalf("Unexpected error decoding pod: %v", err) } @@ -41,7 +42,7 @@ func BenchmarkPodConversion(b *testing.B) { if err != nil { b.Fatalf("Conversion error: %v", err) } - obj, err := scheme.ConvertToVersion(versionedObj, scheme.InternalVersions[testapi.Default.GroupVersion().Group].String()) + obj, err := scheme.ConvertToVersion(versionedObj, testapi.Default.InternalGroupVersion().String()) if err != nil { b.Fatalf("Conversion error: %v", err) } @@ -58,7 +59,7 @@ func BenchmarkNodeConversion(b *testing.B) { b.Fatalf("Unexpected error while reading file: %v", err) } var node api.Node - if err := api.Scheme.DecodeInto(data, &node); err != nil { + if err := runtime.DecodeInto(testapi.Default.Codec(), data, &node); err != nil { b.Fatalf("Unexpected error decoding node: %v", err) } @@ -69,7 +70,7 @@ func BenchmarkNodeConversion(b *testing.B) { if err != nil { b.Fatalf("Conversion error: %v", err) } - obj, err := scheme.ConvertToVersion(versionedObj, scheme.InternalVersions[testapi.Default.GroupVersion().Group].String()) + obj, err := scheme.ConvertToVersion(versionedObj, testapi.Default.InternalGroupVersion().String()) if err != nil { b.Fatalf("Conversion error: %v", err) } @@ -86,7 +87,7 @@ func BenchmarkReplicationControllerConversion(b *testing.B) { b.Fatalf("Unexpected error while reading file: %v", err) } var replicationController api.ReplicationController - if err := api.Scheme.DecodeInto(data, &replicationController); err != nil { + if err := runtime.DecodeInto(testapi.Default.Codec(), data, &replicationController); err != nil { b.Fatalf("Unexpected error decoding node: %v", err) } @@ -97,7 +98,7 @@ func BenchmarkReplicationControllerConversion(b *testing.B) { if err != nil { b.Fatalf("Conversion error: %v", err) } - obj, err := scheme.ConvertToVersion(versionedObj, scheme.InternalVersions[testapi.Default.GroupVersion().Group].String()) + obj, err := scheme.ConvertToVersion(versionedObj, testapi.Default.InternalGroupVersion().String()) if err != nil { b.Fatalf("Conversion error: %v", err) } diff --git a/pkg/api/copy_test.go b/pkg/api/copy_test.go index 94575c8853a..194b5318a42 100644 --- a/pkg/api/copy_test.go +++ b/pkg/api/copy_test.go @@ -54,7 +54,7 @@ func doDeepCopyTest(t *testing.T, kind unversioned.GroupVersionKind, f *fuzz.Fuz } if !reflect.DeepEqual(item, itemCopy) { - t.Errorf("\nexpected: %#v\n\ngot: %#v\n\ndiff: %v", item, itemCopy, util.ObjectDiff(item, itemCopy)) + t.Errorf("\nexpected: %#v\n\ngot: %#v\n\ndiff: %v", item, itemCopy, util.ObjectGoPrintSideBySide(item, itemCopy)) } } diff --git a/pkg/api/deep_copy_test.go b/pkg/api/deep_copy_test.go index 606e3ab080d..a251623a054 100644 --- a/pkg/api/deep_copy_test.go +++ b/pkg/api/deep_copy_test.go @@ -21,6 +21,8 @@ import ( "testing" "k8s.io/kubernetes/pkg/api" + "k8s.io/kubernetes/pkg/api/testapi" + "k8s.io/kubernetes/pkg/runtime" ) func BenchmarkPodCopy(b *testing.B) { @@ -29,7 +31,7 @@ func BenchmarkPodCopy(b *testing.B) { b.Fatalf("Unexpected error while reading file: %v", err) } var pod api.Pod - if err := api.Scheme.DecodeInto(data, &pod); err != nil { + if err := runtime.DecodeInto(testapi.Default.Codec(), data, &pod); err != nil { b.Fatalf("Unexpected error decoding pod: %v", err) } @@ -52,7 +54,7 @@ func BenchmarkNodeCopy(b *testing.B) { b.Fatalf("Unexpected error while reading file: %v", err) } var node api.Node - if err := api.Scheme.DecodeInto(data, &node); err != nil { + if err := runtime.DecodeInto(testapi.Default.Codec(), data, &node); err != nil { b.Fatalf("Unexpected error decoding node: %v", err) } @@ -75,7 +77,7 @@ func BenchmarkReplicationControllerCopy(b *testing.B) { b.Fatalf("Unexpected error while reading file: %v", err) } var replicationController api.ReplicationController - if err := api.Scheme.DecodeInto(data, &replicationController); err != nil { + if err := runtime.DecodeInto(testapi.Default.Codec(), data, &replicationController); err != nil { b.Fatalf("Unexpected error decoding node: %v", err) } diff --git a/pkg/api/install/install.go b/pkg/api/install/install.go index 1a660f45d06..14cf5551926 100644 --- a/pkg/api/install/install.go +++ b/pkg/api/install/install.go @@ -24,14 +24,13 @@ import ( "github.com/golang/glog" "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/apimachinery" - "k8s.io/kubernetes/pkg/apimachinery/registered" - "k8s.io/kubernetes/pkg/util/sets" - "k8s.io/kubernetes/pkg/api/meta" "k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/api/v1" + "k8s.io/kubernetes/pkg/apimachinery" + "k8s.io/kubernetes/pkg/apimachinery/registered" "k8s.io/kubernetes/pkg/runtime" + "k8s.io/kubernetes/pkg/util/sets" ) const importPrefix = "k8s.io/kubernetes/pkg/api" @@ -75,7 +74,6 @@ func enableVersions(externalVersions []unversioned.GroupVersion) error { groupMeta := apimachinery.GroupMeta{ GroupVersion: preferredExternalVersion, GroupVersions: externalVersions, - Codec: runtime.CodecFor(api.Scheme, preferredExternalVersion), RESTMapper: newRESTMapper(externalVersions), SelfLinker: runtime.SelfLinker(accessor), InterfacesFor: interfacesFor, @@ -127,7 +125,6 @@ func interfacesFor(version unversioned.GroupVersion) (*meta.VersionInterfaces, e switch version { case v1.SchemeGroupVersion: return &meta.VersionInterfaces{ - Codec: v1.Codec, ObjectConvertor: api.Scheme, MetadataAccessor: accessor, }, nil diff --git a/pkg/api/install/install_test.go b/pkg/api/install/install_test.go index ad051eb218a..0b161535023 100644 --- a/pkg/api/install/install_test.go +++ b/pkg/api/install/install_test.go @@ -18,11 +18,13 @@ package install import ( "encoding/json" + "reflect" "testing" internal "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/apimachinery/registered" + "k8s.io/kubernetes/pkg/runtime" ) func TestResourceVersioner(t *testing.T) { @@ -49,7 +51,7 @@ func TestCodec(t *testing.T) { pod := internal.Pod{} // We do want to use package registered rather than testapi here, because we // want to test if the package install and package registered work as expected. - data, err := registered.GroupOrDie(internal.GroupName).Codec.Encode(&pod) + data, err := runtime.Encode(internal.Codecs.LegacyCodec(registered.GroupOrDie(internal.GroupName).GroupVersion), &pod) if err != nil { t.Fatalf("unexpected error: %v", err) } @@ -100,8 +102,8 @@ func TestRESTMapper(t *testing.T) { } interfaces, _ := registered.GroupOrDie(internal.GroupName).InterfacesFor(version) - if mapping.Codec != interfaces.Codec { - t.Errorf("unexpected codec: %#v, expected: %#v", mapping, interfaces) + if mapping.ObjectConvertor != interfaces.ObjectConvertor { + t.Errorf("unexpected: %#v, expected: %#v", mapping, interfaces) } rc := &internal.ReplicationController{ObjectMeta: internal.ObjectMeta{Name: "foo"}} @@ -114,3 +116,14 @@ func TestRESTMapper(t *testing.T) { } } } + +func TestUnversioned(t *testing.T) { + for _, obj := range []runtime.Object{ + &unversioned.Status{}, + &unversioned.ExportOptions{}, + } { + if unversioned, ok := internal.Scheme.IsUnversioned(obj); !unversioned || !ok { + t.Errorf("%v is expected to be unversioned", reflect.TypeOf(obj)) + } + } +} diff --git a/pkg/api/meta/help.go b/pkg/api/meta/help.go index 3ddcfef87e6..3812f240fb8 100644 --- a/pkg/api/meta/help.go +++ b/pkg/api/meta/help.go @@ -120,7 +120,7 @@ func SetList(list runtime.Object, objects []runtime.Object) error { } else if src.Type().ConvertibleTo(dest.Type()) { dest.Set(src.Convert(dest.Type())) } else { - return fmt.Errorf("item[%d]: Type mismatch: Expected %v, got %v", i, dest.Type(), src.Type()) + return fmt.Errorf("item[%d]: can't assign or convert %v into %v", i, src.Type(), dest.Type()) } } items.Set(slice) diff --git a/pkg/api/meta/interfaces.go b/pkg/api/meta/interfaces.go index 8f14a3fab50..cc81aafa137 100644 --- a/pkg/api/meta/interfaces.go +++ b/pkg/api/meta/interfaces.go @@ -24,7 +24,6 @@ import ( // VersionInterfaces contains the interfaces one should use for dealing with types of a particular version. type VersionInterfaces struct { - runtime.Codec runtime.ObjectConvertor MetadataAccessor } @@ -142,7 +141,6 @@ type RESTMapping struct { // Scope contains the information needed to deal with REST Resources that are in a resource hierarchy Scope RESTScope - runtime.Codec runtime.ObjectConvertor MetadataAccessor } diff --git a/pkg/api/meta/meta_test.go b/pkg/api/meta/meta_test.go index 9d6c7abd62f..5b6c35230e4 100644 --- a/pkg/api/meta/meta_test.go +++ b/pkg/api/meta/meta_test.go @@ -73,7 +73,7 @@ func TestAPIObjectMeta(t *testing.T) { if err != nil { t.Fatalf("unexpected error: %v", err) } - if e, a := "/a", typeAccessor.GetAPIVersion(); e != a { + if e, a := "a", typeAccessor.GetAPIVersion(); e != a { t.Errorf("expected %v, got %v", e, a) } if e, a := "b", typeAccessor.GetKind(); e != a { @@ -102,7 +102,7 @@ func TestAPIObjectMeta(t *testing.T) { if e, a := types.UID("other"), j.UID; e != a { t.Errorf("expected %v, got %v", e, a) } - if e, a := "/c", j.APIVersion; e != a { + if e, a := "c", j.APIVersion; e != a { t.Errorf("expected %v, got %v", e, a) } if e, a := "d", j.Kind; e != a { @@ -117,7 +117,7 @@ func TestAPIObjectMeta(t *testing.T) { typeAccessor.SetAPIVersion("d") typeAccessor.SetKind("e") - if e, a := "/d", j.APIVersion; e != a { + if e, a := "d", j.APIVersion; e != a { t.Errorf("expected %v, got %v", e, a) } if e, a := "e", j.Kind; e != a { @@ -308,7 +308,7 @@ func TestGenericTypeMetaAccessor(t *testing.T) { if err != nil { t.Errorf("unexpected error: %v", err) } - if e, a := "/a", apiVersion; e != a { + if e, a := "a", apiVersion; e != a { t.Errorf("expected %v, got %v", e, a) } kind, err := accessor.Kind(j) @@ -392,7 +392,7 @@ func TestGenericTypeMetaAccessor(t *testing.T) { if e, a := "other", j.TypeMeta.UID; e != a { t.Errorf("expected %v, got %v", e, a) } - if e, a := "/c", j.TypeMeta.APIVersion; e != a { + if e, a := "c", j.TypeMeta.APIVersion; e != a { t.Errorf("expected %v, got %v", e, a) } if e, a := "d", j.TypeMeta.Kind; e != a { @@ -757,7 +757,7 @@ func BenchmarkAccessorSetReflection(b *testing.B) { Name: "foo", GenerateName: "prefix", UID: "uid", - APIVersion: "/a", + APIVersion: "a", Kind: "b", ResourceVersion: "1", SelfLink: "some/place/only/we/know", diff --git a/pkg/api/meta/restmapper.go b/pkg/api/meta/restmapper.go index 449f519afca..f1a4d4113bf 100644 --- a/pkg/api/meta/restmapper.go +++ b/pkg/api/meta/restmapper.go @@ -23,6 +23,7 @@ import ( "strings" "k8s.io/kubernetes/pkg/api/unversioned" + "k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/util/sets" ) @@ -84,7 +85,7 @@ type DefaultRESTMapper struct { var _ RESTMapper = &DefaultRESTMapper{} -// VersionInterfacesFunc returns the appropriate codec, typer, and metadata accessor for a +// VersionInterfacesFunc returns the appropriate typer, and metadata accessor for a // given api version, or an error if no such api version exists. type VersionInterfacesFunc func(version unversioned.GroupVersion) (*VersionInterfaces, error) @@ -92,7 +93,7 @@ type VersionInterfacesFunc func(version unversioned.GroupVersion) (*VersionInter // to a resource name and back based on the objects in a runtime.Scheme // and the Kubernetes API conventions. Takes a group name, a priority list of the versions // to search when an object has no default version (set empty to return an error), -// and a function that retrieves the correct codec and metadata for a given version. +// and a function that retrieves the correct metadata for a given version. func NewDefaultRESTMapper(defaultGroupVersions []unversioned.GroupVersion, f VersionInterfacesFunc) *DefaultRESTMapper { resourceToKind := make(map[unversioned.GroupVersionResource]unversioned.GroupVersionKind) kindToPluralResource := make(map[unversioned.GroupVersionKind]unversioned.GroupVersionResource) @@ -251,6 +252,9 @@ func (m *DefaultRESTMapper) ResourceFor(resource unversioned.GroupVersionResourc func (m *DefaultRESTMapper) KindsFor(input unversioned.GroupVersionResource) ([]unversioned.GroupVersionKind, error) { resource := input.GroupVersion().WithResource(strings.ToLower(input.Resource)) + if resource.Version == runtime.APIVersionInternal { + resource.Version = "" + } hasResource := len(resource.Resource) > 0 hasGroup := len(resource.Group) > 0 @@ -412,7 +416,7 @@ func (m *DefaultRESTMapper) RESTMapping(gk unversioned.GroupKind, versions ...st var gvk *unversioned.GroupVersionKind hadVersion := false for _, version := range versions { - if len(version) == 0 { + if len(version) == 0 || version == runtime.APIVersionInternal { continue } @@ -472,7 +476,6 @@ func (m *DefaultRESTMapper) RESTMapping(gk unversioned.GroupKind, versions ...st GroupVersionKind: *gvk, Scope: scope, - Codec: interfaces.Codec, ObjectConvertor: interfaces.ObjectConvertor, MetadataAccessor: interfaces.MetadataAccessor, } diff --git a/pkg/api/meta/restmapper_test.go b/pkg/api/meta/restmapper_test.go index 603848d5c87..17525df502e 100644 --- a/pkg/api/meta/restmapper_test.go +++ b/pkg/api/meta/restmapper_test.go @@ -18,8 +18,6 @@ package meta import ( "errors" - "io" - "net/url" "reflect" "strings" "testing" @@ -28,38 +26,6 @@ import ( "k8s.io/kubernetes/pkg/runtime" ) -type fakeCodec struct{} - -var _ runtime.Decoder = fakeCodec{} - -func (fakeCodec) Encode(runtime.Object) ([]byte, error) { - return []byte{}, nil -} - -func (fakeCodec) EncodeToStream(runtime.Object, io.Writer) error { - return nil -} - -func (fakeCodec) Decode([]byte) (runtime.Object, error) { - return nil, nil -} - -func (fakeCodec) DecodeToVersion([]byte, unversioned.GroupVersion) (runtime.Object, error) { - return nil, nil -} - -func (fakeCodec) DecodeInto([]byte, runtime.Object) error { - return nil -} - -func (fakeCodec) DecodeIntoWithSpecifiedVersionKind([]byte, runtime.Object, unversioned.GroupVersionKind) error { - return nil -} - -func (fakeCodec) DecodeParametersInto(parameters url.Values, obj runtime.Object) error { - return nil -} - type fakeConvertor struct{} func (fakeConvertor) Convert(in, out interface{}) error { @@ -74,12 +40,11 @@ func (fakeConvertor) ConvertFieldLabel(version, kind, label, value string) (stri return label, value, nil } -var validCodec = fakeCodec{} var validAccessor = resourceAccessor{} var validConvertor = fakeConvertor{} func fakeInterfaces(version unversioned.GroupVersion) (*VersionInterfaces, error) { - return &VersionInterfaces{Codec: validCodec, ObjectConvertor: validConvertor, MetadataAccessor: validAccessor}, nil + return &VersionInterfaces{ObjectConvertor: validConvertor, MetadataAccessor: validAccessor}, nil } var unmatchedErr = errors.New("no version") @@ -512,7 +477,7 @@ func TestRESTMapperRESTMapping(t *testing.T) { t.Errorf("%d: unexpected resource: %#v", i, mapping) } - if mapping.Codec == nil || mapping.MetadataAccessor == nil || mapping.ObjectConvertor == nil { + if mapping.MetadataAccessor == nil || mapping.ObjectConvertor == nil { t.Errorf("%d: missing codec and accessor: %#v", i, mapping) } diff --git a/pkg/api/register.go b/pkg/api/register.go index c1e9e9157aa..4aff2256be0 100644 --- a/pkg/api/register.go +++ b/pkg/api/register.go @@ -20,16 +20,27 @@ import ( "k8s.io/kubernetes/pkg/api/meta" "k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/runtime" + "k8s.io/kubernetes/pkg/runtime/serializer" ) // Scheme is the default instance of runtime.Scheme to which types in the Kubernetes API are already registered. var Scheme = runtime.NewScheme() +// Codecs provides access to encoding and decoding for the scheme +var Codecs = serializer.NewCodecFactory(Scheme) + // GroupName is the group name use in this package const GroupName = "" // SchemeGroupVersion is group version used to register these objects -var SchemeGroupVersion = unversioned.GroupVersion{Group: GroupName, Version: ""} +var SchemeGroupVersion = unversioned.GroupVersion{Group: GroupName, Version: runtime.APIVersionInternal} + +// Unversiond is group version for unversioned API objects +// TODO: this should be v1 probably +var Unversioned = unversioned.GroupVersion{Group: "", Version: "v1"} + +// ParameterCodec handles versioning of objects that are converted to query parameters. +var ParameterCodec = runtime.NewParameterCodec(Scheme) // Kind takes an unqualified kind and returns back a Group qualified GroupKind func Kind(kind string) unversioned.GroupKind { @@ -42,6 +53,9 @@ func Resource(resource string) unversioned.GroupResource { } func AddToScheme(scheme *runtime.Scheme) { + if err := Scheme.AddIgnoredConversionType(&unversioned.TypeMeta{}, &unversioned.TypeMeta{}); err != nil { + panic(err) + } scheme.AddKnownTypes(SchemeGroupVersion, &Pod{}, &PodList{}, @@ -86,14 +100,15 @@ func AddToScheme(scheme *runtime.Scheme) { &RangeAllocation{}, ) - // Add the Unversioned types to scheme. - // TODO this should not be done here - scheme.AddKnownTypes(SchemeGroupVersion, &unversioned.ExportOptions{}) - scheme.AddKnownTypes(SchemeGroupVersion, &unversioned.Status{}) - scheme.AddKnownTypes(SchemeGroupVersion, &unversioned.APIVersions{}) - scheme.AddKnownTypes(SchemeGroupVersion, &unversioned.APIGroupList{}) - scheme.AddKnownTypes(SchemeGroupVersion, &unversioned.APIGroup{}) - scheme.AddKnownTypes(SchemeGroupVersion, &unversioned.APIResourceList{}) + // Register Unversioned types under their own special group + Scheme.AddUnversionedTypes(Unversioned, + &unversioned.ExportOptions{}, + &unversioned.Status{}, + &unversioned.APIVersions{}, + &unversioned.APIGroupList{}, + &unversioned.APIGroup{}, + &unversioned.APIResourceList{}, + ) } func (obj *Pod) GetObjectMeta() meta.Object { return &obj.ObjectMeta } diff --git a/pkg/api/serialization_test.go b/pkg/api/serialization_test.go index bcae9883c95..0f69b8be81d 100644 --- a/pkg/api/serialization_test.go +++ b/pkg/api/serialization_test.go @@ -61,6 +61,8 @@ func fuzzInternalObject(t *testing.T, forVersion unversioned.GroupVersion, item } func roundTrip(t *testing.T, codec runtime.Codec, item runtime.Object) { + t.Logf("codec: %#v", codec) + printer := spew.ConfigState{DisableMethods: true} name := reflect.TypeOf(item).Elem().Name() @@ -81,8 +83,7 @@ func roundTrip(t *testing.T, codec runtime.Codec, item runtime.Object) { } obj3 := reflect.New(reflect.TypeOf(item).Elem()).Interface().(runtime.Object) - err = runtime.DecodeInto(codec, data, obj3) - if err != nil { + if err := runtime.DecodeInto(codec, data, obj3); err != nil { t.Errorf("2: %v: %v", name, err) return } @@ -122,7 +123,7 @@ func TestSpecificKind(t *testing.T) { // api.Scheme.Log(t) // defer api.Scheme.Log(nil) - kind := "Pod" + kind := "List" for i := 0; i < *fuzzIters; i++ { doRoundTripTest(kind, t) if t.Failed() { @@ -180,7 +181,7 @@ func doRoundTripTest(kind string, t *testing.T) { roundTripSame(t, item, nonRoundTrippableTypesByVersion[kind]...) } if !nonInternalRoundTrippableTypes.Has(kind) { - roundTrip(t, api.Codec, fuzzInternalObject(t, testapi.Default.InternalGroupVersion(), item, rand.Int63())) + roundTrip(t, testapi.Default.Codec(), fuzzInternalObject(t, testapi.Default.InternalGroupVersion(), item, rand.Int63())) } } @@ -200,8 +201,8 @@ func TestEncode_Ptr(t *testing.T) { }, } obj := runtime.Object(pod) - data, err := testapi.Default.Codec().Encode(obj) - obj2, err2 := testapi.Default.Codec().Decode(data) + data, err := runtime.Encode(testapi.Default.Codec(), obj) + obj2, err2 := runtime.Decode(testapi.Default.Codec(), data) if err != nil || err2 != nil { t.Fatalf("Failure: '%v' '%v'", err, err2) } @@ -216,11 +217,11 @@ func TestEncode_Ptr(t *testing.T) { func TestBadJSONRejection(t *testing.T) { badJSONMissingKind := []byte(`{ }`) - if _, err := testapi.Default.Codec().Decode(badJSONMissingKind); err == nil { + if _, err := runtime.Decode(testapi.Default.Codec(), badJSONMissingKind); err == nil { t.Errorf("Did not reject despite lack of kind field: %s", badJSONMissingKind) } badJSONUnknownType := []byte(`{"kind": "bar"}`) - if _, err1 := testapi.Default.Codec().Decode(badJSONUnknownType); err1 == nil { + if _, err1 := runtime.Decode(testapi.Default.Codec(), badJSONUnknownType); err1 == nil { t.Errorf("Did not reject despite use of unknown type: %s", badJSONUnknownType) } /*badJSONKindMismatch := []byte(`{"kind": "Pod"}`) @@ -240,14 +241,14 @@ func TestUnversionedTypes(t *testing.T) { for _, obj := range testcases { // Make sure the unversioned codec can encode - unversionedJSON, err := api.Codec.Encode(obj) + unversionedJSON, err := runtime.Encode(testapi.Default.Codec(), obj) if err != nil { t.Errorf("%v: unexpected error: %v", obj, err) continue } // Make sure the versioned codec under test can decode - versionDecodedObject, err := testapi.Default.Codec().Decode(unversionedJSON) + versionDecodedObject, err := runtime.Decode(testapi.Default.Codec(), unversionedJSON) if err != nil { t.Errorf("%v: unexpected error: %v", obj, err) continue @@ -278,7 +279,7 @@ func BenchmarkEncodeCodec(b *testing.B) { width := len(items) b.ResetTimer() for i := 0; i < b.N; i++ { - if _, err := testapi.Default.Codec().Encode(&items[i%width]); err != nil { + if _, err := runtime.Encode(testapi.Default.Codec(), &items[i%width]); err != nil { b.Fatal(err) } } @@ -320,7 +321,7 @@ func BenchmarkDecodeCodec(b *testing.B) { b.StopTimer() } -func BenchmarkDecodeIntoCodec(b *testing.B) { +func BenchmarkDecodeIntoExternalCodec(b *testing.B) { codec := testapi.Default.Codec() items := benchmarkItems() width := len(items) @@ -343,6 +344,29 @@ func BenchmarkDecodeIntoCodec(b *testing.B) { b.StopTimer() } +func BenchmarkDecodeIntoInternalCodec(b *testing.B) { + codec := testapi.Default.Codec() + items := benchmarkItems() + width := len(items) + encoded := make([][]byte, width) + for i := range items { + data, err := runtime.Encode(codec, &items[i]) + if err != nil { + b.Fatal(err) + } + encoded[i] = data + } + + b.ResetTimer() + for i := 0; i < b.N; i++ { + obj := api.Pod{} + if err := runtime.DecodeInto(codec, encoded[i%width], &obj); err != nil { + b.Fatal(err) + } + } + b.StopTimer() +} + // BenchmarkDecodeJSON provides a baseline for regular JSON decode performance func BenchmarkDecodeIntoJSON(b *testing.B) { codec := testapi.Default.Codec() diff --git a/pkg/api/testapi/testapi.go b/pkg/api/testapi/testapi.go index 09a5d1b4a98..eb5cd8aa163 100644 --- a/pkg/api/testapi/testapi.go +++ b/pkg/api/testapi/testapi.go @@ -47,7 +47,7 @@ type TestGroup struct { func init() { kubeTestAPI := os.Getenv("KUBE_TEST_API") - if kubeTestAPI != "" { + if len(kubeTestAPI) != 0 { testGroupVersions := strings.Split(kubeTestAPI, ",") for _, gvString := range testGroupVersions { groupVersion, err := unversioned.ParseGroupVersion(gvString) @@ -57,7 +57,7 @@ func init() { Groups[groupVersion.Group] = TestGroup{ externalGroupVersion: groupVersion, - internalGroupVersion: unversioned.GroupVersion{Group: groupVersion.Group}, + internalGroupVersion: unversioned.GroupVersion{Group: groupVersion.Group, Version: runtime.APIVersionInternal}, } } } @@ -93,12 +93,7 @@ func (g TestGroup) InternalGroupVersion() unversioned.GroupVersion { // Codec returns the codec for the API version to test against, as set by the // KUBE_TEST_API env var. func (g TestGroup) Codec() runtime.Codec { - // TODO: caesarxuchao: Restructure the body once we have a central `registered`. - interfaces, err := registered.GroupOrDie(g.externalGroupVersion.Group).InterfacesFor(g.externalGroupVersion) - if err != nil { - panic(err) - } - return interfaces.Codec + return api.Codecs.LegacyCodec(g.externalGroupVersion) } // Converter returns the api.Scheme for the API version to test against, as set by the @@ -199,7 +194,11 @@ func GetCodecForObject(obj runtime.Object) (runtime.Codec, error) { } // Codec used for unversioned types if api.Scheme.Recognizes(kind) { - return api.Codec, nil + serializer, ok := api.Codecs.SerializerForFileExtension("json") + if !ok { + return nil, fmt.Errorf("no serializer registered for json") + } + return serializer, nil } return nil, fmt.Errorf("unexpected kind: %v", kind) } diff --git a/pkg/api/testing/compat/compatibility_tester.go b/pkg/api/testing/compat/compatibility_tester.go index 48174fc3d82..17db89ad2cb 100644 --- a/pkg/api/testing/compat/compatibility_tester.go +++ b/pkg/api/testing/compat/compatibility_tester.go @@ -26,7 +26,6 @@ import ( "strings" "testing" - "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/kubectl" "k8s.io/kubernetes/pkg/runtime" @@ -48,7 +47,7 @@ func TestCompatibility( ) { // Decode - codec := runtime.CodecFor(api.Scheme, version) + codec := api.Codecs.LegacyCodec(version) obj, err := runtime.Decode(codec, input) if err != nil { t.Fatalf("Unexpected error: %v", err) diff --git a/pkg/api/testing/fuzzer.go b/pkg/api/testing/fuzzer.go index c34f07effad..30a2ed18746 100644 --- a/pkg/api/testing/fuzzer.go +++ b/pkg/api/testing/fuzzer.go @@ -59,9 +59,6 @@ func FuzzerFor(t *testing.T, version unversioned.GroupVersion, src rand.Source) func(q *resource.Quantity, c fuzz.Continue) { *q = *resource.NewQuantity(c.Int63n(1000), resource.DecimalExponent) }, - func(j *runtime.PluginBase, c fuzz.Continue) { - // Do nothing; this struct has only a Kind field and it must stay blank in memory. - }, func(j *runtime.TypeMeta, c fuzz.Continue) { // We have to customize the randomization of TypeMetas because their // APIVersion and Kind must remain blank in memory. @@ -177,10 +174,8 @@ func FuzzerFor(t *testing.T, version unversioned.GroupVersion, src rand.Source) // TODO: uncomment when round trip starts from a versioned object if true { //c.RandBool() { *j = &runtime.Unknown{ - // apiVersion has rules now. Since it includes / and only `v1` can be bare, - // then this must choose a valid format to deserialize - TypeMeta: runtime.TypeMeta{Kind: "Something", APIVersion: "unknown.group/unknown"}, - RawJSON: []byte(`{"apiVersion":"unknown.group/unknown","kind":"Something","someKey":"someValue"}`), + // We do not set TypeMeta here because it is not carried through a round trip + RawJSON: []byte(`{"apiVersion":"unknown.group/unknown","kind":"Something","someKey":"someValue"}`), } } else { types := []runtime.Object{&api.Pod{}, &api.ReplicationController{}} diff --git a/pkg/api/unversioned/group_version.go b/pkg/api/unversioned/group_version.go index a77ea9ef7ce..5b684915afc 100644 --- a/pkg/api/unversioned/group_version.go +++ b/pkg/api/unversioned/group_version.go @@ -141,11 +141,13 @@ func (gv GroupVersion) String() string { } // special case of "v1" for backward compatibility - if gv.Group == "" && gv.Version == "v1" { + if len(gv.Group) == 0 && gv.Version == "v1" { return gv.Version - } else { + } + if len(gv.Group) > 0 { return gv.Group + "/" + gv.Version } + return gv.Version } // ParseGroupVersion turns "group/version" string into a GroupVersion struct. It reports error @@ -163,6 +165,8 @@ func ParseGroupVersion(gv string) (GroupVersion, error) { switch { case len(s) == 1 && gv == "v1": return GroupVersion{"", "v1"}, nil + case len(s) == 1: + return GroupVersion{"", s[0]}, nil case len(s) == 2: return GroupVersion{s[0], s[1]}, nil default: diff --git a/pkg/api/v1/defaults_test.go b/pkg/api/v1/defaults_test.go index 0c2b5b29884..b1a78e758e3 100644 --- a/pkg/api/v1/defaults_test.go +++ b/pkg/api/v1/defaults_test.go @@ -28,12 +28,13 @@ import ( ) func roundTrip(t *testing.T, obj runtime.Object) runtime.Object { - data, err := versioned.Codec.Encode(obj) + codec := api.Codecs.LegacyCodec(versioned.SchemeGroupVersion) + data, err := runtime.Encode(codec, obj) if err != nil { t.Errorf("%v\n %#v", err, obj) return nil } - obj2, err := api.Codec.Decode(data) + obj2, err := runtime.Decode(codec, data) if err != nil { t.Errorf("%v\nData: %s\nSource: %#v", err, string(data), obj) return nil diff --git a/pkg/api/v1/register.go b/pkg/api/v1/register.go index 14b2e5adfe2..f39ae8ff12a 100644 --- a/pkg/api/v1/register.go +++ b/pkg/api/v1/register.go @@ -17,7 +17,6 @@ limitations under the License. package v1 import ( - "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/runtime" ) @@ -28,9 +27,6 @@ const GroupName = "" // SchemeGroupVersion is group version used to register these objects var SchemeGroupVersion = unversioned.GroupVersion{Group: GroupName, Version: "v1"} -// Codec encodes internal objects to the v1 scheme -var Codec = runtime.CodecFor(api.Scheme, SchemeGroupVersion) - func AddToScheme(scheme *runtime.Scheme) { // Add the API to Scheme. addKnownTypes(scheme) diff --git a/pkg/api/validation/schema_test.go b/pkg/api/validation/schema_test.go index f35df2bd84d..be6fc83e7a0 100644 --- a/pkg/api/validation/schema_test.go +++ b/pkg/api/validation/schema_test.go @@ -72,7 +72,7 @@ func TestValidateOk(t *testing.T) { for _, test := range tests { testObj := test.obj apiObjectFuzzer.Fuzz(testObj) - data, err := testapi.Default.Codec().Encode(testObj) + data, err := runtime.Encode(testapi.Default.Codec(), testObj) if err != nil { t.Errorf("unexpected error: %v", err) } diff --git a/pkg/apimachinery/registered/registered_test.go b/pkg/apimachinery/registered/registered_test.go index e7466fcc2b8..de40d2e2ac0 100644 --- a/pkg/apimachinery/registered/registered_test.go +++ b/pkg/apimachinery/registered/registered_test.go @@ -17,10 +17,14 @@ limitations under the License. package registered import ( + "encoding/json" + "reflect" "testing" + "k8s.io/kubernetes/pkg/api/testapi" "k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/apimachinery" + "k8s.io/kubernetes/pkg/runtime" ) func TestAllPreferredGroupVersions(t *testing.T) { @@ -66,3 +70,61 @@ func TestAllPreferredGroupVersions(t *testing.T) { reset() } } + +var status = &unversioned.Status{ + Status: unversioned.StatusFailure, + Code: 200, + Reason: unversioned.StatusReasonUnknown, + Message: "", +} + +func TestV1EncodeDecodeStatus(t *testing.T) { + v1Codec := testapi.Default.Codec() + + encoded, err := runtime.Encode(v1Codec, status) + if err != nil { + t.Errorf("unexpected error: %v", err) + } + typeMeta := unversioned.TypeMeta{} + if err := json.Unmarshal(encoded, &typeMeta); err != nil { + t.Errorf("unexpected error: %v", err) + } + if typeMeta.Kind != "Status" { + t.Errorf("Kind is not set to \"Status\". Got %v", string(encoded)) + } + if typeMeta.APIVersion != "v1" { + t.Errorf("APIVersion is not set to \"v1\". Got %v", string(encoded)) + } + decoded, err := runtime.Decode(v1Codec, encoded) + if err != nil { + t.Errorf("unexpected error: %v", err) + } + if !reflect.DeepEqual(status, decoded) { + t.Errorf("expected: %#v, got: %#v", status, decoded) + } +} + +func TestExperimentalEncodeDecodeStatus(t *testing.T) { + extensionCodec := testapi.Extensions.Codec() + encoded, err := runtime.Encode(extensionCodec, status) + if err != nil { + t.Errorf("unexpected error: %v", err) + } + typeMeta := unversioned.TypeMeta{} + if err := json.Unmarshal(encoded, &typeMeta); err != nil { + t.Errorf("unexpected error: %v", err) + } + if typeMeta.Kind != "Status" { + t.Errorf("Kind is not set to \"Status\". Got %s", encoded) + } + if typeMeta.APIVersion != "v1" { + t.Errorf("APIVersion is not set to \"\". Got %s", encoded) + } + decoded, err := runtime.Decode(extensionCodec, encoded) + if err != nil { + t.Errorf("unexpected error: %v", err) + } + if !reflect.DeepEqual(status, decoded) { + t.Errorf("expected: %v, got: %v", status, decoded) + } +} diff --git a/pkg/apis/abac/latest/latest.go b/pkg/apis/abac/latest/latest.go index bcbef485680..2618fc4fc24 100644 --- a/pkg/apis/abac/latest/latest.go +++ b/pkg/apis/abac/latest/latest.go @@ -17,8 +17,7 @@ limitations under the License. package latest import ( - "k8s.io/kubernetes/pkg/apis/abac/v1beta1" + _ "k8s.io/kubernetes/pkg/apis/abac" + _ "k8s.io/kubernetes/pkg/apis/abac/v0" + _ "k8s.io/kubernetes/pkg/apis/abac/v1beta1" ) - -// Codec is the default codec for serializing input that should use the latest supported version. -var Codec = v1beta1.Codec diff --git a/pkg/apis/abac/register.go b/pkg/apis/abac/register.go index bc99f922b18..c555d5aa979 100644 --- a/pkg/apis/abac/register.go +++ b/pkg/apis/abac/register.go @@ -14,11 +14,12 @@ See the License for the specific language governing permissions and limitations under the License. */ -package api +package abac import ( "k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/runtime" + "k8s.io/kubernetes/pkg/runtime/serializer" ) // Group is the API group for abac @@ -27,9 +28,11 @@ const Group = "abac.authorization.kubernetes.io" // Scheme is the default instance of runtime.Scheme to which types in the abac API group are registered. var Scheme = runtime.NewScheme() +// Codecs provides access to encoding and decoding for the scheme +var Codecs = serializer.NewCodecFactory(Scheme) + func init() { - Scheme.AddInternalGroupVersion(unversioned.GroupVersion{Group: Group, Version: ""}) - Scheme.AddKnownTypes(unversioned.GroupVersion{Group: Group, Version: ""}, + Scheme.AddKnownTypes(unversioned.GroupVersion{Group: Group, Version: runtime.APIVersionInternal}, &Policy{}, ) } diff --git a/pkg/apis/abac/types.go b/pkg/apis/abac/types.go index 1b694c0481b..024c7ee2417 100644 --- a/pkg/apis/abac/types.go +++ b/pkg/apis/abac/types.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package api +package abac import "k8s.io/kubernetes/pkg/api/unversioned" diff --git a/pkg/apis/abac/v0/conversion.go b/pkg/apis/abac/v0/conversion.go index 56b7a31b0c4..c0fda4bd555 100644 --- a/pkg/apis/abac/v0/conversion.go +++ b/pkg/apis/abac/v0/conversion.go @@ -17,7 +17,7 @@ limitations under the License. package v0 import ( - "k8s.io/kubernetes/pkg/apis/abac" + api "k8s.io/kubernetes/pkg/apis/abac" "k8s.io/kubernetes/pkg/conversion" ) diff --git a/pkg/apis/abac/v0/conversion_test.go b/pkg/apis/abac/v0/conversion_test.go index 256b4e25100..ffdbd398d97 100644 --- a/pkg/apis/abac/v0/conversion_test.go +++ b/pkg/apis/abac/v0/conversion_test.go @@ -20,7 +20,7 @@ import ( "reflect" "testing" - "k8s.io/kubernetes/pkg/apis/abac" + api "k8s.io/kubernetes/pkg/apis/abac" "k8s.io/kubernetes/pkg/apis/abac/v0" ) diff --git a/pkg/apis/abac/v0/register.go b/pkg/apis/abac/v0/register.go index 3aeb73df5b2..d5338045a98 100644 --- a/pkg/apis/abac/v0/register.go +++ b/pkg/apis/abac/v0/register.go @@ -18,16 +18,12 @@ package v0 import ( "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/apis/abac" - "k8s.io/kubernetes/pkg/runtime" + api "k8s.io/kubernetes/pkg/apis/abac" ) // GroupVersion is the API group and version for abac v0 var GroupVersion = unversioned.GroupVersion{Group: api.Group, Version: "v0"} -// Codec encodes internal objects to the v0 version for the abac group -var Codec = runtime.CodecFor(api.Scheme, GroupVersion) - func init() { api.Scheme.AddKnownTypes(GroupVersion, &Policy{}, diff --git a/pkg/apis/abac/v1beta1/register.go b/pkg/apis/abac/v1beta1/register.go index 6312c762a2e..95fd6b3ef18 100644 --- a/pkg/apis/abac/v1beta1/register.go +++ b/pkg/apis/abac/v1beta1/register.go @@ -18,16 +18,12 @@ package v1beta1 import ( "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/apis/abac" - "k8s.io/kubernetes/pkg/runtime" + api "k8s.io/kubernetes/pkg/apis/abac" ) // GroupVersion is the API group and version for abac v1beta1 var GroupVersion = unversioned.GroupVersion{Group: api.Group, Version: "v1beta1"} -// Codec encodes internal objects to the v1beta1 version for the abac group -var Codec = runtime.CodecFor(api.Scheme, GroupVersion) - func init() { api.Scheme.AddKnownTypes(GroupVersion, &Policy{}, diff --git a/pkg/apis/authorization/install/install.go b/pkg/apis/authorization/install/install.go index 83675ea6090..bf8814dd5e9 100644 --- a/pkg/apis/authorization/install/install.go +++ b/pkg/apis/authorization/install/install.go @@ -75,7 +75,6 @@ func enableVersions(externalVersions []unversioned.GroupVersion) error { groupMeta := apimachinery.GroupMeta{ GroupVersion: preferredExternalVersion, GroupVersions: externalVersions, - Codec: runtime.CodecFor(api.Scheme, preferredExternalVersion), RESTMapper: newRESTMapper(externalVersions), SelfLinker: runtime.SelfLinker(accessor), InterfacesFor: interfacesFor, @@ -119,7 +118,6 @@ func interfacesFor(version unversioned.GroupVersion) (*meta.VersionInterfaces, e switch version { case v1beta1.SchemeGroupVersion: return &meta.VersionInterfaces{ - Codec: v1beta1.Codec, ObjectConvertor: api.Scheme, MetadataAccessor: accessor, }, nil diff --git a/pkg/apis/authorization/register.go b/pkg/apis/authorization/register.go index 317e44c9131..b286526131a 100644 --- a/pkg/apis/authorization/register.go +++ b/pkg/apis/authorization/register.go @@ -25,7 +25,7 @@ import ( const GroupName = "authorization.k8s.io" // SchemeGroupVersion is group version used to register these objects -var SchemeGroupVersion = unversioned.GroupVersion{Group: GroupName, Version: ""} +var SchemeGroupVersion = unversioned.GroupVersion{Group: GroupName, Version: runtime.APIVersionInternal} // Kind takes an unqualified kind and returns back a Group qualified GroupKind func Kind(kind string) unversioned.GroupKind { diff --git a/pkg/apis/authorization/v1beta1/register.go b/pkg/apis/authorization/v1beta1/register.go index eee6eaa41c1..d9e33ed5a22 100644 --- a/pkg/apis/authorization/v1beta1/register.go +++ b/pkg/apis/authorization/v1beta1/register.go @@ -17,7 +17,6 @@ limitations under the License. package v1beta1 import ( - "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/runtime" ) @@ -28,8 +27,6 @@ const GroupName = "authorization.k8s.io" // SchemeGroupVersion is group version used to register these objects var SchemeGroupVersion = unversioned.GroupVersion{Group: GroupName, Version: "v1beta1"} -var Codec = runtime.CodecFor(api.Scheme, SchemeGroupVersion) - func AddToScheme(scheme *runtime.Scheme) { // Add the API to Scheme. addKnownTypes(scheme) diff --git a/pkg/apis/componentconfig/decode.go b/pkg/apis/componentconfig/decode.go deleted file mode 100644 index 7fe927c3272..00000000000 --- a/pkg/apis/componentconfig/decode.go +++ /dev/null @@ -1,33 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package componentconfig - -import ( - "io/ioutil" - - "k8s.io/kubernetes/pkg/runtime" -) - -func DecodeFromPathInto(obj runtime.Object, c runtime.Codec, filename string) error { - b, err := ioutil.ReadFile(filename) - c = runtime.YAMLDecoder(c) - - if err != nil { - return err - } - return c.DecodeInto(b, obj) -} diff --git a/pkg/apis/componentconfig/install/install.go b/pkg/apis/componentconfig/install/install.go index 49b382dea5d..ec55542737d 100644 --- a/pkg/apis/componentconfig/install/install.go +++ b/pkg/apis/componentconfig/install/install.go @@ -75,7 +75,6 @@ func enableVersions(externalVersions []unversioned.GroupVersion) error { groupMeta := apimachinery.GroupMeta{ GroupVersion: preferredExternalVersion, GroupVersions: externalVersions, - Codec: runtime.CodecFor(api.Scheme, preferredExternalVersion), RESTMapper: newRESTMapper(externalVersions), SelfLinker: runtime.SelfLinker(accessor), InterfacesFor: interfacesFor, @@ -104,7 +103,6 @@ func interfacesFor(version unversioned.GroupVersion) (*meta.VersionInterfaces, e switch version { case v1alpha1.SchemeGroupVersion: return &meta.VersionInterfaces{ - Codec: v1alpha1.Codec, ObjectConvertor: api.Scheme, MetadataAccessor: accessor, }, nil diff --git a/pkg/apis/componentconfig/install/install_test.go b/pkg/apis/componentconfig/install/install_test.go index 82bae567a93..20536d57928 100644 --- a/pkg/apis/componentconfig/install/install_test.go +++ b/pkg/apis/componentconfig/install/install_test.go @@ -23,13 +23,14 @@ import ( "k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/apimachinery/registered" "k8s.io/kubernetes/pkg/apis/componentconfig" + "k8s.io/kubernetes/pkg/runtime" ) func TestCodec(t *testing.T) { daemonSet := componentconfig.KubeProxyConfiguration{} // We do want to use package registered rather than testapi here, because we // want to test if the package install and package registered work as expected. - data, err := registered.GroupOrDie(componentconfig.GroupName).Codec.Encode(&daemonSet) + data, err := runtime.Encode(api.Codecs.LegacyCodec(registered.GroupOrDie(componentconfig.GroupName).GroupVersion), &daemonSet) if err != nil { t.Fatalf("unexpected error: %v", err) } @@ -80,8 +81,8 @@ func TestRESTMapper(t *testing.T) { } interfaces, _ := registered.GroupOrDie(componentconfig.GroupName).InterfacesFor(version) - if mapping.Codec != interfaces.Codec { - t.Errorf("unexpected codec: %#v, expected: %#v", mapping, interfaces) + if mapping.ObjectConvertor != interfaces.ObjectConvertor { + t.Errorf("unexpected: %#v, expected: %#v", mapping, interfaces) } } } diff --git a/pkg/apis/componentconfig/register.go b/pkg/apis/componentconfig/register.go index ce29ed8baf4..eaf67580996 100644 --- a/pkg/apis/componentconfig/register.go +++ b/pkg/apis/componentconfig/register.go @@ -29,7 +29,7 @@ func AddToScheme(scheme *runtime.Scheme) { const GroupName = "componentconfig" // SchemeGroupVersion is group version used to register these objects -var SchemeGroupVersion = unversioned.GroupVersion{Group: GroupName, Version: ""} +var SchemeGroupVersion = unversioned.GroupVersion{Group: GroupName, Version: runtime.APIVersionInternal} // Kind takes an unqualified kind and returns back a Group qualified GroupKind func Kind(kind string) unversioned.GroupKind { diff --git a/pkg/apis/componentconfig/v1alpha1/register.go b/pkg/apis/componentconfig/v1alpha1/register.go index aeec8975ab4..ab0bdd5fa8f 100644 --- a/pkg/apis/componentconfig/v1alpha1/register.go +++ b/pkg/apis/componentconfig/v1alpha1/register.go @@ -17,7 +17,6 @@ limitations under the License. package v1alpha1 import ( - "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/runtime" ) @@ -28,8 +27,6 @@ const GroupName = "componentconfig" // SchemeGroupVersion is group version used to register these objects var SchemeGroupVersion = unversioned.GroupVersion{Group: GroupName, Version: "v1alpha1"} -var Codec = runtime.CodecFor(api.Scheme, SchemeGroupVersion) - func AddToScheme(scheme *runtime.Scheme) { addKnownTypes(scheme) addDefaultingFuncs(scheme) diff --git a/pkg/apis/extensions/install/install.go b/pkg/apis/extensions/install/install.go index bcc10f36003..4e1477d2d0a 100644 --- a/pkg/apis/extensions/install/install.go +++ b/pkg/apis/extensions/install/install.go @@ -75,7 +75,6 @@ func enableVersions(externalVersions []unversioned.GroupVersion) error { groupMeta := apimachinery.GroupMeta{ GroupVersion: preferredExternalVersion, GroupVersions: externalVersions, - Codec: runtime.CodecFor(api.Scheme, preferredExternalVersion), RESTMapper: newRESTMapper(externalVersions), SelfLinker: runtime.SelfLinker(accessor), InterfacesFor: interfacesFor, @@ -104,7 +103,6 @@ func interfacesFor(version unversioned.GroupVersion) (*meta.VersionInterfaces, e switch version { case v1beta1.SchemeGroupVersion: return &meta.VersionInterfaces{ - Codec: v1beta1.Codec, ObjectConvertor: api.Scheme, MetadataAccessor: accessor, }, nil diff --git a/pkg/apis/extensions/install/install_test.go b/pkg/apis/extensions/install/install_test.go index 4196d2b669c..61aa91beff6 100644 --- a/pkg/apis/extensions/install/install_test.go +++ b/pkg/apis/extensions/install/install_test.go @@ -25,6 +25,7 @@ import ( "k8s.io/kubernetes/pkg/apimachinery/registered" "k8s.io/kubernetes/pkg/apis/extensions" "k8s.io/kubernetes/pkg/apis/extensions/v1beta1" + "k8s.io/kubernetes/pkg/runtime" ) func TestResourceVersioner(t *testing.T) { @@ -51,7 +52,7 @@ func TestCodec(t *testing.T) { daemonSet := extensions.DaemonSet{} // We do want to use package registered rather than testapi here, because we // want to test if the package install and package registered work as expected. - data, err := registered.GroupOrDie(extensions.GroupName).Codec.Encode(&daemonSet) + data, err := runtime.Encode(api.Codecs.LegacyCodec(registered.GroupOrDie(extensions.GroupName).GroupVersion), &daemonSet) if err != nil { t.Fatalf("unexpected error: %v", err) } @@ -101,9 +102,15 @@ func TestRESTMapper(t *testing.T) { t.Errorf("incorrect groupVersion: %v", mapping) } +<<<<<<< HEAD interfaces, _ := registered.GroupOrDie(extensions.GroupName).InterfacesFor(version) if mapping.Codec != interfaces.Codec { t.Errorf("unexpected codec: %#v, expected: %#v", mapping, interfaces) +======= + interfaces, _ := latest.GroupOrDie(extensions.GroupName).InterfacesFor(version) + if mapping.ObjectConvertor != interfaces.ObjectConvertor { + t.Errorf("unexpected: %#v, expected: %#v", mapping, interfaces) +>>>>>>> e776ada... Switch API objects to not register per version codecs } rc := &extensions.HorizontalPodAutoscaler{ObjectMeta: api.ObjectMeta{Name: "foo"}} diff --git a/pkg/apis/extensions/register.go b/pkg/apis/extensions/register.go index f33957292e4..d02dd6f6ea6 100644 --- a/pkg/apis/extensions/register.go +++ b/pkg/apis/extensions/register.go @@ -26,7 +26,7 @@ import ( const GroupName = "extensions" // SchemeGroupVersion is group version used to register these objects -var SchemeGroupVersion = unversioned.GroupVersion{Group: GroupName, Version: ""} +var SchemeGroupVersion = unversioned.GroupVersion{Group: GroupName, Version: runtime.APIVersionInternal} // Kind takes an unqualified kind and returns back a Group qualified GroupKind func Kind(kind string) unversioned.GroupKind { diff --git a/pkg/apis/extensions/v1beta1/defaults_test.go b/pkg/apis/extensions/v1beta1/defaults_test.go index 082fc2adb41..bce6e1997de 100644 --- a/pkg/apis/extensions/v1beta1/defaults_test.go +++ b/pkg/apis/extensions/v1beta1/defaults_test.go @@ -588,12 +588,12 @@ func TestDefaultRequestIsNotSetForReplicaSet(t *testing.T) { } func roundTrip(t *testing.T, obj runtime.Object) runtime.Object { - data, err := runtime.Encode(Codec, obj) + data, err := runtime.Encode(api.Codecs.LegacyCodec(SchemeGroupVersion), obj) if err != nil { t.Errorf("%v\n %#v", err, obj) return nil } - obj2, err := api.Codec.Decode(data) + obj2, err := runtime.Decode(api.Codecs.UniversalDecoder(), data) if err != nil { t.Errorf("%v\nData: %s\nSource: %#v", err, string(data), obj) return nil diff --git a/pkg/apis/extensions/v1beta1/register.go b/pkg/apis/extensions/v1beta1/register.go index e4bbf61da8c..8ffbc48e635 100644 --- a/pkg/apis/extensions/v1beta1/register.go +++ b/pkg/apis/extensions/v1beta1/register.go @@ -17,7 +17,6 @@ limitations under the License. package v1beta1 import ( - "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/api/v1" "k8s.io/kubernetes/pkg/runtime" @@ -29,8 +28,6 @@ const GroupName = "extensions" // SchemeGroupVersion is group version used to register these objects var SchemeGroupVersion = unversioned.GroupVersion{Group: GroupName, Version: "v1beta1"} -var Codec = runtime.CodecFor(api.Scheme, SchemeGroupVersion) - func AddToScheme(scheme *runtime.Scheme) { addKnownTypes(scheme) addDefaultingFuncs(scheme) diff --git a/pkg/apis/metrics/install/install.go b/pkg/apis/metrics/install/install.go index 75709fa6e21..e83c91cc4a2 100644 --- a/pkg/apis/metrics/install/install.go +++ b/pkg/apis/metrics/install/install.go @@ -75,7 +75,6 @@ func enableVersions(externalVersions []unversioned.GroupVersion) error { groupMeta := apimachinery.GroupMeta{ GroupVersion: preferredExternalVersion, GroupVersions: externalVersions, - Codec: runtime.CodecFor(api.Scheme, preferredExternalVersion), RESTMapper: newRESTMapper(externalVersions), SelfLinker: runtime.SelfLinker(accessor), InterfacesFor: interfacesFor, @@ -104,7 +103,6 @@ func interfacesFor(version unversioned.GroupVersion) (*meta.VersionInterfaces, e switch version { case v1alpha1.SchemeGroupVersion: return &meta.VersionInterfaces{ - Codec: v1alpha1.Codec, ObjectConvertor: api.Scheme, MetadataAccessor: accessor, }, nil diff --git a/pkg/apis/metrics/register.go b/pkg/apis/metrics/register.go index 99bcb529c14..29ad86a09f3 100644 --- a/pkg/apis/metrics/register.go +++ b/pkg/apis/metrics/register.go @@ -30,7 +30,7 @@ func AddToScheme(scheme *runtime.Scheme) { const GroupName = "metrics" // SchemeGroupVersion is group version used to register these objects -var SchemeGroupVersion = unversioned.GroupVersion{Group: GroupName, Version: ""} +var SchemeGroupVersion = unversioned.GroupVersion{Group: GroupName, Version: runtime.APIVersionInternal} // Kind takes an unqualified kind and returns back a Group qualified GroupKind func Kind(kind string) unversioned.GroupKind { diff --git a/pkg/apis/metrics/v1alpha1/register.go b/pkg/apis/metrics/v1alpha1/register.go index 1643f6e7e47..c943d54687d 100644 --- a/pkg/apis/metrics/v1alpha1/register.go +++ b/pkg/apis/metrics/v1alpha1/register.go @@ -17,7 +17,6 @@ limitations under the License. package v1alpha1 import ( - "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/api/v1" "k8s.io/kubernetes/pkg/runtime" @@ -29,8 +28,6 @@ const GroupName = "metrics" // SchemeGroupVersion is group version used to register these objects var SchemeGroupVersion = unversioned.GroupVersion{Group: GroupName, Version: "v1alpha1"} -var Codec = runtime.CodecFor(api.Scheme, SchemeGroupVersion) - func AddToScheme(scheme *runtime.Scheme) { // Add the API to Scheme. addKnownTypes(scheme) diff --git a/pkg/apiserver/apiserver_test.go b/pkg/apiserver/apiserver_test.go index 2a9bff8302c..6141edd47e8 100644 --- a/pkg/apiserver/apiserver_test.go +++ b/pkg/apiserver/apiserver_test.go @@ -35,7 +35,6 @@ import ( "k8s.io/kubernetes/pkg/admission" "k8s.io/kubernetes/pkg/api" apierrs "k8s.io/kubernetes/pkg/api/errors" - "k8s.io/kubernetes/pkg/api/latest" "k8s.io/kubernetes/pkg/api/meta" "k8s.io/kubernetes/pkg/api/rest" "k8s.io/kubernetes/pkg/api/unversioned" @@ -70,10 +69,10 @@ var grouplessPrefix = "api" var groupVersions = []unversioned.GroupVersion{grouplessGroupVersion, testGroupVersion, newGroupVersion} -var codec = latest.Codecs.LegacyCodec(groupVersions...) -var grouplessCodec = latest.Codecs.LegacyCodec(grouplessGroupVersion) -var testCodec = latest.Codecs.LegacyCodec(testGroupVersion) -var newCodec = latest.Codecs.LegacyCodec(newGroupVersion) +var codec = api.Codecs.LegacyCodec(groupVersions...) +var grouplessCodec = api.Codecs.LegacyCodec(grouplessGroupVersion) +var testCodec = api.Codecs.LegacyCodec(testGroupVersion) +var newCodec = api.Codecs.LegacyCodec(newGroupVersion) var accessor = meta.NewAccessor() var versioner runtime.ResourceVersioner = accessor @@ -265,7 +264,7 @@ func handleInternal(storage map[string]rest.Storage, admissionControl admission. group.Root = "/" + grouplessPrefix group.GroupVersion = grouplessGroupVersion group.OptionsExternalVersion = &grouplessGroupVersion - group.Serializer = latest.Codecs + group.Serializer = api.Codecs if err := (&group).InstallREST(container); err != nil { panic(fmt.Sprintf("unable to install container %s: %v", group.GroupVersion, err)) } @@ -277,7 +276,7 @@ func handleInternal(storage map[string]rest.Storage, admissionControl admission. group.Root = "/" + prefix group.GroupVersion = testGroupVersion group.OptionsExternalVersion = &testGroupVersion - group.Serializer = latest.Codecs + group.Serializer = api.Codecs if err := (&group).InstallREST(container); err != nil { panic(fmt.Sprintf("unable to install container %s: %v", group.GroupVersion, err)) } @@ -289,7 +288,7 @@ func handleInternal(storage map[string]rest.Storage, admissionControl admission. group.Root = "/" + prefix group.GroupVersion = newGroupVersion group.OptionsExternalVersion = &newGroupVersion - group.Serializer = latest.Codecs + group.Serializer = api.Codecs if err := (&group).InstallREST(container); err != nil { panic(fmt.Sprintf("unable to install container %s: %v", group.GroupVersion, err)) } @@ -2391,7 +2390,7 @@ func TestUpdateREST(t *testing.T) { GroupVersion: newGroupVersion, OptionsExternalVersion: &newGroupVersion, - Serializer: latest.Codecs, + Serializer: api.Codecs, ParameterCodec: api.ParameterCodec, } } @@ -2475,7 +2474,7 @@ func TestParentResourceIsRequired(t *testing.T) { GroupVersion: newGroupVersion, OptionsExternalVersion: &newGroupVersion, - Serializer: latest.Codecs, + Serializer: api.Codecs, ParameterCodec: api.ParameterCodec, } container := restful.NewContainer() @@ -2506,7 +2505,7 @@ func TestParentResourceIsRequired(t *testing.T) { GroupVersion: newGroupVersion, OptionsExternalVersion: &newGroupVersion, - Serializer: latest.Codecs, + Serializer: api.Codecs, ParameterCodec: api.ParameterCodec, } container = restful.NewContainer() @@ -2710,12 +2709,12 @@ func TestCreateYAML(t *testing.T) { simple := &apiservertesting.Simple{ Other: "bar", } - serializer, ok := latest.Codecs.SerializerForMediaType("application/yaml", nil) + serializer, ok := api.Codecs.SerializerForMediaType("application/yaml", nil) if !ok { t.Fatal("No yaml serializer") } - encoder := latest.Codecs.EncoderForVersion(serializer, testGroupVersion) - decoder := latest.Codecs.DecoderToVersion(serializer, testInternalGroupVersion) + encoder := api.Codecs.EncoderForVersion(serializer, testGroupVersion) + decoder := api.Codecs.DecoderToVersion(serializer, testInternalGroupVersion) data, err := runtime.Encode(encoder, simple) if err != nil { @@ -2913,7 +2912,7 @@ func (obj *UnregisteredAPIObject) GetObjectKind() unversioned.ObjectKind { func TestWriteJSONDecodeError(t *testing.T) { server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { - writeNegotiated(latest.Codecs, newGroupVersion, w, req, http.StatusOK, &UnregisteredAPIObject{"Undecodable"}) + writeNegotiated(api.Codecs, newGroupVersion, w, req, http.StatusOK, &UnregisteredAPIObject{"Undecodable"}) })) // TODO: Uncomment when fix #19254 // defer server.Close() diff --git a/pkg/auth/authorizer/abac/abac.go b/pkg/auth/authorizer/abac/abac.go index 0ef8768714a..9b367cf57fb 100644 --- a/pkg/auth/authorizer/abac/abac.go +++ b/pkg/auth/authorizer/abac/abac.go @@ -28,8 +28,7 @@ import ( "github.com/golang/glog" - "k8s.io/kubernetes/pkg/apis/abac" - "k8s.io/kubernetes/pkg/apis/abac/latest" + api "k8s.io/kubernetes/pkg/apis/abac" "k8s.io/kubernetes/pkg/apis/abac/v0" _ "k8s.io/kubernetes/pkg/apis/abac/v1beta1" "k8s.io/kubernetes/pkg/auth/authorizer" diff --git a/pkg/conversion/unversioned_test.go b/pkg/conversion/unversioned_test.go index eee3e10c507..308549edc53 100644 --- a/pkg/conversion/unversioned_test.go +++ b/pkg/conversion/unversioned_test.go @@ -67,7 +67,7 @@ func TestV1EncodeDecodeStatus(t *testing.T) { func TestExperimentalEncodeDecodeStatus(t *testing.T) { // TODO: caesarxuchao: use the testapi.Extensions.Codec() once the PR that // moves experimental from v1 to v1beta1 got merged. - expCodec := latest.Codecs.LegacyCodec(extensions.SchemeGroupVersion) + expCodec := api.Codecs.LegacyCodec(extensions.SchemeGroupVersion) encoded, err := runtime.Encode(expCodec, status) if err != nil { t.Errorf("unexpected error: %v", err) diff --git a/pkg/genericapiserver/genericapiserver_test.go b/pkg/genericapiserver/genericapiserver_test.go index e12e7e9b2a0..e1e963dc187 100644 --- a/pkg/genericapiserver/genericapiserver_test.go +++ b/pkg/genericapiserver/genericapiserver_test.go @@ -94,7 +94,7 @@ func TestInstallAPIGroups(t *testing.T) { config.ProxyTLSClientConfig = &tls.Config{} config.APIPrefix = "/apiPrefix" config.APIGroupPrefix = "/apiGroupPrefix" - config.Serializer = latest.Codecs + config.Serializer = api.Codecs s := New(&config) apiGroupMeta := registered.GroupOrDie(api.GroupName) diff --git a/plugin/pkg/scheduler/api/latest/latest.go b/plugin/pkg/scheduler/api/latest/latest.go index cee44028f24..c01d91d32ed 100644 --- a/plugin/pkg/scheduler/api/latest/latest.go +++ b/plugin/pkg/scheduler/api/latest/latest.go @@ -17,7 +17,12 @@ limitations under the License. package latest import ( - "k8s.io/kubernetes/plugin/pkg/scheduler/api/v1" + "k8s.io/kubernetes/pkg/api/unversioned" + "k8s.io/kubernetes/pkg/runtime" + "k8s.io/kubernetes/pkg/runtime/serializer/json" + "k8s.io/kubernetes/pkg/runtime/serializer/versioning" + "k8s.io/kubernetes/plugin/pkg/scheduler/api" + _ "k8s.io/kubernetes/plugin/pkg/scheduler/api/v1" ) // Version is the string that represents the current external default version. @@ -33,6 +38,10 @@ const OldestVersion = "v1" var Versions = []string{"v1"} // Codec is the default codec for serializing input that should use -// the latest supported version. -// This codec can decode any object that Kubernetes is aware of. -var Codec = v1.Codec +// the latest supported version. It supports JSON by default. +var Codec = versioning.NewCodecForScheme( + api.Scheme, + json.NewSerializer(json.DefaultMetaFactory, api.Scheme, runtime.ObjectTyperToTyper(api.Scheme), true), + []unversioned.GroupVersion{{Version: Version}}, + []unversioned.GroupVersion{{Version: runtime.APIVersionInternal}}, +) diff --git a/plugin/pkg/scheduler/api/register.go b/plugin/pkg/scheduler/api/register.go index 53a19cedafb..3b988f25bfa 100644 --- a/plugin/pkg/scheduler/api/register.go +++ b/plugin/pkg/scheduler/api/register.go @@ -26,9 +26,12 @@ var Scheme = runtime.NewScheme() // SchemeGroupVersion is group version used to register these objects // TODO this should be in the "scheduler" group -var SchemeGroupVersion = unversioned.GroupVersion{Group: "", Version: ""} +var SchemeGroupVersion = unversioned.GroupVersion{Group: "", Version: runtime.APIVersionInternal} func init() { + if err := Scheme.AddIgnoredConversionType(&unversioned.TypeMeta{}, &unversioned.TypeMeta{}); err != nil { + panic(err) + } Scheme.AddKnownTypes(SchemeGroupVersion, &Policy{}, ) diff --git a/plugin/pkg/scheduler/api/v1/register.go b/plugin/pkg/scheduler/api/v1/register.go index 110d1ec2604..8e6d754376c 100644 --- a/plugin/pkg/scheduler/api/v1/register.go +++ b/plugin/pkg/scheduler/api/v1/register.go @@ -18,7 +18,6 @@ package v1 import ( "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/plugin/pkg/scheduler/api" ) @@ -26,9 +25,6 @@ import ( // TODO this should be in the "scheduler" group var SchemeGroupVersion = unversioned.GroupVersion{Group: "", Version: "v1"} -// Codec encodes internal objects to the v1 scheme -var Codec = runtime.CodecFor(api.Scheme, SchemeGroupVersion) - func init() { api.Scheme.AddKnownTypes(SchemeGroupVersion, &Policy{},