Commit c40dd033 authored by deads2k's avatar deads2k

make DefaultRESTMapper methods type correct

parent 94ad6aa0
...@@ -30,6 +30,7 @@ import ( ...@@ -30,6 +30,7 @@ import (
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/meta" "k8s.io/kubernetes/pkg/api/meta"
"k8s.io/kubernetes/pkg/api/registered" "k8s.io/kubernetes/pkg/api/registered"
"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"
) )
...@@ -47,6 +48,9 @@ func init() { ...@@ -47,6 +48,9 @@ func init() {
glog.V(4).Infof("%v", err) glog.V(4).Infof("%v", err)
return return
} }
worstToBestGroupVersions := []unversioned.GroupVersion{}
// Use the first API version in the list of registered versions as the latest. // Use the first API version in the list of registered versions as the latest.
registeredGroupVersions := registered.GroupVersionsForGroup("") registeredGroupVersions := registered.GroupVersionsForGroup("")
groupVersion := registeredGroupVersions[0] groupVersion := registeredGroupVersions[0]
...@@ -61,6 +65,7 @@ func init() { ...@@ -61,6 +65,7 @@ func init() {
for i := len(registeredGroupVersions) - 1; i >= 0; i-- { for i := len(registeredGroupVersions) - 1; i >= 0; i-- {
versions = append(versions, registeredGroupVersions[i].Version) versions = append(versions, registeredGroupVersions[i].Version)
groupVersions = append(groupVersions, registeredGroupVersions[i].String()) groupVersions = append(groupVersions, registeredGroupVersions[i].String())
worstToBestGroupVersions = append(worstToBestGroupVersions, registeredGroupVersions[i])
} }
groupMeta.Versions = versions groupMeta.Versions = versions
groupMeta.GroupVersions = groupVersions groupMeta.GroupVersions = groupVersions
...@@ -89,7 +94,7 @@ func init() { ...@@ -89,7 +94,7 @@ func init() {
"ThirdPartyResourceData", "ThirdPartyResourceData",
"ThirdPartyResourceList") "ThirdPartyResourceList")
mapper := api.NewDefaultRESTMapper("", versions, interfacesFor, importPrefix, ignoredKinds, rootScoped) mapper := api.NewDefaultRESTMapper(worstToBestGroupVersions, interfacesFor, importPrefix, ignoredKinds, rootScoped)
// setup aliases for groups of resources // setup aliases for groups of resources
mapper.AddResourceAlias("all", userResources...) mapper.AddResourceAlias("all", userResources...)
groupMeta.RESTMapper = mapper groupMeta.RESTMapper = mapper
......
...@@ -17,7 +17,6 @@ limitations under the License. ...@@ -17,7 +17,6 @@ limitations under the License.
package api package api
import ( import (
"fmt"
"strings" "strings"
"k8s.io/kubernetes/pkg/api/meta" "k8s.io/kubernetes/pkg/api/meta"
...@@ -35,23 +34,16 @@ func RegisterRESTMapper(m meta.RESTMapper) { ...@@ -35,23 +34,16 @@ func RegisterRESTMapper(m meta.RESTMapper) {
RESTMapper = append(RESTMapper.(meta.MultiRESTMapper), m) 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 { 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 // enumerate all supported versions, get the kinds, and register with the mapper how to address
// our resources. // our resources.
for _, gvString := range groupVersionStrings { for _, gv := range defaultGroupVersions {
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 kind, oType := range Scheme.KnownTypes(gv.String()) { for kind, oType := range Scheme.KnownTypes(gv.String()) {
gvk := gv.WithKind(kind)
// TODO: Remove import path prefix check. // TODO: Remove import path prefix check.
// We check the import path prefix because we currently stuff both "api" and "extensions" objects // 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. // 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 ...@@ -62,7 +54,7 @@ func NewDefaultRESTMapper(group string, groupVersionStrings []string, interfaces
if rootScoped.Has(kind) { if rootScoped.Has(kind) {
scope = meta.RESTScopeRoot scope = meta.RESTScopeRoot
} }
mapper.Add(scope, kind, gv.String(), false) mapper.Add(gvk, scope, false)
} }
} }
return mapper return mapper
......
...@@ -69,7 +69,7 @@ var RESTScopeRoot = &restScope{ ...@@ -69,7 +69,7 @@ var RESTScopeRoot = &restScope{
// (`get pod bar` vs `get pods bar`) // (`get pod bar` vs `get pods bar`)
// TODO these maps should be keyed based on GroupVersionKinds // TODO these maps should be keyed based on GroupVersionKinds
type DefaultRESTMapper struct { type DefaultRESTMapper struct {
groupVersions []unversioned.GroupVersion defaultGroupVersions []unversioned.GroupVersion
resourceToKind map[string]unversioned.GroupVersionKind resourceToKind map[string]unversioned.GroupVersionKind
kindToPluralResource map[unversioned.GroupVersionKind]string kindToPluralResource map[unversioned.GroupVersionKind]string
...@@ -89,12 +89,7 @@ type VersionInterfacesFunc func(apiVersion string) (*VersionInterfaces, error) ...@@ -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 // 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 codec and metadata for a given version.
// TODO remove group when this API is fixed. It is no longer used. func NewDefaultRESTMapper(defaultGroupVersions []unversioned.GroupVersion, f VersionInterfacesFunc) *DefaultRESTMapper {
// 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 {
resourceToKind := make(map[string]unversioned.GroupVersionKind) resourceToKind := make(map[string]unversioned.GroupVersionKind)
kindToPluralResource := make(map[unversioned.GroupVersionKind]string) kindToPluralResource := make(map[unversioned.GroupVersionKind]string)
kindToScope := make(map[unversioned.GroupVersionKind]RESTScope) kindToScope := make(map[unversioned.GroupVersionKind]RESTScope)
...@@ -102,27 +97,19 @@ func NewDefaultRESTMapper(group string, gvStrings []string, f VersionInterfacesF ...@@ -102,27 +97,19 @@ func NewDefaultRESTMapper(group string, gvStrings []string, f VersionInterfacesF
pluralToSingular := make(map[string]string) pluralToSingular := make(map[string]string)
// TODO: verify name mappings work correctly when versions differ // TODO: verify name mappings work correctly when versions differ
gvs := []unversioned.GroupVersion{}
for _, gvString := range gvStrings {
gvs = append(gvs, unversioned.ParseGroupVersionOrDie(gvString))
}
return &DefaultRESTMapper{ return &DefaultRESTMapper{
resourceToKind: resourceToKind, resourceToKind: resourceToKind,
kindToPluralResource: kindToPluralResource, kindToPluralResource: kindToPluralResource,
kindToScope: kindToScope, kindToScope: kindToScope,
groupVersions: gvs, defaultGroupVersions: defaultGroupVersions,
singularToPlural: singularToPlural, singularToPlural: singularToPlural,
pluralToSingular: pluralToSingular, pluralToSingular: pluralToSingular,
interfacesFunc: f, interfacesFunc: f,
} }
} }
func (m *DefaultRESTMapper) Add(scope RESTScope, kind string, gvString string, mixedCase bool) { func (m *DefaultRESTMapper) Add(gvk unversioned.GroupVersionKind, scope RESTScope, mixedCase bool) {
gv := unversioned.ParseGroupVersionOrDie(gvString) plural, singular := KindToResource(gvk.Kind, mixedCase)
gvk := gv.WithKind(kind)
plural, singular := KindToResource(kind, mixedCase)
m.singularToPlural[singular] = plural m.singularToPlural[singular] = plural
m.pluralToSingular[plural] = singular m.pluralToSingular[plural] = singular
_, ok1 := m.resourceToKind[plural] _, ok1 := m.resourceToKind[plural]
...@@ -223,7 +210,7 @@ func (m *DefaultRESTMapper) RESTMapping(kind string, versions ...string) (*RESTM ...@@ -223,7 +210,7 @@ func (m *DefaultRESTMapper) RESTMapping(kind string, versions ...string) (*RESTM
} }
// Use the default preferred versions // Use the default preferred versions
if !hadVersion && (groupVersion == nil) { if !hadVersion && (groupVersion == nil) {
for _, currGroupVersion := range m.groupVersions { for _, currGroupVersion := range m.defaultGroupVersions {
currGVK := currGroupVersion.WithKind(kind) currGVK := currGroupVersion.WithKind(kind)
if _, ok := m.kindToPluralResource[currGVK]; ok { if _, ok := m.kindToPluralResource[currGVK]; ok {
groupVersion = &currGroupVersion groupVersion = &currGroupVersion
...@@ -241,7 +228,7 @@ func (m *DefaultRESTMapper) RESTMapping(kind string, versions ...string) (*RESTM ...@@ -241,7 +228,7 @@ func (m *DefaultRESTMapper) RESTMapping(kind string, versions ...string) (*RESTM
resource, ok := m.kindToPluralResource[gvk] resource, ok := m.kindToPluralResource[gvk]
if !ok { if !ok {
found := []unversioned.GroupVersion{} found := []unversioned.GroupVersion{}
for _, gv := range m.groupVersions { for _, gv := range m.defaultGroupVersions {
if _, ok := m.kindToPluralResource[gvk]; ok { if _, ok := m.kindToPluralResource[gvk]; ok {
found = append(found, gv) found = append(found, gv)
} }
......
...@@ -28,6 +28,7 @@ import ( ...@@ -28,6 +28,7 @@ import (
"k8s.io/kubernetes/pkg/api/latest" "k8s.io/kubernetes/pkg/api/latest"
"k8s.io/kubernetes/pkg/api/meta" "k8s.io/kubernetes/pkg/api/meta"
"k8s.io/kubernetes/pkg/api/registered" "k8s.io/kubernetes/pkg/api/registered"
"k8s.io/kubernetes/pkg/api/unversioned"
_ "k8s.io/kubernetes/pkg/apis/componentconfig" _ "k8s.io/kubernetes/pkg/apis/componentconfig"
"k8s.io/kubernetes/pkg/apis/componentconfig/v1alpha1" "k8s.io/kubernetes/pkg/apis/componentconfig/v1alpha1"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
...@@ -44,6 +45,9 @@ func init() { ...@@ -44,6 +45,9 @@ func init() {
glog.V(4).Infof("%v", err) glog.V(4).Infof("%v", err)
return return
} }
worstToBestGroupVersions := []unversioned.GroupVersion{}
registeredGroupVersions := registered.GroupVersionsForGroup("componentconfig") registeredGroupVersions := registered.GroupVersionsForGroup("componentconfig")
groupVersion := registeredGroupVersions[0] groupVersion := registeredGroupVersions[0]
*groupMeta = latest.GroupMeta{ *groupMeta = latest.GroupMeta{
...@@ -57,6 +61,7 @@ func init() { ...@@ -57,6 +61,7 @@ func init() {
for i := len(registeredGroupVersions) - 1; i >= 0; i-- { for i := len(registeredGroupVersions) - 1; i >= 0; i-- {
versions = append(versions, registeredGroupVersions[i].Version) versions = append(versions, registeredGroupVersions[i].Version)
groupVersions = append(groupVersions, registeredGroupVersions[i].String()) groupVersions = append(groupVersions, registeredGroupVersions[i].String())
worstToBestGroupVersions = append(worstToBestGroupVersions, registeredGroupVersions[i])
} }
groupMeta.Versions = versions groupMeta.Versions = versions
groupMeta.GroupVersions = groupVersions groupMeta.GroupVersions = groupVersions
...@@ -69,7 +74,7 @@ func init() { ...@@ -69,7 +74,7 @@ func init() {
ignoredKinds := sets.NewString() 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) api.RegisterRESTMapper(groupMeta.RESTMapper)
groupMeta.InterfacesFor = interfacesFor groupMeta.InterfacesFor = interfacesFor
} }
......
...@@ -28,6 +28,7 @@ import ( ...@@ -28,6 +28,7 @@ import (
"k8s.io/kubernetes/pkg/api/latest" "k8s.io/kubernetes/pkg/api/latest"
"k8s.io/kubernetes/pkg/api/meta" "k8s.io/kubernetes/pkg/api/meta"
"k8s.io/kubernetes/pkg/api/registered" "k8s.io/kubernetes/pkg/api/registered"
"k8s.io/kubernetes/pkg/api/unversioned"
_ "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" "k8s.io/kubernetes/pkg/runtime"
...@@ -44,6 +45,9 @@ func init() { ...@@ -44,6 +45,9 @@ func init() {
glog.V(4).Infof("%v", err) glog.V(4).Infof("%v", err)
return return
} }
worstToBestGroupVersions := []unversioned.GroupVersion{}
registeredGroupVersions := registered.GroupVersionsForGroup("extensions") registeredGroupVersions := registered.GroupVersionsForGroup("extensions")
groupVersion := registeredGroupVersions[0] groupVersion := registeredGroupVersions[0]
*groupMeta = latest.GroupMeta{ *groupMeta = latest.GroupMeta{
...@@ -57,6 +61,7 @@ func init() { ...@@ -57,6 +61,7 @@ func init() {
for i := len(registeredGroupVersions) - 1; i >= 0; i-- { for i := len(registeredGroupVersions) - 1; i >= 0; i-- {
versions = append(versions, registeredGroupVersions[i].Version) versions = append(versions, registeredGroupVersions[i].Version)
groupVersions = append(groupVersions, registeredGroupVersions[i].String()) groupVersions = append(groupVersions, registeredGroupVersions[i].String())
worstToBestGroupVersions = append(worstToBestGroupVersions, registeredGroupVersions[i])
} }
groupMeta.Versions = versions groupMeta.Versions = versions
groupMeta.GroupVersions = groupVersions groupMeta.GroupVersions = groupVersions
...@@ -69,7 +74,7 @@ func init() { ...@@ -69,7 +74,7 @@ func init() {
ignoredKinds := sets.NewString() 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) api.RegisterRESTMapper(groupMeta.RESTMapper)
groupMeta.InterfacesFor = interfacesFor groupMeta.InterfacesFor = interfacesFor
} }
......
...@@ -28,6 +28,7 @@ import ( ...@@ -28,6 +28,7 @@ import (
"k8s.io/kubernetes/pkg/api/latest" "k8s.io/kubernetes/pkg/api/latest"
"k8s.io/kubernetes/pkg/api/meta" "k8s.io/kubernetes/pkg/api/meta"
"k8s.io/kubernetes/pkg/api/registered" "k8s.io/kubernetes/pkg/api/registered"
"k8s.io/kubernetes/pkg/api/unversioned"
_ "k8s.io/kubernetes/pkg/apis/metrics" _ "k8s.io/kubernetes/pkg/apis/metrics"
"k8s.io/kubernetes/pkg/apis/metrics/v1alpha1" "k8s.io/kubernetes/pkg/apis/metrics/v1alpha1"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
...@@ -44,6 +45,9 @@ func init() { ...@@ -44,6 +45,9 @@ func init() {
glog.V(4).Infof("%v", err) glog.V(4).Infof("%v", err)
return return
} }
worstToBestGroupVersions := []unversioned.GroupVersion{}
registeredGroupVersions := registered.GroupVersionsForGroup("metrics") registeredGroupVersions := registered.GroupVersionsForGroup("metrics")
groupVersion := registeredGroupVersions[0] groupVersion := registeredGroupVersions[0]
*groupMeta = latest.GroupMeta{ *groupMeta = latest.GroupMeta{
...@@ -57,6 +61,7 @@ func init() { ...@@ -57,6 +61,7 @@ func init() {
for i := len(registeredGroupVersions) - 1; i >= 0; i-- { for i := len(registeredGroupVersions) - 1; i >= 0; i-- {
versions = append(versions, registeredGroupVersions[i].Version) versions = append(versions, registeredGroupVersions[i].Version)
groupVersions = append(groupVersions, registeredGroupVersions[i].String()) groupVersions = append(groupVersions, registeredGroupVersions[i].String())
worstToBestGroupVersions = append(worstToBestGroupVersions, registeredGroupVersions[i])
} }
groupMeta.Versions = versions groupMeta.Versions = versions
groupMeta.GroupVersions = groupVersions groupMeta.GroupVersions = groupVersions
...@@ -69,7 +74,7 @@ func init() { ...@@ -69,7 +74,7 @@ func init() {
ignoredKinds := sets.NewString() 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) api.RegisterRESTMapper(groupMeta.RESTMapper)
groupMeta.InterfacesFor = interfacesFor groupMeta.InterfacesFor = interfacesFor
} }
......
...@@ -107,8 +107,7 @@ func interfacesFor(version string) (*meta.VersionInterfaces, error) { ...@@ -107,8 +107,7 @@ func interfacesFor(version string) (*meta.VersionInterfaces, error) {
} }
func newMapper() *meta.DefaultRESTMapper { func newMapper() *meta.DefaultRESTMapper {
gvStrings := []string{testGroupVersion.String(), newGroupVersion.String()} return meta.NewDefaultRESTMapper([]unversioned.GroupVersion{testGroupVersion, newGroupVersion}, interfacesFor)
return meta.NewDefaultRESTMapper(testAPIGroup, gvStrings, interfacesFor)
} }
func addGrouplessTypes() { func addGrouplessTypes() {
...@@ -176,11 +175,13 @@ func init() { ...@@ -176,11 +175,13 @@ func init() {
// the mapper how to address our resources // the mapper how to address our resources
for _, gv := range groupVersions { for _, gv := range groupVersions {
for kind := range api.Scheme.KnownTypes(gv.String()) { for kind := range api.Scheme.KnownTypes(gv.String()) {
gvk := gv.WithKind(kind)
root := bool(kind == "SimpleRoot") root := bool(kind == "SimpleRoot")
if root { if root {
nsMapper.Add(meta.RESTScopeRoot, kind, gv.String(), false) nsMapper.Add(gvk, meta.RESTScopeRoot, false)
} else { } else {
nsMapper.Add(meta.RESTScopeNamespace, kind, gv.String(), false) nsMapper.Add(gvk, meta.RESTScopeNamespace, false)
} }
} }
} }
......
...@@ -90,18 +90,20 @@ func newExternalScheme() (*runtime.Scheme, meta.RESTMapper, runtime.Codec) { ...@@ -90,18 +90,20 @@ func newExternalScheme() (*runtime.Scheme, meta.RESTMapper, runtime.Codec) {
scheme.AddKnownTypeWithName(validVersionGV.String(), "Type", &ExternalType2{}) scheme.AddKnownTypeWithName(validVersionGV.String(), "Type", &ExternalType2{})
codec := runtime.CodecFor(scheme, unlikelyGV.String()) 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{ return &meta.VersionInterfaces{
Codec: runtime.CodecFor(scheme, version), Codec: runtime.CodecFor(scheme, version),
ObjectConvertor: scheme, ObjectConvertor: scheme,
MetadataAccessor: meta.NewAccessor(), MetadataAccessor: meta.NewAccessor(),
}, versionErrIfFalse(version == validVersionGV.String() || version == unlikelyGV.String()) }, versionErrIfFalse(version == validVersionGV.String() || version == unlikelyGV.String())
}) })
for _, version := range []string{unlikelyGV.String(), validVersionGV.String()} { for _, gv := range []unversioned.GroupVersion{unlikelyGV, validVersionGV} {
for kind := range scheme.KnownTypes(version) { for kind := range scheme.KnownTypes(gv.String()) {
gvk := gv.WithKind(kind)
mixedCase := false mixedCase := false
scope := meta.RESTScopeNamespace scope := meta.RESTScopeNamespace
mapper.Add(scope, kind, version, mixedCase) mapper.Add(gvk, scope, mixedCase)
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment