15954: Merge branch 'master'
[arvados.git] / lib / boot / passenger.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         "bytes"
9         "context"
10         "fmt"
11         "os"
12         "path/filepath"
13         "strings"
14
15         "git.arvados.org/arvados.git/sdk/go/arvados"
16 )
17
18 type installPassenger struct {
19         src     string
20         depends []bootTask
21 }
22
23 func (runner installPassenger) String() string {
24         return "installPassenger:" + runner.src
25 }
26
27 func (runner installPassenger) Run(ctx context.Context, fail func(error), boot *Booter) error {
28         err := boot.wait(ctx, runner.depends...)
29         if err != nil {
30                 return err
31         }
32         var buf bytes.Buffer
33         err = boot.RunProgram(ctx, runner.src, &buf, nil, "gem", "list", "--details", "bundler")
34         if err != nil {
35                 return err
36         }
37         for _, version := range []string{"1.11.0", "1.17.3", "2.0.2"} {
38                 if !strings.Contains(buf.String(), "("+version+")") {
39                         err = boot.RunProgram(ctx, runner.src, nil, nil, "gem", "install", "--user", "bundler:1.11", "bundler:1.17.3", "bundler:2.0.2")
40                         if err != nil {
41                                 return err
42                         }
43                         break
44                 }
45         }
46         err = boot.RunProgram(ctx, runner.src, nil, nil, "bundle", "install", "--jobs", "4", "--path", filepath.Join(os.Getenv("HOME"), ".gem"))
47         if err != nil {
48                 return err
49         }
50         err = boot.RunProgram(ctx, runner.src, nil, nil, "bundle", "exec", "passenger-config", "build-native-support")
51         if err != nil {
52                 return err
53         }
54         err = boot.RunProgram(ctx, runner.src, nil, nil, "bundle", "exec", "passenger-config", "install-standalone-runtime")
55         if err != nil {
56                 return err
57         }
58         err = boot.RunProgram(ctx, runner.src, nil, nil, "bundle", "exec", "passenger-config", "validate-install")
59         if err != nil {
60                 return err
61         }
62         return nil
63 }
64
65 type runPassenger struct {
66         src     string
67         svc     arvados.Service
68         depends []bootTask
69 }
70
71 func (runner runPassenger) String() string {
72         return "runPassenger:" + runner.src
73 }
74
75 func (runner runPassenger) Run(ctx context.Context, fail func(error), boot *Booter) error {
76         err := boot.wait(ctx, runner.depends...)
77         if err != nil {
78                 return err
79         }
80         port, err := internalPort(runner.svc)
81         if err != nil {
82                 return fmt.Errorf("bug: no InternalURLs for component %q: %v", runner, runner.svc.InternalURLs)
83         }
84         go func() {
85                 err = boot.RunProgram(ctx, runner.src, nil, nil, "bundle", "exec",
86                         "passenger", "start",
87                         "-p", port,
88                         "--log-file", "/dev/null",
89                         "--pid-file", filepath.Join(boot.tempdir, "passenger."+strings.Replace(runner.src, "/", "_", -1)+".pid"))
90                 fail(err)
91         }()
92         return nil
93 }