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 }