add vault, consul-template, arvados pkgs
[arvados.git] / services / boot / supervisor.go
index d095c235d4791199fed19afd2ad7cd3e0ff18d49..2fcb33613d70e34337d833b0f13368f5a3f5bcb1 100644 (file)
@@ -2,7 +2,10 @@ package main
 
 import (
        "context"
+       "log"
        "os"
+
+       "github.com/hashicorp/consul/api"
 )
 
 type supervisor interface {
@@ -25,3 +28,47 @@ func newSupervisor(ctx context.Context, name, cmd string, args ...string) superv
        }
 }
 
+type supervisedService struct {
+       name string
+       cmd  string
+       args []string
+}
+
+func (s *supervisedService) Boot(ctx context.Context) error {
+       bin := s.cmd
+       if bin == "" {
+               bin = s.name
+       }
+       if _, err := os.Stat(bin); err != nil {
+               return err
+       }
+       sup := newSupervisor(ctx, s.name, bin)
+       if ok, err := sup.Running(ctx); err != nil {
+               return err
+       } else if !ok {
+               if err := sup.Start(ctx); err != nil {
+                       return err
+               }
+       }
+       if err := consul.Boot(ctx); err != nil {
+               return err
+       }
+       consul, err := api.NewClient(consulCfg)
+       if err != nil {
+               return err
+       }
+       agent := consul.Agent()
+       svcs, err := agent.Services()
+       if err != nil {
+               return err
+       }
+       if svc, ok := svcs[s.name]; ok {
+               log.Printf("%s is registered: %#v", s.name, svc)
+               return nil
+       }
+       return agent.ServiceRegister(&api.AgentServiceRegistration{
+               ID:   s.name,
+               Name: s.name,
+               Port: availablePort(),
+       })
+}