def test_get_refresh_token_failure(session: Session): session.access_token_expiration = datetime.utcnow() - timedelta(minutes=1) with requests_mock.Mocker() as m: m.post('http://citrine-testing.fake/api/v1/tokens/refresh', status_code=401) with pytest.raises(UnauthorizedRefreshToken): session.get_resource('/foo')
def test_get_refreshes_token(session: Session): session.access_token_expiration = datetime.utcnow() - timedelta(minutes=1) token_refresh_response = refresh_token(datetime(2019, 3, 14, tzinfo=pytz.utc)) with requests_mock.Mocker() as m: m.post('http://citrine-testing.fake/api/v1/tokens/refresh', json=token_refresh_response) m.get('http://citrine-testing.fake/api/v1/foo', json={'foo': 'bar'}) resp = session.get_resource('/foo') assert {'foo': 'bar'} == resp assert datetime(2019, 3, 14) == session.access_token_expiration
def _poll_for_job_completion(session: Session, project_id: Union[UUID, str], job: Union[JobSubmissionResponse, UUID, str], *, timeout: float = 2 * 60, polling_delay: float = 2.0) -> JobStatusResponse: """ Polls for job completion given a timeout, failing with an exception on job failure. This polls for job completion given the Job ID, failing appropriately if the job result was not successful. Parameters ---------- job The job submission object or job ID that was given from a job submission. timeout Amount of time to wait on the job (in seconds) before giving up. Defaults to 2 minutes. Note that this number has no effect on the underlying job itself, which can also time out server-side. polling_delay: How long to delay between each polling retry attempt. Returns ------- JobStatusResponse The job response information that can be used to extract relevant information from the completed job. """ if isinstance(job, JobSubmissionResponse): job_id = job.job_id else: job_id = job # pragma: no cover path = 'projects/{}/execution/job-status'.format(project_id) params = {'job_id': job_id} start_time = time() while True: response = session.get_resource(path=path, params=params) status: JobStatusResponse = JobStatusResponse.build(response) if status.status in ['Success', 'Failure']: break elif time() - start_time < timeout: logger.info( 'Job still in progress, polling status again in {:.2f} seconds.' .format(polling_delay)) sleep(polling_delay) else: logger.error( 'Job exceeded user timeout of {} seconds.'.format(timeout)) logger.debug('Last status: {}'.format(status.dump())) raise PollingTimeoutError('Job {} timed out.'.format(job_id)) if status.status == 'Failure': logger.debug('Job terminated with Failure status: {}'.format( status.dump())) failure_reasons = [] for task in status.tasks: if task.status == 'Failure': logger.error('Task {} failed with reason "{}"'.format( task.id, task.failure_reason)) failure_reasons.append(task.failure_reason) raise JobFailureError( message='Job {} terminated with Failure status. Failure reasons: {}' .format(job_id, failure_reasons), job_id=job_id, failure_reasons=failure_reasons) return status
def test_get_not_found(session: Session): with requests_mock.Mocker() as m: m.get('http://citrine-testing.fake/api/v1/foo', status_code=404) with pytest.raises(NotFound): session.get_resource('/foo')
def test_get_no_refresh(session: Session): with requests_mock.Mocker() as m: m.get('http://citrine-testing.fake/api/v1/foo', json={'foo': 'bar'}) resp = session.get_resource('/foo') assert {'foo': 'bar'} == resp