add gateway (part)
[arvados.git] / services / boot / config.go
1 package main
2
3 import (
4         "context"
5         "fmt"
6         "io/ioutil"
7         "os"
8         "strings"
9 )
10
11 type Config struct {
12         // 5 alphanumeric chars. Must be either xx*, yy*, zz*, or
13         // globally unique.
14         SiteID string
15
16         // Hostnames or IP addresses of control hosts. Use at least 3
17         // in production. System functions only when a majority are
18         // alive.
19         ControlHosts []string
20         Ports        portsConfig
21         WebGUI       webguiConfig
22         DataDir      string
23         UsrDir       string
24         RunitSvDir   string
25
26         ArvadosAptRepo aptRepoConfig
27 }
28
29 type portsConfig struct {
30         ConsulDNS     int
31         ConsulHTTP    int
32         ConsulHTTPS   int
33         ConsulRPC     int
34         ConsulSerfLAN int
35         ConsulSerfWAN int
36         ConsulServer  int
37         NomadHTTP     int
38         NomadRPC      int
39         NomadSerf     int
40         VaultServer   int
41 }
42
43 type webguiConfig struct {
44         // addr:port to serve web-based setup/monitoring
45         // application
46         Listen string
47 }
48
49 type aptRepoConfig struct {
50         Enabled bool
51         URL     string
52         Release string
53 }
54
55 func (c *Config) Boot(ctx context.Context) error {
56         for _, path := range []string{c.DataDir, c.UsrDir, c.UsrDir + "/bin"} {
57                 if fi, err := os.Stat(path); err != nil {
58                         err = os.MkdirAll(path, 0755)
59                         if err != nil {
60                                 return err
61                         }
62                 } else if !fi.IsDir() {
63                         return fmt.Errorf("%s: is not a directory", path)
64                 }
65         }
66         return nil
67 }
68
69 func DefaultConfig() *Config {
70         var repoConf aptRepoConfig
71         if rel, err := ioutil.ReadFile("/etc/os-release"); err == nil {
72                 rel := string(rel)
73                 for _, try := range []string{"jessie", "precise", "xenial"} {
74                         if !strings.Contains(rel, try) {
75                                 continue
76                         }
77                         repoConf = aptRepoConfig{
78                                 Enabled: true,
79                                 URL:     "http://apt.arvados.org/",
80                                 Release: try,
81                         }
82                         break
83                 }
84         }
85         return &Config{
86                 SiteID:         "zzzzz",
87                 ArvadosAptRepo: repoConf,
88                 ControlHosts:   []string{"127.0.0.1"},
89                 Ports: portsConfig{
90                         ConsulDNS:     18600,
91                         ConsulHTTP:    18500,
92                         ConsulHTTPS:   -1,
93                         ConsulRPC:     18400,
94                         ConsulSerfLAN: 18301,
95                         ConsulSerfWAN: 18302,
96                         ConsulServer:  18300,
97                         NomadHTTP:     14646,
98                         NomadRPC:      14647,
99                         NomadSerf:     14648,
100                         VaultServer:   18200,
101                 },
102                 DataDir:    "/var/lib/arvados",
103                 UsrDir:     "/usr/local/arvados",
104                 RunitSvDir: "/etc/sv",
105                 WebGUI: webguiConfig{
106                         Listen: "127.0.0.1:18000",
107                 },
108         }
109 }