github.com/justincormack/cli@v0.0.0-20201215022714-831ebeae9675/cli/context/kubernetes/save.go (about)

     1  package kubernetes
     2  
     3  import (
     4  	"io/ioutil"
     5  
     6  	"github.com/docker/cli/cli/context"
     7  	"k8s.io/client-go/tools/clientcmd"
     8  	clientcmdapi "k8s.io/client-go/tools/clientcmd/api"
     9  )
    10  
    11  // FromKubeConfig creates a Kubernetes endpoint from a Kubeconfig file
    12  func FromKubeConfig(kubeconfig, kubeContext, namespaceOverride string) (Endpoint, error) {
    13  	cfg := clientcmd.NewNonInteractiveDeferredLoadingClientConfig(
    14  		&clientcmd.ClientConfigLoadingRules{ExplicitPath: kubeconfig},
    15  		&clientcmd.ConfigOverrides{CurrentContext: kubeContext, Context: clientcmdapi.Context{Namespace: namespaceOverride}})
    16  	ns, _, err := cfg.Namespace()
    17  	if err != nil {
    18  		return Endpoint{}, err
    19  	}
    20  	clientcfg, err := cfg.ClientConfig()
    21  	if err != nil {
    22  		return Endpoint{}, err
    23  	}
    24  	var ca, key, cert []byte
    25  	if ca, err = readFileOrDefault(clientcfg.CAFile, clientcfg.CAData); err != nil {
    26  		return Endpoint{}, err
    27  	}
    28  	if key, err = readFileOrDefault(clientcfg.KeyFile, clientcfg.KeyData); err != nil {
    29  		return Endpoint{}, err
    30  	}
    31  	if cert, err = readFileOrDefault(clientcfg.CertFile, clientcfg.CertData); err != nil {
    32  		return Endpoint{}, err
    33  	}
    34  	var tlsData *context.TLSData
    35  	if ca != nil || cert != nil || key != nil {
    36  		tlsData = &context.TLSData{
    37  			CA:   ca,
    38  			Cert: cert,
    39  			Key:  key,
    40  		}
    41  	}
    42  	var usernamePassword *UsernamePassword
    43  	if clientcfg.Username != "" || clientcfg.Password != "" {
    44  		usernamePassword = &UsernamePassword{
    45  			Username: clientcfg.Username,
    46  			Password: clientcfg.Password,
    47  		}
    48  	}
    49  	return Endpoint{
    50  		EndpointMeta: EndpointMeta{
    51  			EndpointMetaBase: context.EndpointMetaBase{
    52  				Host:          clientcfg.Host,
    53  				SkipTLSVerify: clientcfg.Insecure,
    54  			},
    55  			DefaultNamespace: ns,
    56  			AuthProvider:     clientcfg.AuthProvider,
    57  			Exec:             clientcfg.ExecProvider,
    58  			UsernamePassword: usernamePassword,
    59  		},
    60  		TLSData: tlsData,
    61  	}, nil
    62  }
    63  
    64  func readFileOrDefault(path string, defaultValue []byte) ([]byte, error) {
    65  	if path != "" {
    66  		return ioutil.ReadFile(path)
    67  	}
    68  	return defaultValue, nil
    69  }