def results(project, apikey, run, watch, server, output): """ Check to see if results are available for a particular mapping and if so download. Authentication is carried out using the --apikey option which must be provided. Depending on the server operating mode this may return a mask, a linkage table, or a permutation. Consult the entity service documentation for details. """ status = run_get_status(server, project, run, apikey) log(format_run_status(status)) if watch: for status in watch_run_status(server, project, run, apikey, 24 * 60 * 60): log(format_run_status(status)) if status['state'] == 'completed': log("Downloading result") response = run_get_result_text(server, project, run, apikey) log("Received result") print(response, file=output) elif status['state'] == 'error': log("There was an error") error_result = run_get_result_text(server, project, run, apikey) print(error_result, file=output) else: log("No result yet")
def test_watch_run_time_out(requests_mock): requests_mock.get('http://testing-es-url/api/v1/projects/pid/runs/rid/status', json={'state': 'running'}, status_code=200) with pytest.raises(TimeoutError): for update in rest_client.watch_run_status('http://testing-es-url', 'pid', 'rid', 'apikey', timeout=0.5, update_period=0.01): assert update['state'] == 'running' assert requests_mock.last_request.headers['Authorization'] == 'apikey'
def test_project_run(self): p = self._create_project() p_id = p['project_id'] upload_response_1 = rest_client.project_upload_clks( self.url, p_id, p['update_tokens'][0], self.clk_data_1) upload_response_2 = rest_client.project_upload_clks( self.url, p_id, p['update_tokens'][1], self.clk_data_2) run_response = rest_client.run_create(self.url, p_id, p['result_token'], 0.999, name='clkhash rest client test') assert 'run_id' in run_response r_id = run_response['run_id'] with pytest.raises(ServiceError): rest_client.run_get_status(self.url, p_id, 'invalid-run-id', p['result_token']) with pytest.raises(ServiceError): rest_client.run_get_status(self.url, p_id, r_id, 'invalid-token') status1 = rest_client.run_get_status(self.url, p_id, r_id, p['result_token']) assert 'state' in status1 assert 'stages' in status1 print(rest_client.format_run_status(status1)) # Check we can watch the run progress this will raise if not # completed in 10 seconds for status_update in rest_client.watch_run_status( self.url, p_id, r_id, p['result_token'], 10, 0.5): print(rest_client.format_run_status(status_update)) # Check that we can still "wait" on a completed run and get a valid # status status2 = rest_client.wait_for_run(self.url, p_id, r_id, p['result_token'], 10) assert status2['state'] == 'completed' coord_result_raw = rest_client.run_get_result_text( self.url, p_id, r_id, p['result_token']) coord_result = json.loads(coord_result_raw) assert 'mask' in coord_result assert len(coord_result['mask']) == 1000 assert coord_result['mask'].count(1) > 10 result_a = json.loads( rest_client.run_get_result_text( self.url, p_id, r_id, upload_response_1['receipt_token'])) result_b = json.loads( rest_client.run_get_result_text( self.url, p_id, r_id, upload_response_2['receipt_token'])) assert 'permutation' in result_a assert 'rows' in result_a assert 1000 == result_b['rows'] == result_a['rows'] rest_client.run_delete(self.url, p_id, r_id, p['result_token']) rest_client.project_delete(self.url, p_id, p['result_token'])
def test_watch_run_server_error(requests_mock): requests_mock.register_uri( 'GET', 'http://testing-es-url/api/v1/projects/pid/runs/rid/status', [ {'json': {'state': 'running', 'current_stage': {'number': 1, 'description': 'A', 'progress': {'relative': 0.4}}, 'stages': 2}, 'status_code': 200}, {'json': {'state': 'running', 'current_stage': {'number': 1, 'description': 'A', 'progress': {'relative': 0.8}}, 'stages': 2}, 'status_code': 200}, {'text': 'SERVER ERROR', 'status_code': 500}, ] ) with pytest.raises(ServiceError, match=r'.*SERVER ERROR') as exec_info: for update in rest_client.watch_run_status('http://testing-es-url', 'pid', 'rid', 'apikey', timeout=None, update_period=0.01): assert update['state'] == 'running' assert 'A' in str(rest_client.format_run_status(update)) assert "SERVER ERROR" in str(exec_info.value)
def test_watch_run_rate_limited(requests_mock): requests_mock.register_uri( 'GET', 'http://testing-es-url/api/v1/projects/pid/runs/rid/status', [{ 'json': { 'state': 'running' }, 'status_code': 200 }, { 'json': { 'state': 'running', 'progress': {} }, 'status_code': 200 }, { 'text': '', 'status_code': 503 }, { 'text': '', 'status_code': 503 }, { 'json': { 'state': 'running' }, 'status_code': 200 }, { 'json': { 'state': 'completed' }, 'status_code': 200 }]) for update in rest_client.watch_run_status('http://testing-es-url', 'pid', 'rid', 'apikey', timeout=None, update_period=0.01): assert update['state'] in {'running', 'completed'} assert update['state'] == 'completed' assert requests_mock.last_request.headers['Authorization'] == 'apikey'
def test_watch_run_no_repeated_updates(requests_mock): requests_mock.register_uri( 'GET', 'http://testing-es-url/api/v1/projects/pid/runs/rid/status', [ {'json': {'state': 'running', 'current_stage': {'number': 1, 'description': 'A', 'progress': {'relative': 0.4}}, 'stages': 2}, 'status_code': 200}, {'json': {'state': 'running', 'current_stage': {'number': 1, 'description': 'A', 'progress': {'relative': 0.4}}, 'stages': 2}, 'status_code': 200}, {'json': {'state': 'running', 'current_stage': {'number': 1, 'description': 'A', 'progress': {'relative': 0.4}}, 'stages': 2}, 'status_code': 200}, {'json': {'state': 'running', 'current_stage': {'number': 1, 'description': 'A', 'progress': {'relative': 0.8}}, 'stages': 2}, 'status_code': 200}, {'json': {'state': 'completed', 'stages': 2}, 'status_code': 200}, ] ) number_updates = 0 for update in rest_client.watch_run_status('http://testing-es-url', 'pid', 'rid', 'apikey', timeout=None, update_period=0.01): assert update['state'] in {'running', 'completed'} number_updates += 1 assert update['state'] == 'completed' assert 3 == number_updates