github.com/galamsiva2020/kubernetes-heapster-monitoring@v0.0.0-20210823134957-3c1baa7c1e70/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/apimachinery/pkg/runtime/schema"
    24  	kube_rest "k8s.io/client-go/rest"
    25  	kubeClientCmd "k8s.io/client-go/tools/clientcmd"
    26  	kubeClientCmdApi "k8s.io/client-go/tools/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  	}
    43  	if len(uri.Scheme) != 0 && len(uri.Host) != 0 {
    44  		kubeConfigOverride.ClusterInfo.Server = fmt.Sprintf("%s://%s", uri.Scheme, uri.Host)
    45  	}
    46  
    47  	opts := uri.Query()
    48  
    49  	if len(opts["insecure"]) > 0 {
    50  		insecure, err := strconv.ParseBool(opts["insecure"][0])
    51  		if err != nil {
    52  			return nil, err
    53  		}
    54  		kubeConfigOverride.ClusterInfo.InsecureSkipTLSVerify = insecure
    55  	}
    56  
    57  	return &kubeConfigOverride, nil
    58  }
    59  
    60  func GetKubeClientConfig(uri *url.URL) (*kube_rest.Config, error) {
    61  	var (
    62  		kubeConfig *kube_rest.Config
    63  		err        error
    64  	)
    65  
    66  	opts := uri.Query()
    67  	configOverrides, err := getConfigOverrides(uri)
    68  	if err != nil {
    69  		return nil, err
    70  	}
    71  
    72  	inClusterConfig := defaultInClusterConfig
    73  	if len(opts["inClusterConfig"]) > 0 {
    74  		inClusterConfig, err = strconv.ParseBool(opts["inClusterConfig"][0])
    75  		if err != nil {
    76  			return nil, err
    77  		}
    78  	}
    79  
    80  	if inClusterConfig {
    81  		kubeConfig, err = kube_rest.InClusterConfig()
    82  		if err != nil {
    83  			return nil, err
    84  		}
    85  
    86  		if configOverrides.ClusterInfo.Server != "" {
    87  			kubeConfig.Host = configOverrides.ClusterInfo.Server
    88  		}
    89  		kubeConfig.GroupVersion = &schema.GroupVersion{Version: APIVersion}
    90  		kubeConfig.Insecure = configOverrides.ClusterInfo.InsecureSkipTLSVerify
    91  		if configOverrides.ClusterInfo.InsecureSkipTLSVerify {
    92  			kubeConfig.TLSClientConfig.CAFile = ""
    93  		}
    94  	} else {
    95  		authFile := ""
    96  		if len(opts["auth"]) > 0 {
    97  			authFile = opts["auth"][0]
    98  		}
    99  
   100  		if authFile != "" {
   101  			// Load structured kubeconfig data from the given path.
   102  			loader := &kubeClientCmd.ClientConfigLoadingRules{ExplicitPath: authFile}
   103  			loadedConfig, err := loader.Load()
   104  			if err != nil {
   105  				return nil, err
   106  			}
   107  
   108  			// Flatten the loaded data to a particular restclient.Config based on the current context.
   109  			if kubeConfig, err = kubeClientCmd.NewNonInteractiveClientConfig(
   110  				*loadedConfig,
   111  				loadedConfig.CurrentContext,
   112  				&kubeClientCmd.ConfigOverrides{},
   113  				loader).ClientConfig(); err != nil {
   114  				return nil, err
   115  			}
   116  		} else {
   117  			kubeConfig = &kube_rest.Config{
   118  				Host: configOverrides.ClusterInfo.Server,
   119  				TLSClientConfig: kube_rest.TLSClientConfig{
   120  					Insecure: configOverrides.ClusterInfo.InsecureSkipTLSVerify,
   121  				},
   122  			}
   123  			kubeConfig.GroupVersion = &schema.GroupVersion{Version: APIVersion}
   124  		}
   125  	}
   126  	if len(kubeConfig.Host) == 0 {
   127  		return nil, fmt.Errorf("invalid kubernetes master url specified")
   128  	}
   129  
   130  	useServiceAccount := defaultUseServiceAccount
   131  	if len(opts["useServiceAccount"]) >= 1 {
   132  		useServiceAccount, err = strconv.ParseBool(opts["useServiceAccount"][0])
   133  		if err != nil {
   134  			return nil, err
   135  		}
   136  	}
   137  
   138  	if useServiceAccount {
   139  		// If a readable service account token exists, then use it
   140  		if contents, err := ioutil.ReadFile(defaultServiceAccountFile); err == nil {
   141  			kubeConfig.BearerToken = string(contents)
   142  		}
   143  	}
   144  
   145  	kubeConfig.ContentType = "application/vnd.kubernetes.protobuf"
   146  
   147  	return kubeConfig, nil
   148  }