master
go 71 lines 1.46 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 package k8sclient
4
5 import (
6 "errors"
7 "os"
8 "path/filepath"
9
10 "k8s.io/client-go/kubernetes"
11 "k8s.io/client-go/kubernetes/fake"
12 "k8s.io/client-go/rest"
13 "k8s.io/client-go/tools/clientcmd"
14
15 _ "k8s.io/client-go/plugin/pkg/client/auth/gcp"
16 )
17
18 const (
19 EnvFakeClient = "KUBERNETES_FAKE_CLIENTSET"
20 defaultUserAgent = "Netdata/k8s-client"
21 )
22
23 func New(userAgent string) (kubernetes.Interface, error) {
24 if userAgent == "" {
25 userAgent = defaultUserAgent
26 }
27
28 switch {
29 case os.Getenv(EnvFakeClient) != "":
30 return fake.NewClientset(), nil
31 case os.Getenv("KUBERNETES_SERVICE_HOST") != "" && os.Getenv("KUBERNETES_SERVICE_PORT") != "":
32 return newInCluster(userAgent)
33 default:
34 return newOutOfCluster(userAgent)
35 }
36 }
37
38 func newInCluster(userAgent string) (*kubernetes.Clientset, error) {
39 config, err := rest.InClusterConfig()
40 if err != nil {
41 return nil, err
42 }
43
44 config.UserAgent = userAgent
45
46 return kubernetes.NewForConfig(config)
47 }
48
49 func newOutOfCluster(userAgent string) (*kubernetes.Clientset, error) {
50 home := homeDir()
51 if home == "" {
52 return nil, errors.New("couldn't find home directory")
53 }
54
55 path := filepath.Join(home, ".kube", "config")
56 config, err := clientcmd.BuildConfigFromFlags("", path)
57 if err != nil {
58 return nil, err
59 }
60
61 config.UserAgent = userAgent
62
63 return kubernetes.NewForConfig(config)
64 }
65
66 func homeDir() string {
67 if h := os.Getenv("HOME"); h != "" {
68 return h
69 }
70 return os.Getenv("USERPROFILE") // windows
71 }