Merge branch 'master' into 7167-keep-rsync-test-setup
[arvados.git] / sdk / go / arvadostest / run_servers.go
1 package arvadostest
2
3 import (
4         "bufio"
5         "bytes"
6         "fmt"
7         "io"
8         "io/ioutil"
9         "log"
10         "os"
11         "os/exec"
12         "strings"
13 )
14
15 var authSettings = make(map[string]string)
16
17 func ResetEnv() {
18         for k, v := range authSettings {
19                 os.Setenv(k, v)
20         }
21 }
22
23 func ParseAuthSettings(authScript []byte) {
24         scanner := bufio.NewScanner(bytes.NewReader(authScript))
25         for scanner.Scan() {
26                 line := scanner.Text()
27                 if 0 != strings.Index(line, "export ") {
28                         log.Printf("Ignoring: %v", line)
29                         continue
30                 }
31                 toks := strings.SplitN(strings.Replace(line, "export ", "", 1), "=", 2)
32                 if len(toks) == 2 {
33                         authSettings[toks[0]] = toks[1]
34                 } else {
35                         log.Fatalf("Could not parse: %v", line)
36                 }
37         }
38         log.Printf("authSettings: %v", authSettings)
39 }
40
41 var pythonTestDir string = ""
42
43 func chdirToPythonTests() {
44         if pythonTestDir != "" {
45                 if err := os.Chdir(pythonTestDir); err != nil {
46                         log.Fatalf("chdir %s: %s", pythonTestDir, err)
47                 }
48                 return
49         }
50         for {
51                 if err := os.Chdir("sdk/python/tests"); err == nil {
52                         pythonTestDir, err = os.Getwd()
53                         return
54                 }
55                 if parent, err := os.Getwd(); err != nil || parent == "/" {
56                         log.Fatalf("sdk/python/tests/ not found in any ancestor")
57                 }
58                 if err := os.Chdir(".."); err != nil {
59                         log.Fatal(err)
60                 }
61         }
62 }
63
64 func StartAPI() {
65         cwd, _ := os.Getwd()
66         defer os.Chdir(cwd)
67         chdirToPythonTests()
68
69         cmd := exec.Command("python", "run_test_server.py", "start", "--auth", "admin")
70         stderr, err := cmd.StderrPipe()
71         if err != nil {
72                 log.Fatal(err)
73         }
74         go io.Copy(os.Stderr, stderr)
75         stdout, err := cmd.StdoutPipe()
76         if err != nil {
77                 log.Fatal(err)
78         }
79         if err = cmd.Start(); err != nil {
80                 log.Fatal(err)
81         }
82         var authScript []byte
83         if authScript, err = ioutil.ReadAll(stdout); err != nil {
84                 log.Fatal(err)
85         }
86         if err = cmd.Wait(); err != nil {
87                 log.Fatal(err)
88         }
89         ParseAuthSettings(authScript)
90         ResetEnv()
91 }
92
93 func StopAPI() {
94         cwd, _ := os.Getwd()
95         defer os.Chdir(cwd)
96         chdirToPythonTests()
97
98         exec.Command("python", "run_test_server.py", "stop").Run()
99 }
100
101 func StartKeep() {
102         StartKeepAdditional(false)
103 }
104
105 func StartKeepAdditional(keepExisting bool) {
106         cwd, _ := os.Getwd()
107         defer os.Chdir(cwd)
108         chdirToPythonTests()
109
110         cmd := exec.Command("python", "run_test_server.py", "start_keep")
111         if keepExisting {
112                 cmd = exec.Command("python", "run_test_server.py", "start_keep", "--keep_existing", "true")
113         }
114         stderr, err := cmd.StderrPipe()
115         if err != nil {
116                 log.Fatalf("Setting up stderr pipe: %s", err)
117         }
118         go io.Copy(os.Stderr, stderr)
119         if err := cmd.Run(); err != nil {
120                 panic(fmt.Sprintf("'python run_test_server.py start_keep' returned error %s", err))
121         }
122 }
123
124 func StopKeep() {
125         cwd, _ := os.Getwd()
126         defer os.Chdir(cwd)
127         chdirToPythonTests()
128
129         exec.Command("python", "run_test_server.py", "stop_keep").Run()
130 }