11 "github.com/hashicorp/nomad/api"
14 var nomad = &nomadBooter{}
16 type nomadBooter struct {
20 func (nb *nomadBooter) Boot(ctx context.Context) error {
24 if nb.check(ctx) == nil {
28 bin := cfg.UsrDir + "/bin/nomad"
30 URL: "https://releases.hashicorp.com/nomad/0.5.4/nomad_0.5.4_linux_amd64.zip",
39 dataDir := path.Join(cfg.DataDir, "nomad")
40 if err := os.MkdirAll(dataDir, 0700); err != nil {
44 cf := path.Join(cfg.DataDir, "nomad.json")
45 err = atomicWriteJSON(cf, map[string]interface{}{
46 "client": map[string]interface{}{
48 "options": map[string]interface{}{
49 "driver.raw_exec.enable": true,
52 "consul": map[string]interface{}{
53 "address": fmt.Sprintf("127.0.0.1:%d", cfg.Ports.ConsulHTTP),
56 "datacenter": cfg.SiteID,
57 "ports": map[string]int{
58 "http": cfg.Ports.NomadHTTP,
59 "rpc": cfg.Ports.NomadRPC,
60 "serf": cfg.Ports.NomadSerf,
62 "server": map[string]interface{}{
64 "bootstrap_expect": len(cfg.ControlHosts),
71 supervisor := newSupervisor(ctx, "arvados-nomad", bin, "agent", "-config="+cf)
72 running, err := supervisor.Running(ctx)
77 defer feedbackf(ctx, "starting nomad service")()
78 err = supervisor.Start(ctx)
80 return fmt.Errorf("starting nomad: %s", err)
83 return waitCheck(ctx, 30*time.Second, nb.check)
86 var nomadCfg = api.DefaultConfig()
88 func (nb *nomadBooter) check(ctx context.Context) error {
90 nomadCfg.Address = fmt.Sprintf("http://127.0.0.1:%d", cfg.Ports.NomadHTTP)
91 nomad, err := api.NewClient(nomadCfg)
95 _, err = nomad.Agent().Datacenter()