From 7c58f94edcced7169784aa4fd1e6e63dc5ed3029 Mon Sep 17 00:00:00 2001 From: Muhammed Uluyol Date: Tue, 18 Aug 2015 14:25:38 -0700 Subject: [PATCH] Create an experimental client cache. Previously, we would initialize the experimental client at factory creation time. This is problematic because the clientConfig loader has values populated from the command-line flag parsing, and these are not populated until after Factory creation. Introduce an ExperimentalClientCache to create (and reuse) ExperimentalClients. --- pkg/kubectl/cmd/util/clientcache.go | 25 +++++++++++++++++++++++++ pkg/kubectl/cmd/util/factory.go | 18 ++++++------------ 2 files changed, 31 insertions(+), 12 deletions(-) diff --git a/pkg/kubectl/cmd/util/clientcache.go b/pkg/kubectl/cmd/util/clientcache.go index c43fcca264e..49253b7e3da 100644 --- a/pkg/kubectl/cmd/util/clientcache.go +++ b/pkg/kubectl/cmd/util/clientcache.go @@ -89,3 +89,28 @@ func (c *ClientCache) ClientForVersion(version string) (*client.Client, error) { c.clients[config.Version] = client return client, nil } + +type ExperimentalClientCache struct { + loader clientcmd.ClientConfig + client *client.ExperimentalClient + err error + init bool +} + +func NewExperimentalClientCache(loader clientcmd.ClientConfig) *ExperimentalClientCache { + return &ExperimentalClientCache{loader: loader} +} + +func (cc *ExperimentalClientCache) Client() (*client.ExperimentalClient, error) { + if cc.init { + return cc.client, cc.err + } + cfg, err := cc.loader.ClientConfig() + if err != nil { + cc.err = err + } else { + cc.client, cc.err = client.NewExperimental(cfg) + } + cc.init = true + return cc.client, cc.err +} diff --git a/pkg/kubectl/cmd/util/factory.go b/pkg/kubectl/cmd/util/factory.go index fed40ad8273..b429ea582cc 100644 --- a/pkg/kubectl/cmd/util/factory.go +++ b/pkg/kubectl/cmd/util/factory.go @@ -110,14 +110,7 @@ func NewFactory(optionalClientConfig clientcmd.ClientConfig) *Factory { } clients := NewClientCache(clientConfig) - - // Initialize the experimental client (if possible). Failing here is non-fatal, errors - // will be returned when an experimental client is explicitly requested. - var experimentalClient *client.ExperimentalClient - cfg, experimentalClientErr := clientConfig.ClientConfig() - if experimentalClientErr == nil { - experimentalClient, experimentalClientErr = client.NewExperimental(cfg) - } + expClients := NewExperimentalClientCache(clientConfig) noClientErr := errors.New("could not get client") getBothClients := func(group string, version string) (client *client.Client, expClient *client.ExperimentalClient, err error) { @@ -126,7 +119,7 @@ func NewFactory(optionalClientConfig clientcmd.ClientConfig) *Factory { case "api": client, err = clients.ClientForVersion(version) case "experimental": - expClient, err = experimentalClient, experimentalClientErr + expClient, err = expClients.Client() } return } @@ -146,7 +139,7 @@ func NewFactory(optionalClientConfig clientcmd.ClientConfig) *Factory { return clients.ClientForVersion("") }, ExperimentalClient: func() (*client.ExperimentalClient, error) { - return experimentalClient, experimentalClientErr + return expClients.Client() }, ClientConfig: func() (*client.Config, error) { return clients.ClientConfigForVersion("") @@ -164,7 +157,7 @@ func NewFactory(optionalClientConfig clientcmd.ClientConfig) *Factory { } return client.RESTClient, nil case "experimental": - client, err := experimentalClient, experimentalClientErr + client, err := expClients.Client() if err != nil { return nil, err } @@ -260,7 +253,8 @@ func NewFactory(optionalClientConfig clientcmd.ClientConfig) *Factory { if err != nil { return nil, err } - return &clientSwaggerSchema{client, experimentalClient, api.Scheme}, nil + expClient, _ := expClients.Client() + return &clientSwaggerSchema{client, expClient, api.Scheme}, nil } return validation.NullSchema{}, nil },