| /* |
| Copyright 2017 The Kubernetes Authors. |
| |
| Licensed under the Apache License, Version 2.0 (the "License"); |
| you may not use this file except in compliance with the License. |
| You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
| */ |
| |
| package kubeconfig |
| |
| import ( |
| "fmt" |
| |
| clientset "k8s.io/client-go/kubernetes" |
| "k8s.io/client-go/tools/clientcmd" |
| clientcmdapi "k8s.io/client-go/tools/clientcmd/api" |
| |
| "github.com/pkg/errors" |
| ) |
| |
| // CreateBasic creates a basic, general KubeConfig object that then can be extended |
| func CreateBasic(serverURL, clusterName, userName string, caCert []byte) *clientcmdapi.Config { |
| // Use the cluster and the username as the context name |
| contextName := fmt.Sprintf("%s@%s", userName, clusterName) |
| |
| return &clientcmdapi.Config{ |
| Clusters: map[string]*clientcmdapi.Cluster{ |
| clusterName: { |
| Server: serverURL, |
| CertificateAuthorityData: caCert, |
| }, |
| }, |
| Contexts: map[string]*clientcmdapi.Context{ |
| contextName: { |
| Cluster: clusterName, |
| AuthInfo: userName, |
| }, |
| }, |
| AuthInfos: map[string]*clientcmdapi.AuthInfo{}, |
| CurrentContext: contextName, |
| } |
| } |
| |
| // CreateWithCerts creates a KubeConfig object with access to the API server with client certificates |
| func CreateWithCerts(serverURL, clusterName, userName string, caCert []byte, clientKey []byte, clientCert []byte) *clientcmdapi.Config { |
| config := CreateBasic(serverURL, clusterName, userName, caCert) |
| config.AuthInfos[userName] = &clientcmdapi.AuthInfo{ |
| ClientKeyData: clientKey, |
| ClientCertificateData: clientCert, |
| } |
| return config |
| } |
| |
| // CreateWithToken creates a KubeConfig object with access to the API server with a token |
| func CreateWithToken(serverURL, clusterName, userName string, caCert []byte, token string) *clientcmdapi.Config { |
| config := CreateBasic(serverURL, clusterName, userName, caCert) |
| config.AuthInfos[userName] = &clientcmdapi.AuthInfo{ |
| Token: token, |
| } |
| return config |
| } |
| |
| // ClientSetFromFile returns a ready-to-use client from a kubeconfig file |
| func ClientSetFromFile(path string) (*clientset.Clientset, error) { |
| config, err := clientcmd.LoadFromFile(path) |
| if err != nil { |
| return nil, errors.Wrap(err, "failed to load admin kubeconfig") |
| } |
| return ToClientSet(config) |
| } |
| |
| // ToClientSet converts a KubeConfig object to a client |
| func ToClientSet(config *clientcmdapi.Config) (*clientset.Clientset, error) { |
| clientConfig, err := clientcmd.NewDefaultClientConfig(*config, &clientcmd.ConfigOverrides{}).ClientConfig() |
| if err != nil { |
| return nil, errors.Wrap(err, "failed to create API client configuration from kubeconfig") |
| } |
| |
| client, err := clientset.NewForConfig(clientConfig) |
| if err != nil { |
| return nil, errors.Wrap(err, "failed to create API client") |
| } |
| return client, nil |
| } |
| |
| // WriteToDisk writes a KubeConfig object down to disk with mode 0600 |
| func WriteToDisk(filename string, kubeconfig *clientcmdapi.Config) error { |
| err := clientcmd.WriteToFile(*kubeconfig, filename) |
| if err != nil { |
| return err |
| } |
| |
| return nil |
| } |
| |
| // GetClusterFromKubeConfig returns the default Cluster of the specified KubeConfig |
| func GetClusterFromKubeConfig(config *clientcmdapi.Config) *clientcmdapi.Cluster { |
| // If there is an unnamed cluster object, use it |
| if config.Clusters[""] != nil { |
| return config.Clusters[""] |
| } |
| if config.Contexts[config.CurrentContext] != nil { |
| return config.Clusters[config.Contexts[config.CurrentContext].Cluster] |
| } |
| return nil |
| } |