github.com/aclisp/heapster@v0.19.2-0.20160613100040-51756f899a96/common/kubernetes/configs.go (about)

     1  // Copyright 2014 Google Inc. All Rights Reserved.
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //
     7  //     http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12  // See the License for the specific language governing permissions and
    13  // limitations under the License.
    14  
    15  package kubernetes
    16  
    17  import (
    18  	"fmt"
    19  	"io/ioutil"
    20  	"net/url"
    21  	"strconv"
    22  
    23  	"k8s.io/kubernetes/pkg/api/unversioned"
    24  	kube_client "k8s.io/kubernetes/pkg/client/restclient"
    25  	kubeClientCmd "k8s.io/kubernetes/pkg/client/unversioned/clientcmd"
    26  	kubeClientCmdApi "k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api"
    27  )
    28  
    29  const (
    30  	APIVersion = "v1"
    31  
    32  	defaultKubeletPort        = 10255
    33  	defaultKubeletHttps       = false
    34  	defaultUseServiceAccount  = false
    35  	defaultServiceAccountFile = "/var/run/secrets/kubernetes.io/serviceaccount/token"
    36  	defaultInClusterConfig    = true
    37  )
    38  
    39  func getConfigOverrides(uri *url.URL) (*kubeClientCmd.ConfigOverrides, error) {
    40  	kubeConfigOverride := kubeClientCmd.ConfigOverrides{
    41  		ClusterInfo: kubeClientCmdApi.Cluster{
    42  			APIVersion: APIVersion,
    43  		},
    44  	}
    45  	if len(uri.Scheme) != 0 && len(uri.Host) != 0 {
    46  		kubeConfigOverride.ClusterInfo.Server = fmt.Sprintf("%s://%s", uri.Scheme, uri.Host)
    47  	}
    48  
    49  	opts := uri.Query()
    50  
    51  	if len(opts["apiVersion"]) >= 1 {
    52  		kubeConfigOverride.ClusterInfo.APIVersion = opts["apiVersion"][0]
    53  	}
    54  
    55  	if len(opts["insecure"]) > 0 {
    56  		insecure, err := strconv.ParseBool(opts["insecure"][0])
    57  		if err != nil {
    58  			return nil, err
    59  		}
    60  		kubeConfigOverride.ClusterInfo.InsecureSkipTLSVerify = insecure
    61  	}
    62  
    63  	return &kubeConfigOverride, nil
    64  }
    65  
    66  func GetKubeClientConfig(uri *url.URL) (*kube_client.Config, error) {
    67  	var (
    68  		kubeConfig *kube_client.Config
    69  		err        error
    70  	)
    71  
    72  	opts := uri.Query()
    73  	configOverrides, err := getConfigOverrides(uri)
    74  	if err != nil {
    75  		return nil, err
    76  	}
    77  
    78  	inClusterConfig := defaultInClusterConfig
    79  	if len(opts["inClusterConfig"]) > 0 {
    80  		inClusterConfig, err = strconv.ParseBool(opts["inClusterConfig"][0])
    81  		if err != nil {
    82  			return nil, err
    83  		}
    84  	}
    85  
    86  	if inClusterConfig {
    87  		kubeConfig, err = kube_client.InClusterConfig()
    88  		if err != nil {
    89  			return nil, err
    90  		}
    91  
    92  		if configOverrides.ClusterInfo.Server != "" {
    93  			kubeConfig.Host = configOverrides.ClusterInfo.Server
    94  		}
    95  		kubeConfig.GroupVersion = &unversioned.GroupVersion{Version: configOverrides.ClusterInfo.APIVersion}
    96  		kubeConfig.Insecure = configOverrides.ClusterInfo.InsecureSkipTLSVerify
    97  		if configOverrides.ClusterInfo.InsecureSkipTLSVerify {
    98  			kubeConfig.TLSClientConfig.CAFile = ""
    99  		}
   100  	} else {
   101  		authFile := ""
   102  		if len(opts["auth"]) > 0 {
   103  			authFile = opts["auth"][0]
   104  		}
   105  
   106  		if authFile != "" {
   107  			if kubeConfig, err = kubeClientCmd.NewNonInteractiveDeferredLoadingClientConfig(
   108  				&kubeClientCmd.ClientConfigLoadingRules{ExplicitPath: authFile},
   109  				configOverrides).ClientConfig(); err != nil {
   110  				return nil, err
   111  			}
   112  		} else {
   113  			kubeConfig = &kube_client.Config{
   114  				Host:     configOverrides.ClusterInfo.Server,
   115  				Insecure: configOverrides.ClusterInfo.InsecureSkipTLSVerify,
   116  			}
   117  			kubeConfig.GroupVersion = &unversioned.GroupVersion{Version: configOverrides.ClusterInfo.APIVersion}
   118  		}
   119  	}
   120  	if len(kubeConfig.Host) == 0 {
   121  		return nil, fmt.Errorf("invalid kubernetes master url specified")
   122  	}
   123  	if len(kubeConfig.GroupVersion.Version) == 0 {
   124  		return nil, fmt.Errorf("invalid kubernetes API version specified")
   125  	}
   126  
   127  	useServiceAccount := defaultUseServiceAccount
   128  	if len(opts["useServiceAccount"]) >= 1 {
   129  		useServiceAccount, err = strconv.ParseBool(opts["useServiceAccount"][0])
   130  		if err != nil {
   131  			return nil, err
   132  		}
   133  	}
   134  
   135  	if useServiceAccount {
   136  		// If a readable service account token exists, then use it
   137  		if contents, err := ioutil.ReadFile(defaultServiceAccountFile); err == nil {
   138  			kubeConfig.BearerToken = string(contents)
   139  		}
   140  	}
   141  
   142  	return kubeConfig, nil
   143  }