package main import ( "crypto/tls" "crypto/x509" "fmt" "io/ioutil" "os" "os/exec" "path" "path/filepath" "time" "github.com/golang/glog" pb "code.hackerspace.pl/hscloud/cluster/prodvider/proto" "code.hackerspace.pl/hscloud/go/workspace" ) func kubernetesPaths() (string, string, string) { ws, err := workspace.Get() if err != nil { glog.Exitf("%v", err) } localKey := path.Join(ws, ".kubectl", fmt.Sprintf("%s.key", flagUsername)) localCert := path.Join(ws, ".kubectl", fmt.Sprintf("%s.crt", flagUsername)) localCA := path.Join(ws, ".kubectl", fmt.Sprintf("ca.crt")) return localKey, localCert, localCA } func needKubernetesCreds() bool { localKey, localCert, _ := kubernetesPaths() // Check for existence of cert/key. if _, err := os.Stat(localKey); os.IsNotExist(err) { return true } if _, err := os.Stat(localCert); os.IsNotExist(err) { return true } // Cert/key exist, try to load and parse. creds, err := tls.LoadX509KeyPair(localCert, localKey) if err != nil { return true } if len(creds.Certificate) != 1 { return true } cert, err := x509.ParseCertificate(creds.Certificate[0]) if err != nil { return true } creds.Leaf = cert // Check if certificate will still be valid in 2 hours. target := time.Now().Add(2 * time.Hour) if creds.Leaf.NotAfter.Before(target) { return true } return false } func useKubernetesKeys(keys *pb.KubernetesKeys) { localKey, localCert, localCA := kubernetesPaths() parent := filepath.Dir(localKey) if _, err := os.Stat(parent); os.IsNotExist(err) { os.MkdirAll(parent, 0700) } if err := ioutil.WriteFile(localKey, keys.Key, 0600); err != nil { glog.Exitf("WriteFile(%q): %v", localKey, err) } if err := ioutil.WriteFile(localCert, keys.Cert, 0600); err != nil { glog.Exitf("WriteFile(%q): %v", localCert, err) } if err := ioutil.WriteFile(localCA, keys.Ca, 0600); err != nil { glog.Exitf("WriteFile(%q): %v", localCA, err) } kubectl := func(args ...string) { cmd := exec.Command("kubectl", args...) out, err := cmd.CombinedOutput() if err != nil { glog.Exitf("kubectl %v: %v: %v", args, err, string(out)) } } kubectl("config", "set-cluster", keys.Cluster, "--certificate-authority="+localCA, "--embed-certs=true", "--server=https://"+keys.Cluster+":4001") kubectl("config", "set-credentials", flagUsername, "--client-certificate="+localCert, "--client-key="+localKey, "--embed-certs=true") kubectl("config", "set-context", keys.Cluster, "--cluster="+keys.Cluster, "--user="+flagUsername) kubectl("config", "use-context", keys.Cluster) }