def get(service_id: str) -> Algorithm: log = logging.getLogger(__name__) log.info('Algorithms service get algorithms', action=' service algorithms get') try: log.info('Fetch beachfront service `%s` from Piazza', service_id, action='fetch service', actee=service_id) service = piazza.get_service(service_id) except piazza.ServerError as err: log.error('Service lookup failed: %s', err) if err.status_code == 404: raise NotFound(service_id) raise except piazza.Error as err: log.error('Service lookup failed: %s', err) raise if 'metadata' not in service.metadata: raise ValidationError('missing `metadata` hash') try: return Algorithm( interface=_extract_interface(service), description=_extract_description(service), max_cloud_cover=_extract_max_cloud_cover(service), name=_extract_name(service), service_id=service.service_id, version=_extract_version(service), ) except ValidationError as err: log.error('Algorithm conversion failed: %s', err) raise
def test_deserializes_metadata(self, m: Mocker): m.get('/service/test-id', text=RESPONSE_SERVICE) descriptor = piazza.get_service(service_id='test-id') self.assertEqual( { 'classType': { 'classification': 'UNCLASSIFIED' }, 'version': 'test-version' }, descriptor.metadata)
def test_throws_when_descriptors_are_malformed(self, m: Mocker): mangled_response = json.loads(RESPONSE_SERVICE) mangled_response['data'].pop('serviceId') m.get('/service/test-id', json=mangled_response) with self.assertRaises(piazza.InvalidResponse): piazza.get_service(service_id='test-id')
def test_throws_when_name_is_missing(self, m: Mocker): mangled_response = json.loads(RESPONSE_SERVICE) mangled_response['data']['resourceMetadata'].pop('name') m.get('/service/test-id', json=mangled_response) with self.assertRaises(piazza.InvalidResponse): piazza.get_service(service_id='test-id')
def test_throws_when_service_does_not_exist(self, m: Mocker): m.get('/service/test-id', text=RESPONSE_SERVICE_NOT_FOUND, status_code=404) with self.assertRaises(piazza.ServerError): piazza.get_service(service_id='test-id')
def test_throws_when_piazza_is_unreachable(self, _): with unittest.mock.patch('requests.get') as stub: stub.side_effect = ConnectionError(request=unittest.mock.Mock()) with self.assertRaises(piazza.Unreachable): piazza.get_service(service_id='test-id')
def test_handles_http_errors_gracefully(self, m: Mocker): m.get('/service/test-id', text=RESPONSE_ERROR_GENERIC, status_code=500) with self.assertRaises(piazza.ServerError): piazza.get_service(service_id='test-id')
def test_deserializes_canonical_data(self, m: Mocker): m.get('/service/test-id', text=RESPONSE_SERVICE) descriptor = piazza.get_service(service_id='test-id') self.assertEqual('test-id', descriptor.service_id) self.assertEqual('test-description', descriptor.description) self.assertEqual('test-name', descriptor.name)
def test_returns_a_service_descriptor(self, m: Mocker): m.get('/service/test-id', text=RESPONSE_SERVICE) descriptor = piazza.get_service(service_id='test-id') self.assertIsInstance(descriptor, piazza.ServiceDescriptor)
def test_calls_correct_url(self, m: Mocker): m.get('/service/test-id', text=RESPONSE_SERVICE) piazza.get_service(service_id='test-id') self.assertEqual( 'https://test-piazza-host.localdomain/service/test-id', m.request_history[0].url)