13547: Merge branch 'master' into 13547-respect-insecure-flag-when-talking-ssl-to...
[arvados.git] / lib / service / cmd.go
index e59ac486a89ac0131d20ddeb3ff5895f7a4e15a5..4584939f7660b3519895fd5a3a2bc3f640cb9746 100644 (file)
@@ -10,14 +10,21 @@ import (
        "fmt"
        "io"
        "net/http"
+       "os"
 
        "git.curoverse.com/arvados.git/lib/cmd"
        "git.curoverse.com/arvados.git/sdk/go/arvados"
        "git.curoverse.com/arvados.git/sdk/go/httpserver"
        "github.com/Sirupsen/logrus"
+       "github.com/coreos/go-systemd/daemon"
 )
 
-type NewHandlerFunc func(*arvados.Cluster, *arvados.SystemNode) http.Handler
+type Handler interface {
+       http.Handler
+       CheckHealth() error
+}
+
+type NewHandlerFunc func(*arvados.Cluster, *arvados.NodeProfile) Handler
 
 type command struct {
        newHandler NewHandlerFunc
@@ -53,6 +60,7 @@ func (c *command) RunCommand(prog string, args []string, stdin io.Reader, stdout
        flags := flag.NewFlagSet("", flag.ContinueOnError)
        flags.SetOutput(stderr)
        configFile := flags.String("config", arvados.DefaultConfigFile, "Site configuration `file`")
+       nodeProfile := flags.String("node-profile", "", "`Name` of NodeProfiles config entry to use (if blank, use $ARVADOS_NODE_PROFILE or hostname reported by OS)")
        err = flags.Parse(args)
        if err == flag.ErrHelp {
                err = nil
@@ -68,18 +76,26 @@ func (c *command) RunCommand(prog string, args []string, stdin io.Reader, stdout
        if err != nil {
                return 1
        }
-       node, err := cluster.GetThisSystemNode()
+       profileName := *nodeProfile
+       if profileName == "" {
+               profileName = os.Getenv("ARVADOS_NODE_PROFILE")
+       }
+       profile, err := cluster.GetNodeProfile(profileName)
        if err != nil {
                return 1
        }
-       listen := node.ServicePorts()[c.svcName]
+       listen := profile.ServicePorts()[c.svcName]
        if listen == "" {
                err = fmt.Errorf("configuration does not enable the %s service on this host", c.svcName)
                return 1
        }
+       handler := c.newHandler(cluster, profile)
+       if err = handler.CheckHealth(); err != nil {
+               return 1
+       }
        srv := &httpserver.Server{
                Server: http.Server{
-                       Handler: httpserver.AddRequestIDs(httpserver.LogRequests(log, c.newHandler(cluster, node))),
+                       Handler: httpserver.AddRequestIDs(httpserver.LogRequests(log, handler)),
                },
                Addr: listen,
        }
@@ -91,6 +107,9 @@ func (c *command) RunCommand(prog string, args []string, stdin io.Reader, stdout
                "Listen":  srv.Addr,
                "Service": c.svcName,
        }).Info("listening")
+       if _, err := daemon.SdNotify(false, "READY=1"); err != nil {
+               log.WithError(err).Errorf("error notifying init daemon")
+       }
        err = srv.Wait()
        if err != nil {
                return 1