18794: Restart RailsAPI workers when config file changes.
[arvados.git] / lib / controller / rails_restart_test.go
1 // Copyright (C) The Arvados Authors. All rights reserved.
2 //
3 // SPDX-License-Identifier: AGPL-3.0
4
5 package controller
6
7 import (
8         "bytes"
9         "crypto/sha256"
10         "crypto/tls"
11         "fmt"
12         "io/ioutil"
13         "net/http"
14         "net/url"
15         "os"
16         "time"
17
18         "git.arvados.org/arvados.git/lib/config"
19         "git.arvados.org/arvados.git/sdk/go/arvadostest"
20         "git.arvados.org/arvados.git/sdk/go/ctxlog"
21         check "gopkg.in/check.v1"
22 )
23
24 var _ = check.Suite(&railsRestartSuite{})
25
26 type railsRestartSuite struct{}
27
28 // This tests RailsAPI, not controller -- but tests RailsAPI's
29 // integration with passenger, so it needs to run against the
30 // run-tests.sh environment where RailsAPI runs under passenger, not
31 // in the Rails test environment.
32 func (s *railsRestartSuite) TestConfigReload(c *check.C) {
33         hc := http.Client{Transport: &http.Transport{
34                 TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
35         }}
36
37         confdata, err := os.ReadFile(os.Getenv("ARVADOS_CONFIG"))
38         c.Assert(err, check.IsNil)
39         oldhash := fmt.Sprintf("%x", sha256.Sum256(confdata))
40         c.Logf("oldhash %s", oldhash)
41
42         ldr := config.NewLoader(&bytes.Buffer{}, ctxlog.TestLogger(c))
43         cfg, err := ldr.Load()
44         c.Assert(err, check.IsNil)
45         cc, err := cfg.GetCluster("")
46         c.Assert(err, check.IsNil)
47         var metricsURL string
48         for u := range cc.Services.RailsAPI.InternalURLs {
49                 u := url.URL(u)
50                 mu, err := u.Parse("/metrics")
51                 c.Assert(err, check.IsNil)
52                 metricsURL = mu.String()
53         }
54
55         req, err := http.NewRequest(http.MethodGet, metricsURL, nil)
56         c.Assert(err, check.IsNil)
57         req.Header.Set("Authorization", "Bearer "+arvadostest.ManagementToken)
58
59         resp, err := hc.Do(req)
60         c.Assert(err, check.IsNil)
61         c.Check(resp.StatusCode, check.Equals, http.StatusOK)
62         body, err := ioutil.ReadAll(resp.Body)
63         c.Assert(err, check.IsNil)
64         c.Check(string(body), check.Matches, `(?ms).*`+oldhash+`.*`)
65
66         f, err := os.OpenFile(os.Getenv("ARVADOS_CONFIG"), os.O_WRONLY|os.O_APPEND, 0)
67         c.Assert(err, check.IsNil)
68         _, err = f.Write([]byte{'\n'})
69         c.Assert(err, check.IsNil)
70         err = f.Close()
71         c.Assert(err, check.IsNil)
72         newhash := fmt.Sprintf("%x", sha256.Sum256(append(confdata, '\n')))
73         c.Logf("newhash %s", newhash)
74
75         // Wait 2s to give RailsAPI's 1 Hz reload_config thread time
76         // to poll and hit restart.txt
77         time.Sleep(2 * time.Second)
78
79         resp, err = hc.Do(req)
80         c.Assert(err, check.IsNil)
81         c.Check(resp.StatusCode, check.Equals, http.StatusOK)
82         body, err = ioutil.ReadAll(resp.Body)
83         c.Assert(err, check.IsNil)
84         c.Check(string(body), check.Matches, `(?ms).*`+newhash+`.*`)
85 }