Skip to content

Commit 9ede5af

Browse files
committed
add error handling to checkout endpoint
1 parent e21c8aa commit 9ede5af

File tree

4 files changed

+58
-1
lines changed

4 files changed

+58
-1
lines changed

services/api-server/src/simcore_service_api_server/exceptions/backend_errors.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,3 +105,18 @@ class PricingPlanNotFoundError(BaseBackEndError):
105105
class ProjectAlreadyStartedError(BaseBackEndError):
106106
msg_template = "Project already started"
107107
status_code = status.HTTP_200_OK
108+
109+
110+
class InsufficientNumberOfSeatsError(BaseBackEndError):
111+
msg_template = "Not enough available seats. Current available seats {num_of_seats} for license item {licensed_item_id}"
112+
status_code = status.HTTP_409_CONFLICT
113+
114+
115+
class CanNotCheckoutServiceIsNotRunningError(BaseBackEndError):
116+
msg_template = "Can not checkout license item {licensed_item_id} as dynamic service is not running. Current service id: {service_run_id}"
117+
status_code = status.HTTP_422_UNPROCESSABLE_ENTITY
118+
119+
120+
class LicensedItemCheckoutNotFoundError(BaseBackEndError):
121+
msg_template = "Licensed item checkout {licensed_item_checkout_id} not found."
122+
status_code = status.HTTP_404_NOT_FOUND

services/api-server/src/simcore_service_api_server/services_rpc/wb_api_server.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,15 @@
1313
from models_library.users import UserID
1414
from models_library.wallets import WalletID
1515
from servicelib.rabbitmq._client_rpc import RabbitMQRPCClient
16+
from servicelib.rabbitmq.rpc_interfaces.resource_usage_tracker.errors import (
17+
CanNotCheckoutNotEnoughAvailableSeatsError,
18+
)
19+
from servicelib.rabbitmq.rpc_interfaces.resource_usage_tracker.errors import (
20+
CanNotCheckoutServiceIsNotRunningError as _CanNotCheckoutServiceIsNotRunningError,
21+
)
22+
from servicelib.rabbitmq.rpc_interfaces.resource_usage_tracker.errors import (
23+
NotEnoughAvailableSeatsError,
24+
)
1625
from servicelib.rabbitmq.rpc_interfaces.webserver.licenses.licensed_items import (
1726
checkout_licensed_item_for_wallet as _checkout_licensed_item_for_wallet,
1827
)
@@ -26,6 +35,10 @@
2635
release_licensed_item_for_wallet as _release_licensed_item_for_wallet,
2736
)
2837

38+
from ..exceptions.backend_errors import (
39+
CanNotCheckoutServiceIsNotRunningError,
40+
InsufficientNumberOfSeatsError,
41+
)
2942
from ..exceptions.service_errors_utils import service_exception_mapper
3043
from ..models.pagination import PaginationParams
3144
from ..models.schemas.model_adapter import LicensedItemCheckoutGet, LicensedItemGet
@@ -94,6 +107,13 @@ async def get_available_licensed_items_for_wallet(
94107
licensed_items_page=licensed_items_page, page_params=page_params
95108
)
96109

110+
@_exception_mapper(
111+
rpc_exception_map={
112+
NotEnoughAvailableSeatsError: InsufficientNumberOfSeatsError,
113+
CanNotCheckoutNotEnoughAvailableSeatsError: InsufficientNumberOfSeatsError,
114+
_CanNotCheckoutServiceIsNotRunningError: CanNotCheckoutServiceIsNotRunningError,
115+
}
116+
)
97117
async def checkout_licensed_item_for_wallet(
98118
self,
99119
*,

services/api-server/tests/unit/test_licensed_items.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,11 @@
2626
from pytest_mock import MockerFixture
2727
from servicelib.rabbitmq._client_rpc import RabbitMQRPCClient
2828
from servicelib.rabbitmq._errors import RemoteMethodNotRegisteredError
29+
from servicelib.rabbitmq.rpc_interfaces.resource_usage_tracker.errors import (
30+
CanNotCheckoutNotEnoughAvailableSeatsError,
31+
CanNotCheckoutServiceIsNotRunningError,
32+
NotEnoughAvailableSeatsError,
33+
)
2934
from simcore_service_api_server._meta import API_VTAG
3035
from simcore_service_api_server.api.dependencies.webserver_rpc import (
3136
get_wb_api_rpc_client,
@@ -159,6 +164,12 @@ async def side_effect(
159164
"exception_to_raise,expected_api_server_status_code",
160165
[
161166
(None, status.HTTP_200_OK),
167+
(NotEnoughAvailableSeatsError(), status.HTTP_409_CONFLICT),
168+
(CanNotCheckoutNotEnoughAvailableSeatsError(), status.HTTP_409_CONFLICT),
169+
(
170+
CanNotCheckoutServiceIsNotRunningError(),
171+
status.HTTP_422_UNPROCESSABLE_ENTITY,
172+
),
162173
],
163174
)
164175
async def test_get_licensed_items_checkout(

services/web/server/src/simcore_service_webserver/licenses/_rpc.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,11 @@
1717
from servicelib.rabbitmq import RPCRouter
1818
from servicelib.rabbitmq.rpc_interfaces.resource_usage_tracker.errors import (
1919
LICENSES_ERRORS,
20+
CanNotCheckoutNotEnoughAvailableSeatsError,
21+
NotEnoughAvailableSeatsError,
22+
)
23+
from simcore_service_api_server.exceptions.backend_errors import (
24+
CanNotCheckoutServiceIsNotRunningError,
2025
)
2126

2227
from ..rabbitmq import get_rabbitmq_rpc_server
@@ -58,7 +63,13 @@ async def get_available_licensed_items_for_wallet(
5863
raise NotImplementedError
5964

6065

61-
@router.expose(reraise_if_error_type=LICENSES_ERRORS)
66+
@router.expose(
67+
reraise_if_error_type=(
68+
NotEnoughAvailableSeatsError,
69+
CanNotCheckoutNotEnoughAvailableSeatsError,
70+
CanNotCheckoutServiceIsNotRunningError,
71+
)
72+
)
6273
async def checkout_licensed_item_for_wallet(
6374
app: web.Application,
6475
*,

0 commit comments

Comments
 (0)