b4886f0c8af6d474d5ae2677384fb7d22ed31b82
[arvados.git] / sdk / python / run_test_server.py
1 import subprocess
2 import time
3 import os
4 import signal
5 import yaml
6 import sys
7 import argparse
8 import arvados.config
9
10 ARV_API_SERVER_DIR = '../../services/api'
11 SERVER_PID_PATH = 'tmp/pids/server.pid'
12 WEBSOCKETS_SERVER_PID_PATH = 'tmp/pids/passenger.3001.pid'
13
14 def find_server_pid(PID_PATH):
15     timeout = time.time() + 10
16     good_pid = False
17     while (not good_pid) and (time.time() < timeout):
18         time.sleep(0.2)
19         try:
20             with open(PID_PATH, 'r') as f:
21                 server_pid = int(f.read())
22             good_pid = (os.kill(server_pid, 0) == None)
23         except Exception:
24             good_pid = False
25
26     if not good_pid:
27         raise Exception("could not find API server Rails pid")
28
29     return server_pid
30
31 def run(websockets=False):
32     cwd = os.getcwd()
33     os.chdir(ARV_API_SERVER_DIR)
34     os.environ["RAILS_ENV"] = "test"
35     subprocess.call(['bundle', 'exec', 'rake', 'db:test:load'])
36     subprocess.call(['bundle', 'exec', 'rake', 'db:fixtures:load'])
37     if websockets:
38         os.environ["ARVADOS_WEBSOCKETS"] = "true"
39         subprocess.call(['openssl', 'req', '-new', '-x509', '-nodes',
40                          '-out', './self-signed.pem',
41                          '-keyout', './self-signed.key',
42                          '-days', '3650',
43                          '-subj', '/CN=localhost'])
44         subprocess.call(['passenger', 'start', '-d', '-p3001', '--ssl',
45                          '--ssl-certificate', 'self-signed.pem',
46                          '--ssl-certificate-key', 'self-signed.key'])
47         find_server_pid(WEBSOCKETS_SERVER_PID_PATH)
48     else:
49         subprocess.call(['bundle', 'exec', 'rails', 'server', '-d', '-p3001'])
50         find_server_pid(SERVER_PID_PATH)
51     #os.environ["ARVADOS_API_HOST"] = "localhost:3001"
52     os.environ["ARVADOS_API_HOST"] = "127.0.0.1:3001"
53     os.environ["ARVADOS_API_HOST_INSECURE"] = "true"
54     os.chdir(cwd)
55
56 def stop(websockets=False):
57     cwd = os.getcwd()
58     os.chdir(ARV_API_SERVER_DIR)
59     if websockets:
60         os.kill(find_server_pid(WEBSOCKETS_SERVER_PID_PATH), signal.SIGTERM)
61         os.unlink('self-signed.pem')
62         os.unlink('self-signed.key')
63     else:
64         os.kill(find_server_pid(SERVER_PID_PATH), signal.SIGTERM)
65     os.chdir(cwd)
66
67 def fixture(fix):
68     '''load a fixture yaml file'''
69     with open(os.path.join(ARV_API_SERVER_DIR, "test", "fixtures",
70                            fix + ".yml")) as f:
71         return yaml.load(f.read())
72
73 def authorize_with(token):
74     '''token is the symbolic name of the token from the api_client_authorizations fixture'''
75     arvados.config.settings()["ARVADOS_API_TOKEN"] = fixture("api_client_authorizations")[token]["api_token"]
76
77 if __name__ == "__main__":
78     parser = argparse.ArgumentParser()
79     parser.add_argument('action', type=str, help='''one of "start" or "stop"''')
80     parser.add_argument('--websockets', action='store_true', default=False)
81     args = parser.parse_args()
82
83     if args.action == 'start':
84         run(args.websockets)
85     elif args.action == 'stop':
86         stop(args.websockets)