From: Zhang Rong(Jon) Date: Wed, 19 Jan 2022 11:20:09 +0000 (+0800) Subject: INF-257: support query parameters to filter resource API query X-Git-Tag: 2.0.0-rc1~64 X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=commitdiff_plain;h=91c02b447f2035ffbb11891ece162242c8f5a44f;p=pti%2Fo2.git INF-257: support query parameters to filter resource API query 1. Add swagger support accept query parameters. 2. Add a method that is get_by_name in the resource type repository. 3. Make the list method in the resource repository to support more filters. Issue-ID: INF-257 Signed-off-by: Zhang Rong(Jon) Change-Id: I43c0d2e29550880ebdb089759100b68d78d808bf --- diff --git a/o2ims/adapter/ocloud_repository.py b/o2ims/adapter/ocloud_repository.py index 8b54f53..ff1cd27 100644 --- a/o2ims/adapter/ocloud_repository.py +++ b/o2ims/adapter/ocloud_repository.py @@ -55,6 +55,10 @@ class ResouceTypeSqlAlchemyRepository(ResourceTypeRepository): return self.session.query(ocloud.ResourceType).filter_by( resourceTypeId=resource_type_id).first() + def _get_by_name(self, resource_type_name) -> ocloud.ResourceType: + return self.session.query(ocloud.ResourceType).filter_by( + name=resource_type_name).first() + def _list(self) -> List[ocloud.ResourceType]: return self.session.query(ocloud.ResourceType) @@ -112,9 +116,9 @@ class ResourceSqlAlchemyRepository(ResourceRepository): return res return recursive(resource_id) - def _list(self, resourcepool_id) -> List[ocloud.Resource]: + def _list(self, resourcepool_id, **kwargs) -> List[ocloud.Resource]: return self.session.query(ocloud.Resource).filter_by( - resourcePoolId=resourcepool_id) + resourcePoolId=resourcepool_id, **kwargs) def _update(self, resource: ocloud.Resource): self.session.add(resource) diff --git a/o2ims/domain/ocloud.py b/o2ims/domain/ocloud.py index 1323134..d60b08e 100644 --- a/o2ims/domain/ocloud.py +++ b/o2ims/domain/ocloud.py @@ -95,6 +95,9 @@ class Resource(AgRoot, Serializer): def set_children(self, children: list): self.children = children + def set_resource_type_name(self, resource_type_name: str): + self.resourceTypeName = resource_type_name + def serialize(self): d = Serializer.serialize(self) diff --git a/o2ims/domain/ocloud_repo.py b/o2ims/domain/ocloud_repo.py index c513eed..1c63de8 100644 --- a/o2ims/domain/ocloud_repo.py +++ b/o2ims/domain/ocloud_repo.py @@ -68,6 +68,12 @@ class ResourceTypeRepository(abc.ABC): self.seen.add(resource_type) return resource_type + def get_by_name(self, resource_type_name) -> ocloud.ResourceType: + resource_type = self._get_by_name(resource_type_name) + if resource_type: + self.seen.add(resource_type) + return resource_type + def list(self) -> List[ocloud.ResourceType]: return self._list() @@ -83,6 +89,10 @@ class ResourceTypeRepository(abc.ABC): def _get(self, resource_type_id) -> ocloud.ResourceType: raise NotImplementedError + @abc.abstractmethod + def _get_by_name(self, resource_type_name) -> ocloud.ResourceType: + raise NotImplementedError + @abc.abstractmethod def _update(self, resource_type: ocloud.ResourceType): raise NotImplementedError @@ -136,8 +146,8 @@ class ResourceRepository(abc.ABC): self.seen.add(resource) return resource - def list(self, resourcepool_id) -> List[ocloud.Resource]: - return self._list(resourcepool_id) + def list(self, resourcepool_id, **kwargs) -> List[ocloud.Resource]: + return self._list(resourcepool_id, **kwargs) def update(self, resource: ocloud.Resource): self._update(resource) @@ -151,6 +161,10 @@ class ResourceRepository(abc.ABC): def _get(self, resource_id) -> ocloud.Resource: raise NotImplementedError + @abc.abstractmethod + def _list(self, resourcepool_id, **kwargs) -> ocloud.Resource: + raise NotImplementedError + @abc.abstractmethod def _update(self, resource: ocloud.Resource): raise NotImplementedError diff --git a/o2ims/views/ocloud_route.py b/o2ims/views/ocloud_route.py index 88b369e..00fe520 100644 --- a/o2ims/views/ocloud_route.py +++ b/o2ims/views/ocloud_route.py @@ -13,6 +13,7 @@ # limitations under the License. from flask_restx import Resource +from flask_restx import reqparse from o2common.service.messagebus import MessageBus from o2ims.views import ocloud_view @@ -20,6 +21,9 @@ from o2ims.views.api_ns import api_ims_inventory_v1 from o2ims.views.ocloud_dto import OcloudDTO, ResourceTypeDTO,\ ResourcePoolDTO, ResourceDTO, DeploymentManagerDTO, SubscriptionDTO +from o2common.helper import o2logging +logger = o2logging.get_logger(__name__) + def configure_api_route(): # Set global bus for resource @@ -105,13 +109,26 @@ class ResourcePoolGetRouter(Resource): # ---------- Resources ---------- # @api_ims_inventory_v1.route("/resourcePools//resources") @api_ims_inventory_v1.param('resourcePoolID', 'ID of the resource pool') +@api_ims_inventory_v1.param('resourceTypeName', 'filter resource type', + location='args') +@api_ims_inventory_v1.param('parentId', 'filter parentId', + location='args') class ResourcesListRouter(Resource): model = ResourceDTO.resource_list @api_ims_inventory_v1.marshal_list_with(model) def get(self, resourcePoolID): - return ocloud_view.resources(resourcePoolID, bus.uow) + parser = reqparse.RequestParser() + parser.add_argument('resourceTypeName', location='args') + parser.add_argument('parentId', location='args') + args = parser.parse_args() + kwargs = {} + if args.resourceTypeName is not None: + kwargs['resourceTypeName'] = args.resourceTypeName + if args.parentId is not None: + kwargs['parentId'] = args.parentId + return ocloud_view.resources(resourcePoolID, bus.uow, **kwargs) @api_ims_inventory_v1.route( diff --git a/o2ims/views/ocloud_view.py b/o2ims/views/ocloud_view.py index 3735298..0436f3a 100644 --- a/o2ims/views/ocloud_view.py +++ b/o2ims/views/ocloud_view.py @@ -18,6 +18,9 @@ from o2common.service import unit_of_work from o2ims.views.ocloud_dto import SubscriptionDTO from o2ims.domain.subscription_obj import Subscription +from o2common.helper import o2logging +logger = o2logging.get_logger(__name__) + def oclouds(uow: unit_of_work.AbstractUnitOfWork): with uow: @@ -57,9 +60,29 @@ def resource_pool_one(resourcePoolId: str, return first.serialize() if first is not None else None -def resources(resourcePoolId: str, uow: unit_of_work.AbstractUnitOfWork): +def resources(resourcePoolId: str, uow: unit_of_work.AbstractUnitOfWork, + **kwargs): + + filter_kwargs = {} # filter key should be the same with database name + if 'resourceTypeName' in kwargs: + resource_type_name = kwargs['resourceTypeName'] + with uow: + # res_types = uow.resource_types.list() + # restype_ids = [ + # restype.resourceTypeId for restype in res_types + # if resourceTypeName == restype.name] + # restype_id = '' if len(restype_ids) == 0 else restype_ids[0] + res_type = uow.resource_types.get_by_name(resource_type_name) + restype_id = '' if res_type is None else res_type.resourceTypeId + filter_kwargs['resourceTypeId'] = restype_id + + # li = uow.resources.list(resourcePoolId) + # return [r.serialize() for r in li if r.resourceTypeId == restype_id] + if 'parentId' in kwargs: + filter_kwargs['parentId'] = kwargs['parentId'] + with uow: - li = uow.resources.list(resourcePoolId) + li = uow.resources.list(resourcePoolId, **filter_kwargs) return [r.serialize() for r in li]