| package mirko |
| |
| import ( |
| "sync" |
| |
| "github.com/golang/glog" |
| "k8s.io/client-go/kubernetes" |
| "k8s.io/client-go/rest" |
| ) |
| |
| var ( |
| // kubernetesCS is a kubernetes clientset that can connect to the cluster |
| // that this program is running in, or nil if uninitialized (or not in a |
| // cluster. |
| kubernetesCS *kubernetes.Clientset |
| // kubernetesCSValid is true when kubernetesCS is 'valid', ie. when the |
| // clientset is either an actual clientset object, or nil if the program is |
| // not running in production. |
| kubernetesCSValid bool |
| // kubernetesCSMu guards kubernetesCS and kubernetesCSValid. |
| kubernetesCSMu sync.Mutex |
| ) |
| |
| // KubernetesClient attempts to connect to Kubernetes using in-cluster |
| // configuration and returns the resulting clientset. If connecting fails, nil |
| // is returned. Connection will fail if the program is not running in |
| // production. |
| // The connection result is cached for the rest of the program lifetime, so |
| // this function is cheap to call. |
| func KubernetesClient() *kubernetes.Clientset { |
| kubernetesCSMu.Lock() |
| defer kubernetesCSMu.Unlock() |
| |
| if kubernetesCSValid { |
| return kubernetesCS |
| } |
| |
| kubernetesCSValid = true |
| config, err := rest.InClusterConfig() |
| if err != nil { |
| glog.Errorf("Kubernetes InClusterConfig: %v", err) |
| glog.Infof("Mirko: no kubernetes config available...") |
| return nil |
| } |
| clientset, err := kubernetes.NewForConfig(config) |
| if err != nil { |
| glog.Errorf("Kubernetes NewForConfig: %v", err) |
| glog.Infof("Mirko: no kubernetes client available...") |
| return nil |
| } |
| |
| kubernetesCS = clientset |
| return clientset |
| } |