X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/91db2d8fd32bc3f6c2a26ffc37f6591b1e5f380b..b51d376ed64efc68f7ee27fd061323da43faabd5:/sdk/go/arvados/config.go?ds=sidebyside diff --git a/sdk/go/arvados/config.go b/sdk/go/arvados/config.go index 537de2ac17..ca0df1fc90 100644 --- a/sdk/go/arvados/config.go +++ b/sdk/go/arvados/config.go @@ -3,20 +3,21 @@ 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 +25,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 { @@ -47,8 +50,8 @@ type Cluster struct { SystemNodes map[string]SystemNode } -// 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 +60,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 +76,30 @@ func (cc *Cluster) GetSystemNode(node string) (*SystemNode, error) { } type SystemNode struct { - Keepstore Keepstore + 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"` +} + +// ServicePorts returns the configured listening address (or "" if +// disabled) for each service on the node. +func (sn *SystemNode) ServicePorts() map[string]string { + return map[string]string{ + "arvados-api-server": sn.RailsAPI.Listen, + "arvados-node-manager": sn.Nodemanager.Listen, + "arvados-workbench": sn.Workbench.Listen, + "arvados-ws": sn.Websocket.Listen, + "keep-web": sn.Keepweb.Listen, + "keepproxy": sn.Keepproxy.Listen, + "keepstore": sn.Keepstore.Listen, + } } -type Keepstore struct { +type SystemServiceInstance struct { Listen string }