From b70cecaaa5999fea84352ea66bbd594b40e5a847 Mon Sep 17 00:00:00 2001 From: "Zhang Rong(Jon)" Date: Mon, 31 Oct 2022 23:31:47 +0800 Subject: [PATCH] Add error handling for ocloud route Issue-ID: INF-302 Signed-off-by: Zhang Rong(Jon) Change-Id: Ia26e12ac69c9d57f2f9b21b29d2d28235843e194 --- o2common/views/route.py | 29 +++++++++++++++++++++++++++++ o2ims/views/ocloud_route.py | 38 +++++++++++++++++++++++++------------- 2 files changed, 54 insertions(+), 13 deletions(-) diff --git a/o2common/views/route.py b/o2common/views/route.py index 2c93d77..832e38c 100644 --- a/o2common/views/route.py +++ b/o2common/views/route.py @@ -29,6 +29,7 @@ from flask_restx.mask import Mask # , apply as apply_mask from flask_restx.model import Model from flask_restx.fields import List, Nested, String from flask_restx.utils import unpack +from o2common.domain.base import Serializer from o2common.helper import o2logging logger = o2logging.get_logger(__name__) @@ -230,3 +231,31 @@ class o2_marshal_with(marshal_with): mask_li.append(k) return '{%s}' % ','.join(mask_li) + + +class ProblemDetails(Serializer): + def __init__(self, namespace: O2Namespace, code: int, detail: str, + title=None, instance=None + ) -> None: + self.ns = namespace + self.status = code + self.detail = detail + self.type = request.path + self.title = title if title is not None else self.getTitle(code) + self.instance = instance if instance is not None else [] + + def getTitle(self, code): + return HTTPStatus(code).phrase + + def abort(self): + self.ns.abort(self.status, self.detail, **self.serialize()) + + def serialize(self): + details = {} + for key in dir(self): + if key == 'ns' or key.startswith('__') or\ + callable(getattr(self, key)): + continue + else: + details[key] = getattr(self, key) + return details diff --git a/o2ims/views/ocloud_route.py b/o2ims/views/ocloud_route.py index 2490d4a..19613f0 100644 --- a/o2ims/views/ocloud_route.py +++ b/o2ims/views/ocloud_route.py @@ -17,6 +17,7 @@ from flask_restx import Resource, reqparse from o2common.service.messagebus import MessageBus from o2common.views.pagination_route import link_header, PAGE_PARAM +from o2common.views.route import ProblemDetails from o2ims.views import ocloud_view from o2ims.views.api_ns import api_ims_inventory as api_ims_inventory_v1 from o2ims.views.ocloud_dto import OcloudDTO, ResourceTypeDTO,\ @@ -81,8 +82,9 @@ class OcloudsListRouter(Resource): res = ocloud_view.oclouds(bus.uow) if len(res) > 0: return res[0] - api_ims_inventory_v1.abort( - 404, "oCloud doesn't exist") + ProblemDetails( + api_ims_inventory_v1, + 404, "oCloud doesn't exist").abort() # ---------- ResourceTypes ---------- # @@ -167,8 +169,10 @@ class ResourceTypeGetRouter(Resource): result = ocloud_view.resource_type_one(resourceTypeID, bus.uow) if result is not None: return result - api_ims_inventory_v1.abort( - 404, "Resource type {} doesn't exist".format(resourceTypeID)) + ProblemDetails( + api_ims_inventory_v1, + 404, "Resource type {} doesn't exist".format( + resourceTypeID)).abort() # ---------- ResourcePools ---------- # @@ -253,8 +257,10 @@ class ResourcePoolGetRouter(Resource): result = ocloud_view.resource_pool_one(resourcePoolID, bus.uow) if result is not None: return result - api_ims_inventory_v1.abort( - 404, "Resource pool {} doesn't exist".format(resourcePoolID)) + ProblemDetails( + api_ims_inventory_v1, + 404, "Resource pool {} doesn't exist".format( + resourcePoolID)).abort() # ---------- Resources ---------- # @@ -352,8 +358,10 @@ class ResourceGetRouter(Resource): result = ocloud_view.resource_one(resourceID, bus.uow) if result is not None: return result - api_ims_inventory_v1.abort( - 404, "Resource {} doesn't exist".format(resourceID)) + ProblemDetails( + api_ims_inventory_v1, + 404, "Resource {} doesn't exist".format( + resourceID)).abort() # ---------- DeploymentManagers ---------- # @@ -448,9 +456,11 @@ class DeploymentManagerGetRouter(Resource): deploymentManagerID, bus.uow, profile) if result is not None: return result - api_ims_inventory_v1.abort( - 404, - "Deployment manager {} doesn't exist".format(deploymentManagerID)) + + ProblemDetails( + api_ims_inventory_v1, + 404, "Deployment manager {} doesn't exist".format( + deploymentManagerID)).abort() # ---------- Subscriptions ---------- # @@ -549,8 +559,10 @@ class SubscriptionGetDelRouter(Resource): subscriptionID, bus.uow) if result is not None: return result - api_ims_inventory_v1.abort(404, "Subscription {} doesn't exist".format( - subscriptionID)) + ProblemDetails( + api_ims_inventory_v1, + 404, "Subscription {} doesn't exist".format( + subscriptionID)).abort() @api_ims_inventory_v1.doc('Delete subscription by ID') @api_ims_inventory_v1.response(204, 'Subscription deleted') -- 2.16.6