github.com/jonaz/heapster@v1.3.0-beta.0.0.20170208112634-cd3c15ca3d29/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 // Load structured kubeconfig data from the given path. 108 loader := &kubeClientCmd.ClientConfigLoadingRules{ExplicitPath: authFile} 109 loadedConfig, err := loader.Load() 110 if err != nil { 111 return nil, err 112 } 113 114 // Flatten the loaded data to a particular restclient.Config based on the current context. 115 if kubeConfig, err = kubeClientCmd.NewNonInteractiveClientConfig( 116 *loadedConfig, 117 loadedConfig.CurrentContext, 118 &kubeClientCmd.ConfigOverrides{}, 119 loader).ClientConfig(); err != nil { 120 return nil, err 121 } 122 } else { 123 kubeConfig = &kube_client.Config{ 124 Host: configOverrides.ClusterInfo.Server, 125 Insecure: configOverrides.ClusterInfo.InsecureSkipTLSVerify, 126 } 127 kubeConfig.GroupVersion = &unversioned.GroupVersion{Version: configOverrides.ClusterInfo.APIVersion} 128 } 129 } 130 if len(kubeConfig.Host) == 0 { 131 return nil, fmt.Errorf("invalid kubernetes master url specified") 132 } 133 134 useServiceAccount := defaultUseServiceAccount 135 if len(opts["useServiceAccount"]) >= 1 { 136 useServiceAccount, err = strconv.ParseBool(opts["useServiceAccount"][0]) 137 if err != nil { 138 return nil, err 139 } 140 } 141 142 if useServiceAccount { 143 // If a readable service account token exists, then use it 144 if contents, err := ioutil.ReadFile(defaultServiceAccountFile); err == nil { 145 kubeConfig.BearerToken = string(contents) 146 } 147 } 148 149 kubeConfig.ContentType = "application/vnd.kubernetes.protobuf" 150 151 return kubeConfig, nil 152 }