From 5042f9e3dc4540910729c3ec9efb4f45fbbc6a90 Mon Sep 17 00:00:00 2001 From: David Eads Date: Wed, 11 Apr 2018 16:30:01 -0400 Subject: [PATCH] f --- .../util/clientcmd/factory_client_access.go | 51 +---------- pkg/oc/cli/util/clientcmd/legacy_discovery.go | 89 ------------------- .../kubectl/cmd/util/factory_client_access.go | 3 + 3 files changed, 5 insertions(+), 138 deletions(-) delete mode 100644 pkg/oc/cli/util/clientcmd/legacy_discovery.go diff --git a/pkg/oc/cli/util/clientcmd/factory_client_access.go b/pkg/oc/cli/util/clientcmd/factory_client_access.go index f10b786d6e92..b0f1ec15b254 100644 --- a/pkg/oc/cli/util/clientcmd/factory_client_access.go +++ b/pkg/oc/cli/util/clientcmd/factory_client_access.go @@ -4,13 +4,11 @@ import ( "errors" "fmt" "io/ioutil" - "net/http" "os" "path/filepath" "regexp" "strconv" "strings" - "time" "github.com/golang/glog" "github.com/spf13/cobra" @@ -27,13 +25,11 @@ import ( restclient "k8s.io/client-go/rest" kclientcmd "k8s.io/client-go/tools/clientcmd" kclientcmdapi "k8s.io/client-go/tools/clientcmd/api" - "k8s.io/client-go/util/homedir" kapi "k8s.io/kubernetes/pkg/apis/core" kclientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" "k8s.io/kubernetes/pkg/kubectl" kcmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" "k8s.io/kubernetes/pkg/kubectl/resource" - "k8s.io/kubernetes/pkg/kubectl/util/transport" appsapiv1 "github.com/openshift/api/apps/v1" appsapi "github.com/openshift/origin/pkg/apps/apis/apps" @@ -61,8 +57,8 @@ type ClientAccessFactory interface { func NewClientAccessFactory(optionalClientConfig kclientcmd.ClientConfig) ClientAccessFactory { flags := pflag.NewFlagSet("", pflag.ContinueOnError) clientConfig := optionalClientConfig + // TODO find a different home for the --config instead of --kubeconfig hack we have and eliminate the special construction if optionalClientConfig == nil { - // TODO: there should be two client configs, one for OpenShift, and one for Kubernetes clientConfig = osclientcmd.DefaultClientConfig(flags) clientConfig = defaultingClientConfig{clientConfig} } @@ -70,58 +66,15 @@ func NewClientAccessFactory(optionalClientConfig kclientcmd.ClientConfig) Client clientConfig: clientConfig, imageResolutionOptions: &imageResolutionOptions{}, } - factory.kubeClientAccessFactory = kcmdutil.NewClientAccessFactoryFromDiscovery( + factory.kubeClientAccessFactory = kcmdutil.NewClientAccessFactoryFromFlags( flags, clientConfig, - &discoveryFactory{clientConfig: clientConfig}, ) factory.OpenshiftCLIClientBuilder = &OpenshiftCLIClientBuilder{config: clientConfig} return factory } -type discoveryFactory struct { - clientConfig kclientcmd.ClientConfig - cacheDir string -} - -func (f *discoveryFactory) BindFlags(flags *pflag.FlagSet) { - defaultCacheDir := filepath.Join(homedir.HomeDir(), ".kube", "http-cache") - flags.StringVar(&f.cacheDir, kcmdutil.FlagHTTPCacheDir, defaultCacheDir, "Default HTTP cache directory") -} - -func (f *discoveryFactory) DiscoveryClient() (discovery.CachedDiscoveryInterface, error) { - // Output using whatever version was negotiated in the client cache. The - // version we decode with may not be the same as what the server requires. - cfg, err := f.clientConfig.ClientConfig() - if err != nil { - return nil, err - } - // given 25 groups with one-ish version each, discovery needs to make 50 requests - // double it just so we don't end up here again for a while. This config is only used for discovery. - cfg.Burst = 100 - - if f.cacheDir != "" { - wt := cfg.WrapTransport - cfg.WrapTransport = func(rt http.RoundTripper) http.RoundTripper { - if wt != nil { - rt = wt(rt) - } - return transport.NewCacheRoundTripper(f.cacheDir, rt) - } - } - - // at this point we've negotiated and can get the client - kubeClient, err := kclientset.NewForConfig(cfg) - if err != nil { - return nil, err - - } - - cacheDir := computeDiscoverCacheDir(filepath.Join(homedir.HomeDir(), ".kube", "cache", "discovery"), cfg.Host) - return kcmdutil.NewCachedDiscoveryClient(newLegacyDiscoveryClient(kubeClient.Discovery().RESTClient()), cacheDir, time.Duration(10*time.Minute)), nil -} - func (f *ring0Factory) OpenShiftClientConfig() kclientcmd.ClientConfig { return f.clientConfig } diff --git a/pkg/oc/cli/util/clientcmd/legacy_discovery.go b/pkg/oc/cli/util/clientcmd/legacy_discovery.go deleted file mode 100644 index 52bf493dc22a..000000000000 --- a/pkg/oc/cli/util/clientcmd/legacy_discovery.go +++ /dev/null @@ -1,89 +0,0 @@ -package clientcmd - -import ( - "net/url" - - "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime/schema" - "k8s.io/client-go/discovery" - restclient "k8s.io/client-go/rest" -) - -// legacyDiscoveryClient implements the functions that discovery server-supported API groups, -// versions and resources. -type legacyDiscoveryClient struct { - *discovery.DiscoveryClient -} - -// ServerResourcesForGroupVersion returns the supported resources for a group and version. -// This can return an error *and* a partial result -func (d *legacyDiscoveryClient) ServerResourcesForGroupVersion(groupVersion string) (resources *metav1.APIResourceList, err error) { - if true { - return d.DiscoveryClient.ServerResourcesForGroupVersion(groupVersion) - } - parentList, err := d.DiscoveryClient.ServerResourcesForGroupVersion(groupVersion) - if err != nil { - return parentList, err - } - - if groupVersion != "v1" { - return parentList, nil - } - - // we request v1, we must combine the parent list with the list from /oapi - - url := url.URL{} - url.Path = "/oapi/" + groupVersion - originResources := &metav1.APIResourceList{} - err = d.RESTClient().Get().AbsPath(url.String()).Do().Into(originResources) - if err != nil { - // ignore 403 or 404 error to be compatible with an v1.0 server. - if groupVersion == "v1" && (errors.IsNotFound(err) || errors.IsForbidden(err)) { - return parentList, nil - } - return parentList, err - } - - parentList.APIResources = append(parentList.APIResources, originResources.APIResources...) - return parentList, nil -} - -// ServerResources returns the supported resources for all groups and versions. -// This can return an error *and* a partial result -func (d *legacyDiscoveryClient) ServerResources() ([]*metav1.APIResourceList, error) { - if true { - return d.DiscoveryClient.ServerResources() - } - apiGroups, err := d.ServerGroups() - if err != nil { - return nil, err - } - - result := []*metav1.APIResourceList{} - failedGroups := make(map[schema.GroupVersion]error) - - for _, apiGroup := range apiGroups.Groups { - for _, version := range apiGroup.Versions { - gv := schema.GroupVersion{Group: apiGroup.Name, Version: version.Version} - resources, err := d.ServerResourcesForGroupVersion(version.GroupVersion) - if err != nil { - failedGroups[gv] = err - continue - } - - result = append(result, resources) - } - } - - if len(failedGroups) == 0 { - return result, nil - } - - return result, &discovery.ErrGroupDiscoveryFailed{Groups: failedGroups} -} - -// newLegacyDiscoveryClient creates a new DiscoveryClient for the given RESTClient. -func newLegacyDiscoveryClient(c restclient.Interface) *legacyDiscoveryClient { - return &legacyDiscoveryClient{discovery.NewDiscoveryClient(c)} -} diff --git a/vendor/k8s.io/kubernetes/pkg/kubectl/cmd/util/factory_client_access.go b/vendor/k8s.io/kubernetes/pkg/kubectl/cmd/util/factory_client_access.go index 2e2c3bd58b42..0cd4e17f1a58 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubectl/cmd/util/factory_client_access.go +++ b/vendor/k8s.io/kubernetes/pkg/kubectl/cmd/util/factory_client_access.go @@ -82,6 +82,9 @@ func NewClientAccessFactory(optionalClientConfig clientcmd.ClientConfig) ClientA return NewClientAccessFactoryFromDiscovery(flags, clientConfig, &discoveryFactory{clientConfig: clientConfig}) } +func NewClientAccessFactoryFromFlags(flags *pflag.FlagSet, clientConfig clientcmd.ClientConfig) ClientAccessFactory { + return NewClientAccessFactoryFromDiscovery(flags, clientConfig, &discoveryFactory{clientConfig: clientConfig}) +} // NewClientAccessFactoryFromDiscovery allows an external caller to substitute a different discoveryFactory // Which allows for the client cache to be built in ring0, but still rely on a custom discovery client