From 4b524ef995eefdbf74630beaeb0742a88715c82c Mon Sep 17 00:00:00 2001 From: Di Xu Date: Tue, 20 Nov 2018 14:49:10 +0800 Subject: [PATCH] kubectl loads config file once and uses persistent client config --- pkg/kubectl/cmd/cmd.go | 2 +- .../pkg/genericclioptions/config_flags.go | 32 ++++++++++++++++++- .../k8s.io/sample-cli-plugin/pkg/cmd/ns.go | 2 +- 3 files changed, 33 insertions(+), 3 deletions(-) diff --git a/pkg/kubectl/cmd/cmd.go b/pkg/kubectl/cmd/cmd.go index 2cfe569e93..baf8d9680e 100644 --- a/pkg/kubectl/cmd/cmd.go +++ b/pkg/kubectl/cmd/cmd.go @@ -423,7 +423,7 @@ func NewKubectlCommand(in io.Reader, out, err io.Writer) *cobra.Command { addProfilingFlags(flags) - kubeConfigFlags := genericclioptions.NewConfigFlags() + kubeConfigFlags := genericclioptions.NewConfigFlags(true) kubeConfigFlags.AddFlags(flags) matchVersionKubeConfigFlags := cmdutil.NewMatchVersionFlags(kubeConfigFlags) matchVersionKubeConfigFlags.AddFlags(cmds.PersistentFlags()) diff --git a/staging/src/k8s.io/cli-runtime/pkg/genericclioptions/config_flags.go b/staging/src/k8s.io/cli-runtime/pkg/genericclioptions/config_flags.go index e32e1eee77..b14cc90fac 100644 --- a/staging/src/k8s.io/cli-runtime/pkg/genericclioptions/config_flags.go +++ b/staging/src/k8s.io/cli-runtime/pkg/genericclioptions/config_flags.go @@ -21,6 +21,7 @@ import ( "path/filepath" "regexp" "strings" + "sync" "time" "github.com/spf13/pflag" @@ -92,6 +93,13 @@ type ConfigFlags struct { Username *string Password *string Timeout *string + + clientConfig clientcmd.ClientConfig + lock sync.Mutex + // If set to true, will use persistent client config and + // propagate the config to the places that need it, rather than + // loading the config multiple times + usePersistentConfig bool } // ToRESTConfig implements RESTClientGetter. @@ -106,6 +114,13 @@ func (f *ConfigFlags) ToRESTConfig() (*rest.Config, error) { // Returns an interactive clientConfig if the password flag is enabled, // or a non-interactive clientConfig otherwise. func (f *ConfigFlags) ToRawKubeConfigLoader() clientcmd.ClientConfig { + if f.usePersistentConfig { + return f.toRawKubePersistentConfigLoader() + } + return f.toRawKubeConfigLoader() +} + +func (f *ConfigFlags) toRawKubeConfigLoader() clientcmd.ClientConfig { loadingRules := clientcmd.NewDefaultClientConfigLoadingRules() // use the standard defaults for this client command // DEPRECATED: remove and replace with something more accurate @@ -181,6 +196,19 @@ func (f *ConfigFlags) ToRawKubeConfigLoader() clientcmd.ClientConfig { return clientConfig } +// toRawKubePersistentConfigLoader binds config flag values to config overrides +// Returns a persistent clientConfig for propagation. +func (f *ConfigFlags) toRawKubePersistentConfigLoader() clientcmd.ClientConfig { + f.lock.Lock() + defer f.lock.Unlock() + + if f.clientConfig == nil { + f.clientConfig = f.toRawKubeConfigLoader() + } + + return f.clientConfig +} + // ToDiscoveryClient implements RESTClientGetter. // Expects the AddFlags method to have been called. // Returns a CachedDiscoveryInterface using a computed RESTConfig. @@ -285,7 +313,7 @@ func (f *ConfigFlags) WithDeprecatedPasswordFlag() *ConfigFlags { } // NewConfigFlags returns ConfigFlags with default values set -func NewConfigFlags() *ConfigFlags { +func NewConfigFlags(usePersistentConfig bool) *ConfigFlags { impersonateGroup := []string{} insecure := false @@ -306,6 +334,8 @@ func NewConfigFlags() *ConfigFlags { BearerToken: stringptr(""), Impersonate: stringptr(""), ImpersonateGroup: &impersonateGroup, + + usePersistentConfig: usePersistentConfig, } } diff --git a/staging/src/k8s.io/sample-cli-plugin/pkg/cmd/ns.go b/staging/src/k8s.io/sample-cli-plugin/pkg/cmd/ns.go index 13f26cce45..c9a9468d5d 100644 --- a/staging/src/k8s.io/sample-cli-plugin/pkg/cmd/ns.go +++ b/staging/src/k8s.io/sample-cli-plugin/pkg/cmd/ns.go @@ -66,7 +66,7 @@ type NamespaceOptions struct { // NewNamespaceOptions provides an instance of NamespaceOptions with default values func NewNamespaceOptions(streams genericclioptions.IOStreams) *NamespaceOptions { return &NamespaceOptions{ - configFlags: genericclioptions.NewConfigFlags(), + configFlags: genericclioptions.NewConfigFlags(true), IOStreams: streams, }