blob: a05d4c1aeb94912d2c2fa3ab1ba3982da04ce8eb [file] [log] [blame]
Sergiusz Bazanski8fe651b2019-07-21 23:50:05 +02001package mirko
2
3import (
Serge Bazanskiba28a042021-05-22 19:07:59 +00004 "sync"
5
Sergiusz Bazanski8fe651b2019-07-21 23:50:05 +02006 "github.com/golang/glog"
7 "k8s.io/client-go/kubernetes"
8 "k8s.io/client-go/rest"
9)
10
Serge Bazanskiba28a042021-05-22 19:07:59 +000011var (
12 // kubernetesCS is a kubernetes clientset that can connect to the cluster
13 // that this program is running in, or nil if uninitialized (or not in a
14 // cluster.
15 kubernetesCS *kubernetes.Clientset
16 // kubernetesCSValid is true when kubernetesCS is 'valid', ie. when the
17 // clientset is either an actual clientset object, or nil if the program is
18 // not running in production.
19 kubernetesCSValid bool
20 // kubernetesCSMu guards kubernetesCS and kubernetesCSValid.
21 kubernetesCSMu sync.Mutex
22)
23
24// KubernetesClient attempts to connect to Kubernetes using in-cluster
25// configuration and returns the resulting clientset. If connecting fails, nil
26// is returned. Connection will fail if the program is not running in
27// production.
28// The connection result is cached for the rest of the program lifetime, so
29// this function is cheap to call.
30func KubernetesClient() *kubernetes.Clientset {
31 kubernetesCSMu.Lock()
32 defer kubernetesCSMu.Unlock()
33
34 if kubernetesCSValid {
35 return kubernetesCS
36 }
37
38 kubernetesCSValid = true
Sergiusz Bazanski8fe651b2019-07-21 23:50:05 +020039 config, err := rest.InClusterConfig()
40 if err != nil {
Serge Bazanskiba28a042021-05-22 19:07:59 +000041 glog.Errorf("Kubernetes InClusterConfig: %v", err)
42 glog.Infof("Mirko: no kubernetes config available...")
43 return nil
Sergiusz Bazanski8fe651b2019-07-21 23:50:05 +020044 }
Sergiusz Bazanski8fe651b2019-07-21 23:50:05 +020045 clientset, err := kubernetes.NewForConfig(config)
46 if err != nil {
Serge Bazanskiba28a042021-05-22 19:07:59 +000047 glog.Errorf("Kubernetes NewForConfig: %v", err)
48 glog.Infof("Mirko: no kubernetes client available...")
49 return nil
Sergiusz Bazanski8fe651b2019-07-21 23:50:05 +020050 }
51
Serge Bazanskiba28a042021-05-22 19:07:59 +000052 kubernetesCS = clientset
53 return clientset
Sergiusz Bazanski8fe651b2019-07-21 23:50:05 +020054}