From: Bin Yang Date: Wed, 24 Nov 2021 00:22:09 +0000 (+0800) Subject: Refactor o2dms api swagger X-Git-Tag: 1.0.0~18 X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=commitdiff_plain;h=c3ab2dcb442a0e66b7a621c59c6c7a679c26cee9;p=pti%2Fo2.git Refactor o2dms api swagger Signed-off-by: Bin Yang Change-Id: I996a66eb4f738c20b90e3fc75aa7dd7e2dadcf40 --- diff --git a/o2common/config/config.py b/o2common/config/config.py index 55d4755..2849e49 100644 --- a/o2common/config/config.py +++ b/o2common/config/config.py @@ -42,7 +42,7 @@ def get_o2ims_api_base(): def get_o2dms_api_base(): - return get_root_api_base() + "o2dms/v1" + return get_root_api_base() + "o2dms" def get_redis_host_and_port(): diff --git a/o2common/service/unit_of_work.py b/o2common/service/unit_of_work.py index 2f6ff5e..ce5e453 100644 --- a/o2common/service/unit_of_work.py +++ b/o2common/service/unit_of_work.py @@ -23,6 +23,7 @@ class AbstractUnitOfWork(abc.ABC): # resource_pools: ResourcePoolRepository # resources: ResourceRepository # deployment_managers: DeploymentManagerRepository + # nfdeployment_descs: object def __enter__(self): return self diff --git a/o2dms/adapter/dms_repository.py b/o2dms/adapter/dms_repository.py index c69acff..5dd2bb1 100644 --- a/o2dms/adapter/dms_repository.py +++ b/o2dms/adapter/dms_repository.py @@ -28,10 +28,16 @@ class NfDeploymentDescSqlAlchemyRepository(dms_repo def _get(self, nfdeployment_desc_id) -> dms.NfDeploymentDesc: return self.session.query(dms.NfDeploymentDesc).filter_by( - nfDeploymentDescId=nfdeployment_desc_id).first() + id=nfdeployment_desc_id).first() def _list(self) -> List[dms.NfDeploymentDesc]: return self.session.query() - def _update(self, nfdeployment_desc: dms.NfDeploymentDesc): - self.session.add(nfdeployment_desc) + def _update(self, nfdeployment_desc_id, **kwargs): + self.session.query(dms.NfDeploymentDesc).filter_by( + id=nfdeployment_desc_id).update(**kwargs) + + def _delete(self, nfdeployment_desc_id): + self.session.query(dms.NfDeploymentDesc).filter_by( + id=nfdeployment_desc_id + ).delete() diff --git a/o2dms/adapter/orm.py b/o2dms/adapter/orm.py index 7527515..05821dc 100644 --- a/o2dms/adapter/orm.py +++ b/o2dms/adapter/orm.py @@ -45,9 +45,8 @@ nfDeploymentDesc = Table( Column("deploymentManagerId", String(255)), Column("name", String(255)), Column("description", String(255)), - Column("supportedLocations", String(255)), - Column("capabilities", String(255)), - Column("capacity", String(255)), + Column("inputParams", String(255)), + Column("outputParams", String(255)), # Column("extensions", String(1024)) ) diff --git a/o2dms/domain/dms.py b/o2dms/domain/dms.py index ceef458..31932ee 100644 --- a/o2dms/domain/dms.py +++ b/o2dms/domain/dms.py @@ -23,9 +23,9 @@ class NfDeploymentDesc(AgRoot): super().__init__() self.id = id self.version_number = 0 - self.dmsId = dmsId + self.deploymentManagerId = dmsId self.name = name self.description = description self.inputParams = inputParams self.outputParams = outputParams - self.extensions = [] + # self.extensions = [] diff --git a/o2dms/domain/dms_repo.py b/o2dms/domain/dms_repo.py index f199a3c..2564a81 100644 --- a/o2dms/domain/dms_repo.py +++ b/o2dms/domain/dms_repo.py @@ -34,8 +34,11 @@ class NfDeploymentDescRepository(abc.ABC): def list(self) -> List[dms.NfDeploymentDesc]: return self._list() - def update(self, nfdeployment_descriptor: dms.NfDeploymentDesc): - self._update(nfdeployment_descriptor) + def update(self, id, **kwargs): + self._update(id, **kwargs) + + def delete(self, nfdeployment_descriptor_id): + self._delete(nfdeployment_descriptor_id) @abc.abstractmethod def _add(self, nfdeployment_descriptor: dms.NfDeploymentDesc): @@ -48,3 +51,7 @@ class NfDeploymentDescRepository(abc.ABC): @abc.abstractmethod def _update(self, nfdeployment_descriptor: dms.NfDeploymentDesc): raise NotImplementedError + + @abc.abstractmethod + def _delete(self, nfdeployment_descriptor_id): + raise NotImplementedError diff --git a/o2dms/views/__init__.py b/o2dms/views/__init__.py index b514342..ce75f50 100644 --- a/o2dms/views/__init__.py +++ b/o2dms/views/__init__.py @@ -11,3 +11,8 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. + +from flask_restx import Namespace + +api_dms_lcm_v1 = Namespace( + "O2DMS_LCM", description='DMS LCM related operations.') diff --git a/o2dms/views/dms_dto.py b/o2dms/views/dms_dto.py index d353137..4acc9a3 100644 --- a/o2dms/views/dms_dto.py +++ b/o2dms/views/dms_dto.py @@ -12,16 +12,13 @@ # See the License for the specific language governing permissions and # limitations under the License. -from flask_restx import Namespace, fields +from flask_restx import fields +from o2dms.views import api_dms_lcm_v1 class DmsDTO: - - api = Namespace("O2DMS", - description='DMS related operations.') - - dms_get = api.model( - "Get DMS information", + dms_get = api_dms_lcm_v1.model( + "DmsGetDto", { 'deploymentManagerId': fields.String( required=True, @@ -36,12 +33,8 @@ class DmsDTO: class DmsLcmNfDeploymentDescriptorDTO: - - api = Namespace("O2DMS_LCM_NfDeploymentDescriptor", - description='DMS LCM NfDeploymentDescritpor operations.') - - dmslcm_NfDeploymentDescriptor_get = api.model( - "Get NfDeploymentDescriptor information", + dmslcm_NfDeploymentDescriptor_get = api_dms_lcm_v1.model( + "NfDeploymentDescriptorGetDto", { 'id': fields.String( required=True, @@ -52,3 +45,31 @@ class DmsLcmNfDeploymentDescriptorDTO: 'outputParams': fields.String } ) + + NfDeploymentDescriptor_create = api_dms_lcm_v1.model( + "NfDeploymentDescriptorCreateDto", + { + 'name': fields.String, + 'description': fields.String, + 'inputParams': fields.String, + 'outputParams': fields.String + } + ) + + NfDeploymentDescriptor_create_post_resp = api_dms_lcm_v1.model( + "NfDeploymentDescriptorCreateRespDto", + { + 'id': fields.String( + required=True, description='NfDeploymentDescriptor ID'), + } + ) + + NfDeploymentDescriptor_update = api_dms_lcm_v1.model( + "NfDeploymentDescriptorCreateDto", + { + 'name': fields.String, + 'description': fields.String, + 'inputParams': fields.String, + 'outputParams': fields.String + } + ) diff --git a/o2dms/views/dms_lcm_view.py b/o2dms/views/dms_lcm_view.py index 32f77cc..ab84fba 100644 --- a/o2dms/views/dms_lcm_view.py +++ b/o2dms/views/dms_lcm_view.py @@ -13,10 +13,12 @@ # limitations under the License. from sqlalchemy import select - +import uuid from o2common.service import unit_of_work from o2ims.adapter.orm import deploymentmanager from o2dms.adapter.orm import nfDeploymentDesc +from o2dms.views.dms_dto import DmsLcmNfDeploymentDescriptorDTO +from o2dms.domain.dms import NfDeploymentDesc def deployment_managers(uow: unit_of_work.AbstractUnitOfWork): @@ -43,29 +45,49 @@ def lcm_nfdeploymentdesc_list(deploymentManagerID: str, def lcm_nfdeploymentdesc_one(nfdeploymentdescriptorid: str, - deploymentManagerID: str, uow: unit_of_work.AbstractUnitOfWork): with uow: - res = uow.session.execute(select(deploymentmanager).where( - nfDeploymentDesc.c.deploymentManagerId == deploymentManagerID, + res = uow.session.execute(select(nfDeploymentDesc).where( nfDeploymentDesc.c.id == nfdeploymentdescriptorid)) first = res.first() return None if first is None else dict(first) -# def lcm_nfdeploymentdesc_create(nfdeploymentdescriptorid: str, -# uow: unit_of_work.AbstractUnitOfWork): -# with uow: -# res = uow.session.execute(select(deploymentmanager).where( -# deploymentmanager.c.id == nfdeploymentdescriptorid)) -# first = res.first() -# return None if first is None else dict(first) +def lcm_nfdeploymentdesc_create( + deploymentManagerId: str, + input: DmsLcmNfDeploymentDescriptorDTO. + NfDeploymentDescriptor_create, + uow: unit_of_work.AbstractUnitOfWork): + + id = str(uuid.uuid4()) + entity = NfDeploymentDesc( + id, input['name'], deploymentManagerId, input['description'], + input['inputParams'], input['outputParams']) + with uow: + uow.nfdeployment_descs.add(entity) + uow.commit() + return id + +def lcm_nfdeploymentdesc_update( + nfdeploymentdescriptorid: str, + input: DmsLcmNfDeploymentDescriptorDTO.NfDeploymentDescriptor_update, + uow: unit_of_work.AbstractUnitOfWork): -# def lcm_nfdeploymentdesc_delete(nfdeploymentdescriptorid: str, -# uow: unit_of_work.AbstractUnitOfWork): -# with uow: -# res = uow.session.execute(select(deploymentmanager).where( -# deploymentmanager.c.id == nfdeploymentdescriptorid)) -# first = res.first() -# return None if first is None else dict(first) + with uow: + entity = uow.nfdeployment_descs.get(nfdeploymentdescriptorid) + entity.name = input['name'] + entity.description = input['description'] + entity.inputParams = input['inputParams'] + entity.outputParams = input['outputParams'] + uow.commit() + return True + + +def lcm_nfdeploymentdesc_delete( + nfdeploymentdescriptorid: str, uow: unit_of_work.AbstractUnitOfWork): + + with uow: + uow.nfdeployment_descs.delete(nfdeploymentdescriptorid) + uow.commit() + return True diff --git a/o2dms/views/dms_route.py b/o2dms/views/dms_route.py index 895bfcb..e9fd2e2 100644 --- a/o2dms/views/dms_route.py +++ b/o2dms/views/dms_route.py @@ -17,80 +17,106 @@ from flask_restx import Resource from o2common.config import config from o2dms.views.dms_dto import DmsDTO, DmsLcmNfDeploymentDescriptorDTO -from o2dms.views import dms_lcm_view +from o2dms.views import dms_lcm_view, api_dms_lcm_v1 apibase = config.get_o2dms_api_base() # ---------- DeploymentManagers ---------- # -api_dms = DmsDTO.api - - -@api_dms.route("/") -@api_dms.param('deploymentManagerID', 'ID of the deployment manager') -@api_dms.response(404, 'Deployment manager not found') +@api_dms_lcm_v1.route("/") +@api_dms_lcm_v1.param('deploymentManagerID', 'ID of the deployment manager') +@api_dms_lcm_v1.response(404, 'Deployment manager not found') class DmsGetRouter(Resource): model = DmsDTO.dms_get - @api_dms.doc('Get deployment manager') - @api_dms.marshal_with(model) + @api_dms_lcm_v1.doc('Get deployment manager') + @api_dms_lcm_v1.marshal_with(model) def get(self, deploymentManagerID): result = dms_lcm_view.deployment_manager_one( - deploymentManagerID, uow) + deploymentManagerID, bus.uow) if result is not None: return result - api_dms.abort(404, "Deployment manager {} doesn't exist".format( + api_dms_lcm_v1.abort(404, "Deployment manager {} doesn't exist".format( deploymentManagerID)) # LCM services # -api_lcm_nfdeploymentDesc = DmsLcmNfDeploymentDescriptorDTO.api - - -@api_lcm_nfdeploymentDesc\ - .route("//O2dms_DeploymentLifecycle") -@api_lcm_nfdeploymentDesc\ +@api_dms_lcm_v1\ + .route("//O2dms_DeploymentLifecycle/" + "NfDeploymentDescriptor") +@api_dms_lcm_v1\ .param('deploymentManagerID', 'ID of the deployment manager') -@api_lcm_nfdeploymentDesc.response(404, 'DMS LCM not found') +@api_dms_lcm_v1.response(404, 'DMS LCM not found') class DmsLcmNfDeploymentDescListRouter(Resource): model = DmsLcmNfDeploymentDescriptorDTO.dmslcm_NfDeploymentDescriptor_get - @api_lcm_nfdeploymentDesc.doc('Get a list of NfDeploymentDescriptor') - @api_lcm_nfdeploymentDesc.marshal_list_with(model) + createdto = DmsLcmNfDeploymentDescriptorDTO.NfDeploymentDescriptor_create + post_resp = DmsLcmNfDeploymentDescriptorDTO.\ + NfDeploymentDescriptor_create_post_resp + + @api_dms_lcm_v1.doc('Get a list of NfDeploymentDescriptor') + @api_dms_lcm_v1.marshal_list_with(model) def get(self, deploymentManagerID): - return dms_lcm_view.lcm_nfdeploymentdesc_list(deploymentManagerID, uow) + return dms_lcm_view.lcm_nfdeploymentdesc_list( + deploymentManagerID, bus.uow) + + @api_dms_lcm_v1.doc('Create a NfDeploymentDescriptor') + @api_dms_lcm_v1.expect(createdto) + @api_dms_lcm_v1.marshal_with(post_resp, code=201) + def post(self, deploymentManagerID): + data = api_dms_lcm_v1.payload + id = dms_lcm_view.lcm_nfdeploymentdesc_create( + deploymentManagerID, data, bus.uow) + return {"id": id}, 201 -@api_lcm_nfdeploymentDesc\ +@api_dms_lcm_v1\ .route("//O2dms_DeploymentLifecycle/" - "") -@api_lcm_nfdeploymentDesc\ + "NfDeploymentDescriptor/") +@api_dms_lcm_v1\ .param('deploymentManagerID', 'ID of the deployment manager') -@api_lcm_nfdeploymentDesc.param('nfDeploymentDescriptorId', - 'ID of the NfDeploymentDescriptor') -@api_lcm_nfdeploymentDesc.response(404, 'DMS LCM not found') +@api_dms_lcm_v1.param('nfDeploymentDescriptorId', + 'ID of the NfDeploymentDescriptor') +@api_dms_lcm_v1.response(404, 'DMS LCM not found') class DmsLcmNfDeploymentDescGetRouter(Resource): model = DmsLcmNfDeploymentDescriptorDTO.dmslcm_NfDeploymentDescriptor_get + updatedto = DmsLcmNfDeploymentDescriptorDTO.\ + NfDeploymentDescriptor_update - @api_lcm_nfdeploymentDesc.doc('Get a NfDeploymentDescriptor') - @api_lcm_nfdeploymentDesc.marshal_with(model) + @api_dms_lcm_v1.doc('Get a NfDeploymentDescriptor') + @api_dms_lcm_v1.marshal_with(model) def get(self, nfDeploymentDescriptorId, deploymentManagerID): result = dms_lcm_view\ - .lcm_nfdeploymentdesc_one(nfDeploymentDescriptorId, - deploymentManagerID, uow) + .lcm_nfdeploymentdesc_one(nfDeploymentDescriptorId, bus.uow) if result is not None: return result - api_dms.abort(404, "NfDeploymentDescriptor {} doesn't exist".format( - nfDeploymentDescriptorId)) - - -def configure_namespace(app, bus): - app.add_namespace(api_dms, path=apibase) - app.add_namespace(api_lcm_nfdeploymentDesc, path=apibase) + api_dms_lcm_v1.abort( + 404, "NfDeploymentDescriptor {} doesn't exist".format( + nfDeploymentDescriptorId)) + + @api_dms_lcm_v1.doc('Update a NfDeploymentDescriptor') + @api_dms_lcm_v1.expect(updatedto) + def put(self, nfDeploymentDescriptorId, deploymentManagerID): + data = api_dms_lcm_v1.payload + dms_lcm_view.lcm_nfdeploymentdesc_update( + nfDeploymentDescriptorId, data, bus.uow) + return {}, 201 + + @api_dms_lcm_v1.doc('Delete NfDeploymentDescriptor by ID') + @api_dms_lcm_v1.response(204, 'NfDeploymentDescriptor deleted') + def delete(self, nfDeploymentDescriptorId, deploymentManagerID): + with bus.uow: + bus.uow.nfdeployment_descs.delete(nfDeploymentDescriptorId) + bus.uow.commit() + return '', 204 + + +def configure_namespace(app, bus_new): + app.add_namespace(api_dms_lcm_v1, path=apibase) # Set global uow - global uow - uow = bus.uow + global bus + bus = bus_new diff --git a/o2ims/views/ocloud_dto.py b/o2ims/views/ocloud_dto.py index 0201451..e480e09 100644 --- a/o2ims/views/ocloud_dto.py +++ b/o2ims/views/ocloud_dto.py @@ -20,7 +20,7 @@ from o2ims.views import api class OcloudDTO: ocloud = api.model( - "OcloudList", + "OcloudDto", { 'oCloudId': fields.String(required=True), 'globalCloudId': fields.String, @@ -34,7 +34,7 @@ class OcloudDTO: class ResourceTypeDTO: resource_type_get = api.model( - "ResourceTypeGet", + "ResourceTypeGetDto", { 'resourceTypeId': fields.String(required=True, description='Resource type ID'), @@ -49,7 +49,7 @@ class ResourceTypeDTO: class ResourcePoolDTO: resource_pool_get = api.model( - "ResourcePoolGet", + "ResourcePoolGetDto", { 'resourcePoolId': fields.String(required=True, description='Resource pool ID'), @@ -64,7 +64,7 @@ class ResourcePoolDTO: class ResourceDTO: resource_list = api.model( - "ResourceList", + "ResourceListDto", { 'resourceId': fields.String(required=True, description='Resource ID'), @@ -76,7 +76,7 @@ class ResourceDTO: ) resource_get = api.model( - "ResourceGet", + "ResourceGetDto", { 'resourceId': fields.String(required=True, description='Resource ID'), @@ -91,7 +91,7 @@ class ResourceDTO: class DeploymentManagerDTO: deployment_manager_get = api.model( - "DeploymentManagerGet", + "DeploymentManagerGetDto", { 'deploymentManagerId': fields.String( required=True, @@ -109,7 +109,7 @@ class DeploymentManagerDTO: class SubscriptionDTO: subscription_get = api.model( - "SubscriptionGet", + "SubscriptionGetDto", { 'subscriptionId': fields.String(required=True, description='Subscription ID'), @@ -120,7 +120,7 @@ class SubscriptionDTO: ) subscription = api.model( - "SubscriptionCreate", + "SubscriptionCreateDto", { 'callback': fields.String( required=True, description='Subscription callback address'), @@ -130,7 +130,7 @@ class SubscriptionDTO: ) subscription_post_resp = api.model( - "SubscriptionCreatedResp", + "SubscriptionCreatedRespDto", { 'subscriptionId': fields.String(required=True, description='Subscription ID'),