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 }