]> git.arvados.org - arvados.git/blob - sdk/go/keepclient/discover_test.go
Merge branch '22859-service-port-range'
[arvados.git] / sdk / go / keepclient / discover_test.go
1 // Copyright (C) The Arvados Authors. All rights reserved.
2 //
3 // SPDX-License-Identifier: Apache-2.0
4
5 package keepclient
6
7 import (
8         "bytes"
9         "crypto/md5"
10         "fmt"
11         "net/http"
12         "os"
13
14         "git.arvados.org/arvados.git/lib/config"
15         "git.arvados.org/arvados.git/sdk/go/arvados"
16         "git.arvados.org/arvados.git/sdk/go/arvadosclient"
17         "git.arvados.org/arvados.git/sdk/go/arvadostest"
18         "git.arvados.org/arvados.git/sdk/go/ctxlog"
19         "gopkg.in/check.v1"
20 )
21
22 func (s *ServerRequiredSuite) TestOverrideDiscovery(c *check.C) {
23         defer os.Unsetenv("ARVADOS_KEEP_SERVICES")
24
25         data := []byte("TestOverrideDiscovery")
26         hash := fmt.Sprintf("%x+%d", md5.Sum(data), len(data))
27         st := StubGetHandler{
28                 c,
29                 hash,
30                 arvadostest.ActiveToken,
31                 http.StatusOK,
32                 data}
33         ks := RunSomeFakeKeepServers(st, 2)
34
35         os.Setenv("ARVADOS_KEEP_SERVICES", "")
36         arv1, err := arvadosclient.MakeArvadosClient()
37         c.Assert(err, check.IsNil)
38         arv1.ApiToken = arvadostest.ActiveToken
39
40         os.Setenv("ARVADOS_KEEP_SERVICES", ks[0].url+"  "+ks[1].url+" ")
41         arv2, err := arvadosclient.MakeArvadosClient()
42         c.Assert(err, check.IsNil)
43         arv2.ApiToken = arvadostest.ActiveToken
44
45         // ARVADOS_KEEP_SERVICES was empty when we created arv1, but
46         // it pointed to our stub servers when we created
47         // arv2. Regardless of what it's set to now, a keepclient for
48         // arv2 should use our stub servers, but one created for arv1
49         // should not.
50
51         kc1, err := MakeKeepClient(arv1)
52         c.Assert(err, check.IsNil)
53         kc2, err := MakeKeepClient(arv2)
54         c.Assert(err, check.IsNil)
55
56         _, _, _, err = kc1.Get(hash)
57         c.Check(err, check.NotNil)
58         _, _, _, err = kc2.Get(hash)
59         c.Check(err, check.IsNil)
60 }
61
62 func (s *ServerRequiredSuite) TestDoubleSlash(c *check.C) {
63         defer os.Unsetenv("ARVADOS_KEEP_SERVICES")
64
65         data := []byte("TestDoubleSlash")
66         hash := fmt.Sprintf("%x+%d", md5.Sum(data), len(data))
67
68         os.Setenv("ARVADOS_KEEP_SERVICES", "")
69         arv1, err := arvadosclient.MakeArvadosClient()
70         c.Assert(err, check.IsNil)
71         arv1.ApiToken = arvadostest.ActiveToken
72         kc1, err := MakeKeepClient(arv1)
73         c.Assert(err, check.IsNil)
74
75         // Use kc1's config to set up a new client kc2, but add an
76         // extra trailing slash to each URL.
77         var svcs string
78         for _, url := range kc1.LocalRoots() {
79                 svcs += url + "/ "
80         }
81         c.Assert(svcs, check.Not(check.HasLen), 0)
82         os.Setenv("ARVADOS_KEEP_SERVICES", svcs)
83
84         arv2, err := arvadosclient.MakeArvadosClient()
85         c.Assert(err, check.IsNil)
86         arv2.ApiToken = arvadostest.ActiveToken
87         kc2, err := MakeKeepClient(arv2)
88         c.Assert(err, check.IsNil)
89
90         // Check that trailing slashes were trimmed.
91         for _, url := range kc2.LocalRoots() {
92                 c.Assert(url, check.Not(check.Matches), `.*/$`)
93         }
94
95         _, _, err = kc2.PutB(data)
96         c.Assert(err, check.IsNil)
97         _, _, _, err = kc2.Get(hash)
98         c.Check(err, check.IsNil)
99 }
100
101 func (s *StandaloneSuite) TestKeepServicesFromClusterConfig(c *check.C) {
102         // This behavior is disabled via env var in the test
103         // environment. Clear the env var to test the default
104         // production behavior.
105         v := "ARVADOS_USE_KEEP_ACCESSIBLE_API"
106         defer os.Setenv(v, os.Getenv(v))
107         os.Unsetenv(v)
108
109         rdr := bytes.NewReader([]byte(`
110 Clusters:
111  zzzzz:
112   Services:
113    Keepstore:
114     InternalURLs:
115      "https://[::1]:12345/":
116       Rendezvous: abcdefghijklmno
117      "https://[::1]:54321/":
118       Rendezvous: xyz
119      "http://0.0.0.0:54321/":
120       {}
121    Keepproxy:
122     InternalURLs:
123      "https://[::1]:55555/":
124       {}
125 `))
126         ldr := config.NewLoader(rdr, ctxlog.TestLogger(c))
127         ldr.Path = "-"
128         cfg, err := ldr.Load()
129         c.Assert(err, check.IsNil)
130         cluster, err := cfg.GetCluster("")
131         c.Assert(err, check.IsNil)
132         c.Assert(cluster.ClusterID, check.Equals, "zzzzz")
133         ac, err := arvados.NewClientFromConfig(cluster)
134         c.Assert(err, check.IsNil)
135         arv1, err := arvadosclient.New(ac)
136         c.Assert(err, check.IsNil)
137         c.Check(arv1.Cluster, check.NotNil)
138         kc, err := MakeKeepClient(arv1)
139         c.Assert(err, check.IsNil)
140         // Note the default rendezvous string is generated based on
141         // the MD5 of the keepstore URL and that URL *must* have a
142         // trailing slash in order to match the RailsAPI behavior --
143         // meanwhile, the keepstore URL given in the localRoots map
144         // *must not* have a trailing slash.
145         c.Check(kc.localRoots, check.DeepEquals, map[string]string{
146                 "zzzzz-bi6l4-abcdefghijklmno":                                                "https://[::1]:12345",
147                 fmt.Sprintf("zzzzz-bi6l4-%x", md5.Sum([]byte("xyz")))[:27]:                   "https://[::1]:54321",
148                 fmt.Sprintf("zzzzz-bi6l4-%x", md5.Sum([]byte("http://0.0.0.0:54321/")))[:27]: "http://0.0.0.0:54321",
149         })
150 }