1 // Copyright (C) The Arvados Authors. All rights reserved.
3 // SPDX-License-Identifier: Apache-2.0
5 // package service provides a cmd.Handler that brings up a system service.
14 "git.curoverse.com/arvados.git/lib/cmd"
15 "git.curoverse.com/arvados.git/sdk/go/arvados"
16 "git.curoverse.com/arvados.git/sdk/go/httpserver"
17 "github.com/Sirupsen/logrus"
20 type NewHandlerFunc func(*arvados.Cluster, *arvados.SystemNode) http.Handler
23 newHandler NewHandlerFunc
24 svcName arvados.ServiceName
27 // Command returns a cmd.Handler that loads site config, calls
28 // newHandler with the current cluster and node configs, and brings up
29 // an http server with the returned handler.
31 // The handler is wrapped with server middleware (adding X-Request-ID
32 // headers, logging requests/responses, etc).
33 func Command(svcName arvados.ServiceName, newHandler NewHandlerFunc) cmd.Handler {
35 newHandler: newHandler,
40 func (c *command) RunCommand(prog string, args []string, stdin io.Reader, stdout, stderr io.Writer) int {
42 log.Formatter = &logrus.JSONFormatter{
43 TimestampFormat: rfc3339NanoFixed,
50 log.WithError(err).Info("exiting")
53 flags := flag.NewFlagSet("", flag.ContinueOnError)
54 flags.SetOutput(stderr)
55 configFile := flags.String("config", arvados.DefaultConfigFile, "Site configuration `file`")
56 hostName := flags.String("host", "", "Host profile `name` to use in SystemNodes config (if blank, use hostname reported by OS)")
57 err = flags.Parse(args)
58 if err == flag.ErrHelp {
61 } else if err != nil {
64 cfg, err := arvados.GetConfig(*configFile)
68 cluster, err := cfg.GetCluster("")
72 node, err := cluster.GetSystemNode(*hostName)
76 listen := node.ServicePorts()[c.svcName]
78 err = fmt.Errorf("configuration does not enable the %s service on this host", c.svcName)
81 srv := &httpserver.Server{
83 Handler: httpserver.AddRequestIDs(httpserver.LogRequests(log, c.newHandler(cluster, node))),
91 log.WithFields(logrus.Fields{
102 const rfc3339NanoFixed = "2006-01-02T15:04:05.000000000Z07:00"