13497: Abort startup if Rails API cannot be found.
authorTom Clegg <tclegg@veritasgenetics.com>
Fri, 15 Jun 2018 19:08:59 +0000 (15:08 -0400)
committerTom Clegg <tclegg@veritasgenetics.com>
Fri, 15 Jun 2018 19:08:59 +0000 (15:08 -0400)
Arvados-DCO-1.1-Signed-off-by: Tom Clegg <tclegg@veritasgenetics.com>

lib/controller/cmd.go
lib/controller/handler.go
lib/service/cmd.go

index e006b65941615038ab9722b6db9ae11129264072..02fb3afbae59b95e81ce2725898b8781f4d76040 100644 (file)
@@ -5,8 +5,6 @@
 package controller
 
 import (
-       "net/http"
-
        "git.curoverse.com/arvados.git/lib/cmd"
        "git.curoverse.com/arvados.git/lib/service"
        "git.curoverse.com/arvados.git/sdk/go/arvados"
@@ -14,6 +12,6 @@ import (
 
 var Command cmd.Handler = service.Command(arvados.ServiceNameController, newHandler)
 
-func newHandler(cluster *arvados.Cluster, node *arvados.SystemNode) http.Handler {
+func newHandler(cluster *arvados.Cluster, node *arvados.SystemNode) service.Handler {
        return &Handler{Cluster: cluster, Node: node}
 }
index ad765bafa5a0c556e96337a730eda7bfe768e6d3..643a932a5cd9e216608b9574432367a820b03080 100644 (file)
@@ -33,6 +33,12 @@ func (h *Handler) ServeHTTP(w http.ResponseWriter, req *http.Request) {
        h.handlerStack.ServeHTTP(w, req)
 }
 
+func (h *Handler) CheckHealth() error {
+       h.setupOnce.Do(h.setup)
+       _, err := findRailsAPI(h.Cluster, h.NodeProfile)
+       return err
+}
+
 func (h *Handler) setup() {
        mux := http.NewServeMux()
        mux.Handle("/_health/", &health.Handler{
index ab788606619a03ce80e9bf8ab30cef4cfda393ff..a144c01a6f01e35ab3b82b38ae6bfd032d11fb1d 100644 (file)
@@ -18,7 +18,12 @@ import (
        "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.SystemNode) Handler
 
 type command struct {
        newHandler NewHandlerFunc
@@ -79,9 +84,13 @@ func (c *command) RunCommand(prog string, args []string, stdin io.Reader, stdout
                err = fmt.Errorf("configuration does not enable the %s service on this host", c.svcName)
                return 1
        }
+       handler := c.newHandler(cluster, node)
+       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,
        }