Sergiusz Bazanski | 8fe651b | 2019-07-21 23:50:05 +0200 | [diff] [blame] | 1 | package mirko |
| 2 | |
| 3 | import ( |
Serge Bazanski | ba28a04 | 2021-05-22 19:07:59 +0000 | [diff] [blame] | 4 | "sync" |
| 5 | |
Sergiusz Bazanski | 8fe651b | 2019-07-21 23:50:05 +0200 | [diff] [blame] | 6 | "github.com/golang/glog" |
| 7 | "k8s.io/client-go/kubernetes" |
| 8 | "k8s.io/client-go/rest" |
| 9 | ) |
| 10 | |
Serge Bazanski | ba28a04 | 2021-05-22 19:07:59 +0000 | [diff] [blame] | 11 | var ( |
| 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. |
| 30 | func KubernetesClient() *kubernetes.Clientset { |
| 31 | kubernetesCSMu.Lock() |
| 32 | defer kubernetesCSMu.Unlock() |
| 33 | |
| 34 | if kubernetesCSValid { |
| 35 | return kubernetesCS |
| 36 | } |
| 37 | |
| 38 | kubernetesCSValid = true |
Sergiusz Bazanski | 8fe651b | 2019-07-21 23:50:05 +0200 | [diff] [blame] | 39 | config, err := rest.InClusterConfig() |
| 40 | if err != nil { |
Serge Bazanski | ba28a04 | 2021-05-22 19:07:59 +0000 | [diff] [blame] | 41 | glog.Errorf("Kubernetes InClusterConfig: %v", err) |
| 42 | glog.Infof("Mirko: no kubernetes config available...") |
| 43 | return nil |
Sergiusz Bazanski | 8fe651b | 2019-07-21 23:50:05 +0200 | [diff] [blame] | 44 | } |
Sergiusz Bazanski | 8fe651b | 2019-07-21 23:50:05 +0200 | [diff] [blame] | 45 | clientset, err := kubernetes.NewForConfig(config) |
| 46 | if err != nil { |
Serge Bazanski | ba28a04 | 2021-05-22 19:07:59 +0000 | [diff] [blame] | 47 | glog.Errorf("Kubernetes NewForConfig: %v", err) |
| 48 | glog.Infof("Mirko: no kubernetes client available...") |
| 49 | return nil |
Sergiusz Bazanski | 8fe651b | 2019-07-21 23:50:05 +0200 | [diff] [blame] | 50 | } |
| 51 | |
Serge Bazanski | ba28a04 | 2021-05-22 19:07:59 +0000 | [diff] [blame] | 52 | kubernetesCS = clientset |
| 53 | return clientset |
Sergiusz Bazanski | 8fe651b | 2019-07-21 23:50:05 +0200 | [diff] [blame] | 54 | } |