diff --git a/services/web/server/src/simcore_service_webserver/catalog/_handlers.py b/services/web/server/src/simcore_service_webserver/catalog/_handlers.py index cfaafe30ab62..02e21f37e298 100644 --- a/services/web/server/src/simcore_service_webserver/catalog/_handlers.py +++ b/services/web/server/src/simcore_service_webserver/catalog/_handlers.py @@ -370,6 +370,7 @@ async def get_service_resources(request: Request): ) @login_required @permission_required("services.catalog.*") +@_handlers_errors.reraise_catalog_exceptions_as_http_errors async def get_service_pricing_plan(request: Request): ctx = CatalogRequestContext.create(request) path_params = parse_request_path_parameters_as(ServicePathParams, request) diff --git a/services/web/server/src/simcore_service_webserver/catalog/_handlers_errors.py b/services/web/server/src/simcore_service_webserver/catalog/_handlers_errors.py index 53f64c98b0cf..4a278cc95dc2 100644 --- a/services/web/server/src/simcore_service_webserver/catalog/_handlers_errors.py +++ b/services/web/server/src/simcore_service_webserver/catalog/_handlers_errors.py @@ -3,6 +3,7 @@ from aiohttp import web from servicelib.aiohttp.typing_extension import Handler +from ..resource_usage.errors import DefaultPricingPlanNotFoundError from .exceptions import ( CatalogForbiddenError, CatalogItemNotFoundError, @@ -19,6 +20,7 @@ async def _wrapper(request: web.Request) -> web.StreamResponse: except ( CatalogItemNotFoundError, + DefaultPricingPlanNotFoundError, DefaultPricingUnitForServiceNotFoundError, ) as exc: raise web.HTTPNotFound(reason=f"{exc}") from exc diff --git a/services/web/server/src/simcore_service_webserver/projects/_nodes_handlers.py b/services/web/server/src/simcore_service_webserver/projects/_nodes_handlers.py index c7b1ad4629ab..0302c8f7e32e 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_nodes_handlers.py +++ b/services/web/server/src/simcore_service_webserver/projects/_nodes_handlers.py @@ -68,6 +68,7 @@ from ..groups.exceptions import GroupNotFoundError from ..login.decorators import login_required from ..projects.api import has_user_project_access_rights +from ..resource_usage.errors import DefaultPricingPlanNotFoundError from ..security.decorators import permission_required from ..users.api import get_user_id_from_gid, get_user_role from ..users.exceptions import UserDefaultWalletNotFoundError @@ -101,6 +102,7 @@ async def wrapper(request: web.Request) -> web.StreamResponse: ProjectNotFoundError, NodeNotFoundError, UserDefaultWalletNotFoundError, + DefaultPricingPlanNotFoundError, DefaultPricingUnitNotFoundError, GroupNotFoundError, CatalogItemNotFoundError, diff --git a/services/web/server/src/simcore_service_webserver/projects/_states_handlers.py b/services/web/server/src/simcore_service_webserver/projects/_states_handlers.py index cc0e5b7ef57c..fe7c62960f00 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_states_handlers.py +++ b/services/web/server/src/simcore_service_webserver/projects/_states_handlers.py @@ -29,6 +29,7 @@ from ..login.decorators import login_required from ..notifications import project_logs from ..products.api import Product, get_current_product +from ..resource_usage.errors import DefaultPricingPlanNotFoundError from ..security.decorators import permission_required from ..users import api from ..users.exceptions import UserDefaultWalletNotFoundError @@ -37,6 +38,7 @@ from . import projects_api from ._common_models import ProjectPathParams, RequestContext from .exceptions import ( + DefaultPricingUnitNotFoundError, ProjectInvalidRightsError, ProjectNotFoundError, ProjectStartsTooManyDynamicNodesError, @@ -57,7 +59,12 @@ async def _wrapper(request: web.Request) -> web.StreamResponse: try: return await handler(request) - except (ProjectNotFoundError, UserDefaultWalletNotFoundError) as exc: + except ( + ProjectNotFoundError, + UserDefaultWalletNotFoundError, + DefaultPricingPlanNotFoundError, + DefaultPricingUnitNotFoundError, + ) as exc: raise web.HTTPNotFound(reason=f"{exc}") from exc except ProjectInvalidRightsError as exc: diff --git a/services/web/server/src/simcore_service_webserver/resource_usage/_client.py b/services/web/server/src/simcore_service_webserver/resource_usage/_client.py index 63763aa145b9..eb616b5d209b 100644 --- a/services/web/server/src/simcore_service_webserver/resource_usage/_client.py +++ b/services/web/server/src/simcore_service_webserver/resource_usage/_client.py @@ -23,11 +23,13 @@ from models_library.users import UserID from models_library.wallets import WalletID from pydantic import NonNegativeInt, parse_obj_as +from servicelib.aiohttp import status from servicelib.aiohttp.client_session import get_client_session from settings_library.resource_usage_tracker import ResourceUsageTrackerSettings from yarl import URL from ._utils import handle_client_exceptions +from .errors import DefaultPricingPlanNotFoundError from .settings import get_plugin_settings _logger = logging.getLogger(__name__) @@ -95,10 +97,15 @@ async def get_default_service_pricing_plan( } ) with handle_client_exceptions(app) as session: - async with session.get(url) as response: - response.raise_for_status() - body: dict = await response.json() - return parse_obj_as(PricingPlanGet, body) + try: + async with session.get(url) as response: + response.raise_for_status() + body: dict = await response.json() + return parse_obj_as(PricingPlanGet, body) + except ClientResponseError as e: + if e.status == status.HTTP_404_NOT_FOUND: + raise DefaultPricingPlanNotFoundError from e + raise async def get_pricing_plan_unit( diff --git a/services/web/server/src/simcore_service_webserver/resource_usage/errors.py b/services/web/server/src/simcore_service_webserver/resource_usage/errors.py new file mode 100644 index 000000000000..ccaddaf1a703 --- /dev/null +++ b/services/web/server/src/simcore_service_webserver/resource_usage/errors.py @@ -0,0 +1,9 @@ +from ..errors import WebServerBaseError + + +class ResourceUsageValueError(WebServerBaseError, ValueError): + ... + + +class DefaultPricingPlanNotFoundError(ResourceUsageValueError): + msg_template = "Default pricing plan not found"