| 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) |
| } |