13497: Proxy requests to Rails API.
[arvados.git] / sdk / go / arvados / config.go
index 537de2ac178e27320c9c97a380ed75816fcee8e4..e0a2b1d28b7422e365250cc7f74ba553ba9c7011 100644 (file)
@@ -1,22 +1,27 @@
+// Copyright (C) The Arvados Authors. All rights reserved.
+//
+// SPDX-License-Identifier: Apache-2.0
+
 package arvados
 
 import (
        "fmt"
        "os"
-       "strings"
 
        "git.curoverse.com/arvados.git/sdk/go/config"
 )
 
+const DefaultConfigFile = "/etc/arvados/config.yml"
+
 type Config struct {
        Clusters map[string]Cluster
 }
 
 // GetConfig returns the current system config, loading it from
-// /etc if needed.
-func GetConfig() (*Config, error) {
+// configFile if needed.
+func GetConfig(configFile string) (*Config, error) {
        var cfg Config
-       err := config.LoadFile(&cfg, "/etc/arvados/config.yml")
+       err := config.LoadFile(&cfg, configFile)
        return &cfg, err
 }
 
@@ -24,7 +29,9 @@ func GetConfig() (*Config, error) {
 // cluster, or the default/only configured cluster if clusterID is "".
 func (sc *Config) GetCluster(clusterID string) (*Cluster, error) {
        if clusterID == "" {
-               if len(sc.Clusters) != 1 {
+               if len(sc.Clusters) == 0 {
+                       return nil, fmt.Errorf("no clusters configured")
+               } else if len(sc.Clusters) > 1 {
                        return nil, fmt.Errorf("multiple clusters configured, cannot choose")
                } else {
                        for id, cc := range sc.Clusters {
@@ -45,10 +52,20 @@ type Cluster struct {
        ClusterID       string `json:"-"`
        ManagementToken string
        SystemNodes     map[string]SystemNode
+       InstanceTypes   []InstanceType
+}
+
+type InstanceType struct {
+       Name         string
+       ProviderType string
+       VCPUs        int
+       RAM          int64
+       Scratch      int64
+       Price        float64
 }
 
-// GetThisSystemNodeConfig returns a SystemNode for the node we're
-// running on right now.
+// GetThisSystemNode returns a SystemNode for the node we're running
+// on right now.
 func (cc *Cluster) GetThisSystemNode() (*SystemNode, error) {
        hostname, err := os.Hostname()
        if err != nil {
@@ -57,18 +74,12 @@ func (cc *Cluster) GetThisSystemNode() (*SystemNode, error) {
        return cc.GetSystemNode(hostname)
 }
 
-// GetSystemNodeConfig returns a NodeConfig for the given node. An
-// error is returned if the appropriate configuration can't be
-// determined (e.g., this does not appear to be a system node).
+// GetSystemNode returns a SystemNode for the given hostname. An error
+// is returned if the appropriate configuration can't be determined
+// (e.g., this does not appear to be a system node).
 func (cc *Cluster) GetSystemNode(node string) (*SystemNode, error) {
-       // Generally node is "a.b.ca", use the first of {"a.b.ca",
-       // "a.b", "a"} that has an entry in SystemNodes.
-       labels := strings.Split(node, ".")
-       for j := len(labels); j > 0; j-- {
-               hostpart := strings.Join(labels[:j], ".")
-               if cfg, ok := cc.SystemNodes[hostpart]; ok {
-                       return &cfg, nil
-               }
+       if cfg, ok := cc.SystemNodes[node]; ok {
+               return &cfg, nil
        }
        // If node is not listed, but "*" gives a default system node
        // config, use the default config.
@@ -79,9 +90,46 @@ func (cc *Cluster) GetSystemNode(node string) (*SystemNode, error) {
 }
 
 type SystemNode struct {
-       Keepstore Keepstore
+       Controller  SystemServiceInstance `json:"arvados-controller"`
+       Health      SystemServiceInstance `json:"arvados-health"`
+       Keepproxy   SystemServiceInstance `json:"keepproxy"`
+       Keepstore   SystemServiceInstance `json:"keepstore"`
+       Keepweb     SystemServiceInstance `json:"keep-web"`
+       Nodemanager SystemServiceInstance `json:"arvados-node-manager"`
+       RailsAPI    SystemServiceInstance `json:"arvados-api-server"`
+       Websocket   SystemServiceInstance `json:"arvados-ws"`
+       Workbench   SystemServiceInstance `json:"arvados-workbench"`
+}
+
+type ServiceName string
+
+const (
+       ServiceNameRailsAPI    ServiceName = "arvados-api-server"
+       ServiceNameController  ServiceName = "arvados-controller"
+       ServiceNameNodemanager ServiceName = "arvados-node-manager"
+       ServiceNameWorkbench   ServiceName = "arvados-workbench"
+       ServiceNameWebsocket   ServiceName = "arvados-ws"
+       ServiceNameKeepweb     ServiceName = "keep-web"
+       ServiceNameKeepproxy   ServiceName = "keepproxy"
+       ServiceNameKeepstore   ServiceName = "keepstore"
+)
+
+// ServicePorts returns the configured listening address (or "" if
+// disabled) for each service on the node.
+func (sn *SystemNode) ServicePorts() map[ServiceName]string {
+       return map[ServiceName]string{
+               ServiceNameRailsAPI:    sn.RailsAPI.Listen,
+               ServiceNameController:  sn.Controller.Listen,
+               ServiceNameNodemanager: sn.Nodemanager.Listen,
+               ServiceNameWorkbench:   sn.Workbench.Listen,
+               ServiceNameWebsocket:   sn.Websocket.Listen,
+               ServiceNameKeepweb:     sn.Keepweb.Listen,
+               ServiceNameKeepproxy:   sn.Keepproxy.Listen,
+               ServiceNameKeepstore:   sn.Keepstore.Listen,
+       }
 }
 
-type Keepstore struct {
+type SystemServiceInstance struct {
        Listen string
+       TLS    bool
 }