From 887a23521d1f8b284e510041b269e5c9608687d6 Mon Sep 17 00:00:00 2001 From: Tom Clegg Date: Wed, 21 Apr 2021 15:03:59 -0400 Subject: [PATCH] 17343: Add option to boot without workbench1 to speed up tests. Arvados-DCO-1.1-Signed-off-by: Tom Clegg --- lib/boot/cmd.go | 1 + lib/boot/nginx.go | 20 +++++++++++++------- lib/boot/supervisor.go | 17 +++++++++++++++-- lib/controller/integration_test.go | 3 ++- tools/sync-groups/federation_test.go | 3 ++- 5 files changed, 33 insertions(+), 11 deletions(-) diff --git a/lib/boot/cmd.go b/lib/boot/cmd.go index 963d16226b..001504e203 100644 --- a/lib/boot/cmd.go +++ b/lib/boot/cmd.go @@ -66,6 +66,7 @@ func (bcmd bootCommand) run(ctx context.Context, prog string, args []string, std flags.StringVar(&super.ClusterType, "type", "production", "cluster `type`: development, test, or production") flags.StringVar(&super.ListenHost, "listen-host", "localhost", "host name or interface address for service listeners") flags.StringVar(&super.ControllerAddr, "controller-address", ":0", "desired controller address, `host:port` or `:port`") + flags.BoolVar(&super.NoWorkbench1, "no-workbench1", false, "do not run workbench1") flags.BoolVar(&super.OwnTemporaryDatabase, "own-temporary-database", false, "bring up a postgres server and create a temporary database") timeout := flags.Duration("timeout", 0, "maximum time to wait for cluster to be ready") shutdown := flags.Bool("shutdown", false, "shut down when the cluster becomes ready") diff --git a/lib/boot/nginx.go b/lib/boot/nginx.go index dc4aebd528..5826e5c013 100644 --- a/lib/boot/nginx.go +++ b/lib/boot/nginx.go @@ -53,12 +53,17 @@ func (runNginx) Run(ctx context.Context, fail func(error), super *Supervisor) er {"WORKBENCH1", super.cluster.Services.Workbench1}, {"WS", super.cluster.Services.Websocket}, } { - host, port, err := internalPort(cmpt.svc) - if err != nil { + var host, port string + if len(cmpt.svc.InternalURLs) == 0 { + // We won't run this service, but we need an + // upstream port to write in our templated + // nginx config. Choose a port that will + // return 502 Bad Gateway. + port = "9" + } else if host, port, err = internalPort(cmpt.svc); err != nil { return fmt.Errorf("%s internal port: %w (%v)", cmpt.varname, err, cmpt.svc) - } - if ok, err := addrIsLocal(net.JoinHostPort(host, port)); !ok || err != nil { - return fmt.Errorf("urlIsLocal() failed for host %q port %q: %v", host, port, err) + } else if ok, err := addrIsLocal(net.JoinHostPort(host, port)); !ok || err != nil { + return fmt.Errorf("%s addrIsLocal() failed for host %q port %q: %v", cmpt.varname, host, port, err) } vars[cmpt.varname+"PORT"] = port @@ -66,8 +71,9 @@ func (runNginx) Run(ctx context.Context, fail func(error), super *Supervisor) er if err != nil { return fmt.Errorf("%s external port: %w (%v)", cmpt.varname, err, cmpt.svc) } - if ok, err := addrIsLocal(net.JoinHostPort(super.ListenHost, port)); !ok || err != nil { - return fmt.Errorf("urlIsLocal() failed for host %q port %q: %v", super.ListenHost, port, err) + listenAddr := net.JoinHostPort(super.ListenHost, port) + if ok, err := addrIsLocal(listenAddr); !ok || err != nil { + return fmt.Errorf("%s addrIsLocal(%q) failed: %w", cmpt.varname, listenAddr, err) } vars[cmpt.varname+"SSLPORT"] = port } diff --git a/lib/boot/supervisor.go b/lib/boot/supervisor.go index 961ed55de3..0f497a443b 100644 --- a/lib/boot/supervisor.go +++ b/lib/boot/supervisor.go @@ -42,6 +42,7 @@ type Supervisor struct { ClusterType string // e.g., production ListenHost string // e.g., localhost ControllerAddr string // e.g., 127.0.0.1:8000 + NoWorkbench1 bool OwnTemporaryDatabase bool Stderr io.Writer @@ -249,10 +250,14 @@ func (super *Supervisor) run(cfg *arvados.Config) error { runServiceCommand{name: "ws", svc: super.cluster.Services.Websocket, depends: []supervisedTask{seedDatabase{}}}, installPassenger{src: "services/api"}, runPassenger{src: "services/api", varlibdir: "railsapi", svc: super.cluster.Services.RailsAPI, depends: []supervisedTask{createCertificates{}, seedDatabase{}, installPassenger{src: "services/api"}}}, - installPassenger{src: "apps/workbench", depends: []supervisedTask{seedDatabase{}}}, // dependency ensures workbench doesn't delay api install/startup - runPassenger{src: "apps/workbench", varlibdir: "workbench1", svc: super.cluster.Services.Workbench1, depends: []supervisedTask{installPassenger{src: "apps/workbench"}}}, seedDatabase{}, } + if !super.NoWorkbench1 { + tasks = append(tasks, + installPassenger{src: "apps/workbench", depends: []supervisedTask{seedDatabase{}}}, // dependency ensures workbench doesn't delay api install/startup + runPassenger{src: "apps/workbench", varlibdir: "workbench1", svc: super.cluster.Services.Workbench1, depends: []supervisedTask{installPassenger{src: "apps/workbench"}}}, + ) + } if super.ClusterType != "test" { tasks = append(tasks, runServiceCommand{name: "dispatch-cloud", svc: super.cluster.Services.DispatchCloud}, @@ -678,6 +683,14 @@ func (super *Supervisor) autofillConfig(cfg *arvados.Config) error { svc.ExternalURL = arvados.URL{Scheme: "wss", Host: fmt.Sprintf("%s:%s", super.ListenHost, nextPort(super.ListenHost)), Path: "/websocket"} } } + if super.NoWorkbench1 && svc == &cluster.Services.Workbench1 { + // When workbench1 is disabled, it gets an + // ExternalURL (so we have a valid listening + // port to write in our Nginx config) but no + // InternalURLs (so health checker doesn't + // complain). + continue + } if len(svc.InternalURLs) == 0 { svc.InternalURLs = map[arvados.URL]arvados.ServiceInstance{ {Scheme: "http", Host: fmt.Sprintf("%s:%s", super.ListenHost, nextPort(super.ListenHost)), Path: "/"}: {}, diff --git a/lib/controller/integration_test.go b/lib/controller/integration_test.go index aeaede427e..7b1dcbea66 100644 --- a/lib/controller/integration_test.go +++ b/lib/controller/integration_test.go @@ -130,8 +130,9 @@ func (s *IntegrationSuite) SetUpSuite(c *check.C) { tc := boot.NewTestCluster( filepath.Join(cwd, "..", ".."), id, cfg, "127.0.0."+id[3:], c.Log) + tc.Super.NoWorkbench1 = true + tc.Start() s.testClusters[id] = tc - s.testClusters[id].Start() } for _, tc := range s.testClusters { ok := tc.WaitReady() diff --git a/tools/sync-groups/federation_test.go b/tools/sync-groups/federation_test.go index aebac21de6..1bbdaa3fa3 100644 --- a/tools/sync-groups/federation_test.go +++ b/tools/sync-groups/federation_test.go @@ -114,8 +114,9 @@ func (s *FederationSuite) SetUpSuite(c *check.C) { tc := boot.NewTestCluster( filepath.Join(cwd, "..", ".."), id, cfg, "127.0.0."+id[3:], c.Log) + tc.Super.NoWorkbench1 = true + tc.Start() s.testClusters[id] = tc - s.testClusters[id].Start() } for _, tc := range s.testClusters { ok := tc.WaitReady() -- 2.30.2