Skip to content

Commit f8c6567

Browse files
imporve error handling
1 parent 2a0b64f commit f8c6567

File tree

6 files changed

+61
-18
lines changed

6 files changed

+61
-18
lines changed
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
from common_library.errors_classes import OsparcErrorMixin
2+
3+
4+
class LicensesBaseError(OsparcErrorMixin, Exception):
5+
...
6+
7+
8+
class NotEnoughAvailableSeatsError(LicensesBaseError):
9+
msg_template = "Not enough available seats. Current available seats {available_num_of_seats} for license item {license_item_id}"
10+
11+
12+
class CanNotCheckoutNotEnoughAvailableSeatsError(LicensesBaseError):
13+
msg_template = "Can not checkout license item {licensed_item_id} with num of seats {num_of_seats}. Currently available seats {available_num_of_seats}"
14+
15+
16+
class CanNotCheckoutServiceIsNotRunningError(LicensesBaseError):
17+
msg_template = "Can not checkout license item {licensed_item_id} as dynamic service is not running. Current service {service_run}"
18+
19+
20+
class LicensedItemCheckoutNotFoundError(LicensesBaseError):
21+
msg_template = "Licensed item checkout {licensed_item_checkout_id} not found."
22+
23+
24+
LICENSES_ERRORS = (
25+
NotEnoughAvailableSeatsError,
26+
CanNotCheckoutNotEnoughAvailableSeatsError,
27+
CanNotCheckoutServiceIsNotRunningError,
28+
LicensedItemCheckoutNotFoundError,
29+
)

services/resource-usage-tracker/src/simcore_service_resource_usage_tracker/api/rpc/_licensed_items_checkouts.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,16 @@
1313
from models_library.users import UserID
1414
from models_library.wallets import WalletID
1515
from servicelib.rabbitmq import RPCRouter
16+
from servicelib.rabbitmq.rpc_interfaces.resource_usage_tracker.errors import (
17+
LICENSES_ERRORS,
18+
)
1619

1720
from ...services import licensed_items_checkouts
1821

1922
router = RPCRouter()
2023

2124

22-
@router.expose(reraise_if_error_type=())
25+
@router.expose(reraise_if_error_type=LICENSES_ERRORS)
2326
async def get_licensed_item_checkout(
2427
app: FastAPI,
2528
*,
@@ -33,7 +36,7 @@ async def get_licensed_item_checkout(
3336
)
3437

3538

36-
@router.expose(reraise_if_error_type=())
39+
@router.expose(reraise_if_error_type=LICENSES_ERRORS)
3740
async def get_licensed_items_checkouts_page(
3841
app: FastAPI,
3942
*,
@@ -53,7 +56,7 @@ async def get_licensed_items_checkouts_page(
5356
)
5457

5558

56-
@router.expose(reraise_if_error_type=())
59+
@router.expose(reraise_if_error_type=LICENSES_ERRORS)
5760
async def checkout_licensed_item(
5861
app: FastAPI,
5962
*,
@@ -77,7 +80,7 @@ async def checkout_licensed_item(
7780
)
7881

7982

80-
@router.expose(reraise_if_error_type=())
83+
@router.expose(reraise_if_error_type=LICENSES_ERRORS)
8184
async def release_licensed_item(
8285
app: FastAPI,
8386
*,

services/resource-usage-tracker/src/simcore_service_resource_usage_tracker/exceptions/errors.py

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,4 @@
11
from common_library.errors_classes import OsparcErrorMixin
2-
from models_library.resource_tracker_licensed_items_checkouts import (
3-
LicensedItemCheckoutID,
4-
)
52
from models_library.resource_tracker_licensed_items_purchases import (
63
LicensedItemPurchaseID,
74
)
@@ -78,7 +75,3 @@ class PricingPlanNotFoundForServiceError(RutNotFoundError):
7875

7976
class LicensedItemPurchaseNotFoundError(RutNotFoundError):
8077
licensed_item_purchase_id: LicensedItemPurchaseID
81-
82-
83-
class LicensedItemCheckoutNotFoundError(RutNotFoundError):
84-
licensed_item_checkout_id: LicensedItemCheckoutID

services/resource-usage-tracker/src/simcore_service_resource_usage_tracker/services/licensed_items_checkouts.py

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,11 @@
1515
from models_library.rest_ordering import OrderBy
1616
from models_library.users import UserID
1717
from models_library.wallets import WalletID
18+
from servicelib.rabbitmq.rpc_interfaces.resource_usage_tracker.errors import (
19+
CanNotCheckoutNotEnoughAvailableSeatsError,
20+
CanNotCheckoutServiceIsNotRunningError,
21+
NotEnoughAvailableSeatsError,
22+
)
1823
from sqlalchemy.ext.asyncio import AsyncEngine
1924

2025
from ..api.rest.dependencies import get_resource_tracker_db_engine
@@ -122,10 +127,16 @@ async def checkout_licensed_item(
122127

123128
available_seats = _active_purchased_seats - _currently_used_seats
124129
if available_seats <= 0:
125-
raise ValueError("Not enough available seats")
130+
raise NotEnoughAvailableSeatsError(
131+
license_item_id=licensed_item_id, available_num_of_seats=available_seats
132+
)
126133

127134
if available_seats - num_of_seats < 0:
128-
raise ValueError("Can not checkout num of seats, not enough available")
135+
raise CanNotCheckoutNotEnoughAvailableSeatsError(
136+
license_item_id=licensed_item_id,
137+
available_num_of_seats=available_seats,
138+
num_of_seats=num_of_seats,
139+
)
129140

130141
# Check if the service run ID is currently running
131142
service_run = await service_runs_db.get_service_run_by_id(
@@ -135,7 +146,9 @@ async def checkout_licensed_item(
135146
service_run is None
136147
or service_run.service_run_status != ServiceRunStatus.RUNNING
137148
):
138-
raise ValueError("This should not happen")
149+
raise CanNotCheckoutServiceIsNotRunningError(
150+
license_item_id=licensed_item_id, service_run=service_run
151+
)
139152

140153
_create_item_checkout = CreateLicensedItemCheckoutDB(
141154
licensed_item_id=licensed_item_id,

services/resource-usage-tracker/src/simcore_service_resource_usage_tracker/services/modules/db/licensed_items_checkouts_db.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@
77
from models_library.rest_ordering import OrderBy, OrderDirection
88
from models_library.wallets import WalletID
99
from pydantic import NonNegativeInt
10+
from servicelib.rabbitmq.rpc_interfaces.resource_usage_tracker.errors import (
11+
LicensedItemCheckoutNotFoundError,
12+
)
1013
from simcore_postgres_database.models.resource_tracker_licensed_items_checkouts import (
1114
resource_tracker_licensed_items_checkouts,
1215
)
@@ -19,7 +22,6 @@
1922
)
2023
from sqlalchemy.ext.asyncio import AsyncConnection, AsyncEngine
2124

22-
from ....exceptions.errors import LicensedItemCheckoutNotFoundError
2325
from ....models.licensed_items_checkouts import (
2426
CreateLicensedItemCheckoutDB,
2527
LicensedItemCheckoutDB,

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

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,17 @@
1515
from models_library.users import UserID
1616
from models_library.wallets import WalletID
1717
from servicelib.rabbitmq import RPCRouter
18+
from servicelib.rabbitmq.rpc_interfaces.resource_usage_tracker.errors import (
19+
LICENSES_ERRORS,
20+
)
1821

1922
from ..rabbitmq import get_rabbitmq_rpc_server
2023
from . import _licensed_checkouts_api, _licensed_items_api
2124

2225
router = RPCRouter()
2326

2427

25-
@router.expose()
28+
@router.expose(reraise_if_error_type=LICENSES_ERRORS)
2629
async def get_licensed_items(
2730
app: web.Application,
2831
*,
@@ -55,7 +58,7 @@ async def get_purchased_licensed_items_for_wallet(
5558
raise NotImplementedError
5659

5760

58-
@router.expose(reraise_if_error_type=(NotImplementedError,))
61+
@router.expose(reraise_if_error_type=LICENSES_ERRORS)
5962
async def checkout_licensed_item_for_wallet(
6063
app: web.Application,
6164
*,
@@ -77,7 +80,7 @@ async def checkout_licensed_item_for_wallet(
7780
)
7881

7982

80-
@router.expose(reraise_if_error_type=(NotImplementedError,))
83+
@router.expose(reraise_if_error_type=LICENSES_ERRORS)
8184
async def release_licensed_item_for_wallet(
8285
app: web.Application,
8386
*,

0 commit comments

Comments
 (0)