Merge branch 'main' from workbench2.git
[arvados.git] / lib / boot / workbench2.go
1 // Copyright (C) The Arvados Authors. All rights reserved.
2 //
3 // SPDX-License-Identifier: AGPL-3.0
4
5 package boot
6
7 import (
8         "context"
9         "errors"
10         "fmt"
11         "io"
12         "io/fs"
13         "io/ioutil"
14         "net"
15         "os"
16
17         "git.arvados.org/arvados.git/sdk/go/arvados"
18 )
19
20 type runWorkbench2 struct {
21         svc arvados.Service
22 }
23
24 func (runner runWorkbench2) String() string {
25         return "runWorkbench2"
26 }
27
28 func (runner runWorkbench2) Run(ctx context.Context, fail func(error), super *Supervisor) error {
29         host, port, err := internalPort(runner.svc)
30         if err != nil {
31                 return fmt.Errorf("bug: no internalPort for %q: %v (%#v)", runner, err, runner.svc)
32         }
33         super.waitShutdown.Add(1)
34         go func() {
35                 defer super.waitShutdown.Done()
36                 if super.ClusterType == "production" {
37                         err = super.RunProgram(ctx, "/var/lib/arvados/workbench2", runOptions{
38                                 user: "www-data",
39                         }, "arvados-server", "workbench2", super.cluster.Services.Controller.ExternalURL.Host, net.JoinHostPort(host, port), ".")
40                 } else {
41                         stdinr, stdinw := io.Pipe()
42                         defer stdinw.Close()
43                         go func() {
44                                 <-ctx.Done()
45                                 stdinw.Close()
46                         }()
47                         if err = os.Mkdir(super.SourcePath+"/services/workbench2/public/_health", 0777); err != nil && !errors.Is(err, fs.ErrExist) {
48                                 fail(err)
49                                 return
50                         }
51                         if err = ioutil.WriteFile(super.SourcePath+"/services/workbench2/public/_health/ping", []byte(`{"health":"OK"}`), 0666); err != nil {
52                                 fail(err)
53                                 return
54                         }
55                         err = super.RunProgram(ctx, super.SourcePath+"/services/workbench2", runOptions{
56                                 env: []string{
57                                         "CI=true",
58                                         "HTTPS=false",
59                                         "PORT=" + port,
60                                         "REACT_APP_ARVADOS_API_HOST=" + super.cluster.Services.Controller.ExternalURL.Host,
61                                 },
62                                 // If we don't connect stdin, "yarn start" just exits.
63                                 stdin: stdinr,
64                         }, "yarn", "start")
65                         fail(errors.New("`yarn start` exited"))
66                 }
67                 fail(err)
68         }()
69         return nil
70 }