clientcmd: fix NPE in NewNonInteractiveDeferredLoadingClientConfig with nil overrides

Kubernetes-commit: 945991b40275b096707c7b9eb0f192e99bd15b6d
This commit is contained in:
Dr. Stefan Schimanski 2020-06-26 15:59:17 +02:00 committed by Kubernetes Publisher
parent db5293afc7
commit 8f2b164e09
2 changed files with 38 additions and 23 deletions

View File

@ -159,7 +159,7 @@ func (config *DirectClientConfig) ClientConfig() (*restclient.Config, error) {
clientConfig.Proxy = http.ProxyURL(u) clientConfig.Proxy = http.ProxyURL(u)
} }
if len(config.overrides.Timeout) > 0 { if config.overrides != nil && len(config.overrides.Timeout) > 0 {
timeout, err := ParseTimeout(config.overrides.Timeout) timeout, err := ParseTimeout(config.overrides.Timeout)
if err != nil { if err != nil {
return nil, err return nil, err
@ -381,7 +381,7 @@ func (config *DirectClientConfig) ConfirmUsable() error {
// getContextName returns the default, or user-set context name, and a boolean that indicates // getContextName returns the default, or user-set context name, and a boolean that indicates
// whether the default context name has been overwritten by a user-set flag, or left as its default value // whether the default context name has been overwritten by a user-set flag, or left as its default value
func (config *DirectClientConfig) getContextName() (string, bool) { func (config *DirectClientConfig) getContextName() (string, bool) {
if len(config.overrides.CurrentContext) != 0 { if config.overrides != nil && len(config.overrides.CurrentContext) != 0 {
return config.overrides.CurrentContext, true return config.overrides.CurrentContext, true
} }
if len(config.contextName) != 0 { if len(config.contextName) != 0 {
@ -395,7 +395,7 @@ func (config *DirectClientConfig) getContextName() (string, bool) {
// and a boolean indicating whether the default authInfo name is overwritten by a user-set flag, or // and a boolean indicating whether the default authInfo name is overwritten by a user-set flag, or
// left as its default value // left as its default value
func (config *DirectClientConfig) getAuthInfoName() (string, bool) { func (config *DirectClientConfig) getAuthInfoName() (string, bool) {
if len(config.overrides.Context.AuthInfo) != 0 { if config.overrides != nil && len(config.overrides.Context.AuthInfo) != 0 {
return config.overrides.Context.AuthInfo, true return config.overrides.Context.AuthInfo, true
} }
context, _ := config.getContext() context, _ := config.getContext()
@ -406,7 +406,7 @@ func (config *DirectClientConfig) getAuthInfoName() (string, bool) {
// indicating whether the default clusterName has been overwritten by a user-set flag, or left as // indicating whether the default clusterName has been overwritten by a user-set flag, or left as
// its default value // its default value
func (config *DirectClientConfig) getClusterName() (string, bool) { func (config *DirectClientConfig) getClusterName() (string, bool) {
if len(config.overrides.Context.Cluster) != 0 { if config.overrides != nil && len(config.overrides.Context.Cluster) != 0 {
return config.overrides.Context.Cluster, true return config.overrides.Context.Cluster, true
} }
context, _ := config.getContext() context, _ := config.getContext()
@ -424,7 +424,9 @@ func (config *DirectClientConfig) getContext() (clientcmdapi.Context, error) {
} else if required { } else if required {
return clientcmdapi.Context{}, fmt.Errorf("context %q does not exist", contextName) return clientcmdapi.Context{}, fmt.Errorf("context %q does not exist", contextName)
} }
if config.overrides != nil {
mergo.MergeWithOverwrite(mergedContext, config.overrides.Context) mergo.MergeWithOverwrite(mergedContext, config.overrides.Context)
}
return *mergedContext, nil return *mergedContext, nil
} }
@ -440,7 +442,9 @@ func (config *DirectClientConfig) getAuthInfo() (clientcmdapi.AuthInfo, error) {
} else if required { } else if required {
return clientcmdapi.AuthInfo{}, fmt.Errorf("auth info %q does not exist", authInfoName) return clientcmdapi.AuthInfo{}, fmt.Errorf("auth info %q does not exist", authInfoName)
} }
if config.overrides != nil {
mergo.MergeWithOverwrite(mergedAuthInfo, config.overrides.AuthInfo) mergo.MergeWithOverwrite(mergedAuthInfo, config.overrides.AuthInfo)
}
return *mergedAuthInfo, nil return *mergedAuthInfo, nil
} }
@ -451,16 +455,22 @@ func (config *DirectClientConfig) getCluster() (clientcmdapi.Cluster, error) {
clusterInfoName, required := config.getClusterName() clusterInfoName, required := config.getClusterName()
mergedClusterInfo := clientcmdapi.NewCluster() mergedClusterInfo := clientcmdapi.NewCluster()
if config.overrides != nil {
mergo.MergeWithOverwrite(mergedClusterInfo, config.overrides.ClusterDefaults) mergo.MergeWithOverwrite(mergedClusterInfo, config.overrides.ClusterDefaults)
}
if configClusterInfo, exists := clusterInfos[clusterInfoName]; exists { if configClusterInfo, exists := clusterInfos[clusterInfoName]; exists {
mergo.MergeWithOverwrite(mergedClusterInfo, configClusterInfo) mergo.MergeWithOverwrite(mergedClusterInfo, configClusterInfo)
} else if required { } else if required {
return clientcmdapi.Cluster{}, fmt.Errorf("cluster %q does not exist", clusterInfoName) return clientcmdapi.Cluster{}, fmt.Errorf("cluster %q does not exist", clusterInfoName)
} }
if config.overrides != nil {
mergo.MergeWithOverwrite(mergedClusterInfo, config.overrides.ClusterInfo) mergo.MergeWithOverwrite(mergedClusterInfo, config.overrides.ClusterInfo)
}
// * An override of --insecure-skip-tls-verify=true and no accompanying CA/CA data should clear already-set CA/CA data // * An override of --insecure-skip-tls-verify=true and no accompanying CA/CA data should clear already-set CA/CA data
// otherwise, a kubeconfig containing a CA reference would return an error that "CA and insecure-skip-tls-verify couldn't both be set". // otherwise, a kubeconfig containing a CA reference would return an error that "CA and insecure-skip-tls-verify couldn't both be set".
// * An override of --certificate-authority should also override TLS skip settings and CA data, otherwise existing CA data will take precedence. // * An override of --certificate-authority should also override TLS skip settings and CA data, otherwise existing CA data will take precedence.
if config.overrides != nil {
caLen := len(config.overrides.ClusterInfo.CertificateAuthority) caLen := len(config.overrides.ClusterInfo.CertificateAuthority)
caDataLen := len(config.overrides.ClusterInfo.CertificateAuthorityData) caDataLen := len(config.overrides.ClusterInfo.CertificateAuthorityData)
if config.overrides.ClusterInfo.InsecureSkipTLSVerify || caLen > 0 || caDataLen > 0 { if config.overrides.ClusterInfo.InsecureSkipTLSVerify || caLen > 0 || caDataLen > 0 {
@ -476,6 +486,7 @@ func (config *DirectClientConfig) getCluster() (clientcmdapi.Cluster, error) {
if config.overrides.ClusterInfo.TLSServerName != "" || config.overrides.ClusterInfo.Server != "" { if config.overrides.ClusterInfo.TLSServerName != "" || config.overrides.ClusterInfo.Server != "" {
mergedClusterInfo.TLSServerName = config.overrides.ClusterInfo.TLSServerName mergedClusterInfo.TLSServerName = config.overrides.ClusterInfo.TLSServerName
} }
}
return *mergedClusterInfo, nil return *mergedClusterInfo, nil
} }

View File

@ -71,10 +71,14 @@ func (config *DeferredLoadingClientConfig) createClientConfig() (ClientConfig, e
return nil, err return nil, err
} }
var currentContext string
if config.overrides != nil {
currentContext = config.overrides.CurrentContext
}
if config.fallbackReader != nil { if config.fallbackReader != nil {
config.clientConfig = NewInteractiveClientConfig(*mergedConfig, config.overrides.CurrentContext, config.overrides, config.fallbackReader, config.loader) config.clientConfig = NewInteractiveClientConfig(*mergedConfig, currentContext, config.overrides, config.fallbackReader, config.loader)
} else { } else {
config.clientConfig = NewNonInteractiveClientConfig(*mergedConfig, config.overrides.CurrentContext, config.overrides, config.loader) config.clientConfig = NewNonInteractiveClientConfig(*mergedConfig, currentContext, config.overrides, config.loader)
} }
return config.clientConfig, nil return config.clientConfig, nil
} }