From abf2c43ad7b30793be9cf7cd03d448f135de0ae2 Mon Sep 17 00:00:00 2001 From: deads2k Date: Fri, 14 Oct 2016 16:06:31 -0400 Subject: [PATCH] attempt to use discovery RESTMapper and fallback if we can't --- pkg/kubectl/cmd/util/factory.go | 48 +++++++++++---------------------- 1 file changed, 15 insertions(+), 33 deletions(-) diff --git a/pkg/kubectl/cmd/util/factory.go b/pkg/kubectl/cmd/util/factory.go index 78ae76cda2d..c152f3ced8d 100644 --- a/pkg/kubectl/cmd/util/factory.go +++ b/pkg/kubectl/cmd/util/factory.go @@ -32,7 +32,6 @@ import ( "strings" "time" - "github.com/blang/semver" "github.com/emicklei/go-restful/swagger" "github.com/spf13/cobra" "github.com/spf13/pflag" @@ -334,26 +333,23 @@ func (f *factory) Object() (meta.RESTMapper, runtime.ObjectTyper) { mapper := registered.RESTMapper() discoveryClient, err := discovery.NewDiscoveryClientForConfig(cfg) - // if we can find the server version and it's current enough to have discovery information, use it. Otherwise, - // fallback to our hardcoded list if err == nil { - if serverVersion, err := discoveryClient.ServerVersion(); err == nil && useDiscoveryRESTMapper(serverVersion.GitVersion) { - // register third party resources with the api machinery groups. This probably should be done, but - // its consistent with old code, so we'll start with it. - if err := registerThirdPartyResources(discoveryClient); err != nil { - fmt.Fprintf(os.Stderr, "Unable to register third party resources: %v\n", err) - } - // ThirdPartyResourceData is special. It's not discoverable, but needed for thirdparty resource listing - // TODO eliminate this once we're truly generic. - thirdPartyResourceDataMapper := meta.NewDefaultRESTMapper([]unversioned.GroupVersion{extensionsv1beta1.SchemeGroupVersion}, registered.InterfacesFor) - thirdPartyResourceDataMapper.Add(extensionsv1beta1.SchemeGroupVersion.WithKind("ThirdPartyResourceData"), meta.RESTScopeNamespace) + // register third party resources with the api machinery groups. This probably should be done, but + // its consistent with old code, so we'll start with it. + if err := registerThirdPartyResources(discoveryClient); err != nil { + fmt.Fprintf(os.Stderr, "Unable to register third party resources: %v\n", err) + } + // ThirdPartyResourceData is special. It's not discoverable, but needed for thirdparty resource listing + // TODO eliminate this once we're truly generic. + thirdPartyResourceDataMapper := meta.NewDefaultRESTMapper([]unversioned.GroupVersion{extensionsv1beta1.SchemeGroupVersion}, registered.InterfacesFor) + thirdPartyResourceDataMapper.Add(extensionsv1beta1.SchemeGroupVersion.WithKind("ThirdPartyResourceData"), meta.RESTScopeNamespace) - mapper = meta.FirstHitRESTMapper{ - MultiRESTMapper: meta.MultiRESTMapper{ - discovery.NewDeferredDiscoveryRESTMapper(discoveryClient, registered.InterfacesFor), - thirdPartyResourceDataMapper, - }, - } + mapper = meta.FirstHitRESTMapper{ + MultiRESTMapper: meta.MultiRESTMapper{ + discovery.NewDeferredDiscoveryRESTMapper(discoveryClient, registered.InterfacesFor), + thirdPartyResourceDataMapper, // needed for TPR printing + registered.RESTMapper(), // hardcoded fall back + }, } } @@ -1332,20 +1328,6 @@ func (f *factory) NewBuilder() *resource.Builder { return resource.NewBuilder(mapper, typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)) } -// useDiscoveryRESTMapper checks the server version to see if its recent enough to have -// enough discovery information available to reliably build a RESTMapper. If not, use the -// hardcoded mapper in this client (legacy behavior) -func useDiscoveryRESTMapper(serverVersion string) bool { - if len(serverVersion) == 0 { - return false - } - serverSemVer, err := semver.Parse(serverVersion[1:]) - if err != nil { - return false - } - return serverSemVer.GE(semver.MustParse("1.3.0")) -} - // registerThirdPartyResources inspects the discovery endpoint to find thirdpartyresources in the discovery doc // and then registers them with the apimachinery code. I think this is done so that scheme/codec stuff works, // but I really don't know. Feels like this code should go away once kubectl is completely generic for generic