13497: Add controller, proxy to Rails API.
[arvados.git] / lib / controller / cmd.go
1 // Copyright (C) The Arvados Authors. All rights reserved.
2 //
3 // SPDX-License-Identifier: AGPL-3.0
4
5 package controller
6
7 import (
8         "flag"
9         "fmt"
10         "io"
11         "net/http"
12
13         "git.curoverse.com/arvados.git/lib/cmd"
14         "git.curoverse.com/arvados.git/sdk/go/arvados"
15         "git.curoverse.com/arvados.git/sdk/go/httpserver"
16         "github.com/Sirupsen/logrus"
17 )
18
19 const rfc3339NanoFixed = "2006-01-02T15:04:05.000000000Z07:00"
20
21 var Command cmd.Handler = &command{}
22
23 type command struct{}
24
25 func (*command) RunCommand(prog string, args []string, stdin io.Reader, stdout, stderr io.Writer) int {
26         log := logrus.StandardLogger()
27         log.Formatter = &logrus.JSONFormatter{
28                 TimestampFormat: rfc3339NanoFixed,
29         }
30         log.Out = stderr
31
32         var err error
33         defer func() {
34                 if err != nil {
35                         log.WithError(err).Info("exiting")
36                 }
37         }()
38         flags := flag.NewFlagSet("", flag.ContinueOnError)
39         flags.SetOutput(stderr)
40         configFile := flags.String("config", arvados.DefaultConfigFile, "Site configuration `file`")
41         err = flags.Parse(args)
42         if err != nil {
43                 return 2
44         }
45         cfg, err := arvados.GetConfig(*configFile)
46         if err != nil {
47                 return 1
48         }
49         cluster, err := cfg.GetCluster("")
50         if err != nil {
51                 return 1
52         }
53         node, err := cluster.GetThisSystemNode()
54         if err != nil {
55                 return 1
56         }
57         if node.Controller.Listen == "" {
58                 err = fmt.Errorf("configuration does not run a controller on this host: Clusters[%q].SystemNodes[`hostname` or *].Controller.Listen == \"\"", cluster.ClusterID)
59                 return 1
60         }
61         srv := &httpserver.Server{
62                 Server: http.Server{
63                         Handler: httpserver.LogRequests(&Handler{
64                                 Cluster: cluster,
65                         }),
66                 },
67                 Addr: node.Controller.Listen,
68         }
69         err = srv.Start()
70         if err != nil {
71                 return 1
72         }
73         log.WithField("Listen", srv.Addr).Info("listening")
74         err = srv.Wait()
75         if err != nil {
76                 return 1
77         }
78         return 0
79 }