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 }