[ARVADOS] created: 1.3.0-1332-g7388e2f81

Git user git at public.curoverse.com
Thu Jul 18 20:26:03 UTC 2019


        at  7388e2f812805496e67930fdd316bb19657cb9fa (commit)


commit 7388e2f812805496e67930fdd316bb19657cb9fa
Author: Peter Amstutz <pamstutz at veritasgenetics.com>
Date:   Thu Jul 18 16:25:50 2019 -0400

    14717: Migrate websockets to new config
    
    Arvados-DCO-1.1-Signed-off-by: Peter Amstutz <pamstutz at veritasgenetics.com>

diff --git a/lib/config/config.default.yml b/lib/config/config.default.yml
index 15bae9af8..1a1f1c5ac 100644
--- a/lib/config/config.default.yml
+++ b/lib/config/config.default.yml
@@ -198,6 +198,10 @@ Clusters:
       # Maximum wall clock time to spend handling an incoming request.
       RequestTimeout: 5m
 
+      WebsocketKeepaliveTimeout: 60s
+      WebsocketClientEventQueue: 64
+      WebsocketServerEventQueue: 4
+
     Users:
       # Config parameters to automatically setup new users.  If enabled,
       # this users will be able to self-activate.  Enable this if you want
diff --git a/lib/config/deprecated.go b/lib/config/deprecated.go
index 8f3f3d7ed..4526706a3 100644
--- a/lib/config/deprecated.go
+++ b/lib/config/deprecated.go
@@ -178,6 +178,24 @@ type oldCrunchDispatchSlurmConfig struct {
 
 const defaultCrunchDispatchSlurmConfigPath = "/etc/arvados/crunch-dispatch-slurm/crunch-dispatch-slurm.yml"
 
+func loadOldClientConfig(cluster *arvados.Cluster, client *arvados.Client) {
+	if client == nil {
+		return
+	}
+	if client.APIHost != "" {
+		cluster.Services.Controller.ExternalURL.Host = client.APIHost
+	}
+	if client.Scheme != "" {
+		cluster.Services.Controller.ExternalURL.Scheme = client.Scheme
+	} else {
+		cluster.Services.Controller.ExternalURL.Scheme = "https"
+	}
+	if client.AuthToken != "" {
+		cluster.SystemRootToken = client.AuthToken
+	}
+	cluster.TLS.Insecure = client.Insecure
+}
+
 // update config using values from an crunch-dispatch-slurm config file.
 func (ldr *Loader) loadOldCrunchDispatchSlurmConfig(cfg *arvados.Config) error {
 	var oc oldCrunchDispatchSlurmConfig
@@ -193,18 +211,7 @@ func (ldr *Loader) loadOldCrunchDispatchSlurmConfig(cfg *arvados.Config) error {
 		return err
 	}
 
-	if oc.Client != nil {
-		u := arvados.URL{}
-		u.Host = oc.Client.APIHost
-		if oc.Client.Scheme != "" {
-			u.Scheme = oc.Client.Scheme
-		} else {
-			u.Scheme = "https"
-		}
-		cluster.Services.Controller.ExternalURL = u
-		cluster.SystemRootToken = oc.Client.AuthToken
-		cluster.TLS.Insecure = oc.Client.Insecure
-	}
+	loadOldClientConfig(cluster, oc.Client)
 
 	if oc.SbatchArguments != nil {
 		cluster.Containers.SLURM.SbatchArgumentsList = *oc.SbatchArguments
@@ -236,3 +243,70 @@ func (ldr *Loader) loadOldCrunchDispatchSlurmConfig(cfg *arvados.Config) error {
 	cfg.Clusters[cluster.ClusterID] = *cluster
 	return nil
 }
+
+type oldWsConfig struct {
+	Client       *arvados.Client
+	Postgres     *arvados.PostgreSQLConnection
+	PostgresPool *int
+	Listen       *string
+	LogLevel     *string
+	LogFormat    *string
+
+	PingTimeout      *arvados.Duration
+	ClientEventQueue *int
+	ServerEventQueue *int
+
+	ManagementToken *string
+}
+
+const defaultWebsocketsConfigPath = "/etc/arvados/ws/ws.yml"
+
+// update config using values from an crunch-dispatch-slurm config file.
+func (ldr *Loader) loadOldWebsocketsConfig(cfg *arvados.Config) error {
+	var oc oldWsConfig
+	err := ldr.loadOldConfigHelper("arvados-ws", ldr.WebsocketsPath, &oc)
+	if os.IsNotExist(err) && ldr.WebsocketsPath == defaultWebsocketsConfigPath {
+		return nil
+	} else if err != nil {
+		return err
+	}
+
+	cluster, err := cfg.GetCluster("")
+	if err != nil {
+		return err
+	}
+
+	loadOldClientConfig(cluster, oc.Client)
+	fmt.Printf("Clllllllllllient %v %v", *oc.Client, cluster.Services.Controller.ExternalURL)
+
+	if oc.Postgres != nil {
+		cluster.PostgreSQL.Connection = *oc.Postgres
+	}
+	if oc.PostgresPool != nil {
+		cluster.PostgreSQL.ConnectionPool = *oc.PostgresPool
+	}
+	if oc.Listen != nil {
+		cluster.Services.Websocket.InternalURLs[arvados.URL{Host: *oc.Listen}] = arvados.ServiceInstance{}
+	}
+	if oc.LogLevel != nil {
+		cluster.SystemLogs.LogLevel = *oc.LogLevel
+	}
+	if oc.LogFormat != nil {
+		cluster.SystemLogs.Format = *oc.LogFormat
+	}
+	if oc.PingTimeout != nil {
+		cluster.API.WebsocketKeepaliveTimeout = *oc.PingTimeout
+	}
+	if oc.ClientEventQueue != nil {
+		cluster.API.WebsocketClientEventQueue = *oc.ClientEventQueue
+	}
+	if oc.ServerEventQueue != nil {
+		cluster.API.WebsocketServerEventQueue = *oc.ServerEventQueue
+	}
+	if oc.ManagementToken != nil {
+		cluster.ManagementToken = *oc.ManagementToken
+	}
+
+	cfg.Clusters[cluster.ClusterID] = *cluster
+	return nil
+}
diff --git a/lib/config/export.go b/lib/config/export.go
index dbbaac127..1cb84a2a1 100644
--- a/lib/config/export.go
+++ b/lib/config/export.go
@@ -64,6 +64,9 @@ var whitelist = map[string]bool{
 	"API.MaxRequestSize":                           true,
 	"API.RailsSessionSecretToken":                  false,
 	"API.RequestTimeout":                           true,
+	"API.WebsocketClientEventQueue":                false,
+	"API.WebsocketKeepaliveTimeout":                true,
+	"API.WebsocketServerEventQueue":                false,
 	"AuditLogs":                                    false,
 	"AuditLogs.MaxAge":                             false,
 	"AuditLogs.MaxDeleteBatch":                     false,
diff --git a/lib/config/generated_config.go b/lib/config/generated_config.go
index 58a7690f4..7bcb38441 100644
--- a/lib/config/generated_config.go
+++ b/lib/config/generated_config.go
@@ -204,6 +204,10 @@ Clusters:
       # Maximum wall clock time to spend handling an incoming request.
       RequestTimeout: 5m
 
+      WebsocketKeepaliveTimeout: 60s
+      WebsocketClientEventQueue: 64
+      WebsocketServerEventQueue: 4
+
     Users:
       # Config parameters to automatically setup new users.  If enabled,
       # this users will be able to self-activate.  Enable this if you want
diff --git a/lib/config/load.go b/lib/config/load.go
index bce57d759..63b6ac7d9 100644
--- a/lib/config/load.go
+++ b/lib/config/load.go
@@ -31,6 +31,7 @@ type Loader struct {
 	Path                    string
 	KeepstorePath           string
 	CrunchDispatchSlurmPath string
+	WebsocketsPath          string
 
 	configdata []byte
 }
@@ -59,6 +60,7 @@ func (ldr *Loader) SetupFlags(flagset *flag.FlagSet) {
 	flagset.StringVar(&ldr.Path, "config", arvados.DefaultConfigFile, "Site configuration `file` (default may be overridden by setting an ARVADOS_CONFIG environment variable)")
 	flagset.StringVar(&ldr.KeepstorePath, "legacy-keepstore-config", defaultKeepstoreConfigPath, "Legacy keepstore configuration `file`")
 	flagset.StringVar(&ldr.CrunchDispatchSlurmPath, "legacy-crunch-dispatch-slurm-config", defaultCrunchDispatchSlurmConfigPath, "Legacy crunch-dispatch-slurm configuration `file`")
+	flagset.StringVar(&ldr.WebsocketsPath, "legacy-ws-config", defaultWebsocketsConfigPath, "Legacy arvados-ws configuration `file`")
 }
 
 // MungeLegacyConfigArgs checks args for a -config flag whose argument
@@ -132,6 +134,12 @@ func (ldr *Loader) loadBytes(path string) ([]byte, error) {
 	return ioutil.ReadAll(f)
 }
 
+func (ldr *Loader) LoadDefaults() (*arvados.Config, error) {
+	ldr.configdata = []byte(`Clusters: {zzzzz: {}}`)
+	defer func() { ldr.configdata = nil }()
+	return ldr.Load()
+}
+
 func (ldr *Loader) Load() (*arvados.Config, error) {
 	if ldr.configdata == nil {
 		buf, err := ldr.loadBytes(ldr.Path)
@@ -208,6 +216,7 @@ func (ldr *Loader) Load() (*arvados.Config, error) {
 		for _, err := range []error{
 			ldr.loadOldKeepstoreConfig(&cfg),
 			ldr.loadOldCrunchDispatchSlurmConfig(&cfg),
+			ldr.loadOldWebsocketsConfig(&cfg),
 		} {
 			if err != nil {
 				return nil, err
diff --git a/sdk/go/arvados/config.go b/sdk/go/arvados/config.go
index 12ec8e6b2..9072b7319 100644
--- a/sdk/go/arvados/config.go
+++ b/sdk/go/arvados/config.go
@@ -76,6 +76,9 @@ type Cluster struct {
 		MaxRequestSize                 int
 		RailsSessionSecretToken        string
 		RequestTimeout                 Duration
+		WebsocketKeepaliveTimeout      Duration
+		WebsocketClientEventQueue      int
+		WebsocketServerEventQueue      int
 	}
 	AuditLogs struct {
 		MaxAge             Duration
diff --git a/services/crunch-dispatch-slurm/crunch-dispatch-slurm_test.go b/services/crunch-dispatch-slurm/crunch-dispatch-slurm_test.go
index ca3944d76..6007c6d4a 100644
--- a/services/crunch-dispatch-slurm/crunch-dispatch-slurm_test.go
+++ b/services/crunch-dispatch-slurm/crunch-dispatch-slurm_test.go
@@ -395,7 +395,7 @@ func (s *StubbedSuite) TestLoadLegacyConfig(c *C) {
 	content := []byte(`
 Client:
   APIHost: example.com
-  APIToken: abcdefg
+  AuthToken: abcdefg
 SbatchArguments: ["--foo", "bar"]
 PollPeriod: 12s
 PrioritySpread: 42
@@ -422,6 +422,7 @@ BatchSize: 99
 	c.Check(err, IsNil)
 
 	c.Check(s.disp.cluster.Services.Controller.ExternalURL, Equals, arvados.URL{Scheme: "https", Host: "example.com"})
+	c.Check(s.disp.cluster.SystemRootToken, Equals, "abcdefg")
 	c.Check(s.disp.cluster.Containers.SLURM.SbatchArgumentsList, DeepEquals, []string{"--foo", "bar"})
 	c.Check(s.disp.cluster.Containers.CloudVMs.PollInterval, Equals, arvados.Duration(12*time.Second))
 	c.Check(s.disp.cluster.Containers.SLURM.PrioritySpread, Equals, int64(42))
diff --git a/services/ws/config.go b/services/ws/config.go
deleted file mode 100644
index ead1ec20c..000000000
--- a/services/ws/config.go
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright (C) The Arvados Authors. All rights reserved.
-//
-// SPDX-License-Identifier: AGPL-3.0
-
-package main
-
-import (
-	"time"
-
-	"git.curoverse.com/arvados.git/sdk/go/arvados"
-)
-
-type wsConfig struct {
-	Client       arvados.Client
-	Postgres     arvados.PostgreSQLConnection
-	PostgresPool int
-	Listen       string
-	LogLevel     string
-	LogFormat    string
-
-	PingTimeout      arvados.Duration
-	ClientEventQueue int
-	ServerEventQueue int
-
-	ManagementToken string
-}
-
-func defaultConfig() wsConfig {
-	return wsConfig{
-		Client: arvados.Client{
-			APIHost: "localhost:443",
-		},
-		Postgres: arvados.PostgreSQLConnection{
-			"dbname":                    "arvados_production",
-			"user":                      "arvados",
-			"password":                  "xyzzy",
-			"host":                      "localhost",
-			"connect_timeout":           "30",
-			"sslmode":                   "require",
-			"fallback_application_name": "arvados-ws",
-		},
-		PostgresPool:     64,
-		LogLevel:         "info",
-		LogFormat:        "json",
-		PingTimeout:      arvados.Duration(time.Minute),
-		ClientEventQueue: 64,
-		ServerEventQueue: 4,
-	}
-}
diff --git a/services/ws/main.go b/services/ws/main.go
index a0006a4f8..0556c77d6 100644
--- a/services/ws/main.go
+++ b/services/ws/main.go
@@ -7,47 +7,71 @@ package main
 import (
 	"flag"
 	"fmt"
+	"os"
 
-	"git.curoverse.com/arvados.git/sdk/go/config"
+	"git.curoverse.com/arvados.git/lib/config"
+	"git.curoverse.com/arvados.git/sdk/go/arvados"
 	"git.curoverse.com/arvados.git/sdk/go/ctxlog"
+	"github.com/sirupsen/logrus"
+	"gopkg.in/yaml.v2"
 )
 
 var logger = ctxlog.FromContext
 var version = "dev"
 
-func main() {
-	log := logger(nil)
+func configure(log logrus.FieldLogger, args []string) *arvados.Cluster {
+	flags := flag.NewFlagSet(args[0], flag.ExitOnError)
+	dumpConfig := flags.Bool("dump-config", false, "show current configuration and exit")
+	getVersion := flags.Bool("version", false, "Print version information and exit.")
+
+	loader := config.NewLoader(nil, log)
+	loader.SetupFlags(flags)
+	args = loader.MungeLegacyConfigArgs(log, args[1:], "-legacy-ws-config")
 
-	configPath := flag.String("config", "/etc/arvados/ws/ws.yml", "`path` to config file")
-	dumpConfig := flag.Bool("dump-config", false, "show current configuration and exit")
-	getVersion := flag.Bool("version", false, "Print version information and exit.")
-	cfg := defaultConfig()
-	flag.Parse()
+	flags.Parse(args)
 
 	// Print version information if requested
 	if *getVersion {
 		fmt.Printf("arvados-ws %s\n", version)
-		return
+		return nil
 	}
 
-	err := config.LoadFile(&cfg, *configPath)
+	cfg, err := loader.Load()
 	if err != nil {
 		log.Fatal(err)
 	}
 
-	ctxlog.SetLevel(cfg.LogLevel)
-	ctxlog.SetFormat(cfg.LogFormat)
+	cluster, err := cfg.GetCluster("")
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	ctxlog.SetLevel(cluster.SystemLogs.LogLevel)
+	ctxlog.SetFormat(cluster.SystemLogs.Format)
 
 	if *dumpConfig {
-		txt, err := config.Dump(&cfg)
+		out, err := yaml.Marshal(cfg)
 		if err != nil {
 			log.Fatal(err)
 		}
-		fmt.Print(string(txt))
+		_, err = os.Stdout.Write(out)
+		if err != nil {
+			log.Fatal(err)
+		}
+		return nil
+	}
+	return cluster
+}
+
+func main() {
+	log := logger(nil)
+
+	cluster := configure(log, os.Args)
+	if cluster == nil {
 		return
 	}
 
 	log.Printf("arvados-ws %s started", version)
-	srv := &server{wsConfig: &cfg}
+	srv := &server{cluster: cluster}
 	log.Fatal(srv.Run())
 }
diff --git a/services/ws/router.go b/services/ws/router.go
index a408b58bd..5a5b7c53b 100644
--- a/services/ws/router.go
+++ b/services/ws/router.go
@@ -13,6 +13,7 @@ import (
 	"sync/atomic"
 	"time"
 
+	"git.curoverse.com/arvados.git/sdk/go/arvados"
 	"git.curoverse.com/arvados.git/sdk/go/ctxlog"
 	"git.curoverse.com/arvados.git/sdk/go/health"
 	"github.com/sirupsen/logrus"
@@ -27,7 +28,8 @@ type wsConn interface {
 }
 
 type router struct {
-	Config         *wsConfig
+	client         arvados.Client
+	cluster        *arvados.Cluster
 	eventSource    eventSource
 	newPermChecker func() permChecker
 
@@ -52,8 +54,8 @@ type debugStatuser interface {
 
 func (rtr *router) setup() {
 	rtr.handler = &handler{
-		PingTimeout: rtr.Config.PingTimeout.Duration(),
-		QueueSize:   rtr.Config.ClientEventQueue,
+		PingTimeout: time.Duration(rtr.cluster.API.WebsocketKeepaliveTimeout),
+		QueueSize:   rtr.cluster.API.WebsocketClientEventQueue,
 	}
 	rtr.mux = http.NewServeMux()
 	rtr.mux.Handle("/websocket", rtr.makeServer(newSessionV0))
@@ -62,7 +64,7 @@ func (rtr *router) setup() {
 	rtr.mux.Handle("/status.json", rtr.jsonHandler(rtr.Status))
 
 	rtr.mux.Handle("/_health/", &health.Handler{
-		Token:  rtr.Config.ManagementToken,
+		Token:  rtr.cluster.ManagementToken,
 		Prefix: "/_health/",
 		Routes: health.Routes{
 			"db": rtr.eventSource.DBHealth,
@@ -87,7 +89,7 @@ func (rtr *router) makeServer(newSession sessionFactory) *websocket.Server {
 
 			stats := rtr.handler.Handle(ws, rtr.eventSource,
 				func(ws wsConn, sendq chan<- interface{}) (session, error) {
-					return newSession(ws, sendq, rtr.eventSource.DB(), rtr.newPermChecker(), &rtr.Config.Client)
+					return newSession(ws, sendq, rtr.eventSource.DB(), rtr.newPermChecker(), &rtr.client)
 				})
 
 			log.WithFields(logrus.Fields{
diff --git a/services/ws/server.go b/services/ws/server.go
index eda7ff2a4..081ff53b3 100644
--- a/services/ws/server.go
+++ b/services/ws/server.go
@@ -10,13 +10,14 @@ import (
 	"sync"
 	"time"
 
+	"git.curoverse.com/arvados.git/sdk/go/arvados"
 	"github.com/coreos/go-systemd/daemon"
 )
 
 type server struct {
 	httpServer  *http.Server
 	listener    net.Listener
-	wsConfig    *wsConfig
+	cluster     *arvados.Cluster
 	eventSource *pgEventSource
 	setupOnce   sync.Once
 }
@@ -40,27 +41,38 @@ func (srv *server) Run() error {
 func (srv *server) setup() {
 	log := logger(nil)
 
-	ln, err := net.Listen("tcp", srv.wsConfig.Listen)
+	var listen arvados.URL
+	for listen, _ = range srv.cluster.Services.Websocket.InternalURLs {
+		break
+	}
+	ln, err := net.Listen("tcp", listen.Host)
 	if err != nil {
-		log.WithField("Listen", srv.wsConfig.Listen).Fatal(err)
+		log.WithField("Listen", listen).Fatal(err)
 	}
 	log.WithField("Listen", ln.Addr().String()).Info("listening")
 
+	client := arvados.Client{}
+	client.APIHost = srv.cluster.Services.Controller.ExternalURL.Host
+	client.AuthToken = srv.cluster.SystemRootToken
+	client.Insecure = srv.cluster.TLS.Insecure
+
 	srv.listener = ln
 	srv.eventSource = &pgEventSource{
-		DataSource:   srv.wsConfig.Postgres.String(),
-		MaxOpenConns: srv.wsConfig.PostgresPool,
-		QueueSize:    srv.wsConfig.ServerEventQueue,
+		DataSource:   srv.cluster.PostgreSQL.Connection.String(),
+		MaxOpenConns: srv.cluster.PostgreSQL.ConnectionPool,
+		QueueSize:    srv.cluster.API.WebsocketServerEventQueue,
 	}
+
 	srv.httpServer = &http.Server{
-		Addr:           srv.wsConfig.Listen,
+		Addr:           listen.Host,
 		ReadTimeout:    time.Minute,
 		WriteTimeout:   time.Minute,
 		MaxHeaderBytes: 1 << 20,
 		Handler: &router{
-			Config:         srv.wsConfig,
+			cluster:        srv.cluster,
+			client:         client,
 			eventSource:    srv.eventSource,
-			newPermChecker: func() permChecker { return newPermChecker(srv.wsConfig.Client) },
+			newPermChecker: func() permChecker { return newPermChecker(client) },
 		},
 	}
 
diff --git a/services/ws/server_test.go b/services/ws/server_test.go
index b1f943857..097889c98 100644
--- a/services/ws/server_test.go
+++ b/services/ws/server_test.go
@@ -7,10 +7,13 @@ package main
 import (
 	"encoding/json"
 	"io/ioutil"
+	"log"
 	"net/http"
+	"os"
 	"sync"
 	"time"
 
+	"git.curoverse.com/arvados.git/lib/config"
 	"git.curoverse.com/arvados.git/sdk/go/arvados"
 	"git.curoverse.com/arvados.git/sdk/go/arvadostest"
 	check "gopkg.in/check.v1"
@@ -19,29 +22,42 @@ import (
 var _ = check.Suite(&serverSuite{})
 
 type serverSuite struct {
-	cfg *wsConfig
-	srv *server
-	wg  sync.WaitGroup
+	cluster *arvados.Cluster
+	srv     *server
+	wg      sync.WaitGroup
 }
 
 func (s *serverSuite) SetUpTest(c *check.C) {
-	s.cfg = s.testConfig()
-	s.srv = &server{wsConfig: s.cfg}
+	var err error
+	s.cluster, err = s.testConfig()
+	c.Assert(err, check.IsNil)
+	s.srv = &server{cluster: s.cluster}
 }
 
-func (*serverSuite) testConfig() *wsConfig {
-	cfg := defaultConfig()
-	cfg.Client = *(arvados.NewClientFromEnv())
-	cfg.Postgres = testDBConfig()
-	cfg.Listen = ":"
-	cfg.ManagementToken = arvadostest.ManagementToken
-	return &cfg
+func (*serverSuite) testConfig() (*arvados.Cluster, error) {
+	ldr := config.NewLoader(nil, nil)
+	cfg, err := ldr.LoadDefaults()
+	if err != nil {
+		return nil, err
+	}
+	cluster, err := cfg.GetCluster("")
+	if err != nil {
+		return nil, err
+	}
+	client := arvados.NewClientFromEnv()
+	cluster.Services.Controller.ExternalURL.Host = client.APIHost
+	cluster.SystemRootToken = client.AuthToken
+	cluster.TLS.Insecure = client.Insecure
+	cluster.PostgreSQL.Connection = testDBConfig()
+	cluster.Services.Websocket.InternalURLs = map[arvados.URL]arvados.ServiceInstance{arvados.URL{Host: ":"}: arvados.ServiceInstance{}}
+	cluster.ManagementToken = arvadostest.ManagementToken
+	return cluster, nil
 }
 
 // TestBadDB ensures Run() returns an error (instead of panicking or
 // deadlocking) if it can't connect to the database server at startup.
 func (s *serverSuite) TestBadDB(c *check.C) {
-	s.cfg.Postgres["password"] = "1234"
+	s.cluster.PostgreSQL.Connection["password"] = "1234"
 
 	var wg sync.WaitGroup
 	wg.Add(1)
@@ -72,7 +88,7 @@ func (s *serverSuite) TestHealth(c *check.C) {
 	go s.srv.Run()
 	defer s.srv.Close()
 	s.srv.WaitReady()
-	for _, token := range []string{"", "foo", s.cfg.ManagementToken} {
+	for _, token := range []string{"", "foo", s.cluster.ManagementToken} {
 		req, err := http.NewRequest("GET", "http://"+s.srv.listener.Addr().String()+"/_health/ping", nil)
 		c.Assert(err, check.IsNil)
 		if token != "" {
@@ -80,7 +96,7 @@ func (s *serverSuite) TestHealth(c *check.C) {
 		}
 		resp, err := http.DefaultClient.Do(req)
 		c.Check(err, check.IsNil)
-		if token == s.cfg.ManagementToken {
+		if token == s.cluster.ManagementToken {
 			c.Check(resp.StatusCode, check.Equals, http.StatusOK)
 			buf, err := ioutil.ReadAll(resp.Body)
 			c.Check(err, check.IsNil)
@@ -107,7 +123,7 @@ func (s *serverSuite) TestStatus(c *check.C) {
 }
 
 func (s *serverSuite) TestHealthDisabled(c *check.C) {
-	s.cfg.ManagementToken = ""
+	s.cluster.ManagementToken = ""
 
 	go s.srv.Run()
 	defer s.srv.Close()
@@ -122,3 +138,57 @@ func (s *serverSuite) TestHealthDisabled(c *check.C) {
 		c.Check(resp.StatusCode, check.Equals, http.StatusNotFound)
 	}
 }
+
+func (s *serverSuite) TestLoadLegacyConfig(c *check.C) {
+	content := []byte(`
+Client:
+  APIHost: example.com
+  AuthToken: abcdefg
+Postgres:
+  "dbname": "arvados_production"
+  "user": "arvados"
+  "password": "xyzzy"
+  "host": "localhost"
+  "connect_timeout": "30"
+  "sslmode": "require"
+  "fallback_application_name": "arvados-ws"
+PostgresPool: 63
+Listen: ":8765"
+LogLevel: "debug"
+LogFormat: "text"
+PingTimeout: 61s
+ClientEventQueue: 62
+ServerEventQueue:  5
+ManagementToken: qqqqq
+`)
+	tmpfile, err := ioutil.TempFile("", "example")
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	defer os.Remove(tmpfile.Name()) // clean up
+
+	if _, err := tmpfile.Write(content); err != nil {
+		log.Fatal(err)
+	}
+	if err := tmpfile.Close(); err != nil {
+		log.Fatal(err)
+
+	}
+	cluster := configure(logger(nil), []string{"arvados-ws", "-config", tmpfile.Name()})
+	c.Check(cluster, check.NotNil)
+
+	c.Check(cluster.Services.Controller.ExternalURL, check.Equals, arvados.URL{Scheme: "https", Host: "example.com"})
+	c.Check(cluster.SystemRootToken, check.Equals, "abcdefg")
+
+	c.Check(cluster.PostgreSQL.Connection.String(), check.Equals, "connect_timeout='30' dbname='arvados_production' fallback_application_name='arvados-ws' host='localhost' password='xyzzy' sslmode='require' user='arvados' ")
+	c.Check(cluster.PostgreSQL.ConnectionPool, check.Equals, 63)
+	c.Check(cluster.Services.Websocket.InternalURLs, check.DeepEquals, map[arvados.URL]arvados.ServiceInstance{
+		arvados.URL{Host: ":8765"}: arvados.ServiceInstance{}})
+	c.Check(cluster.SystemLogs.LogLevel, check.Equals, "debug")
+	c.Check(cluster.SystemLogs.Format, check.Equals, "text")
+	c.Check(cluster.API.WebsocketKeepaliveTimeout, check.Equals, arvados.Duration(61*time.Second))
+	c.Check(cluster.API.WebsocketClientEventQueue, check.Equals, 62)
+	c.Check(cluster.API.WebsocketServerEventQueue, check.Equals, 5)
+	c.Check(cluster.ManagementToken, check.Equals, "qqqqq")
+}

-----------------------------------------------------------------------


hooks/post-receive
-- 




More information about the arvados-commits mailing list