18947: Merge branch 'main'
[arvados.git] / cmd / arvados-server / cmd.go
index fcea2223da70d5a174ee74b8281ebd3d20e0b503..3a1fcd4c64e29b981ddb0234f1bf3eae6a14da7b 100644 (file)
@@ -5,6 +5,11 @@
 package main
 
 import (
+       "context"
+       "encoding/json"
+       "fmt"
+       "io"
+       "net/http"
        "os"
 
        "git.arvados.org/arvados.git/lib/boot"
@@ -15,7 +20,18 @@ import (
        "git.arvados.org/arvados.git/lib/crunchrun"
        "git.arvados.org/arvados.git/lib/dispatchcloud"
        "git.arvados.org/arvados.git/lib/install"
+       "git.arvados.org/arvados.git/lib/lsf"
+       "git.arvados.org/arvados.git/lib/recovercollection"
+       "git.arvados.org/arvados.git/lib/service"
+       "git.arvados.org/arvados.git/sdk/go/arvados"
+       "git.arvados.org/arvados.git/sdk/go/health"
+       "git.arvados.org/arvados.git/services/githttpd"
+       keepbalance "git.arvados.org/arvados.git/services/keep-balance"
+       keepweb "git.arvados.org/arvados.git/services/keep-web"
+       "git.arvados.org/arvados.git/services/keepproxy"
+       "git.arvados.org/arvados.git/services/keepstore"
        "git.arvados.org/arvados.git/services/ws"
+       "github.com/prometheus/client_golang/prometheus"
 )
 
 var (
@@ -24,19 +40,72 @@ var (
                "-version":  cmd.Version,
                "--version": cmd.Version,
 
-               "boot":            boot.Command,
-               "cloudtest":       cloudtest.Command,
-               "config-check":    config.CheckCommand,
-               "config-defaults": config.DumpDefaultsCommand,
-               "config-dump":     config.DumpCommand,
-               "controller":      controller.Command,
-               "crunch-run":      crunchrun.Command,
-               "dispatch-cloud":  dispatchcloud.Command,
-               "install":         install.Command,
-               "ws":              ws.Command,
+               "boot":               boot.Command,
+               "check":              health.CheckCommand,
+               "cloudtest":          cloudtest.Command,
+               "config-check":       config.CheckCommand,
+               "config-defaults":    config.DumpDefaultsCommand,
+               "config-dump":        config.DumpCommand,
+               "controller":         controller.Command,
+               "crunch-run":         crunchrun.Command,
+               "dispatch-cloud":     dispatchcloud.Command,
+               "dispatch-lsf":       lsf.DispatchCommand,
+               "git-httpd":          githttpd.Command,
+               "health":             healthCommand,
+               "install":            install.Command,
+               "init":               install.InitCommand,
+               "keep-balance":       keepbalance.Command,
+               "keep-web":           keepweb.Command,
+               "keepproxy":          keepproxy.Command,
+               "keepstore":          keepstore.Command,
+               "recover-collection": recovercollection.Command,
+               "workbench2":         wb2command{},
+               "ws":                 ws.Command,
        })
 )
 
 func main() {
        os.Exit(handler.RunCommand(os.Args[0], os.Args[1:], os.Stdin, os.Stdout, os.Stderr))
 }
+
+type wb2command struct{}
+
+func (wb2command) RunCommand(prog string, args []string, stdin io.Reader, stdout, stderr io.Writer) int {
+       if len(args) != 3 {
+               fmt.Fprintf(stderr, "usage: %s api-host listen-addr app-dir\n", prog)
+               return 1
+       }
+       configJSON, err := json.Marshal(map[string]string{"API_HOST": args[0]})
+       if err != nil {
+               fmt.Fprintf(stderr, "json.Marshal: %s\n", err)
+               return 1
+       }
+       mux := http.NewServeMux()
+       mux.Handle("/", http.FileServer(http.Dir(args[2])))
+       mux.HandleFunc("/config.json", func(w http.ResponseWriter, _ *http.Request) {
+               w.Write(configJSON)
+       })
+       mux.HandleFunc("/_health/ping", func(w http.ResponseWriter, _ *http.Request) {
+               io.WriteString(w, `{"health":"OK"}`)
+       })
+       err = http.ListenAndServe(args[1], mux)
+       if err != nil {
+               fmt.Fprintln(stderr, err.Error())
+               return 1
+       }
+       return 0
+}
+
+var healthCommand cmd.Handler = service.Command(arvados.ServiceNameHealth, func(ctx context.Context, cluster *arvados.Cluster, _ string, reg *prometheus.Registry) service.Handler {
+       mClockSkew := prometheus.NewGauge(prometheus.GaugeOpts{
+               Namespace: "arvados",
+               Subsystem: "health",
+               Name:      "clock_skew_seconds",
+               Help:      "Clock skew observed in most recent health check",
+       })
+       reg.MustRegister(mClockSkew)
+       return &health.Aggregator{
+               Cluster:         cluster,
+               MetricClockSkew: mClockSkew,
+       }
+})