Skip to content

Commit ccdeff2

Browse files
🎨 improve error handling on pricing plans (#6436)
1 parent b6532c1 commit ccdeff2

File tree

6 files changed

+33
-5
lines changed

6 files changed

+33
-5
lines changed

services/web/server/src/simcore_service_webserver/catalog/_handlers.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -370,6 +370,7 @@ async def get_service_resources(request: Request):
370370
)
371371
@login_required
372372
@permission_required("services.catalog.*")
373+
@_handlers_errors.reraise_catalog_exceptions_as_http_errors
373374
async def get_service_pricing_plan(request: Request):
374375
ctx = CatalogRequestContext.create(request)
375376
path_params = parse_request_path_parameters_as(ServicePathParams, request)

services/web/server/src/simcore_service_webserver/catalog/_handlers_errors.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from aiohttp import web
44
from servicelib.aiohttp.typing_extension import Handler
55

6+
from ..resource_usage.errors import DefaultPricingPlanNotFoundError
67
from .exceptions import (
78
CatalogForbiddenError,
89
CatalogItemNotFoundError,
@@ -19,6 +20,7 @@ async def _wrapper(request: web.Request) -> web.StreamResponse:
1920

2021
except (
2122
CatalogItemNotFoundError,
23+
DefaultPricingPlanNotFoundError,
2224
DefaultPricingUnitForServiceNotFoundError,
2325
) as exc:
2426
raise web.HTTPNotFound(reason=f"{exc}") from exc

services/web/server/src/simcore_service_webserver/projects/_nodes_handlers.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@
6868
from ..groups.exceptions import GroupNotFoundError
6969
from ..login.decorators import login_required
7070
from ..projects.api import has_user_project_access_rights
71+
from ..resource_usage.errors import DefaultPricingPlanNotFoundError
7172
from ..security.decorators import permission_required
7273
from ..users.api import get_user_id_from_gid, get_user_role
7374
from ..users.exceptions import UserDefaultWalletNotFoundError
@@ -101,6 +102,7 @@ async def wrapper(request: web.Request) -> web.StreamResponse:
101102
ProjectNotFoundError,
102103
NodeNotFoundError,
103104
UserDefaultWalletNotFoundError,
105+
DefaultPricingPlanNotFoundError,
104106
DefaultPricingUnitNotFoundError,
105107
GroupNotFoundError,
106108
CatalogItemNotFoundError,

services/web/server/src/simcore_service_webserver/projects/_states_handlers.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
from ..login.decorators import login_required
3030
from ..notifications import project_logs
3131
from ..products.api import Product, get_current_product
32+
from ..resource_usage.errors import DefaultPricingPlanNotFoundError
3233
from ..security.decorators import permission_required
3334
from ..users import api
3435
from ..users.exceptions import UserDefaultWalletNotFoundError
@@ -37,6 +38,7 @@
3738
from . import projects_api
3839
from ._common_models import ProjectPathParams, RequestContext
3940
from .exceptions import (
41+
DefaultPricingUnitNotFoundError,
4042
ProjectInvalidRightsError,
4143
ProjectNotFoundError,
4244
ProjectStartsTooManyDynamicNodesError,
@@ -57,7 +59,12 @@ async def _wrapper(request: web.Request) -> web.StreamResponse:
5759
try:
5860
return await handler(request)
5961

60-
except (ProjectNotFoundError, UserDefaultWalletNotFoundError) as exc:
62+
except (
63+
ProjectNotFoundError,
64+
UserDefaultWalletNotFoundError,
65+
DefaultPricingPlanNotFoundError,
66+
DefaultPricingUnitNotFoundError,
67+
) as exc:
6168
raise web.HTTPNotFound(reason=f"{exc}") from exc
6269

6370
except ProjectInvalidRightsError as exc:

services/web/server/src/simcore_service_webserver/resource_usage/_client.py

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,13 @@
2323
from models_library.users import UserID
2424
from models_library.wallets import WalletID
2525
from pydantic import NonNegativeInt, parse_obj_as
26+
from servicelib.aiohttp import status
2627
from servicelib.aiohttp.client_session import get_client_session
2728
from settings_library.resource_usage_tracker import ResourceUsageTrackerSettings
2829
from yarl import URL
2930

3031
from ._utils import handle_client_exceptions
32+
from .errors import DefaultPricingPlanNotFoundError
3133
from .settings import get_plugin_settings
3234

3335
_logger = logging.getLogger(__name__)
@@ -95,10 +97,15 @@ async def get_default_service_pricing_plan(
9597
}
9698
)
9799
with handle_client_exceptions(app) as session:
98-
async with session.get(url) as response:
99-
response.raise_for_status()
100-
body: dict = await response.json()
101-
return parse_obj_as(PricingPlanGet, body)
100+
try:
101+
async with session.get(url) as response:
102+
response.raise_for_status()
103+
body: dict = await response.json()
104+
return parse_obj_as(PricingPlanGet, body)
105+
except ClientResponseError as e:
106+
if e.status == status.HTTP_404_NOT_FOUND:
107+
raise DefaultPricingPlanNotFoundError from e
108+
raise
102109

103110

104111
async def get_pricing_plan_unit(
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
from ..errors import WebServerBaseError
2+
3+
4+
class ResourceUsageValueError(WebServerBaseError, ValueError):
5+
...
6+
7+
8+
class DefaultPricingPlanNotFoundError(ResourceUsageValueError):
9+
msg_template = "Default pricing plan not found"

0 commit comments

Comments
 (0)