fade out when stale
[arvados.git] / services / boot / consul_task.go
1 package main
2
3 import (
4         "fmt"
5         "os"
6         "os/exec"
7         "time"
8
9         "github.com/hashicorp/consul/api"
10 )
11
12 type consulService struct {
13         supervisor
14 }
15
16 func (cs *consulService) Init(cfg *Config) {
17         args := []string{
18                 "agent",
19                 "-server",
20                 "-advertise=127.0.0.1",
21                 "-data-dir", cfg.DataDir + "/consul",
22                 "-bootstrap-expect", fmt.Sprintf("%d", len(cfg.ControlHosts))}
23         cs.supervisor = newSupervisor("consul", "/usr/local/bin/consul", args...)
24 }
25
26 func (cs *consulService) Children() []task {
27         return nil
28 }
29
30 func (cs *consulService) ShortName() string {
31         return "consul running"
32 }
33
34 func (cs *consulService) String() string {
35         return "Ensure consul daemon is supervised & running"
36 }
37
38 func (cs *consulService) Check() error {
39         consul, err := api.NewClient(api.DefaultConfig())
40         if err != nil {
41                 return err
42         }
43         _, err = consul.Catalog().Datacenters()
44         if err != nil {
45                 return err
46         }
47         return nil
48 }
49
50 func (cs *consulService) CanFix() bool {
51         return true
52 }
53
54 func (cs *consulService) Fix() error {
55         err := cs.supervisor.Start()
56         if err != nil {
57                 return err
58         }
59
60         if len(cfg.ControlHosts) > 1 {
61                 cmd := exec.Command("/usr/local/bin/consul", append([]string{"join"}, cfg.ControlHosts...)...)
62                 cmd.Stdout = os.Stderr
63                 cmd.Stderr = os.Stderr
64                 err := cmd.Run()
65                 if err != nil {
66                         return err
67                 }
68         }
69
70         timeout := time.After(10 * time.Second)
71         ticker := time.NewTicker(50 * time.Millisecond)
72         defer ticker.Stop()
73         for cs.Check() != nil {
74                 select {
75                 case <-ticker.C:
76                 case <-timeout:
77                         return cs.Check()
78                 }
79         }
80         return nil
81 }