1 // Copyright (C) The Arvados Authors. All rights reserved.
3 // SPDX-License-Identifier: AGPL-3.0
16 "git.curoverse.com/arvados.git/lib/config"
17 "git.curoverse.com/arvados.git/sdk/go/arvados"
18 "git.curoverse.com/arvados.git/sdk/go/arvadostest"
19 check "gopkg.in/check.v1"
22 var _ = check.Suite(&serverSuite{})
24 type serverSuite struct {
25 cluster *arvados.Cluster
30 func (s *serverSuite) SetUpTest(c *check.C) {
32 s.cluster, err = s.testConfig()
33 c.Assert(err, check.IsNil)
34 s.srv = &server{cluster: s.cluster}
37 func (*serverSuite) testConfig() (*arvados.Cluster, error) {
38 ldr := config.NewLoader(nil, nil)
39 ldr.LegacyComponentConfig = "ws-test"
40 cfg, err := ldr.Load()
44 cluster, err := cfg.GetCluster("")
48 client := arvados.NewClientFromEnv()
49 cluster.Services.Controller.ExternalURL.Host = client.APIHost
50 cluster.SystemRootToken = client.AuthToken
51 cluster.TLS.Insecure = client.Insecure
52 cluster.PostgreSQL.Connection = testDBConfig()
53 cluster.Services.Websocket.InternalURLs = map[arvados.URL]arvados.ServiceInstance{arvados.URL{Host: ":"}: arvados.ServiceInstance{}}
54 cluster.ManagementToken = arvadostest.ManagementToken
58 // TestBadDB ensures Run() returns an error (instead of panicking or
59 // deadlocking) if it can't connect to the database server at startup.
60 func (s *serverSuite) TestBadDB(c *check.C) {
61 s.cluster.PostgreSQL.Connection["password"] = "1234"
67 c.Check(err, check.NotNil)
76 done := make(chan bool)
83 case <-time.After(10 * time.Second):
88 func (s *serverSuite) TestHealth(c *check.C) {
92 for _, token := range []string{"", "foo", s.cluster.ManagementToken} {
93 req, err := http.NewRequest("GET", "http://"+s.srv.listener.Addr().String()+"/_health/ping", nil)
94 c.Assert(err, check.IsNil)
96 req.Header.Add("Authorization", "Bearer "+token)
98 resp, err := http.DefaultClient.Do(req)
99 c.Check(err, check.IsNil)
100 if token == s.cluster.ManagementToken {
101 c.Check(resp.StatusCode, check.Equals, http.StatusOK)
102 buf, err := ioutil.ReadAll(resp.Body)
103 c.Check(err, check.IsNil)
104 c.Check(string(buf), check.Equals, `{"health":"OK"}`+"\n")
106 c.Check(resp.StatusCode, check.Not(check.Equals), http.StatusOK)
111 func (s *serverSuite) TestStatus(c *check.C) {
115 req, err := http.NewRequest("GET", "http://"+s.srv.listener.Addr().String()+"/status.json", nil)
116 c.Assert(err, check.IsNil)
117 resp, err := http.DefaultClient.Do(req)
118 c.Check(err, check.IsNil)
119 c.Check(resp.StatusCode, check.Equals, http.StatusOK)
120 var status map[string]interface{}
121 err = json.NewDecoder(resp.Body).Decode(&status)
122 c.Check(err, check.IsNil)
123 c.Check(status["Version"], check.Not(check.Equals), "")
126 func (s *serverSuite) TestHealthDisabled(c *check.C) {
127 s.cluster.ManagementToken = ""
133 for _, token := range []string{"", "foo", arvadostest.ManagementToken} {
134 req, err := http.NewRequest("GET", "http://"+s.srv.listener.Addr().String()+"/_health/ping", nil)
135 c.Assert(err, check.IsNil)
136 req.Header.Add("Authorization", "Bearer "+token)
137 resp, err := http.DefaultClient.Do(req)
138 c.Check(err, check.IsNil)
139 c.Check(resp.StatusCode, check.Equals, http.StatusNotFound)
143 func (s *serverSuite) TestLoadLegacyConfig(c *check.C) {
149 "dbname": "arvados_production"
153 "connect_timeout": "30"
155 "fallback_application_name": "arvados-ws"
163 ManagementToken: qqqqq
165 tmpfile, err := ioutil.TempFile("", "example")
170 defer os.Remove(tmpfile.Name()) // clean up
172 if _, err := tmpfile.Write(content); err != nil {
175 if err := tmpfile.Close(); err != nil {
179 cluster := configure(logger(nil), []string{"arvados-ws", "-config", tmpfile.Name()})
180 c.Check(cluster, check.NotNil)
182 c.Check(cluster.Services.Controller.ExternalURL, check.Equals, arvados.URL{Scheme: "https", Host: "example.com"})
183 c.Check(cluster.SystemRootToken, check.Equals, "abcdefg")
185 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' ")
186 c.Check(cluster.PostgreSQL.ConnectionPool, check.Equals, 63)
187 c.Check(cluster.Services.Websocket.InternalURLs, check.DeepEquals, map[arvados.URL]arvados.ServiceInstance{
188 arvados.URL{Host: ":8765"}: arvados.ServiceInstance{}})
189 c.Check(cluster.SystemLogs.LogLevel, check.Equals, "debug")
190 c.Check(cluster.SystemLogs.Format, check.Equals, "text")
191 c.Check(cluster.API.WebsocketKeepaliveTimeout, check.Equals, arvados.Duration(61*time.Second))
192 c.Check(cluster.API.WebsocketClientEventQueue, check.Equals, 62)
193 c.Check(cluster.API.WebsocketServerEventQueue, check.Equals, 5)
194 c.Check(cluster.ManagementToken, check.Equals, "qqqqq")