github.com/pdmccormick/importable-docker-buildx@v0.0.0-20240426161518-e47091289030/driver/kubernetes/context/save.go (about)

     1  package context
     2  
     3  import (
     4  	"os"
     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  
    25  	var proxyURLString string
    26  	if clientcfg.Proxy != nil {
    27  		proxyURL, err := clientcfg.Proxy(nil)
    28  		if err != nil {
    29  			return Endpoint{}, err
    30  		}
    31  
    32  		proxyURLString = proxyURL.String()
    33  	}
    34  
    35  	var ca, key, cert []byte
    36  	if ca, err = readFileOrDefault(clientcfg.CAFile, clientcfg.CAData); err != nil {
    37  		return Endpoint{}, err
    38  	}
    39  	if key, err = readFileOrDefault(clientcfg.KeyFile, clientcfg.KeyData); err != nil {
    40  		return Endpoint{}, err
    41  	}
    42  	if cert, err = readFileOrDefault(clientcfg.CertFile, clientcfg.CertData); err != nil {
    43  		return Endpoint{}, err
    44  	}
    45  	var tlsData *context.TLSData
    46  	if ca != nil || cert != nil || key != nil {
    47  		tlsData = &context.TLSData{
    48  			CA:   ca,
    49  			Cert: cert,
    50  			Key:  key,
    51  		}
    52  	}
    53  	var usernamePassword *UsernamePassword
    54  	if clientcfg.Username != "" || clientcfg.Password != "" {
    55  		usernamePassword = &UsernamePassword{
    56  			Username: clientcfg.Username,
    57  			Password: clientcfg.Password,
    58  		}
    59  	}
    60  	return Endpoint{
    61  		EndpointMeta: EndpointMeta{
    62  			EndpointMetaBase: context.EndpointMetaBase{
    63  				Host:          clientcfg.Host,
    64  				SkipTLSVerify: clientcfg.Insecure,
    65  			},
    66  			DefaultNamespace: ns,
    67  			ProxyURL:         proxyURLString,
    68  			AuthProvider:     clientcfg.AuthProvider,
    69  			Exec:             clientcfg.ExecProvider,
    70  			UsernamePassword: usernamePassword,
    71  			Token:            clientcfg.BearerToken,
    72  		},
    73  		TLSData: tlsData,
    74  	}, nil
    75  }
    76  
    77  func readFileOrDefault(path string, defaultValue []byte) ([]byte, error) {
    78  	if path != "" {
    79  		return os.ReadFile(path)
    80  	}
    81  	return defaultValue, nil
    82  }