This repository has been archived by the owner on Jun 16, 2023. It is now read-only.
forked from Mirantis/virtlet
-
Notifications
You must be signed in to change notification settings - Fork 0
/
k8s_client.go
90 lines (74 loc) · 2.88 KB
/
k8s_client.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
/*
Copyright 2017 Mirantis
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 utils
import (
"flag"
"os"
"strings"
"github.com/spf13/pflag"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/rest"
"k8s.io/client-go/tools/clientcmd"
)
// GetK8sClientConfig returns config that is needed to access k8s
func GetK8sClientConfig(host string) (*rest.Config, error) {
if host == "" {
url, exists := os.LookupEnv("KUBERNETES_CLUSTER_URL")
if !exists {
return rest.InClusterConfig()
}
host = url
}
return &rest.Config{Host: host}, nil
}
// GetK8sClientset returns clientset for standard k8s APIs
func GetK8sClientset(config *rest.Config) (*kubernetes.Clientset, error) {
if config == nil {
var err error
config, err = GetK8sClientConfig("")
if err != nil {
return nil, err
}
}
return kubernetes.NewForConfig(config)
}
// wordSepNormalizeFunc change "_" to "-" in the flags.
func wordSepNormalizeFunc(f *pflag.FlagSet, name string) pflag.NormalizedName {
if strings.Contains(name, "_") {
return pflag.NormalizedName(strings.Replace(name, "_", "-", -1))
}
return pflag.NormalizedName(name)
}
// defaultClientConfig builds a default Kubernetes client config based
// on Cobra flags. It's based on kubelet code.
func defaultClientConfig(flags *pflag.FlagSet) clientcmd.ClientConfig {
loadingRules := clientcmd.NewDefaultClientConfigLoadingRules()
// use the standard defaults for this client command
// DEPRECATED: remove and replace with something more accurate
loadingRules.DefaultClientConfig = &clientcmd.DefaultClientConfig
flags.StringVar(&loadingRules.ExplicitPath, "kubeconfig", "", "Path to the kubeconfig file to use for CLI requests.")
overrides := &clientcmd.ConfigOverrides{ClusterDefaults: clientcmd.ClusterDefaults}
flagNames := clientcmd.RecommendedConfigOverrideFlags("")
// short flagnames are disabled by default. These are here for compatibility with existing scripts
flagNames.ClusterOverrideFlags.APIServer.ShortName = "s"
clientcmd.BindOverrideFlags(overrides, flags, flagNames)
clientConfig := clientcmd.NewInteractiveDeferredLoadingClientConfig(loadingRules, overrides, os.Stdin)
return clientConfig
}
// BindFlags applies standard Go flags and the flags used by kubeclient
// to the specified FlagSet.
func BindFlags(flags *pflag.FlagSet) clientcmd.ClientConfig {
flags.AddGoFlagSet(flag.CommandLine)
flags.SetNormalizeFunc(wordSepNormalizeFunc)
return defaultClientConfig(flags)
}