13 ARV_API_SERVER_DIR = '../../services/api'
14 KEEP_SERVER_DIR = '../../services/keep'
15 SERVER_PID_PATH = 'tmp/pids/webrick-test.pid'
16 WEBSOCKETS_SERVER_PID_PATH = 'tmp/pids/passenger-test.pid'
18 def find_server_pid(PID_PATH, wait=10):
22 while (not good_pid) and (now <= timeout):
25 with open(PID_PATH, 'r') as f:
26 server_pid = int(f.read())
27 good_pid = (os.kill(server_pid, 0) == None)
39 def kill_server_pid(PID_PATH, wait=10):
43 with open(PID_PATH, 'r') as f:
44 server_pid = int(f.read())
46 os.kill(server_pid, signal.SIGTERM) == None
47 os.getpgid(server_pid) # throw OSError if no such pid
55 def run(websockets=False, reuse_server=False):
57 os.chdir(os.path.join(os.path.dirname(__file__), ARV_API_SERVER_DIR))
60 pid_file = WEBSOCKETS_SERVER_PID_PATH
62 pid_file = SERVER_PID_PATH
64 test_pid = find_server_pid(pid_file, 0)
66 if test_pid == None or not reuse_server:
67 # do not try to run both server variants at once
70 # delete cached discovery document
71 shutil.rmtree(arvados.http_cache('discovery'))
74 os.environ["RAILS_ENV"] = "test"
75 subprocess.call(['bundle', 'exec', 'rake', 'tmp:cache:clear'])
76 subprocess.call(['bundle', 'exec', 'rake', 'db:test:load'])
77 subprocess.call(['bundle', 'exec', 'rake', 'db:fixtures:load'])
80 os.environ["ARVADOS_WEBSOCKETS"] = "true"
81 subprocess.call(['openssl', 'req', '-new', '-x509', '-nodes',
82 '-out', './self-signed.pem',
83 '-keyout', './self-signed.key',
85 '-subj', '/CN=localhost'])
86 subprocess.call(['bundle', 'exec',
87 'passenger', 'start', '-d', '-p3333',
89 os.path.join(os.getcwd(), WEBSOCKETS_SERVER_PID_PATH),
91 '--ssl-certificate', 'self-signed.pem',
92 '--ssl-certificate-key', 'self-signed.key'])
93 os.environ["ARVADOS_API_HOST"] = "127.0.0.1:3333"
95 subprocess.call(['bundle', 'exec', 'rails', 'server', '-d',
97 os.path.join(os.getcwd(), SERVER_PID_PATH),
99 os.environ["ARVADOS_API_HOST"] = "127.0.0.1:3001"
101 pid = find_server_pid(SERVER_PID_PATH)
103 os.environ["ARVADOS_API_HOST_INSECURE"] = "true"
104 os.environ["ARVADOS_API_TOKEN"] = ""
109 os.chdir(os.path.join(os.path.dirname(__file__), ARV_API_SERVER_DIR))
111 kill_server_pid(WEBSOCKETS_SERVER_PID_PATH, 0)
112 kill_server_pid(SERVER_PID_PATH, 0)
115 os.unlink('self-signed.pem')
120 os.unlink('self-signed.key')
126 def _start_keep(n, keep_args):
127 keep0 = tempfile.mkdtemp()
128 keep_cmd = ["bin/keep",
129 "-volumes={}".format(keep0),
130 "-listen=:{}".format(25107+n),
131 "-pid={}".format("tmp/keep{}.pid".format(n))]
133 for arg, val in keep_args.iteritems():
134 keep_cmd.append("{}={}".format(arg, val))
136 kp0 = subprocess.Popen(keep_cmd)
137 with open("tmp/keep{}.pid".format(n), 'w') as f:
138 f.write(str(kp0.pid))
140 with open("tmp/keep{}.volume".format(n), 'w') as f:
143 def run_keep(blob_signing_key=None, enforce_permissions=False):
147 os.chdir(os.path.join(os.path.dirname(__file__), KEEP_SERVER_DIR))
148 if os.environ.get('GOPATH') == None:
149 os.environ["GOPATH"] = os.getcwd()
151 os.environ["GOPATH"] = os.getcwd() + ":" + os.environ["GOPATH"]
153 subprocess.call(["./go.sh", "install", "keep"])
155 if not os.path.exists("tmp"):
160 with open("tmp/keep.blob_signing_key", "w") as f:
161 f.write(blob_signing_key)
162 keep_args['--permission-key-file'] = 'tmp/keep.blob_signing_key'
163 if enforce_permissions:
164 keep_args['--enforce-permissions'] = 'true'
166 _start_keep(0, keep_args)
167 _start_keep(1, keep_args)
169 os.environ["ARVADOS_API_HOST"] = "127.0.0.1:3001"
170 os.environ["ARVADOS_API_HOST_INSECURE"] = "true"
172 authorize_with("admin")
173 api = arvados.api('v1', cache=False)
174 for d in api.keep_services().list().execute()['items']:
175 api.keep_services().delete(uuid=d['uuid']).execute()
176 for d in api.keep_disks().list().execute()['items']:
177 api.keep_disks().delete(uuid=d['uuid']).execute()
179 s1 = api.keep_services().create(body={"keep_service": {"service_host": "localhost", "service_port": 25107, "service_type": "disk"} }).execute()
180 s2 = api.keep_services().create(body={"keep_service": {"service_host": "localhost", "service_port": 25108, "service_type": "disk"} }).execute()
181 api.keep_disks().create(body={"keep_disk": {"keep_service_uuid": s1["uuid"] } }).execute()
182 api.keep_disks().create(body={"keep_disk": {"keep_service_uuid": s2["uuid"] } }).execute()
187 kill_server_pid("tmp/keep{}.pid".format(n), 0)
188 if os.path.exists("tmp/keep{}.volume".format(n)):
189 with open("tmp/keep{}.volume".format(n), 'r') as r:
190 shutil.rmtree(r.read(), True)
191 os.unlink("tmp/keep{}.volume".format(n))
192 if os.path.exists("tmp/keep.blob_signing_key"):
193 os.remove("tmp/keep.blob_signing_key")
197 os.chdir(os.path.join(os.path.dirname(__file__), KEEP_SERVER_DIR))
204 def run_keep_proxy(auth):
208 os.chdir(os.path.join(os.path.dirname(__file__), KEEP_SERVER_DIR))
209 if os.environ.get('GOPATH') == None:
210 os.environ["GOPATH"] = os.getcwd()
212 os.environ["GOPATH"] = os.getcwd() + ":" + os.environ["GOPATH"]
214 subprocess.call(["./go.sh", "install", "arvados.org/keepproxy"])
216 if not os.path.exists("tmp"):
219 os.environ["ARVADOS_API_HOST"] = "127.0.0.1:3001"
220 os.environ["ARVADOS_API_HOST_INSECURE"] = "true"
221 os.environ["ARVADOS_API_TOKEN"] = fixture("api_client_authorizations")[auth]["api_token"]
223 kp0 = subprocess.Popen(["bin/keepproxy", "-pid=tmp/keepproxy.pid", "-listen=:{}".format(25101)])
225 authorize_with("admin")
226 api = arvados.api('v1', cache=False)
227 api.keep_services().create(body={"keep_service": {"service_host": "localhost", "service_port": 25101, "service_type": "proxy"} }).execute()
229 arvados.config.settings()["ARVADOS_KEEP_PROXY"] = "http://localhost:25101"
233 def stop_keep_proxy():
235 os.chdir(os.path.join(os.path.dirname(__file__), KEEP_SERVER_DIR))
236 kill_server_pid("tmp/keepproxy.pid", 0)
240 '''load a fixture yaml file'''
241 with open(os.path.join(os.path.dirname(__file__), ARV_API_SERVER_DIR, "test", "fixtures",
243 return yaml.load(f.read())
245 def authorize_with(token):
246 '''token is the symbolic name of the token from the api_client_authorizations fixture'''
247 arvados.config.settings()["ARVADOS_API_TOKEN"] = fixture("api_client_authorizations")[token]["api_token"]
248 arvados.config.settings()["ARVADOS_API_HOST"] = os.environ.get("ARVADOS_API_HOST")
249 arvados.config.settings()["ARVADOS_API_HOST_INSECURE"] = "true"
251 if __name__ == "__main__":
252 parser = argparse.ArgumentParser()
253 parser.add_argument('action', type=str, help='''one of "start", "stop", "start_keep", "stop_keep"''')
254 parser.add_argument('--websockets', action='store_true', default=False)
255 parser.add_argument('--reuse', action='store_true', default=False)
256 parser.add_argument('--auth', type=str, help='Print authorization info for given api_client_authorizations fixture')
257 args = parser.parse_args()
259 if args.action == 'start':
260 run(websockets=args.websockets, reuse_server=args.reuse)
261 if args.auth != None:
262 authorize_with(args.auth)
263 print("export ARVADOS_API_HOST={}".format(arvados.config.settings()["ARVADOS_API_HOST"]))
264 print("export ARVADOS_API_TOKEN={}".format(arvados.config.settings()["ARVADOS_API_TOKEN"]))
265 print("export ARVADOS_API_HOST_INSECURE={}".format(arvados.config.settings()["ARVADOS_API_HOST_INSECURE"]))
266 elif args.action == 'stop':
268 elif args.action == 'start_keep':
270 elif args.action == 'stop_keep':
272 elif args.action == 'start_keep_proxy':
273 run_keep_proxy("admin")
274 elif args.action == 'stop_keep_proxy':
277 print('Unrecognized action "{}", actions are "start", "stop", "start_keep", "stop_keep"'.format(args.action))