17417: Add arm64 packages for our Golang components.
[arvados.git] / cmd / arvados-client / container_gateway_test.go
1 // Copyright (C) The Arvados Authors. All rights reserved.
2 //
3 // SPDX-License-Identifier: Apache-2.0
4
5 package main
6
7 import (
8         "bytes"
9         "context"
10         "crypto/hmac"
11         "crypto/sha256"
12         "fmt"
13         "net/url"
14         "os"
15         "os/exec"
16
17         "git.arvados.org/arvados.git/lib/controller/rpc"
18         "git.arvados.org/arvados.git/lib/crunchrun"
19         "git.arvados.org/arvados.git/sdk/go/arvados"
20         "git.arvados.org/arvados.git/sdk/go/arvadostest"
21         check "gopkg.in/check.v1"
22 )
23
24 func (s *ClientSuite) TestShellGatewayNotAvailable(c *check.C) {
25         var stdout, stderr bytes.Buffer
26         cmd := exec.Command("go", "run", ".", "shell", arvadostest.QueuedContainerUUID, "-o", "controlpath=none", "echo", "ok")
27         cmd.Env = append(cmd.Env, os.Environ()...)
28         cmd.Env = append(cmd.Env, "ARVADOS_API_TOKEN="+arvadostest.ActiveTokenV2)
29         cmd.Stdout = &stdout
30         cmd.Stderr = &stderr
31         c.Check(cmd.Run(), check.NotNil)
32         c.Log(stderr.String())
33         c.Check(stderr.String(), check.Matches, `(?ms).*container is not running yet \(state is "Queued"\).*`)
34 }
35
36 func (s *ClientSuite) TestShellGateway(c *check.C) {
37         defer func() {
38                 c.Check(arvados.NewClientFromEnv().RequestAndDecode(nil, "POST", "database/reset", nil, nil), check.IsNil)
39         }()
40         uuid := arvadostest.QueuedContainerUUID
41         h := hmac.New(sha256.New, []byte(arvadostest.SystemRootToken))
42         fmt.Fprint(h, uuid)
43         authSecret := fmt.Sprintf("%x", h.Sum(nil))
44         dcid := "theperthcountyconspiracy"
45         gw := crunchrun.Gateway{
46                 DockerContainerID: &dcid,
47                 ContainerUUID:     uuid,
48                 Address:           "0.0.0.0:0",
49                 AuthSecret:        authSecret,
50         }
51         err := gw.Start()
52         c.Assert(err, check.IsNil)
53
54         rpcconn := rpc.NewConn("",
55                 &url.URL{
56                         Scheme: "https",
57                         Host:   os.Getenv("ARVADOS_API_HOST"),
58                 },
59                 true,
60                 func(context.Context) ([]string, error) {
61                         return []string{arvadostest.SystemRootToken}, nil
62                 })
63         _, err = rpcconn.ContainerUpdate(context.TODO(), arvados.UpdateOptions{UUID: uuid, Attrs: map[string]interface{}{
64                 "state": arvados.ContainerStateLocked,
65         }})
66         c.Assert(err, check.IsNil)
67         _, err = rpcconn.ContainerUpdate(context.TODO(), arvados.UpdateOptions{UUID: uuid, Attrs: map[string]interface{}{
68                 "state":           arvados.ContainerStateRunning,
69                 "gateway_address": gw.Address,
70         }})
71         c.Assert(err, check.IsNil)
72
73         var stdout, stderr bytes.Buffer
74         cmd := exec.Command("go", "run", ".", "shell", uuid, "-o", "controlpath=none", "-o", "userknownhostsfile="+c.MkDir()+"/known_hosts", "echo", "ok")
75         cmd.Env = append(cmd.Env, os.Environ()...)
76         cmd.Env = append(cmd.Env, "ARVADOS_API_TOKEN="+arvadostest.ActiveTokenV2)
77         cmd.Stdout = &stdout
78         cmd.Stderr = &stderr
79         c.Check(cmd.Run(), check.NotNil)
80         c.Log(stderr.String())
81         c.Check(stderr.String(), check.Matches, `(?ms).*(No such container: theperthcountyconspiracy|exec: \"docker\": executable file not found in \$PATH).*`)
82 }