10 "github.com/hashicorp/consul/api"
13 var consul = &consulBooter{}
15 type consulBooter struct {
19 func (cb *consulBooter) Boot(ctx context.Context) error {
23 if cb.check(ctx) == nil {
27 bin := cfg.UsrDir + "/bin/consul"
29 URL: "https://releases.hashicorp.com/consul/0.7.2/consul_0.7.2_linux_amd64.zip",
37 dataDir := cfg.DataDir + "/consul"
38 if err := os.MkdirAll(dataDir, 0700); err != nil {
44 "-datacenter=" + cfg.SiteID,
45 "-dns-port=" + fmt.Sprintf("%d", cfg.Ports.ConsulDNS),
46 "-http-port=" + fmt.Sprintf("%d", cfg.Ports.ConsulHTTP),
47 "-serf-lan-bind=0.0.0.0:" + fmt.Sprintf("%d", cfg.Ports.ConsulSerfLAN),
48 "-serf-wan-bind=0.0.0.0:" + fmt.Sprintf("%d", cfg.Ports.ConsulSerfWAN),
50 "-bootstrap-expect", fmt.Sprintf("%d", len(cfg.ControlHosts))}
51 supervisor := newSupervisor(ctx, "consul", bin, args...)
52 running, err := supervisor.Running(ctx)
57 defer feedbackf(ctx, "starting consul service")()
58 err = supervisor.Start(ctx)
60 return fmt.Errorf("starting consul: %s", err)
62 if len(cfg.ControlHosts) > 1 {
63 cmd := exec.Command(bin, append([]string{"join"}, cfg.ControlHosts...)...)
64 cmd.Stdout = os.Stderr
65 cmd.Stderr = os.Stderr
68 return fmt.Errorf("consul join: %s", err)
75 var consulCfg = api.DefaultConfig()
77 func (cb *consulBooter) check(ctx context.Context) error {
79 consulCfg.Address = fmt.Sprintf("127.0.0.1:%d", cfg.Ports.ConsulHTTP)
80 consulCfg.Datacenter = cfg.SiteID
81 consul, err := api.NewClient(consulCfg)
85 _, err = consul.Catalog().Datacenters()