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.
This commit is contained in:
Clayton Coleman 2015-12-21 00:21:26 -05:00
parent 125ef6fbc8
commit c1d932e44a
54 changed files with 258 additions and 239 deletions

View File

@ -68,7 +68,6 @@ func enableVersions(externalVersions []unversioned.GroupVersion) error {
groupMeta := apimachinery.GroupMeta{ groupMeta := apimachinery.GroupMeta{
GroupVersion: preferredExternalVersion, GroupVersion: preferredExternalVersion,
GroupVersions: externalVersions, GroupVersions: externalVersions,
Codec: runtime.CodecFor(api.Scheme, preferredExternalVersion),
RESTMapper: newRESTMapper(externalVersions), RESTMapper: newRESTMapper(externalVersions),
SelfLinker: runtime.SelfLinker(accessor), SelfLinker: runtime.SelfLinker(accessor),
InterfacesFor: interfacesFor, InterfacesFor: interfacesFor,
@ -97,7 +96,6 @@ func interfacesFor(version unversioned.GroupVersion) (*meta.VersionInterfaces, e
switch version { switch version {
case v1.SchemeGroupVersion: case v1.SchemeGroupVersion:
return &meta.VersionInterfaces{ return &meta.VersionInterfaces{
Codec: v1.Codec,
ObjectConvertor: api.Scheme, ObjectConvertor: api.Scheme,
MetadataAccessor: accessor, MetadataAccessor: accessor,
}, nil }, nil

View File

@ -22,7 +22,7 @@ import (
"k8s.io/kubernetes/pkg/runtime" "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) { func AddToScheme(scheme *runtime.Scheme) {
// Add the API to Scheme. // Add the API to Scheme.

View File

@ -17,7 +17,6 @@ limitations under the License.
package v1 package v1
import ( import (
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/api/unversioned"
"k8s.io/kubernetes/pkg/api/v1" "k8s.io/kubernetes/pkg/api/v1"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
@ -25,8 +24,6 @@ import (
var SchemeGroupVersion = unversioned.GroupVersion{Group: "testgroup", Version: "v1"} var SchemeGroupVersion = unversioned.GroupVersion{Group: "testgroup", Version: "v1"}
var Codec = runtime.CodecFor(api.Scheme, SchemeGroupVersion)
func AddToScheme(scheme *runtime.Scheme) { func AddToScheme(scheme *runtime.Scheme) {
// Add the API to Scheme. // Add the API to Scheme.
addKnownTypes(scheme) addKnownTypes(scheme)

View File

@ -22,14 +22,9 @@ import (
"k8s.io/kubernetes/pkg/conversion" "k8s.io/kubernetes/pkg/conversion"
"k8s.io/kubernetes/pkg/fields" "k8s.io/kubernetes/pkg/fields"
"k8s.io/kubernetes/pkg/labels" "k8s.io/kubernetes/pkg/labels"
"k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/util/intstr" "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() { func init() {
Scheme.AddDefaultingFuncs( Scheme.AddDefaultingFuncs(
func(obj *ListOptions) { func(obj *ListOptions) {

View File

@ -22,6 +22,7 @@ import (
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/testapi" "k8s.io/kubernetes/pkg/api/testapi"
"k8s.io/kubernetes/pkg/runtime"
) )
func BenchmarkPodConversion(b *testing.B) { func BenchmarkPodConversion(b *testing.B) {
@ -30,7 +31,7 @@ func BenchmarkPodConversion(b *testing.B) {
b.Fatalf("Unexpected error while reading file: %v", err) b.Fatalf("Unexpected error while reading file: %v", err)
} }
var pod api.Pod 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) b.Fatalf("Unexpected error decoding pod: %v", err)
} }
@ -41,7 +42,7 @@ func BenchmarkPodConversion(b *testing.B) {
if err != nil { if err != nil {
b.Fatalf("Conversion error: %v", err) 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 { if err != nil {
b.Fatalf("Conversion error: %v", err) b.Fatalf("Conversion error: %v", err)
} }
@ -58,7 +59,7 @@ func BenchmarkNodeConversion(b *testing.B) {
b.Fatalf("Unexpected error while reading file: %v", err) b.Fatalf("Unexpected error while reading file: %v", err)
} }
var node api.Node 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) b.Fatalf("Unexpected error decoding node: %v", err)
} }
@ -69,7 +70,7 @@ func BenchmarkNodeConversion(b *testing.B) {
if err != nil { if err != nil {
b.Fatalf("Conversion error: %v", err) 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 { if err != nil {
b.Fatalf("Conversion error: %v", err) b.Fatalf("Conversion error: %v", err)
} }
@ -86,7 +87,7 @@ func BenchmarkReplicationControllerConversion(b *testing.B) {
b.Fatalf("Unexpected error while reading file: %v", err) b.Fatalf("Unexpected error while reading file: %v", err)
} }
var replicationController api.ReplicationController 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) b.Fatalf("Unexpected error decoding node: %v", err)
} }
@ -97,7 +98,7 @@ func BenchmarkReplicationControllerConversion(b *testing.B) {
if err != nil { if err != nil {
b.Fatalf("Conversion error: %v", err) 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 { if err != nil {
b.Fatalf("Conversion error: %v", err) b.Fatalf("Conversion error: %v", err)
} }

View File

@ -54,7 +54,7 @@ func doDeepCopyTest(t *testing.T, kind unversioned.GroupVersionKind, f *fuzz.Fuz
} }
if !reflect.DeepEqual(item, itemCopy) { 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))
} }
} }

View File

@ -21,6 +21,8 @@ import (
"testing" "testing"
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/testapi"
"k8s.io/kubernetes/pkg/runtime"
) )
func BenchmarkPodCopy(b *testing.B) { func BenchmarkPodCopy(b *testing.B) {
@ -29,7 +31,7 @@ func BenchmarkPodCopy(b *testing.B) {
b.Fatalf("Unexpected error while reading file: %v", err) b.Fatalf("Unexpected error while reading file: %v", err)
} }
var pod api.Pod 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) 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) b.Fatalf("Unexpected error while reading file: %v", err)
} }
var node api.Node 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) 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) b.Fatalf("Unexpected error while reading file: %v", err)
} }
var replicationController api.ReplicationController 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) b.Fatalf("Unexpected error decoding node: %v", err)
} }

View File

@ -24,14 +24,13 @@ import (
"github.com/golang/glog" "github.com/golang/glog"
"k8s.io/kubernetes/pkg/api" "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/meta"
"k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/api/unversioned"
"k8s.io/kubernetes/pkg/api/v1" "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/runtime"
"k8s.io/kubernetes/pkg/util/sets"
) )
const importPrefix = "k8s.io/kubernetes/pkg/api" const importPrefix = "k8s.io/kubernetes/pkg/api"
@ -75,7 +74,6 @@ func enableVersions(externalVersions []unversioned.GroupVersion) error {
groupMeta := apimachinery.GroupMeta{ groupMeta := apimachinery.GroupMeta{
GroupVersion: preferredExternalVersion, GroupVersion: preferredExternalVersion,
GroupVersions: externalVersions, GroupVersions: externalVersions,
Codec: runtime.CodecFor(api.Scheme, preferredExternalVersion),
RESTMapper: newRESTMapper(externalVersions), RESTMapper: newRESTMapper(externalVersions),
SelfLinker: runtime.SelfLinker(accessor), SelfLinker: runtime.SelfLinker(accessor),
InterfacesFor: interfacesFor, InterfacesFor: interfacesFor,
@ -127,7 +125,6 @@ func interfacesFor(version unversioned.GroupVersion) (*meta.VersionInterfaces, e
switch version { switch version {
case v1.SchemeGroupVersion: case v1.SchemeGroupVersion:
return &meta.VersionInterfaces{ return &meta.VersionInterfaces{
Codec: v1.Codec,
ObjectConvertor: api.Scheme, ObjectConvertor: api.Scheme,
MetadataAccessor: accessor, MetadataAccessor: accessor,
}, nil }, nil

View File

@ -18,11 +18,13 @@ package install
import ( import (
"encoding/json" "encoding/json"
"reflect"
"testing" "testing"
internal "k8s.io/kubernetes/pkg/api" internal "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/api/unversioned"
"k8s.io/kubernetes/pkg/apimachinery/registered" "k8s.io/kubernetes/pkg/apimachinery/registered"
"k8s.io/kubernetes/pkg/runtime"
) )
func TestResourceVersioner(t *testing.T) { func TestResourceVersioner(t *testing.T) {
@ -49,7 +51,7 @@ func TestCodec(t *testing.T) {
pod := internal.Pod{} pod := internal.Pod{}
// We do want to use package registered rather than testapi here, because we // 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. // 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 { if err != nil {
t.Fatalf("unexpected error: %v", err) t.Fatalf("unexpected error: %v", err)
} }
@ -100,8 +102,8 @@ func TestRESTMapper(t *testing.T) {
} }
interfaces, _ := registered.GroupOrDie(internal.GroupName).InterfacesFor(version) interfaces, _ := registered.GroupOrDie(internal.GroupName).InterfacesFor(version)
if mapping.Codec != interfaces.Codec { if mapping.ObjectConvertor != interfaces.ObjectConvertor {
t.Errorf("unexpected codec: %#v, expected: %#v", mapping, interfaces) t.Errorf("unexpected: %#v, expected: %#v", mapping, interfaces)
} }
rc := &internal.ReplicationController{ObjectMeta: internal.ObjectMeta{Name: "foo"}} 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))
}
}
}

View File

@ -120,7 +120,7 @@ func SetList(list runtime.Object, objects []runtime.Object) error {
} else if src.Type().ConvertibleTo(dest.Type()) { } else if src.Type().ConvertibleTo(dest.Type()) {
dest.Set(src.Convert(dest.Type())) dest.Set(src.Convert(dest.Type()))
} else { } 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) items.Set(slice)

View File

@ -24,7 +24,6 @@ import (
// VersionInterfaces contains the interfaces one should use for dealing with types of a particular version. // VersionInterfaces contains the interfaces one should use for dealing with types of a particular version.
type VersionInterfaces struct { type VersionInterfaces struct {
runtime.Codec
runtime.ObjectConvertor runtime.ObjectConvertor
MetadataAccessor 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 contains the information needed to deal with REST Resources that are in a resource hierarchy
Scope RESTScope Scope RESTScope
runtime.Codec
runtime.ObjectConvertor runtime.ObjectConvertor
MetadataAccessor MetadataAccessor
} }

View File

@ -73,7 +73,7 @@ func TestAPIObjectMeta(t *testing.T) {
if err != nil { if err != nil {
t.Fatalf("unexpected error: %v", err) 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) t.Errorf("expected %v, got %v", e, a)
} }
if e, a := "b", typeAccessor.GetKind(); 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 { if e, a := types.UID("other"), j.UID; e != a {
t.Errorf("expected %v, got %v", 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) t.Errorf("expected %v, got %v", e, a)
} }
if e, a := "d", j.Kind; e != a { if e, a := "d", j.Kind; e != a {
@ -117,7 +117,7 @@ func TestAPIObjectMeta(t *testing.T) {
typeAccessor.SetAPIVersion("d") typeAccessor.SetAPIVersion("d")
typeAccessor.SetKind("e") 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) t.Errorf("expected %v, got %v", e, a)
} }
if e, a := "e", j.Kind; e != a { if e, a := "e", j.Kind; e != a {
@ -308,7 +308,7 @@ func TestGenericTypeMetaAccessor(t *testing.T) {
if err != nil { if err != nil {
t.Errorf("unexpected error: %v", err) 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) t.Errorf("expected %v, got %v", e, a)
} }
kind, err := accessor.Kind(j) kind, err := accessor.Kind(j)
@ -392,7 +392,7 @@ func TestGenericTypeMetaAccessor(t *testing.T) {
if e, a := "other", j.TypeMeta.UID; e != a { if e, a := "other", j.TypeMeta.UID; e != a {
t.Errorf("expected %v, got %v", 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) t.Errorf("expected %v, got %v", e, a)
} }
if e, a := "d", j.TypeMeta.Kind; e != a { if e, a := "d", j.TypeMeta.Kind; e != a {
@ -757,7 +757,7 @@ func BenchmarkAccessorSetReflection(b *testing.B) {
Name: "foo", Name: "foo",
GenerateName: "prefix", GenerateName: "prefix",
UID: "uid", UID: "uid",
APIVersion: "/a", APIVersion: "a",
Kind: "b", Kind: "b",
ResourceVersion: "1", ResourceVersion: "1",
SelfLink: "some/place/only/we/know", SelfLink: "some/place/only/we/know",

View File

@ -23,6 +23,7 @@ import (
"strings" "strings"
"k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/api/unversioned"
"k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/util/sets" "k8s.io/kubernetes/pkg/util/sets"
) )
@ -84,7 +85,7 @@ type DefaultRESTMapper struct {
var _ RESTMapper = &DefaultRESTMapper{} 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. // given api version, or an error if no such api version exists.
type VersionInterfacesFunc func(version unversioned.GroupVersion) (*VersionInterfaces, error) 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 // 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 // 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), // 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 { func NewDefaultRESTMapper(defaultGroupVersions []unversioned.GroupVersion, f VersionInterfacesFunc) *DefaultRESTMapper {
resourceToKind := make(map[unversioned.GroupVersionResource]unversioned.GroupVersionKind) resourceToKind := make(map[unversioned.GroupVersionResource]unversioned.GroupVersionKind)
kindToPluralResource := make(map[unversioned.GroupVersionKind]unversioned.GroupVersionResource) 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) { func (m *DefaultRESTMapper) KindsFor(input unversioned.GroupVersionResource) ([]unversioned.GroupVersionKind, error) {
resource := input.GroupVersion().WithResource(strings.ToLower(input.Resource)) resource := input.GroupVersion().WithResource(strings.ToLower(input.Resource))
if resource.Version == runtime.APIVersionInternal {
resource.Version = ""
}
hasResource := len(resource.Resource) > 0 hasResource := len(resource.Resource) > 0
hasGroup := len(resource.Group) > 0 hasGroup := len(resource.Group) > 0
@ -412,7 +416,7 @@ func (m *DefaultRESTMapper) RESTMapping(gk unversioned.GroupKind, versions ...st
var gvk *unversioned.GroupVersionKind var gvk *unversioned.GroupVersionKind
hadVersion := false hadVersion := false
for _, version := range versions { for _, version := range versions {
if len(version) == 0 { if len(version) == 0 || version == runtime.APIVersionInternal {
continue continue
} }
@ -472,7 +476,6 @@ func (m *DefaultRESTMapper) RESTMapping(gk unversioned.GroupKind, versions ...st
GroupVersionKind: *gvk, GroupVersionKind: *gvk,
Scope: scope, Scope: scope,
Codec: interfaces.Codec,
ObjectConvertor: interfaces.ObjectConvertor, ObjectConvertor: interfaces.ObjectConvertor,
MetadataAccessor: interfaces.MetadataAccessor, MetadataAccessor: interfaces.MetadataAccessor,
} }

View File

@ -18,8 +18,6 @@ package meta
import ( import (
"errors" "errors"
"io"
"net/url"
"reflect" "reflect"
"strings" "strings"
"testing" "testing"
@ -28,38 +26,6 @@ import (
"k8s.io/kubernetes/pkg/runtime" "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{} type fakeConvertor struct{}
func (fakeConvertor) Convert(in, out interface{}) error { func (fakeConvertor) Convert(in, out interface{}) error {
@ -74,12 +40,11 @@ func (fakeConvertor) ConvertFieldLabel(version, kind, label, value string) (stri
return label, value, nil return label, value, nil
} }
var validCodec = fakeCodec{}
var validAccessor = resourceAccessor{} var validAccessor = resourceAccessor{}
var validConvertor = fakeConvertor{} var validConvertor = fakeConvertor{}
func fakeInterfaces(version unversioned.GroupVersion) (*VersionInterfaces, error) { 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") var unmatchedErr = errors.New("no version")
@ -512,7 +477,7 @@ func TestRESTMapperRESTMapping(t *testing.T) {
t.Errorf("%d: unexpected resource: %#v", i, mapping) 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) t.Errorf("%d: missing codec and accessor: %#v", i, mapping)
} }

View File

@ -20,16 +20,27 @@ import (
"k8s.io/kubernetes/pkg/api/meta" "k8s.io/kubernetes/pkg/api/meta"
"k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/api/unversioned"
"k8s.io/kubernetes/pkg/runtime" "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. // Scheme is the default instance of runtime.Scheme to which types in the Kubernetes API are already registered.
var Scheme = runtime.NewScheme() 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 // GroupName is the group name use in this package
const GroupName = "" const GroupName = ""
// SchemeGroupVersion is group version used to register these objects // 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 // Kind takes an unqualified kind and returns back a Group qualified GroupKind
func Kind(kind string) unversioned.GroupKind { func Kind(kind string) unversioned.GroupKind {
@ -42,6 +53,9 @@ func Resource(resource string) unversioned.GroupResource {
} }
func AddToScheme(scheme *runtime.Scheme) { func AddToScheme(scheme *runtime.Scheme) {
if err := Scheme.AddIgnoredConversionType(&unversioned.TypeMeta{}, &unversioned.TypeMeta{}); err != nil {
panic(err)
}
scheme.AddKnownTypes(SchemeGroupVersion, scheme.AddKnownTypes(SchemeGroupVersion,
&Pod{}, &Pod{},
&PodList{}, &PodList{},
@ -86,14 +100,15 @@ func AddToScheme(scheme *runtime.Scheme) {
&RangeAllocation{}, &RangeAllocation{},
) )
// Add the Unversioned types to scheme. // Register Unversioned types under their own special group
// TODO this should not be done here Scheme.AddUnversionedTypes(Unversioned,
scheme.AddKnownTypes(SchemeGroupVersion, &unversioned.ExportOptions{}) &unversioned.ExportOptions{},
scheme.AddKnownTypes(SchemeGroupVersion, &unversioned.Status{}) &unversioned.Status{},
scheme.AddKnownTypes(SchemeGroupVersion, &unversioned.APIVersions{}) &unversioned.APIVersions{},
scheme.AddKnownTypes(SchemeGroupVersion, &unversioned.APIGroupList{}) &unversioned.APIGroupList{},
scheme.AddKnownTypes(SchemeGroupVersion, &unversioned.APIGroup{}) &unversioned.APIGroup{},
scheme.AddKnownTypes(SchemeGroupVersion, &unversioned.APIResourceList{}) &unversioned.APIResourceList{},
)
} }
func (obj *Pod) GetObjectMeta() meta.Object { return &obj.ObjectMeta } func (obj *Pod) GetObjectMeta() meta.Object { return &obj.ObjectMeta }

View File

@ -61,6 +61,8 @@ func fuzzInternalObject(t *testing.T, forVersion unversioned.GroupVersion, item
} }
func roundTrip(t *testing.T, codec runtime.Codec, item runtime.Object) { func roundTrip(t *testing.T, codec runtime.Codec, item runtime.Object) {
t.Logf("codec: %#v", codec)
printer := spew.ConfigState{DisableMethods: true} printer := spew.ConfigState{DisableMethods: true}
name := reflect.TypeOf(item).Elem().Name() 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) obj3 := reflect.New(reflect.TypeOf(item).Elem()).Interface().(runtime.Object)
err = runtime.DecodeInto(codec, data, obj3) if err := runtime.DecodeInto(codec, data, obj3); err != nil {
if err != nil {
t.Errorf("2: %v: %v", name, err) t.Errorf("2: %v: %v", name, err)
return return
} }
@ -122,7 +123,7 @@ func TestSpecificKind(t *testing.T) {
// api.Scheme.Log(t) // api.Scheme.Log(t)
// defer api.Scheme.Log(nil) // defer api.Scheme.Log(nil)
kind := "Pod" kind := "List"
for i := 0; i < *fuzzIters; i++ { for i := 0; i < *fuzzIters; i++ {
doRoundTripTest(kind, t) doRoundTripTest(kind, t)
if t.Failed() { if t.Failed() {
@ -180,7 +181,7 @@ func doRoundTripTest(kind string, t *testing.T) {
roundTripSame(t, item, nonRoundTrippableTypesByVersion[kind]...) roundTripSame(t, item, nonRoundTrippableTypesByVersion[kind]...)
} }
if !nonInternalRoundTrippableTypes.Has(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) obj := runtime.Object(pod)
data, err := testapi.Default.Codec().Encode(obj) data, err := runtime.Encode(testapi.Default.Codec(), obj)
obj2, err2 := testapi.Default.Codec().Decode(data) obj2, err2 := runtime.Decode(testapi.Default.Codec(), data)
if err != nil || err2 != nil { if err != nil || err2 != nil {
t.Fatalf("Failure: '%v' '%v'", err, err2) t.Fatalf("Failure: '%v' '%v'", err, err2)
} }
@ -216,11 +217,11 @@ func TestEncode_Ptr(t *testing.T) {
func TestBadJSONRejection(t *testing.T) { func TestBadJSONRejection(t *testing.T) {
badJSONMissingKind := []byte(`{ }`) 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) t.Errorf("Did not reject despite lack of kind field: %s", badJSONMissingKind)
} }
badJSONUnknownType := []byte(`{"kind": "bar"}`) 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) t.Errorf("Did not reject despite use of unknown type: %s", badJSONUnknownType)
} }
/*badJSONKindMismatch := []byte(`{"kind": "Pod"}`) /*badJSONKindMismatch := []byte(`{"kind": "Pod"}`)
@ -240,14 +241,14 @@ func TestUnversionedTypes(t *testing.T) {
for _, obj := range testcases { for _, obj := range testcases {
// Make sure the unversioned codec can encode // Make sure the unversioned codec can encode
unversionedJSON, err := api.Codec.Encode(obj) unversionedJSON, err := runtime.Encode(testapi.Default.Codec(), obj)
if err != nil { if err != nil {
t.Errorf("%v: unexpected error: %v", obj, err) t.Errorf("%v: unexpected error: %v", obj, err)
continue continue
} }
// Make sure the versioned codec under test can decode // 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 { if err != nil {
t.Errorf("%v: unexpected error: %v", obj, err) t.Errorf("%v: unexpected error: %v", obj, err)
continue continue
@ -278,7 +279,7 @@ func BenchmarkEncodeCodec(b *testing.B) {
width := len(items) width := len(items)
b.ResetTimer() b.ResetTimer()
for i := 0; i < b.N; i++ { 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) b.Fatal(err)
} }
} }
@ -320,7 +321,7 @@ func BenchmarkDecodeCodec(b *testing.B) {
b.StopTimer() b.StopTimer()
} }
func BenchmarkDecodeIntoCodec(b *testing.B) { func BenchmarkDecodeIntoExternalCodec(b *testing.B) {
codec := testapi.Default.Codec() codec := testapi.Default.Codec()
items := benchmarkItems() items := benchmarkItems()
width := len(items) width := len(items)
@ -343,6 +344,29 @@ func BenchmarkDecodeIntoCodec(b *testing.B) {
b.StopTimer() 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 // BenchmarkDecodeJSON provides a baseline for regular JSON decode performance
func BenchmarkDecodeIntoJSON(b *testing.B) { func BenchmarkDecodeIntoJSON(b *testing.B) {
codec := testapi.Default.Codec() codec := testapi.Default.Codec()

View File

@ -47,7 +47,7 @@ type TestGroup struct {
func init() { func init() {
kubeTestAPI := os.Getenv("KUBE_TEST_API") kubeTestAPI := os.Getenv("KUBE_TEST_API")
if kubeTestAPI != "" { if len(kubeTestAPI) != 0 {
testGroupVersions := strings.Split(kubeTestAPI, ",") testGroupVersions := strings.Split(kubeTestAPI, ",")
for _, gvString := range testGroupVersions { for _, gvString := range testGroupVersions {
groupVersion, err := unversioned.ParseGroupVersion(gvString) groupVersion, err := unversioned.ParseGroupVersion(gvString)
@ -57,7 +57,7 @@ func init() {
Groups[groupVersion.Group] = TestGroup{ Groups[groupVersion.Group] = TestGroup{
externalGroupVersion: groupVersion, 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 // Codec returns the codec for the API version to test against, as set by the
// KUBE_TEST_API env var. // KUBE_TEST_API env var.
func (g TestGroup) Codec() runtime.Codec { func (g TestGroup) Codec() runtime.Codec {
// TODO: caesarxuchao: Restructure the body once we have a central `registered`. return api.Codecs.LegacyCodec(g.externalGroupVersion)
interfaces, err := registered.GroupOrDie(g.externalGroupVersion.Group).InterfacesFor(g.externalGroupVersion)
if err != nil {
panic(err)
}
return interfaces.Codec
} }
// Converter returns the api.Scheme for the API version to test against, as set by the // 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 // Codec used for unversioned types
if api.Scheme.Recognizes(kind) { 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) return nil, fmt.Errorf("unexpected kind: %v", kind)
} }

View File

@ -26,7 +26,6 @@ import (
"strings" "strings"
"testing" "testing"
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/api/unversioned"
"k8s.io/kubernetes/pkg/kubectl" "k8s.io/kubernetes/pkg/kubectl"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
@ -48,7 +47,7 @@ func TestCompatibility(
) { ) {
// Decode // Decode
codec := runtime.CodecFor(api.Scheme, version) codec := api.Codecs.LegacyCodec(version)
obj, err := runtime.Decode(codec, input) obj, err := runtime.Decode(codec, input)
if err != nil { if err != nil {
t.Fatalf("Unexpected error: %v", err) t.Fatalf("Unexpected error: %v", err)

View File

@ -59,9 +59,6 @@ func FuzzerFor(t *testing.T, version unversioned.GroupVersion, src rand.Source)
func(q *resource.Quantity, c fuzz.Continue) { func(q *resource.Quantity, c fuzz.Continue) {
*q = *resource.NewQuantity(c.Int63n(1000), resource.DecimalExponent) *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) { func(j *runtime.TypeMeta, c fuzz.Continue) {
// We have to customize the randomization of TypeMetas because their // We have to customize the randomization of TypeMetas because their
// APIVersion and Kind must remain blank in memory. // 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 // TODO: uncomment when round trip starts from a versioned object
if true { //c.RandBool() { if true { //c.RandBool() {
*j = &runtime.Unknown{ *j = &runtime.Unknown{
// apiVersion has rules now. Since it includes <group>/<version> and only `v1` can be bare, // We do not set TypeMeta here because it is not carried through a round trip
// then this must choose a valid format to deserialize RawJSON: []byte(`{"apiVersion":"unknown.group/unknown","kind":"Something","someKey":"someValue"}`),
TypeMeta: runtime.TypeMeta{Kind: "Something", APIVersion: "unknown.group/unknown"},
RawJSON: []byte(`{"apiVersion":"unknown.group/unknown","kind":"Something","someKey":"someValue"}`),
} }
} else { } else {
types := []runtime.Object{&api.Pod{}, &api.ReplicationController{}} types := []runtime.Object{&api.Pod{}, &api.ReplicationController{}}

View File

@ -141,11 +141,13 @@ func (gv GroupVersion) String() string {
} }
// special case of "v1" for backward compatibility // special case of "v1" for backward compatibility
if gv.Group == "" && gv.Version == "v1" { if len(gv.Group) == 0 && gv.Version == "v1" {
return gv.Version return gv.Version
} else { }
if len(gv.Group) > 0 {
return gv.Group + "/" + gv.Version return gv.Group + "/" + gv.Version
} }
return gv.Version
} }
// ParseGroupVersion turns "group/version" string into a GroupVersion struct. It reports error // ParseGroupVersion turns "group/version" string into a GroupVersion struct. It reports error
@ -163,6 +165,8 @@ func ParseGroupVersion(gv string) (GroupVersion, error) {
switch { switch {
case len(s) == 1 && gv == "v1": case len(s) == 1 && gv == "v1":
return GroupVersion{"", "v1"}, nil return GroupVersion{"", "v1"}, nil
case len(s) == 1:
return GroupVersion{"", s[0]}, nil
case len(s) == 2: case len(s) == 2:
return GroupVersion{s[0], s[1]}, nil return GroupVersion{s[0], s[1]}, nil
default: default:

View File

@ -28,12 +28,13 @@ import (
) )
func roundTrip(t *testing.T, obj runtime.Object) runtime.Object { 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 { if err != nil {
t.Errorf("%v\n %#v", err, obj) t.Errorf("%v\n %#v", err, obj)
return nil return nil
} }
obj2, err := api.Codec.Decode(data) obj2, err := runtime.Decode(codec, data)
if err != nil { if err != nil {
t.Errorf("%v\nData: %s\nSource: %#v", err, string(data), obj) t.Errorf("%v\nData: %s\nSource: %#v", err, string(data), obj)
return nil return nil

View File

@ -17,7 +17,6 @@ limitations under the License.
package v1 package v1
import ( import (
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/api/unversioned"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
) )
@ -28,9 +27,6 @@ const GroupName = ""
// SchemeGroupVersion is group version used to register these objects // SchemeGroupVersion is group version used to register these objects
var SchemeGroupVersion = unversioned.GroupVersion{Group: GroupName, Version: "v1"} 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) { func AddToScheme(scheme *runtime.Scheme) {
// Add the API to Scheme. // Add the API to Scheme.
addKnownTypes(scheme) addKnownTypes(scheme)

View File

@ -72,7 +72,7 @@ func TestValidateOk(t *testing.T) {
for _, test := range tests { for _, test := range tests {
testObj := test.obj testObj := test.obj
apiObjectFuzzer.Fuzz(testObj) apiObjectFuzzer.Fuzz(testObj)
data, err := testapi.Default.Codec().Encode(testObj) data, err := runtime.Encode(testapi.Default.Codec(), testObj)
if err != nil { if err != nil {
t.Errorf("unexpected error: %v", err) t.Errorf("unexpected error: %v", err)
} }

View File

@ -17,10 +17,14 @@ limitations under the License.
package registered package registered
import ( import (
"encoding/json"
"reflect"
"testing" "testing"
"k8s.io/kubernetes/pkg/api/testapi"
"k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/api/unversioned"
"k8s.io/kubernetes/pkg/apimachinery" "k8s.io/kubernetes/pkg/apimachinery"
"k8s.io/kubernetes/pkg/runtime"
) )
func TestAllPreferredGroupVersions(t *testing.T) { func TestAllPreferredGroupVersions(t *testing.T) {
@ -66,3 +70,61 @@ func TestAllPreferredGroupVersions(t *testing.T) {
reset() 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)
}
}

View File

@ -17,8 +17,7 @@ limitations under the License.
package latest package latest
import ( 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

View File

@ -14,11 +14,12 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package api package abac
import ( import (
"k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/api/unversioned"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/runtime/serializer"
) )
// Group is the API group for abac // 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. // Scheme is the default instance of runtime.Scheme to which types in the abac API group are registered.
var Scheme = runtime.NewScheme() var Scheme = runtime.NewScheme()
// Codecs provides access to encoding and decoding for the scheme
var Codecs = serializer.NewCodecFactory(Scheme)
func init() { func init() {
Scheme.AddInternalGroupVersion(unversioned.GroupVersion{Group: Group, Version: ""}) Scheme.AddKnownTypes(unversioned.GroupVersion{Group: Group, Version: runtime.APIVersionInternal},
Scheme.AddKnownTypes(unversioned.GroupVersion{Group: Group, Version: ""},
&Policy{}, &Policy{},
) )
} }

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package api package abac
import "k8s.io/kubernetes/pkg/api/unversioned" import "k8s.io/kubernetes/pkg/api/unversioned"

View File

@ -17,7 +17,7 @@ limitations under the License.
package v0 package v0
import ( import (
"k8s.io/kubernetes/pkg/apis/abac" api "k8s.io/kubernetes/pkg/apis/abac"
"k8s.io/kubernetes/pkg/conversion" "k8s.io/kubernetes/pkg/conversion"
) )

View File

@ -20,7 +20,7 @@ import (
"reflect" "reflect"
"testing" "testing"
"k8s.io/kubernetes/pkg/apis/abac" api "k8s.io/kubernetes/pkg/apis/abac"
"k8s.io/kubernetes/pkg/apis/abac/v0" "k8s.io/kubernetes/pkg/apis/abac/v0"
) )

View File

@ -18,16 +18,12 @@ package v0
import ( import (
"k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/api/unversioned"
"k8s.io/kubernetes/pkg/apis/abac" api "k8s.io/kubernetes/pkg/apis/abac"
"k8s.io/kubernetes/pkg/runtime"
) )
// GroupVersion is the API group and version for abac v0 // GroupVersion is the API group and version for abac v0
var GroupVersion = unversioned.GroupVersion{Group: api.Group, Version: "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() { func init() {
api.Scheme.AddKnownTypes(GroupVersion, api.Scheme.AddKnownTypes(GroupVersion,
&Policy{}, &Policy{},

View File

@ -18,16 +18,12 @@ package v1beta1
import ( import (
"k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/api/unversioned"
"k8s.io/kubernetes/pkg/apis/abac" api "k8s.io/kubernetes/pkg/apis/abac"
"k8s.io/kubernetes/pkg/runtime"
) )
// GroupVersion is the API group and version for abac v1beta1 // GroupVersion is the API group and version for abac v1beta1
var GroupVersion = unversioned.GroupVersion{Group: api.Group, Version: "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() { func init() {
api.Scheme.AddKnownTypes(GroupVersion, api.Scheme.AddKnownTypes(GroupVersion,
&Policy{}, &Policy{},

View File

@ -75,7 +75,6 @@ func enableVersions(externalVersions []unversioned.GroupVersion) error {
groupMeta := apimachinery.GroupMeta{ groupMeta := apimachinery.GroupMeta{
GroupVersion: preferredExternalVersion, GroupVersion: preferredExternalVersion,
GroupVersions: externalVersions, GroupVersions: externalVersions,
Codec: runtime.CodecFor(api.Scheme, preferredExternalVersion),
RESTMapper: newRESTMapper(externalVersions), RESTMapper: newRESTMapper(externalVersions),
SelfLinker: runtime.SelfLinker(accessor), SelfLinker: runtime.SelfLinker(accessor),
InterfacesFor: interfacesFor, InterfacesFor: interfacesFor,
@ -119,7 +118,6 @@ func interfacesFor(version unversioned.GroupVersion) (*meta.VersionInterfaces, e
switch version { switch version {
case v1beta1.SchemeGroupVersion: case v1beta1.SchemeGroupVersion:
return &meta.VersionInterfaces{ return &meta.VersionInterfaces{
Codec: v1beta1.Codec,
ObjectConvertor: api.Scheme, ObjectConvertor: api.Scheme,
MetadataAccessor: accessor, MetadataAccessor: accessor,
}, nil }, nil

View File

@ -25,7 +25,7 @@ import (
const GroupName = "authorization.k8s.io" const GroupName = "authorization.k8s.io"
// SchemeGroupVersion is group version used to register these objects // 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 // Kind takes an unqualified kind and returns back a Group qualified GroupKind
func Kind(kind string) unversioned.GroupKind { func Kind(kind string) unversioned.GroupKind {

View File

@ -17,7 +17,6 @@ limitations under the License.
package v1beta1 package v1beta1
import ( import (
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/api/unversioned"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
) )
@ -28,8 +27,6 @@ const GroupName = "authorization.k8s.io"
// SchemeGroupVersion is group version used to register these objects // SchemeGroupVersion is group version used to register these objects
var SchemeGroupVersion = unversioned.GroupVersion{Group: GroupName, Version: "v1beta1"} var SchemeGroupVersion = unversioned.GroupVersion{Group: GroupName, Version: "v1beta1"}
var Codec = runtime.CodecFor(api.Scheme, SchemeGroupVersion)
func AddToScheme(scheme *runtime.Scheme) { func AddToScheme(scheme *runtime.Scheme) {
// Add the API to Scheme. // Add the API to Scheme.
addKnownTypes(scheme) addKnownTypes(scheme)

View File

@ -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)
}

View File

@ -75,7 +75,6 @@ func enableVersions(externalVersions []unversioned.GroupVersion) error {
groupMeta := apimachinery.GroupMeta{ groupMeta := apimachinery.GroupMeta{
GroupVersion: preferredExternalVersion, GroupVersion: preferredExternalVersion,
GroupVersions: externalVersions, GroupVersions: externalVersions,
Codec: runtime.CodecFor(api.Scheme, preferredExternalVersion),
RESTMapper: newRESTMapper(externalVersions), RESTMapper: newRESTMapper(externalVersions),
SelfLinker: runtime.SelfLinker(accessor), SelfLinker: runtime.SelfLinker(accessor),
InterfacesFor: interfacesFor, InterfacesFor: interfacesFor,
@ -104,7 +103,6 @@ func interfacesFor(version unversioned.GroupVersion) (*meta.VersionInterfaces, e
switch version { switch version {
case v1alpha1.SchemeGroupVersion: case v1alpha1.SchemeGroupVersion:
return &meta.VersionInterfaces{ return &meta.VersionInterfaces{
Codec: v1alpha1.Codec,
ObjectConvertor: api.Scheme, ObjectConvertor: api.Scheme,
MetadataAccessor: accessor, MetadataAccessor: accessor,
}, nil }, nil

View File

@ -23,13 +23,14 @@ import (
"k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/api/unversioned"
"k8s.io/kubernetes/pkg/apimachinery/registered" "k8s.io/kubernetes/pkg/apimachinery/registered"
"k8s.io/kubernetes/pkg/apis/componentconfig" "k8s.io/kubernetes/pkg/apis/componentconfig"
"k8s.io/kubernetes/pkg/runtime"
) )
func TestCodec(t *testing.T) { func TestCodec(t *testing.T) {
daemonSet := componentconfig.KubeProxyConfiguration{} daemonSet := componentconfig.KubeProxyConfiguration{}
// We do want to use package registered rather than testapi here, because we // 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. // 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 { if err != nil {
t.Fatalf("unexpected error: %v", err) t.Fatalf("unexpected error: %v", err)
} }
@ -80,8 +81,8 @@ func TestRESTMapper(t *testing.T) {
} }
interfaces, _ := registered.GroupOrDie(componentconfig.GroupName).InterfacesFor(version) interfaces, _ := registered.GroupOrDie(componentconfig.GroupName).InterfacesFor(version)
if mapping.Codec != interfaces.Codec { if mapping.ObjectConvertor != interfaces.ObjectConvertor {
t.Errorf("unexpected codec: %#v, expected: %#v", mapping, interfaces) t.Errorf("unexpected: %#v, expected: %#v", mapping, interfaces)
} }
} }
} }

View File

@ -29,7 +29,7 @@ func AddToScheme(scheme *runtime.Scheme) {
const GroupName = "componentconfig" const GroupName = "componentconfig"
// SchemeGroupVersion is group version used to register these objects // 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 // Kind takes an unqualified kind and returns back a Group qualified GroupKind
func Kind(kind string) unversioned.GroupKind { func Kind(kind string) unversioned.GroupKind {

View File

@ -17,7 +17,6 @@ limitations under the License.
package v1alpha1 package v1alpha1
import ( import (
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/api/unversioned"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
) )
@ -28,8 +27,6 @@ const GroupName = "componentconfig"
// SchemeGroupVersion is group version used to register these objects // SchemeGroupVersion is group version used to register these objects
var SchemeGroupVersion = unversioned.GroupVersion{Group: GroupName, Version: "v1alpha1"} var SchemeGroupVersion = unversioned.GroupVersion{Group: GroupName, Version: "v1alpha1"}
var Codec = runtime.CodecFor(api.Scheme, SchemeGroupVersion)
func AddToScheme(scheme *runtime.Scheme) { func AddToScheme(scheme *runtime.Scheme) {
addKnownTypes(scheme) addKnownTypes(scheme)
addDefaultingFuncs(scheme) addDefaultingFuncs(scheme)

View File

@ -75,7 +75,6 @@ func enableVersions(externalVersions []unversioned.GroupVersion) error {
groupMeta := apimachinery.GroupMeta{ groupMeta := apimachinery.GroupMeta{
GroupVersion: preferredExternalVersion, GroupVersion: preferredExternalVersion,
GroupVersions: externalVersions, GroupVersions: externalVersions,
Codec: runtime.CodecFor(api.Scheme, preferredExternalVersion),
RESTMapper: newRESTMapper(externalVersions), RESTMapper: newRESTMapper(externalVersions),
SelfLinker: runtime.SelfLinker(accessor), SelfLinker: runtime.SelfLinker(accessor),
InterfacesFor: interfacesFor, InterfacesFor: interfacesFor,
@ -104,7 +103,6 @@ func interfacesFor(version unversioned.GroupVersion) (*meta.VersionInterfaces, e
switch version { switch version {
case v1beta1.SchemeGroupVersion: case v1beta1.SchemeGroupVersion:
return &meta.VersionInterfaces{ return &meta.VersionInterfaces{
Codec: v1beta1.Codec,
ObjectConvertor: api.Scheme, ObjectConvertor: api.Scheme,
MetadataAccessor: accessor, MetadataAccessor: accessor,
}, nil }, nil

View File

@ -25,6 +25,7 @@ import (
"k8s.io/kubernetes/pkg/apimachinery/registered" "k8s.io/kubernetes/pkg/apimachinery/registered"
"k8s.io/kubernetes/pkg/apis/extensions" "k8s.io/kubernetes/pkg/apis/extensions"
"k8s.io/kubernetes/pkg/apis/extensions/v1beta1" "k8s.io/kubernetes/pkg/apis/extensions/v1beta1"
"k8s.io/kubernetes/pkg/runtime"
) )
func TestResourceVersioner(t *testing.T) { func TestResourceVersioner(t *testing.T) {
@ -51,7 +52,7 @@ func TestCodec(t *testing.T) {
daemonSet := extensions.DaemonSet{} daemonSet := extensions.DaemonSet{}
// We do want to use package registered rather than testapi here, because we // 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. // 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 { if err != nil {
t.Fatalf("unexpected error: %v", err) t.Fatalf("unexpected error: %v", err)
} }
@ -101,9 +102,15 @@ func TestRESTMapper(t *testing.T) {
t.Errorf("incorrect groupVersion: %v", mapping) t.Errorf("incorrect groupVersion: %v", mapping)
} }
<<<<<<< HEAD
interfaces, _ := registered.GroupOrDie(extensions.GroupName).InterfacesFor(version) interfaces, _ := registered.GroupOrDie(extensions.GroupName).InterfacesFor(version)
if mapping.Codec != interfaces.Codec { if mapping.Codec != interfaces.Codec {
t.Errorf("unexpected codec: %#v, expected: %#v", mapping, interfaces) 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"}} rc := &extensions.HorizontalPodAutoscaler{ObjectMeta: api.ObjectMeta{Name: "foo"}}

View File

@ -26,7 +26,7 @@ import (
const GroupName = "extensions" const GroupName = "extensions"
// SchemeGroupVersion is group version used to register these objects // 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 // Kind takes an unqualified kind and returns back a Group qualified GroupKind
func Kind(kind string) unversioned.GroupKind { func Kind(kind string) unversioned.GroupKind {

View File

@ -588,12 +588,12 @@ func TestDefaultRequestIsNotSetForReplicaSet(t *testing.T) {
} }
func roundTrip(t *testing.T, obj runtime.Object) runtime.Object { 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 { if err != nil {
t.Errorf("%v\n %#v", err, obj) t.Errorf("%v\n %#v", err, obj)
return nil return nil
} }
obj2, err := api.Codec.Decode(data) obj2, err := runtime.Decode(api.Codecs.UniversalDecoder(), data)
if err != nil { if err != nil {
t.Errorf("%v\nData: %s\nSource: %#v", err, string(data), obj) t.Errorf("%v\nData: %s\nSource: %#v", err, string(data), obj)
return nil return nil

View File

@ -17,7 +17,6 @@ limitations under the License.
package v1beta1 package v1beta1
import ( import (
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/api/unversioned"
"k8s.io/kubernetes/pkg/api/v1" "k8s.io/kubernetes/pkg/api/v1"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
@ -29,8 +28,6 @@ const GroupName = "extensions"
// SchemeGroupVersion is group version used to register these objects // SchemeGroupVersion is group version used to register these objects
var SchemeGroupVersion = unversioned.GroupVersion{Group: GroupName, Version: "v1beta1"} var SchemeGroupVersion = unversioned.GroupVersion{Group: GroupName, Version: "v1beta1"}
var Codec = runtime.CodecFor(api.Scheme, SchemeGroupVersion)
func AddToScheme(scheme *runtime.Scheme) { func AddToScheme(scheme *runtime.Scheme) {
addKnownTypes(scheme) addKnownTypes(scheme)
addDefaultingFuncs(scheme) addDefaultingFuncs(scheme)

View File

@ -75,7 +75,6 @@ func enableVersions(externalVersions []unversioned.GroupVersion) error {
groupMeta := apimachinery.GroupMeta{ groupMeta := apimachinery.GroupMeta{
GroupVersion: preferredExternalVersion, GroupVersion: preferredExternalVersion,
GroupVersions: externalVersions, GroupVersions: externalVersions,
Codec: runtime.CodecFor(api.Scheme, preferredExternalVersion),
RESTMapper: newRESTMapper(externalVersions), RESTMapper: newRESTMapper(externalVersions),
SelfLinker: runtime.SelfLinker(accessor), SelfLinker: runtime.SelfLinker(accessor),
InterfacesFor: interfacesFor, InterfacesFor: interfacesFor,
@ -104,7 +103,6 @@ func interfacesFor(version unversioned.GroupVersion) (*meta.VersionInterfaces, e
switch version { switch version {
case v1alpha1.SchemeGroupVersion: case v1alpha1.SchemeGroupVersion:
return &meta.VersionInterfaces{ return &meta.VersionInterfaces{
Codec: v1alpha1.Codec,
ObjectConvertor: api.Scheme, ObjectConvertor: api.Scheme,
MetadataAccessor: accessor, MetadataAccessor: accessor,
}, nil }, nil

View File

@ -30,7 +30,7 @@ func AddToScheme(scheme *runtime.Scheme) {
const GroupName = "metrics" const GroupName = "metrics"
// SchemeGroupVersion is group version used to register these objects // 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 // Kind takes an unqualified kind and returns back a Group qualified GroupKind
func Kind(kind string) unversioned.GroupKind { func Kind(kind string) unversioned.GroupKind {

View File

@ -17,7 +17,6 @@ limitations under the License.
package v1alpha1 package v1alpha1
import ( import (
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/api/unversioned"
"k8s.io/kubernetes/pkg/api/v1" "k8s.io/kubernetes/pkg/api/v1"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
@ -29,8 +28,6 @@ const GroupName = "metrics"
// SchemeGroupVersion is group version used to register these objects // SchemeGroupVersion is group version used to register these objects
var SchemeGroupVersion = unversioned.GroupVersion{Group: GroupName, Version: "v1alpha1"} var SchemeGroupVersion = unversioned.GroupVersion{Group: GroupName, Version: "v1alpha1"}
var Codec = runtime.CodecFor(api.Scheme, SchemeGroupVersion)
func AddToScheme(scheme *runtime.Scheme) { func AddToScheme(scheme *runtime.Scheme) {
// Add the API to Scheme. // Add the API to Scheme.
addKnownTypes(scheme) addKnownTypes(scheme)

View File

@ -35,7 +35,6 @@ import (
"k8s.io/kubernetes/pkg/admission" "k8s.io/kubernetes/pkg/admission"
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
apierrs "k8s.io/kubernetes/pkg/api/errors" apierrs "k8s.io/kubernetes/pkg/api/errors"
"k8s.io/kubernetes/pkg/api/latest"
"k8s.io/kubernetes/pkg/api/meta" "k8s.io/kubernetes/pkg/api/meta"
"k8s.io/kubernetes/pkg/api/rest" "k8s.io/kubernetes/pkg/api/rest"
"k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/api/unversioned"
@ -70,10 +69,10 @@ var grouplessPrefix = "api"
var groupVersions = []unversioned.GroupVersion{grouplessGroupVersion, testGroupVersion, newGroupVersion} var groupVersions = []unversioned.GroupVersion{grouplessGroupVersion, testGroupVersion, newGroupVersion}
var codec = latest.Codecs.LegacyCodec(groupVersions...) var codec = api.Codecs.LegacyCodec(groupVersions...)
var grouplessCodec = latest.Codecs.LegacyCodec(grouplessGroupVersion) var grouplessCodec = api.Codecs.LegacyCodec(grouplessGroupVersion)
var testCodec = latest.Codecs.LegacyCodec(testGroupVersion) var testCodec = api.Codecs.LegacyCodec(testGroupVersion)
var newCodec = latest.Codecs.LegacyCodec(newGroupVersion) var newCodec = api.Codecs.LegacyCodec(newGroupVersion)
var accessor = meta.NewAccessor() var accessor = meta.NewAccessor()
var versioner runtime.ResourceVersioner = accessor var versioner runtime.ResourceVersioner = accessor
@ -265,7 +264,7 @@ func handleInternal(storage map[string]rest.Storage, admissionControl admission.
group.Root = "/" + grouplessPrefix group.Root = "/" + grouplessPrefix
group.GroupVersion = grouplessGroupVersion group.GroupVersion = grouplessGroupVersion
group.OptionsExternalVersion = &grouplessGroupVersion group.OptionsExternalVersion = &grouplessGroupVersion
group.Serializer = latest.Codecs group.Serializer = api.Codecs
if err := (&group).InstallREST(container); err != nil { if err := (&group).InstallREST(container); err != nil {
panic(fmt.Sprintf("unable to install container %s: %v", group.GroupVersion, err)) 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.Root = "/" + prefix
group.GroupVersion = testGroupVersion group.GroupVersion = testGroupVersion
group.OptionsExternalVersion = &testGroupVersion group.OptionsExternalVersion = &testGroupVersion
group.Serializer = latest.Codecs group.Serializer = api.Codecs
if err := (&group).InstallREST(container); err != nil { if err := (&group).InstallREST(container); err != nil {
panic(fmt.Sprintf("unable to install container %s: %v", group.GroupVersion, err)) 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.Root = "/" + prefix
group.GroupVersion = newGroupVersion group.GroupVersion = newGroupVersion
group.OptionsExternalVersion = &newGroupVersion group.OptionsExternalVersion = &newGroupVersion
group.Serializer = latest.Codecs group.Serializer = api.Codecs
if err := (&group).InstallREST(container); err != nil { if err := (&group).InstallREST(container); err != nil {
panic(fmt.Sprintf("unable to install container %s: %v", group.GroupVersion, err)) panic(fmt.Sprintf("unable to install container %s: %v", group.GroupVersion, err))
} }
@ -2391,7 +2390,7 @@ func TestUpdateREST(t *testing.T) {
GroupVersion: newGroupVersion, GroupVersion: newGroupVersion,
OptionsExternalVersion: &newGroupVersion, OptionsExternalVersion: &newGroupVersion,
Serializer: latest.Codecs, Serializer: api.Codecs,
ParameterCodec: api.ParameterCodec, ParameterCodec: api.ParameterCodec,
} }
} }
@ -2475,7 +2474,7 @@ func TestParentResourceIsRequired(t *testing.T) {
GroupVersion: newGroupVersion, GroupVersion: newGroupVersion,
OptionsExternalVersion: &newGroupVersion, OptionsExternalVersion: &newGroupVersion,
Serializer: latest.Codecs, Serializer: api.Codecs,
ParameterCodec: api.ParameterCodec, ParameterCodec: api.ParameterCodec,
} }
container := restful.NewContainer() container := restful.NewContainer()
@ -2506,7 +2505,7 @@ func TestParentResourceIsRequired(t *testing.T) {
GroupVersion: newGroupVersion, GroupVersion: newGroupVersion,
OptionsExternalVersion: &newGroupVersion, OptionsExternalVersion: &newGroupVersion,
Serializer: latest.Codecs, Serializer: api.Codecs,
ParameterCodec: api.ParameterCodec, ParameterCodec: api.ParameterCodec,
} }
container = restful.NewContainer() container = restful.NewContainer()
@ -2710,12 +2709,12 @@ func TestCreateYAML(t *testing.T) {
simple := &apiservertesting.Simple{ simple := &apiservertesting.Simple{
Other: "bar", Other: "bar",
} }
serializer, ok := latest.Codecs.SerializerForMediaType("application/yaml", nil) serializer, ok := api.Codecs.SerializerForMediaType("application/yaml", nil)
if !ok { if !ok {
t.Fatal("No yaml serializer") t.Fatal("No yaml serializer")
} }
encoder := latest.Codecs.EncoderForVersion(serializer, testGroupVersion) encoder := api.Codecs.EncoderForVersion(serializer, testGroupVersion)
decoder := latest.Codecs.DecoderToVersion(serializer, testInternalGroupVersion) decoder := api.Codecs.DecoderToVersion(serializer, testInternalGroupVersion)
data, err := runtime.Encode(encoder, simple) data, err := runtime.Encode(encoder, simple)
if err != nil { if err != nil {
@ -2913,7 +2912,7 @@ func (obj *UnregisteredAPIObject) GetObjectKind() unversioned.ObjectKind {
func TestWriteJSONDecodeError(t *testing.T) { func TestWriteJSONDecodeError(t *testing.T) {
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { 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 // TODO: Uncomment when fix #19254
// defer server.Close() // defer server.Close()

View File

@ -28,8 +28,7 @@ import (
"github.com/golang/glog" "github.com/golang/glog"
"k8s.io/kubernetes/pkg/apis/abac" api "k8s.io/kubernetes/pkg/apis/abac"
"k8s.io/kubernetes/pkg/apis/abac/latest"
"k8s.io/kubernetes/pkg/apis/abac/v0" "k8s.io/kubernetes/pkg/apis/abac/v0"
_ "k8s.io/kubernetes/pkg/apis/abac/v1beta1" _ "k8s.io/kubernetes/pkg/apis/abac/v1beta1"
"k8s.io/kubernetes/pkg/auth/authorizer" "k8s.io/kubernetes/pkg/auth/authorizer"

View File

@ -67,7 +67,7 @@ func TestV1EncodeDecodeStatus(t *testing.T) {
func TestExperimentalEncodeDecodeStatus(t *testing.T) { func TestExperimentalEncodeDecodeStatus(t *testing.T) {
// TODO: caesarxuchao: use the testapi.Extensions.Codec() once the PR that // TODO: caesarxuchao: use the testapi.Extensions.Codec() once the PR that
// moves experimental from v1 to v1beta1 got merged. // 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) encoded, err := runtime.Encode(expCodec, status)
if err != nil { if err != nil {
t.Errorf("unexpected error: %v", err) t.Errorf("unexpected error: %v", err)

View File

@ -94,7 +94,7 @@ func TestInstallAPIGroups(t *testing.T) {
config.ProxyTLSClientConfig = &tls.Config{} config.ProxyTLSClientConfig = &tls.Config{}
config.APIPrefix = "/apiPrefix" config.APIPrefix = "/apiPrefix"
config.APIGroupPrefix = "/apiGroupPrefix" config.APIGroupPrefix = "/apiGroupPrefix"
config.Serializer = latest.Codecs config.Serializer = api.Codecs
s := New(&config) s := New(&config)
apiGroupMeta := registered.GroupOrDie(api.GroupName) apiGroupMeta := registered.GroupOrDie(api.GroupName)

View File

@ -17,7 +17,12 @@ limitations under the License.
package latest package latest
import ( 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. // Version is the string that represents the current external default version.
@ -33,6 +38,10 @@ const OldestVersion = "v1"
var Versions = []string{"v1"} var Versions = []string{"v1"}
// Codec is the default codec for serializing input that should use // Codec is the default codec for serializing input that should use
// the latest supported version. // the latest supported version. It supports JSON by default.
// This codec can decode any object that Kubernetes is aware of. var Codec = versioning.NewCodecForScheme(
var Codec = v1.Codec api.Scheme,
json.NewSerializer(json.DefaultMetaFactory, api.Scheme, runtime.ObjectTyperToTyper(api.Scheme), true),
[]unversioned.GroupVersion{{Version: Version}},
[]unversioned.GroupVersion{{Version: runtime.APIVersionInternal}},
)

View File

@ -26,9 +26,12 @@ var Scheme = runtime.NewScheme()
// SchemeGroupVersion is group version used to register these objects // SchemeGroupVersion is group version used to register these objects
// TODO this should be in the "scheduler" group // TODO this should be in the "scheduler" group
var SchemeGroupVersion = unversioned.GroupVersion{Group: "", Version: ""} var SchemeGroupVersion = unversioned.GroupVersion{Group: "", Version: runtime.APIVersionInternal}
func init() { func init() {
if err := Scheme.AddIgnoredConversionType(&unversioned.TypeMeta{}, &unversioned.TypeMeta{}); err != nil {
panic(err)
}
Scheme.AddKnownTypes(SchemeGroupVersion, Scheme.AddKnownTypes(SchemeGroupVersion,
&Policy{}, &Policy{},
) )

View File

@ -18,7 +18,6 @@ package v1
import ( import (
"k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/api/unversioned"
"k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/plugin/pkg/scheduler/api" "k8s.io/kubernetes/plugin/pkg/scheduler/api"
) )
@ -26,9 +25,6 @@ import (
// TODO this should be in the "scheduler" group // TODO this should be in the "scheduler" group
var SchemeGroupVersion = unversioned.GroupVersion{Group: "", Version: "v1"} var SchemeGroupVersion = unversioned.GroupVersion{Group: "", Version: "v1"}
// Codec encodes internal objects to the v1 scheme
var Codec = runtime.CodecFor(api.Scheme, SchemeGroupVersion)
func init() { func init() {
api.Scheme.AddKnownTypes(SchemeGroupVersion, api.Scheme.AddKnownTypes(SchemeGroupVersion,
&Policy{}, &Policy{},