예제 #1
0
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")
예제 #2
0
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'
예제 #3
0
    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'])
예제 #4
0
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)
예제 #5
0
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'
예제 #6
0
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