Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improve error handling in Lancium adapter #281

Merged
merged 2 commits into from
Feb 16, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 20 additions & 1 deletion tardis/adapters/sites/lancium.py
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -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
33 changes: 22 additions & 11 deletions tests/adapters_t/sites_t/test_lancium.py
Original file line number Diff line number Diff line change
@@ -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

Expand Down Expand Up @@ -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):
Expand All @@ -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):

Check warning

Code scanning / CodeQL

Unreachable code

This statement is unreachable.
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))