Skip to content

Commit 50d9609

Browse files
improve error handling
1 parent 65ffdd9 commit 50d9609

File tree

6 files changed

+34
-6
lines changed

6 files changed

+34
-6
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
@@ -67,6 +67,7 @@
6767
from ..groups.exceptions import GroupNotFoundError
6868
from ..login.decorators import login_required
6969
from ..projects.api import has_user_project_access_rights
70+
from ..resource_usage.errors import DefaultPricingPlanNotFoundError
7071
from ..security.decorators import permission_required
7172
from ..users.api import get_user_id_from_gid, get_user_role
7273
from ..users.exceptions import UserDefaultWalletNotFoundError
@@ -100,6 +101,7 @@ async def wrapper(request: web.Request) -> web.StreamResponse:
100101
ProjectNotFoundError,
101102
NodeNotFoundError,
102103
UserDefaultWalletNotFoundError,
104+
DefaultPricingPlanNotFoundError,
103105
DefaultPricingUnitNotFoundError,
104106
GroupNotFoundError,
105107
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: 12 additions & 5 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__)
@@ -87,18 +89,23 @@ async def get_default_service_pricing_plan(
8789
) -> PricingPlanGet:
8890
settings: ResourceUsageTrackerSettings = get_plugin_settings(app)
8991
url = URL(
90-
f"{settings.api_base_url}/services/{urllib.parse.quote_plus(service_key)}/{service_version}/pricing-plan",
92+
f"{settings.api_base_url}/services/{urllib.parse.quote_plus(service_key)}/{service_version}/pricing-plan", # <- here is the issue
9193
encoded=True,
9294
).with_query(
9395
{
9496
"product_name": product_name,
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)