From 849279a07f1c528c710c89013760fc5430a788f6 Mon Sep 17 00:00:00 2001 From: Derek McQuay Date: Mon, 15 May 2017 10:48:25 -0700 Subject: [PATCH] builds its own []command from json Signed-off-by: Derek McQuay --- main.go | 131 +++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 82 insertions(+), 49 deletions(-) diff --git a/main.go b/main.go index a429ec5..9a3d252 100644 --- a/main.go +++ b/main.go @@ -8,39 +8,57 @@ import ( "os/exec" "strings" "sync" + + "github.com/fatih/color" ) type command struct { - node string - port int - url string - health string + node string + hc string } -type dcosJSON struct { +type healthCheck struct { + Name string `json:"name"` + PodSpecs []struct { + Type string `json:"type"` + TaskSpecs []struct { + HealthCheckSpec struct { + Command string `json:"command"` + } `json:"health-check-spec"` + } `json:"task-specs"` + } `json:"pod-specs"` +} + +type serviceIPs struct { Name string `json:"name"` Statuses []struct { ContainerStatus struct { - ContainerID struct { - Value string `json:"value"` - } `json:"container_id"` NetworkInfos []struct { IPAddresses []struct { IPAddress string `json:"ip_address"` } `json:"ip_addresses"` } `json:"network_infos"` } `json:"container_status"` - State string `json:"state"` - Timestamp float64 `json:"timestamp"` } `json:"statuses"` } -type apiserverIPs struct { - name string - ip string +func getHealthCheck() healthCheck { + cmd := exec.Command("dcos", "kubernetes", "config", "target") + var out bytes.Buffer + cmd.Stdout = &out + err := cmd.Run() + if err != nil { + log.Fatal(err) + } + + h := healthCheck{} + if err := json.Unmarshal([]byte(out.String()), &h); err != nil { + panic(err) + } + return h } -func getAPIServerIPs() []apiserverIPs { +func getServiceIPs() []serviceIPs { cmd := exec.Command("dcos", "task", "--json") var out bytes.Buffer cmd.Stdout = &out @@ -49,64 +67,75 @@ func getAPIServerIPs() []apiserverIPs { log.Fatal(err) } - d := []dcosJSON{} - if err := json.Unmarshal([]byte(out.String()), &d); err != nil { + s := []serviceIPs{} + if err := json.Unmarshal([]byte(out.String()), &s); err != nil { panic(err) } - ips := []apiserverIPs{} - for _, i := range d { - if strings.Contains(i.Name, "apiserver") { - ips = append( - ips, - apiserverIPs{ - name: i.Name, - ip: i.Statuses[0].ContainerStatus.NetworkInfos[0].IPAddresses[0].IPAddress, - }, - ) + + // get rid of kubernetes pod + for i, n := range s { + if n.Name == "kubernetes" { + s = append(s[:i], s[i+1:]...) } } - return ips + return s } -func addAPIServer(n string, ips []apiserverIPs) string { +func addAPIServer(n string, ips []serviceIPs) string { for _, i := range ips { - if strings.Contains(i.name, n) { - return i.ip + if strings.Contains(i.Name, n) { + return i.Statuses[0].ContainerStatus.NetworkInfos[0].IPAddresses[0].IPAddress } } return "" } +func stripHealthCheck(n string, hcs healthCheck) string { + for _, j := range hcs.PodSpecs { + if strings.Contains(n, j.Type) { + if len(j.TaskSpecs) != 0 { + return j.TaskSpecs[0].HealthCheckSpec.Command + } + return "" + } + } + return "" +} + +func buildCommands(hcs healthCheck, ips []serviceIPs) []command { + commands := []command{} + for _, s := range ips { + if strings.Contains(s.Name, "apiserver") || strings.Contains(s.Name, "etcd") { + ip := s.Statuses[0].ContainerStatus.NetworkInfos[0].IPAddresses[0].IPAddress + c := strings.Replace(stripHealthCheck(s.Name, hcs), "$LIBPROCESS_IP", ip, -1) + commands = append(commands, command{node: s.Name, hc: c}) + } else { + commands = append(commands, command{node: s.Name, hc: stripHealthCheck(s.Name, hcs)}) + } + } + fmt.Println(commands) + return commands +} + func main() { var wg sync.WaitGroup - ips := getAPIServerIPs() - hosts := []command{ - command{node: "kube-controller-manager-0-node", port: 10252, url: "localhost", health: "healthz"}, - command{node: "kube-controller-manager-1-node", port: 10252, url: "localhost", health: "healthz"}, - command{node: "kube-controller-manager-2-node", port: 10252, url: "localhost", health: "healthz"}, - command{node: "kube-scheduler-0-node", port: 10252, url: "localhost", health: "healthz"}, - command{node: "kube-scheduler-1-node", port: 10251, url: "localhost", health: "healthz"}, - command{node: "kube-scheduler-2-node", port: 10251, url: "localhost", health: "healthz"}, - command{node: "kube-apiserver-0-node", port: 9000, url: addAPIServer("0", ips), health: "healthz"}, - command{node: "kube-apiserver-1-node", port: 9000, url: addAPIServer("1", ips), health: "healthz"}, - command{node: "kube-apiserver-2-node", port: 9000, url: addAPIServer("2", ips), health: "healthz"}, - command{node: "etcd-0-node", port: 2379, url: "localhost", health: "health"}, - command{node: "etcd-1-node", port: 2379, url: "localhost", health: "health"}, - command{node: "etcd-2-node", port: 2379, url: "localhost", health: "health"}, - } + hcs := getHealthCheck() + ips := getServiceIPs() + hosts := buildCommands(hcs, ips) for _, n := range hosts { wg.Add(1) go func(c command) { defer wg.Done() + s := strings.Split(c.hc, " ") cmd := exec.Command( "dcos", "task", "exec", c.node, - "/usr/bin/curl", - "-sSf", - fmt.Sprintf("%s:%d/%s", c.url, c.port, c.health), + s[0], + s[1], + s[2], ) var out bytes.Buffer cmd.Stdout = &out @@ -114,7 +143,11 @@ func main() { if err != nil { log.Fatal(err) } - fmt.Printf("%v: %q\n", c, out.String()) + if strings.Contains(out.String(), "ok") || strings.Contains(out.String(), "true") { + color.Green(fmt.Sprintf("%v: %q\n", c, out.String())) + } else { + color.Red(fmt.Sprintf("%v: %q\n", c, out.String())) + } }(n) } wg.Wait()