]> git.arvados.org - arvados.git/blob - sdk/go/arvadostest/run_servers.go
23027: Validate port range for nginx core configuration
[arvados.git] / sdk / go / arvadostest / run_servers.go
1 // Copyright (C) The Arvados Authors. All rights reserved.
2 //
3 // SPDX-License-Identifier: Apache-2.0
4
5 package arvadostest
6
7 import (
8         "crypto/tls"
9         "fmt"
10         "io/ioutil"
11         "log"
12         "net/http"
13         "os"
14         "os/exec"
15         "path"
16         "path/filepath"
17         "strconv"
18         "strings"
19
20         "gopkg.in/check.v1"
21 )
22
23 var authSettings = make(map[string]string)
24
25 // ResetEnv resets ARVADOS_* env vars to whatever they were the first
26 // time this func was called.
27 //
28 // Call it from your SetUpTest or SetUpSuite func if your tests modify
29 // env vars.
30 func ResetEnv() {
31         if len(authSettings) == 0 {
32                 for _, e := range os.Environ() {
33                         e := strings.SplitN(e, "=", 2)
34                         if len(e) == 2 {
35                                 authSettings[e[0]] = e[1]
36                         }
37                 }
38         } else {
39                 for k, v := range authSettings {
40                         os.Setenv(k, v)
41                 }
42         }
43 }
44
45 func pythonTestDir() string {
46         reldir := "sdk/python/tests/"
47         for i := 0; i < 10; i++ {
48                 if _, err := os.Stat(reldir); err == nil {
49                         dir, err := filepath.Abs(reldir)
50                         if err != nil {
51                                 log.Fatal(err)
52                         }
53                         return dir
54                 }
55                 reldir = "../" + reldir
56         }
57         log.Fatalf("sdk/python/tests/ not found in any ancestor")
58         return ""
59 }
60
61 func ResetDB(c *check.C) {
62         hc := http.Client{Transport: &http.Transport{
63                 TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
64         }}
65         req, err := http.NewRequest("POST", "https://"+os.Getenv("ARVADOS_TEST_API_HOST")+"/database/reset", nil)
66         c.Assert(err, check.IsNil)
67         req.Header.Set("Authorization", "Bearer "+AdminToken)
68         resp, err := hc.Do(req)
69         c.Assert(err, check.IsNil)
70         defer resp.Body.Close()
71         c.Check(resp.StatusCode, check.Equals, http.StatusOK)
72 }
73
74 // StartKeep starts the given number of keep servers,
75 // optionally with --keep-blob-signing enabled.
76 // Use numKeepServers = 2 and blobSigning = false under all normal circumstances.
77 func StartKeep(numKeepServers int, blobSigning bool) {
78         cmdArgs := []string{"run_test_server.py", "start_keep", "--num-keep-servers", strconv.Itoa(numKeepServers)}
79         if blobSigning {
80                 cmdArgs = append(cmdArgs, "--keep-blob-signing")
81         }
82         cmd := exec.Command("python", cmdArgs...)
83         cmd.Dir = pythonTestDir()
84         bgRun(cmd)
85 }
86
87 // StopKeep stops keep servers that were started with StartKeep.
88 // numkeepServers should be the same value that was passed to StartKeep,
89 // which is 2 under all normal circumstances.
90 func StopKeep(numKeepServers int) {
91         cmd := exec.Command("python", "run_test_server.py", "stop_keep", "--num-keep-servers", strconv.Itoa(numKeepServers))
92         cmd.Dir = pythonTestDir()
93         bgRun(cmd)
94         // Without Wait, "go test" in go1.10.1 tends to hang. https://github.com/golang/go/issues/24050
95         cmd.Wait()
96 }
97
98 // Start cmd, with stderr and stdout redirected to our own
99 // stderr. Return when the process exits, but do not wait for its
100 // stderr and stdout to close: any grandchild processes will continue
101 // writing to our stderr.
102 func bgRun(cmd *exec.Cmd) {
103         cmd.Stdin = nil
104         cmd.Stderr = os.Stderr
105         cmd.Stdout = os.Stderr
106         if err := cmd.Start(); err != nil {
107                 log.Fatalf("%+v: %s", cmd.Args, err)
108         }
109         if pstate, err := cmd.Process.Wait(); err != nil {
110                 log.Fatalf("%+v: %s", cmd.Args, err)
111         } else if pstate.ExitCode() != 0 {
112                 log.Fatalf("%+v: exited %d", cmd.Args, pstate.ExitCode())
113         }
114 }
115
116 // CreateBadPath creates a tmp dir, appends given string and returns that path
117 // This will guarantee that the path being returned does not exist
118 func CreateBadPath() (badpath string, err error) {
119         tempdir, err := ioutil.TempDir("", "bad")
120         if err != nil {
121                 return "", fmt.Errorf("Could not create temporary directory for bad path: %v", err)
122         }
123         badpath = path.Join(tempdir, "bad")
124         return badpath, nil
125 }
126
127 // DestroyBadPath deletes the tmp dir created by the previous CreateBadPath call
128 func DestroyBadPath(badpath string) error {
129         tempdir := path.Join(badpath, "..")
130         err := os.Remove(tempdir)
131         if err != nil {
132                 return fmt.Errorf("Could not remove bad path temporary directory %v: %v", tempdir, err)
133         }
134         return nil
135 }