diff --git a/tardis/adapters/sites/lancium.py b/tardis/adapters/sites/lancium.py index e71e67ac..b48ecbdc 100644 --- a/tardis/adapters/sites/lancium.py +++ b/tardis/adapters/sites/lancium.py @@ -1,6 +1,11 @@ from aiolancium.client import Authenticator, LanciumClient +from simple_rest_client.exceptions import AuthError, ClientError -from ...exceptions.tardisexceptions import TardisError, TardisResourceStatusUpdateFailed +from ...exceptions.tardisexceptions import ( + TardisError, + TardisResourceStatusUpdateFailed, + TardisDroneCrashed, +) from ...interfaces.siteadapter import SiteAdapter, ResourceStatus from ...utilities.attributedict import AttributeDict, convert_to_attribute_dict from ...utilities.asynccachemap import AsyncCacheMap @@ -144,5 +149,19 @@ async def terminate_resource(self, resource_attributes: AttributeDict): def handle_exceptions(self): try: yield + except AuthError as ae: + # AuthError inherits ClientError but does not contain a response + # therefore handle AuthError separately before ClientError + raise TardisError from ae + except ClientError as ce: + status_code = ce.response.status_code + if status_code == 404: + # Drone does not exist anymore + raise TardisDroneCrashed from ce + elif status_code == 409: + # Current status of the drone does not allow the performed operation + # Let us wait until the next resource status update + raise TardisResourceStatusUpdateFailed from ce + raise TardisError from ce except Exception as ex: raise TardisError from ex diff --git a/tests/adapters_t/sites_t/test_lancium.py b/tests/adapters_t/sites_t/test_lancium.py index 16c199bd..afb913dd 100644 --- a/tests/adapters_t/sites_t/test_lancium.py +++ b/tests/adapters_t/sites_t/test_lancium.py @@ -1,12 +1,13 @@ from tardis.adapters.sites.lancium import LanciumAdapter from tardis.exceptions.tardisexceptions import ( + TardisDroneCrashed, TardisResourceStatusUpdateFailed, TardisError, ) from tardis.interfaces.siteadapter import ResourceStatus from tardis.utilities.attributedict import AttributeDict -from simple_rest_client.exceptions import AuthError +from simple_rest_client.exceptions import AuthError, ClientError from ...utilities.utilities import run_async, set_awaitable_return_value @@ -250,11 +251,12 @@ def run_it(job_id): id=int(job_id) ) - self.mocked_lancium_api.jobs.terminate_job.side_effect = AuthError( - "operation=auth_error", {} - ) - with self.assertRaises(AuthError): - run_it(123) + for exception in (AuthError, ClientError): + self.mocked_lancium_api.jobs.terminate_job.side_effect = exception( + "test", AttributeDict + ) + with self.assertRaises(exception): + run_it(123) def test_terminate_resource(self): def run_it(job_id): @@ -267,13 +269,22 @@ def run_it(job_id): run_it(job_id) self.mocked_lancium_api.jobs.delete_job.assert_called_with(id=int(job_id)) - self.mocked_lancium_api.jobs.delete_job.side_effect = AuthError( - "operation=auth_error", {} - ) - with self.assertRaises(AuthError): - run_it(123) + for exception in (AuthError, ClientError): + self.mocked_lancium_api.jobs.delete_job.side_effect = exception( + "test", AttributeDict() + ) + with self.assertRaises(exception): + run_it(123) def test_exception_handling(self): with self.assertRaises(TardisError): with self.adapter.handle_exceptions(): raise AuthError("test", "test") + + with self.assertRaises(TardisResourceStatusUpdateFailed): + with self.adapter.handle_exceptions(): + raise ClientError("error", AttributeDict(status_code=409)) + + with self.assertRaises(TardisDroneCrashed): + with self.adapter.handle_exceptions(): + raise ClientError("error", AttributeDict(status_code=404))