From c40dd0335a41762df53cabef89a58533cb6de825 Mon Sep 17 00:00:00 2001 From: deads2k Date: Mon, 16 Nov 2015 10:53:05 -0500 Subject: [PATCH] make DefaultRESTMapper methods type correct --- pkg/api/install/install.go | 7 +- pkg/api/mapper.go | 20 ++--- pkg/api/meta/restmapper.go | 27 ++----- pkg/api/meta/restmapper_test.go | 86 ++++++++++----------- pkg/apis/componentconfig/install/install.go | 7 +- pkg/apis/extensions/install/install.go | 7 +- pkg/apis/metrics/install/install.go | 7 +- pkg/apiserver/apiserver_test.go | 9 ++- pkg/kubectl/cmd/cmd_test.go | 10 ++- 9 files changed, 91 insertions(+), 89 deletions(-) diff --git a/pkg/api/install/install.go b/pkg/api/install/install.go index 2ed0f1f9bc6..3354c70da94 100644 --- a/pkg/api/install/install.go +++ b/pkg/api/install/install.go @@ -30,6 +30,7 @@ import ( "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api/meta" "k8s.io/kubernetes/pkg/api/registered" + "k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/api/v1" "k8s.io/kubernetes/pkg/runtime" ) @@ -47,6 +48,9 @@ func init() { glog.V(4).Infof("%v", err) return } + + worstToBestGroupVersions := []unversioned.GroupVersion{} + // Use the first API version in the list of registered versions as the latest. registeredGroupVersions := registered.GroupVersionsForGroup("") groupVersion := registeredGroupVersions[0] @@ -61,6 +65,7 @@ func init() { for i := len(registeredGroupVersions) - 1; i >= 0; i-- { versions = append(versions, registeredGroupVersions[i].Version) groupVersions = append(groupVersions, registeredGroupVersions[i].String()) + worstToBestGroupVersions = append(worstToBestGroupVersions, registeredGroupVersions[i]) } groupMeta.Versions = versions groupMeta.GroupVersions = groupVersions @@ -89,7 +94,7 @@ func init() { "ThirdPartyResourceData", "ThirdPartyResourceList") - mapper := api.NewDefaultRESTMapper("", versions, interfacesFor, importPrefix, ignoredKinds, rootScoped) + mapper := api.NewDefaultRESTMapper(worstToBestGroupVersions, interfacesFor, importPrefix, ignoredKinds, rootScoped) // setup aliases for groups of resources mapper.AddResourceAlias("all", userResources...) groupMeta.RESTMapper = mapper diff --git a/pkg/api/mapper.go b/pkg/api/mapper.go index d657adf49fd..50df8893cd2 100644 --- a/pkg/api/mapper.go +++ b/pkg/api/mapper.go @@ -17,7 +17,6 @@ limitations under the License. package api import ( - "fmt" "strings" "k8s.io/kubernetes/pkg/api/meta" @@ -35,23 +34,16 @@ func RegisterRESTMapper(m meta.RESTMapper) { RESTMapper = append(RESTMapper.(meta.MultiRESTMapper), m) } -func NewDefaultRESTMapper(group string, groupVersionStrings []string, interfacesFunc meta.VersionInterfacesFunc, +func NewDefaultRESTMapper(defaultGroupVersions []unversioned.GroupVersion, interfacesFunc meta.VersionInterfacesFunc, importPathPrefix string, ignoredKinds, rootScoped sets.String) *meta.DefaultRESTMapper { - mapper := meta.NewDefaultRESTMapper(group, groupVersionStrings, interfacesFunc) + mapper := meta.NewDefaultRESTMapper(defaultGroupVersions, interfacesFunc) // enumerate all supported versions, get the kinds, and register with the mapper how to address // our resources. - for _, gvString := range groupVersionStrings { - gv, err := unversioned.ParseGroupVersion(gvString) - // TODO stop panicing when the types are fixed - if err != nil { - panic(err) - } - if gv.Group != group { - panic(fmt.Sprintf("%q does not match the expect %q", gv.Group, group)) - } - + for _, gv := range defaultGroupVersions { for kind, oType := range Scheme.KnownTypes(gv.String()) { + gvk := gv.WithKind(kind) + // TODO: Remove import path prefix check. // We check the import path prefix because we currently stuff both "api" and "extensions" objects // into the same group within Scheme since Scheme has no notion of groups yet. @@ -62,7 +54,7 @@ func NewDefaultRESTMapper(group string, groupVersionStrings []string, interfaces if rootScoped.Has(kind) { scope = meta.RESTScopeRoot } - mapper.Add(scope, kind, gv.String(), false) + mapper.Add(gvk, scope, false) } } return mapper diff --git a/pkg/api/meta/restmapper.go b/pkg/api/meta/restmapper.go index 96c109d617c..bb1d817a2fe 100644 --- a/pkg/api/meta/restmapper.go +++ b/pkg/api/meta/restmapper.go @@ -69,7 +69,7 @@ var RESTScopeRoot = &restScope{ // (`get pod bar` vs `get pods bar`) // TODO these maps should be keyed based on GroupVersionKinds type DefaultRESTMapper struct { - groupVersions []unversioned.GroupVersion + defaultGroupVersions []unversioned.GroupVersion resourceToKind map[string]unversioned.GroupVersionKind kindToPluralResource map[unversioned.GroupVersionKind]string @@ -89,12 +89,7 @@ type VersionInterfacesFunc func(apiVersion string) (*VersionInterfaces, error) // 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. -// TODO remove group when this API is fixed. It is no longer used. -// The external API for a RESTMapper is cross-version and this is currently called using -// group/version tuples. In the end, the structure may be easier to understand with -// a GroupRESTMapper and CrossGroupRESTMapper, but for now, this one is constructed and -// used a CrossGroupRESTMapper. -func NewDefaultRESTMapper(group string, gvStrings []string, f VersionInterfacesFunc) *DefaultRESTMapper { +func NewDefaultRESTMapper(defaultGroupVersions []unversioned.GroupVersion, f VersionInterfacesFunc) *DefaultRESTMapper { resourceToKind := make(map[string]unversioned.GroupVersionKind) kindToPluralResource := make(map[unversioned.GroupVersionKind]string) kindToScope := make(map[unversioned.GroupVersionKind]RESTScope) @@ -102,27 +97,19 @@ func NewDefaultRESTMapper(group string, gvStrings []string, f VersionInterfacesF pluralToSingular := make(map[string]string) // TODO: verify name mappings work correctly when versions differ - gvs := []unversioned.GroupVersion{} - for _, gvString := range gvStrings { - gvs = append(gvs, unversioned.ParseGroupVersionOrDie(gvString)) - } - return &DefaultRESTMapper{ resourceToKind: resourceToKind, kindToPluralResource: kindToPluralResource, kindToScope: kindToScope, - groupVersions: gvs, + defaultGroupVersions: defaultGroupVersions, singularToPlural: singularToPlural, pluralToSingular: pluralToSingular, interfacesFunc: f, } } -func (m *DefaultRESTMapper) Add(scope RESTScope, kind string, gvString string, mixedCase bool) { - gv := unversioned.ParseGroupVersionOrDie(gvString) - gvk := gv.WithKind(kind) - - plural, singular := KindToResource(kind, mixedCase) +func (m *DefaultRESTMapper) Add(gvk unversioned.GroupVersionKind, scope RESTScope, mixedCase bool) { + plural, singular := KindToResource(gvk.Kind, mixedCase) m.singularToPlural[singular] = plural m.pluralToSingular[plural] = singular _, ok1 := m.resourceToKind[plural] @@ -223,7 +210,7 @@ func (m *DefaultRESTMapper) RESTMapping(kind string, versions ...string) (*RESTM } // Use the default preferred versions if !hadVersion && (groupVersion == nil) { - for _, currGroupVersion := range m.groupVersions { + for _, currGroupVersion := range m.defaultGroupVersions { currGVK := currGroupVersion.WithKind(kind) if _, ok := m.kindToPluralResource[currGVK]; ok { groupVersion = &currGroupVersion @@ -241,7 +228,7 @@ func (m *DefaultRESTMapper) RESTMapping(kind string, versions ...string) (*RESTM resource, ok := m.kindToPluralResource[gvk] if !ok { found := []unversioned.GroupVersion{} - for _, gv := range m.groupVersions { + for _, gv := range m.defaultGroupVersions { if _, ok := m.kindToPluralResource[gvk]; ok { found = append(found, gv) } diff --git a/pkg/api/meta/restmapper_test.go b/pkg/api/meta/restmapper_test.go index 477db07abef..450d3cc20fd 100644 --- a/pkg/api/meta/restmapper_test.go +++ b/pkg/api/meta/restmapper_test.go @@ -96,21 +96,23 @@ func TestRESTMapperVersionAndKindForResource(t *testing.T) { MixedCase bool Err bool }{ - {Resource: "internalobjec", Err: true, GroupVersionToRegister: testGroupVersion}, - {Resource: "internalObjec", Err: true, GroupVersionToRegister: testGroupVersion}, + {Resource: "internalobjec", Err: true}, + {Resource: "internalObjec", Err: true}, - {Resource: "internalobject", GroupVersionToRegister: testGroupVersion, ExpectedGVK: unversioned.NewGroupVersionKind(testGroupVersion, "InternalObject")}, - {Resource: "internalobjects", GroupVersionToRegister: testGroupVersion, ExpectedGVK: unversioned.NewGroupVersionKind(testGroupVersion, "InternalObject")}, + {Resource: "internalobject", ExpectedGVK: testGroupVersion.WithKind("InternalObject")}, + {Resource: "internalobjects", ExpectedGVK: testGroupVersion.WithKind("InternalObject")}, - {Resource: "internalobject", GroupVersionToRegister: testGroupVersion, MixedCase: true, ExpectedGVK: unversioned.NewGroupVersionKind(testGroupVersion, "InternalObject")}, - {Resource: "internalobjects", GroupVersionToRegister: testGroupVersion, MixedCase: true, ExpectedGVK: unversioned.NewGroupVersionKind(testGroupVersion, "InternalObject")}, + {Resource: "internalobject", MixedCase: true, ExpectedGVK: testGroupVersion.WithKind("InternalObject")}, + {Resource: "internalobjects", MixedCase: true, ExpectedGVK: testGroupVersion.WithKind("InternalObject")}, - {Resource: "internalObject", GroupVersionToRegister: testGroupVersion, MixedCase: true, ExpectedGVK: unversioned.NewGroupVersionKind(testGroupVersion, "InternalObject")}, - {Resource: "internalObjects", GroupVersionToRegister: testGroupVersion, MixedCase: true, ExpectedGVK: unversioned.NewGroupVersionKind(testGroupVersion, "InternalObject")}, + {Resource: "internalObject", MixedCase: true, ExpectedGVK: testGroupVersion.WithKind("InternalObject")}, + {Resource: "internalObjects", MixedCase: true, ExpectedGVK: testGroupVersion.WithKind("InternalObject")}, } for i, testCase := range testCases { - mapper := NewDefaultRESTMapper(testGroup, []string{testGroupVersion.String()}, fakeInterfaces) - mapper.Add(RESTScopeNamespace, testCase.ExpectedGVK.Kind, testCase.GroupVersionToRegister.String(), testCase.MixedCase) + mapper := NewDefaultRESTMapper([]unversioned.GroupVersion{testGroupVersion}, fakeInterfaces) + if len(testCase.ExpectedGVK.Kind) != 0 { + mapper.Add(testCase.ExpectedGVK, RESTScopeNamespace, testCase.MixedCase) + } v, k, err := mapper.VersionAndKindForResource(testCase.Resource) hasErr := err != nil @@ -137,19 +139,18 @@ func TestRESTMapperVersionAndKindForResource(t *testing.T) { func TestRESTMapperGroupForResource(t *testing.T) { testCases := []struct { - Resource string - Kind string - GroupVersion unversioned.GroupVersion - Err bool + Resource string + GroupVersionKind unversioned.GroupVersionKind + Err bool }{ - {Resource: "myObject", Kind: "MyObject", GroupVersion: unversioned.GroupVersion{Group: "testapi", Version: "test"}}, - {Resource: "myobject", Kind: "MyObject", GroupVersion: unversioned.GroupVersion{Group: "testapi2", Version: "test"}}, - {Resource: "myObje", Err: true, Kind: "MyObject", GroupVersion: unversioned.GroupVersion{Group: "testapi", Version: "test"}}, - {Resource: "myobje", Err: true, Kind: "MyObject", GroupVersion: unversioned.GroupVersion{Group: "testapi", Version: "test"}}, + {Resource: "myObject", GroupVersionKind: unversioned.GroupVersionKind{Group: "testapi", Version: "test", Kind: "MyObject"}}, + {Resource: "myobject", GroupVersionKind: unversioned.GroupVersionKind{Group: "testapi2", Version: "test", Kind: "MyObject"}}, + {Resource: "myObje", Err: true, GroupVersionKind: unversioned.GroupVersionKind{Group: "testapi", Version: "test", Kind: "MyObject"}}, + {Resource: "myobje", Err: true, GroupVersionKind: unversioned.GroupVersionKind{Group: "testapi", Version: "test", Kind: "MyObject"}}, } for i, testCase := range testCases { - mapper := NewDefaultRESTMapper(testCase.GroupVersion.Group, []string{testCase.GroupVersion.String()}, fakeInterfaces) - mapper.Add(RESTScopeNamespace, testCase.Kind, testCase.GroupVersion.String(), false) + mapper := NewDefaultRESTMapper([]unversioned.GroupVersion{testCase.GroupVersionKind.GroupVersion()}, fakeInterfaces) + mapper.Add(testCase.GroupVersionKind, RESTScopeNamespace, false) g, err := mapper.GroupForResource(testCase.Resource) if testCase.Err { if err == nil { @@ -157,8 +158,8 @@ func TestRESTMapperGroupForResource(t *testing.T) { } } else if err != nil { t.Errorf("%d: unexpected error: %v", i, err) - } else if g != testCase.GroupVersion.Group { - t.Errorf("%d: expected group %q, got %q", i, testCase.GroupVersion.Group, g) + } else if g != testCase.GroupVersionKind.Group { + t.Errorf("%d: expected group %q, got %q", i, testCase.GroupVersionKind.Group, g) } } } @@ -193,6 +194,8 @@ func TestKindToResource(t *testing.T) { } func TestRESTMapperResourceSingularizer(t *testing.T) { + testGroupVersion := unversioned.GroupVersion{Group: "tgroup", Version: "test"} + testCases := []struct { Kind string MixedCase bool @@ -216,11 +219,9 @@ func TestRESTMapperResourceSingularizer(t *testing.T) { {Kind: "lowercases", MixedCase: false, Plural: "lowercases", Singular: "lowercases"}, } for i, testCase := range testCases { - testGroupVersion := unversioned.GroupVersion{Group: "tgroup", Version: "test"} - - mapper := NewDefaultRESTMapper(testGroupVersion.Group, []string{testGroupVersion.String()}, fakeInterfaces) + mapper := NewDefaultRESTMapper([]unversioned.GroupVersion{testGroupVersion}, fakeInterfaces) // create singular/plural mapping - mapper.Add(RESTScopeNamespace, testCase.Kind, testGroupVersion.String(), testCase.MixedCase) + mapper.Add(testGroupVersion.WithKind(testCase.Kind), RESTScopeNamespace, testCase.MixedCase) singular, _ := mapper.ResourceSingularizer(testCase.Plural) if singular != testCase.Singular { @@ -232,12 +233,13 @@ func TestRESTMapperResourceSingularizer(t *testing.T) { func TestRESTMapperRESTMapping(t *testing.T) { testGroup := "tgroup" testGroupVersion := unversioned.GroupVersion{Group: testGroup, Version: "test"} + internalGroupVersion := unversioned.GroupVersion{Group: testGroup, Version: "test"} testCases := []struct { Kind string APIGroupVersions []unversioned.GroupVersion MixedCase bool - DefaultVersions []string + DefaultVersions []unversioned.GroupVersion Resource string ExpectedGroupVersion *unversioned.GroupVersion @@ -246,25 +248,23 @@ func TestRESTMapperRESTMapping(t *testing.T) { {Kind: "Unknown", Err: true}, {Kind: "InternalObject", Err: true}, - {DefaultVersions: []string{testGroupVersion.String()}, Kind: "Unknown", Err: true}, + {DefaultVersions: []unversioned.GroupVersion{testGroupVersion}, Kind: "Unknown", Err: true}, - {DefaultVersions: []string{testGroupVersion.String()}, Kind: "InternalObject", APIGroupVersions: []unversioned.GroupVersion{{Group: testGroup, Version: "test"}}, Resource: "internalobjects"}, - {DefaultVersions: []string{testGroupVersion.String()}, Kind: "InternalObject", APIGroupVersions: []unversioned.GroupVersion{{Group: testGroup, Version: "test"}}, Resource: "internalobjects"}, + {DefaultVersions: []unversioned.GroupVersion{testGroupVersion}, Kind: "InternalObject", APIGroupVersions: []unversioned.GroupVersion{{Group: testGroup, Version: "test"}}, Resource: "internalobjects"}, + {DefaultVersions: []unversioned.GroupVersion{testGroupVersion}, Kind: "InternalObject", APIGroupVersions: []unversioned.GroupVersion{{Group: testGroup, Version: "test"}}, Resource: "internalobjects"}, - {DefaultVersions: []string{testGroupVersion.String()}, Kind: "InternalObject", APIGroupVersions: []unversioned.GroupVersion{{Group: testGroup, Version: "test"}}, Resource: "internalobjects"}, + {DefaultVersions: []unversioned.GroupVersion{testGroupVersion}, Kind: "InternalObject", APIGroupVersions: []unversioned.GroupVersion{{Group: testGroup, Version: "test"}}, Resource: "internalobjects"}, - {DefaultVersions: []string{testGroupVersion.String()}, Kind: "InternalObject", APIGroupVersions: []unversioned.GroupVersion{}, Resource: "internalobjects", ExpectedGroupVersion: &unversioned.GroupVersion{Group: testGroup, Version: "test"}}, + {DefaultVersions: []unversioned.GroupVersion{testGroupVersion}, Kind: "InternalObject", APIGroupVersions: []unversioned.GroupVersion{}, Resource: "internalobjects", ExpectedGroupVersion: &unversioned.GroupVersion{Group: testGroup, Version: "test"}}, - {DefaultVersions: []string{testGroupVersion.String()}, Kind: "InternalObject", APIGroupVersions: []unversioned.GroupVersion{{Group: testGroup, Version: "test"}}, Resource: "internalobjects"}, - {DefaultVersions: []string{testGroupVersion.String()}, Kind: "InternalObject", APIGroupVersions: []unversioned.GroupVersion{{Group: testGroup, Version: "test"}}, MixedCase: true, Resource: "internalObjects"}, + {DefaultVersions: []unversioned.GroupVersion{testGroupVersion}, Kind: "InternalObject", APIGroupVersions: []unversioned.GroupVersion{{Group: testGroup, Version: "test"}}, Resource: "internalobjects"}, + {DefaultVersions: []unversioned.GroupVersion{testGroupVersion}, Kind: "InternalObject", APIGroupVersions: []unversioned.GroupVersion{{Group: testGroup, Version: "test"}}, MixedCase: true, Resource: "internalObjects"}, // TODO: add test for a resource that exists in one version but not another } for i, testCase := range testCases { - internalGroupVersion := unversioned.GroupVersion{Group: testGroup, Version: "test"} - - mapper := NewDefaultRESTMapper(testGroup, testCase.DefaultVersions, fakeInterfaces) - mapper.Add(RESTScopeNamespace, "InternalObject", internalGroupVersion.String(), testCase.MixedCase) + mapper := NewDefaultRESTMapper(testCase.DefaultVersions, fakeInterfaces) + mapper.Add(internalGroupVersion.WithKind("InternalObject"), RESTScopeNamespace, testCase.MixedCase) deprecatedGroupVersionStrings := []string{} for _, gv := range testCase.APIGroupVersions { @@ -303,9 +303,9 @@ func TestRESTMapperRESTMappingSelectsVersion(t *testing.T) { expectedGroupVersion2 := unversioned.GroupVersion{Group: "tgroup", Version: "test2"} expectedGroupVersion3 := unversioned.GroupVersion{Group: "tgroup", Version: "test3"} - mapper := NewDefaultRESTMapper("tgroup", []string{expectedGroupVersion1.String(), expectedGroupVersion2.String()}, fakeInterfaces) - mapper.Add(RESTScopeNamespace, "InternalObject", expectedGroupVersion1.String(), false) - mapper.Add(RESTScopeNamespace, "OtherObject", expectedGroupVersion2.String(), false) + mapper := NewDefaultRESTMapper([]unversioned.GroupVersion{expectedGroupVersion1, expectedGroupVersion2}, fakeInterfaces) + mapper.Add(expectedGroupVersion1.WithKind("InternalObject"), RESTScopeNamespace, false) + mapper.Add(expectedGroupVersion2.WithKind("OtherObject"), RESTScopeNamespace, false) // pick default matching object kind based on search order mapping, err := mapper.RESTMapping("OtherObject") @@ -359,8 +359,8 @@ func TestRESTMapperReportsErrorOnBadVersion(t *testing.T) { expectedGroupVersion1 := unversioned.GroupVersion{Group: "tgroup", Version: "test1"} expectedGroupVersion2 := unversioned.GroupVersion{Group: "tgroup", Version: "test2"} - mapper := NewDefaultRESTMapper("tgroup", []string{expectedGroupVersion1.String(), expectedGroupVersion2.String()}, unmatchedVersionInterfaces) - mapper.Add(RESTScopeNamespace, "InternalObject", expectedGroupVersion1.String(), false) + mapper := NewDefaultRESTMapper([]unversioned.GroupVersion{expectedGroupVersion1, expectedGroupVersion2}, unmatchedVersionInterfaces) + mapper.Add(expectedGroupVersion1.WithKind("InternalObject"), RESTScopeNamespace, false) _, err := mapper.RESTMapping("InternalObject", expectedGroupVersion1.String()) if err == nil { t.Errorf("unexpected non-error") diff --git a/pkg/apis/componentconfig/install/install.go b/pkg/apis/componentconfig/install/install.go index dd66adc959e..9ae7d3a477d 100644 --- a/pkg/apis/componentconfig/install/install.go +++ b/pkg/apis/componentconfig/install/install.go @@ -28,6 +28,7 @@ import ( "k8s.io/kubernetes/pkg/api/latest" "k8s.io/kubernetes/pkg/api/meta" "k8s.io/kubernetes/pkg/api/registered" + "k8s.io/kubernetes/pkg/api/unversioned" _ "k8s.io/kubernetes/pkg/apis/componentconfig" "k8s.io/kubernetes/pkg/apis/componentconfig/v1alpha1" "k8s.io/kubernetes/pkg/runtime" @@ -44,6 +45,9 @@ func init() { glog.V(4).Infof("%v", err) return } + + worstToBestGroupVersions := []unversioned.GroupVersion{} + registeredGroupVersions := registered.GroupVersionsForGroup("componentconfig") groupVersion := registeredGroupVersions[0] *groupMeta = latest.GroupMeta{ @@ -57,6 +61,7 @@ func init() { for i := len(registeredGroupVersions) - 1; i >= 0; i-- { versions = append(versions, registeredGroupVersions[i].Version) groupVersions = append(groupVersions, registeredGroupVersions[i].String()) + worstToBestGroupVersions = append(worstToBestGroupVersions, registeredGroupVersions[i]) } groupMeta.Versions = versions groupMeta.GroupVersions = groupVersions @@ -69,7 +74,7 @@ func init() { ignoredKinds := sets.NewString() - groupMeta.RESTMapper = api.NewDefaultRESTMapper("componentconfig", groupVersions, interfacesFor, importPrefix, ignoredKinds, rootScoped) + groupMeta.RESTMapper = api.NewDefaultRESTMapper(worstToBestGroupVersions, interfacesFor, importPrefix, ignoredKinds, rootScoped) api.RegisterRESTMapper(groupMeta.RESTMapper) groupMeta.InterfacesFor = interfacesFor } diff --git a/pkg/apis/extensions/install/install.go b/pkg/apis/extensions/install/install.go index bf0af1a532a..f16343340f7 100644 --- a/pkg/apis/extensions/install/install.go +++ b/pkg/apis/extensions/install/install.go @@ -28,6 +28,7 @@ import ( "k8s.io/kubernetes/pkg/api/latest" "k8s.io/kubernetes/pkg/api/meta" "k8s.io/kubernetes/pkg/api/registered" + "k8s.io/kubernetes/pkg/api/unversioned" _ "k8s.io/kubernetes/pkg/apis/extensions" "k8s.io/kubernetes/pkg/apis/extensions/v1beta1" "k8s.io/kubernetes/pkg/runtime" @@ -44,6 +45,9 @@ func init() { glog.V(4).Infof("%v", err) return } + + worstToBestGroupVersions := []unversioned.GroupVersion{} + registeredGroupVersions := registered.GroupVersionsForGroup("extensions") groupVersion := registeredGroupVersions[0] *groupMeta = latest.GroupMeta{ @@ -57,6 +61,7 @@ func init() { for i := len(registeredGroupVersions) - 1; i >= 0; i-- { versions = append(versions, registeredGroupVersions[i].Version) groupVersions = append(groupVersions, registeredGroupVersions[i].String()) + worstToBestGroupVersions = append(worstToBestGroupVersions, registeredGroupVersions[i]) } groupMeta.Versions = versions groupMeta.GroupVersions = groupVersions @@ -69,7 +74,7 @@ func init() { ignoredKinds := sets.NewString() - groupMeta.RESTMapper = api.NewDefaultRESTMapper("extensions", groupVersions, interfacesFor, importPrefix, ignoredKinds, rootScoped) + groupMeta.RESTMapper = api.NewDefaultRESTMapper(worstToBestGroupVersions, interfacesFor, importPrefix, ignoredKinds, rootScoped) api.RegisterRESTMapper(groupMeta.RESTMapper) groupMeta.InterfacesFor = interfacesFor } diff --git a/pkg/apis/metrics/install/install.go b/pkg/apis/metrics/install/install.go index c7575a1fe8a..ae7baf2a718 100644 --- a/pkg/apis/metrics/install/install.go +++ b/pkg/apis/metrics/install/install.go @@ -28,6 +28,7 @@ import ( "k8s.io/kubernetes/pkg/api/latest" "k8s.io/kubernetes/pkg/api/meta" "k8s.io/kubernetes/pkg/api/registered" + "k8s.io/kubernetes/pkg/api/unversioned" _ "k8s.io/kubernetes/pkg/apis/metrics" "k8s.io/kubernetes/pkg/apis/metrics/v1alpha1" "k8s.io/kubernetes/pkg/runtime" @@ -44,6 +45,9 @@ func init() { glog.V(4).Infof("%v", err) return } + + worstToBestGroupVersions := []unversioned.GroupVersion{} + registeredGroupVersions := registered.GroupVersionsForGroup("metrics") groupVersion := registeredGroupVersions[0] *groupMeta = latest.GroupMeta{ @@ -57,6 +61,7 @@ func init() { for i := len(registeredGroupVersions) - 1; i >= 0; i-- { versions = append(versions, registeredGroupVersions[i].Version) groupVersions = append(groupVersions, registeredGroupVersions[i].String()) + worstToBestGroupVersions = append(worstToBestGroupVersions, registeredGroupVersions[i]) } groupMeta.Versions = versions groupMeta.GroupVersions = groupVersions @@ -69,7 +74,7 @@ func init() { ignoredKinds := sets.NewString() - groupMeta.RESTMapper = api.NewDefaultRESTMapper("metrics", groupVersions, interfacesFor, importPrefix, ignoredKinds, rootScoped) + groupMeta.RESTMapper = api.NewDefaultRESTMapper(worstToBestGroupVersions, interfacesFor, importPrefix, ignoredKinds, rootScoped) api.RegisterRESTMapper(groupMeta.RESTMapper) groupMeta.InterfacesFor = interfacesFor } diff --git a/pkg/apiserver/apiserver_test.go b/pkg/apiserver/apiserver_test.go index 90b1c4a318b..38d644db2e5 100644 --- a/pkg/apiserver/apiserver_test.go +++ b/pkg/apiserver/apiserver_test.go @@ -107,8 +107,7 @@ func interfacesFor(version string) (*meta.VersionInterfaces, error) { } func newMapper() *meta.DefaultRESTMapper { - gvStrings := []string{testGroupVersion.String(), newGroupVersion.String()} - return meta.NewDefaultRESTMapper(testAPIGroup, gvStrings, interfacesFor) + return meta.NewDefaultRESTMapper([]unversioned.GroupVersion{testGroupVersion, newGroupVersion}, interfacesFor) } func addGrouplessTypes() { @@ -176,11 +175,13 @@ func init() { // the mapper how to address our resources for _, gv := range groupVersions { for kind := range api.Scheme.KnownTypes(gv.String()) { + gvk := gv.WithKind(kind) + root := bool(kind == "SimpleRoot") if root { - nsMapper.Add(meta.RESTScopeRoot, kind, gv.String(), false) + nsMapper.Add(gvk, meta.RESTScopeRoot, false) } else { - nsMapper.Add(meta.RESTScopeNamespace, kind, gv.String(), false) + nsMapper.Add(gvk, meta.RESTScopeNamespace, false) } } } diff --git a/pkg/kubectl/cmd/cmd_test.go b/pkg/kubectl/cmd/cmd_test.go index ff8aa9f405c..f99c946f7fd 100644 --- a/pkg/kubectl/cmd/cmd_test.go +++ b/pkg/kubectl/cmd/cmd_test.go @@ -90,18 +90,20 @@ func newExternalScheme() (*runtime.Scheme, meta.RESTMapper, runtime.Codec) { scheme.AddKnownTypeWithName(validVersionGV.String(), "Type", &ExternalType2{}) codec := runtime.CodecFor(scheme, unlikelyGV.String()) - mapper := meta.NewDefaultRESTMapper("apitest", []string{unlikelyGV.String(), validVersionGV.String()}, func(version string) (*meta.VersionInterfaces, error) { + mapper := meta.NewDefaultRESTMapper([]unversioned.GroupVersion{unlikelyGV, validVersionGV}, func(version string) (*meta.VersionInterfaces, error) { return &meta.VersionInterfaces{ Codec: runtime.CodecFor(scheme, version), ObjectConvertor: scheme, MetadataAccessor: meta.NewAccessor(), }, versionErrIfFalse(version == validVersionGV.String() || version == unlikelyGV.String()) }) - for _, version := range []string{unlikelyGV.String(), validVersionGV.String()} { - for kind := range scheme.KnownTypes(version) { + for _, gv := range []unversioned.GroupVersion{unlikelyGV, validVersionGV} { + for kind := range scheme.KnownTypes(gv.String()) { + gvk := gv.WithKind(kind) + mixedCase := false scope := meta.RESTScopeNamespace - mapper.Add(scope, kind, version, mixedCase) + mapper.Add(gvk, scope, mixedCase) } }