Refactor o2dms api swagger 12/7112/6
authorBin Yang <bin.yang@windriver.com>
Wed, 24 Nov 2021 00:22:09 +0000 (08:22 +0800)
committerBin Yang <bin.yang@windriver.com>
Wed, 24 Nov 2021 03:39:06 +0000 (11:39 +0800)
Signed-off-by: Bin Yang <bin.yang@windriver.com>
Change-Id: I996a66eb4f738c20b90e3fc75aa7dd7e2dadcf40

o2common/config/config.py
o2common/service/unit_of_work.py
o2dms/adapter/dms_repository.py
o2dms/adapter/orm.py
o2dms/domain/dms.py
o2dms/domain/dms_repo.py
o2dms/views/__init__.py
o2dms/views/dms_dto.py
o2dms/views/dms_lcm_view.py
o2dms/views/dms_route.py
o2ims/views/ocloud_dto.py

index 55d4755..2849e49 100644 (file)
@@ -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():
index 2f6ff5e..ce5e453 100644 (file)
@@ -23,6 +23,7 @@ class AbstractUnitOfWork(abc.ABC):
     # resource_pools: ResourcePoolRepository
     # resources: ResourceRepository
     # deployment_managers: DeploymentManagerRepository
+    # nfdeployment_descs: object
 
     def __enter__(self):
         return self
index c69acff..5dd2bb1 100644 (file)
@@ -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()
index 7527515..05821dc 100644 (file)
@@ -45,9 +45,8 @@ nfDeploymentDesc = Table(
     Column("deploymentManagerId", String(255)),\r
     Column("name", String(255)),\r
     Column("description", String(255)),\r
-    Column("supportedLocations", String(255)),\r
-    Column("capabilities", String(255)),\r
-    Column("capacity", String(255)),\r
+    Column("inputParams", String(255)),\r
+    Column("outputParams", String(255)),\r
     # Column("extensions", String(1024))\r
 )\r
 \r
index ceef458..31932ee 100644 (file)
@@ -23,9 +23,9 @@ class NfDeploymentDesc(AgRoot):
         super().__init__()\r
         self.id = id\r
         self.version_number = 0\r
-        self.dmsId = dmsId\r
+        self.deploymentManagerId = dmsId\r
         self.name = name\r
         self.description = description\r
         self.inputParams = inputParams\r
         self.outputParams = outputParams\r
-        self.extensions = []\r
+        self.extensions = []\r
index f199a3c..2564a81 100644 (file)
@@ -34,8 +34,11 @@ class NfDeploymentDescRepository(abc.ABC):
     def list(self) -> List[dms.NfDeploymentDesc]:\r
         return self._list()\r
 \r
-    def update(self, nfdeployment_descriptor: dms.NfDeploymentDesc):\r
-        self._update(nfdeployment_descriptor)\r
+    def update(self, id, **kwargs):\r
+        self._update(id, **kwargs)\r
+\r
+    def delete(self, nfdeployment_descriptor_id):\r
+        self._delete(nfdeployment_descriptor_id)\r
 \r
     @abc.abstractmethod\r
     def _add(self, nfdeployment_descriptor: dms.NfDeploymentDesc):\r
@@ -48,3 +51,7 @@ class NfDeploymentDescRepository(abc.ABC):
     @abc.abstractmethod\r
     def _update(self, nfdeployment_descriptor: dms.NfDeploymentDesc):\r
         raise NotImplementedError\r
+\r
+    @abc.abstractmethod\r
+    def _delete(self, nfdeployment_descriptor_id):\r
+        raise NotImplementedError\r
index b514342..ce75f50 100644 (file)
@@ -11,3 +11,8 @@
 #  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
 #  See the License for the specific language governing permissions and\r
 #  limitations under the License.\r
+\r
+from flask_restx import Namespace\r
+\r
+api_dms_lcm_v1 = Namespace(\r
+    "O2DMS_LCM", description='DMS LCM related operations.')\r
index d353137..4acc9a3 100644 (file)
 #  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
+        }
+    )
index 32f77cc..ab84fba 100644 (file)
 #  limitations under the License.\r
 \r
 from sqlalchemy import select\r
-\r
+import uuid\r
 from o2common.service import unit_of_work\r
 from o2ims.adapter.orm import deploymentmanager\r
 from o2dms.adapter.orm import nfDeploymentDesc\r
+from o2dms.views.dms_dto import DmsLcmNfDeploymentDescriptorDTO\r
+from o2dms.domain.dms import NfDeploymentDesc\r
 \r
 \r
 def deployment_managers(uow: unit_of_work.AbstractUnitOfWork):\r
@@ -43,29 +45,49 @@ def lcm_nfdeploymentdesc_list(deploymentManagerID: str,
 \r
 \r
 def lcm_nfdeploymentdesc_one(nfdeploymentdescriptorid: str,\r
-                             deploymentManagerID: str,\r
                              uow: unit_of_work.AbstractUnitOfWork):\r
     with uow:\r
-        res = uow.session.execute(select(deploymentmanager).where(\r
-            nfDeploymentDesc.c.deploymentManagerId == deploymentManagerID,\r
+        res = uow.session.execute(select(nfDeploymentDesc).where(\r
             nfDeploymentDesc.c.id == nfdeploymentdescriptorid))\r
         first = res.first()\r
     return None if first is None else dict(first)\r
 \r
 \r
-# def lcm_nfdeploymentdesc_create(nfdeploymentdescriptorid: str,\r
-#                            uow: unit_of_work.AbstractUnitOfWork):\r
-#     with uow:\r
-#         res = uow.session.execute(select(deploymentmanager).where(\r
-#             deploymentmanager.c.id == nfdeploymentdescriptorid))\r
-#         first = res.first()\r
-#     return None if first is None else dict(first)\r
+def lcm_nfdeploymentdesc_create(\r
+        deploymentManagerId: str,\r
+        input: DmsLcmNfDeploymentDescriptorDTO.\r
+        NfDeploymentDescriptor_create,\r
+        uow: unit_of_work.AbstractUnitOfWork):\r
+\r
+    id = str(uuid.uuid4())\r
+    entity = NfDeploymentDesc(\r
+        id, input['name'], deploymentManagerId, input['description'],\r
+        input['inputParams'], input['outputParams'])\r
+    with uow:\r
+        uow.nfdeployment_descs.add(entity)\r
+        uow.commit()\r
+    return id\r
+\r
 \r
+def lcm_nfdeploymentdesc_update(\r
+        nfdeploymentdescriptorid: str,\r
+        input: DmsLcmNfDeploymentDescriptorDTO.NfDeploymentDescriptor_update,\r
+        uow: unit_of_work.AbstractUnitOfWork):\r
 \r
-# def lcm_nfdeploymentdesc_delete(nfdeploymentdescriptorid: str,\r
-#                            uow: unit_of_work.AbstractUnitOfWork):\r
-#     with uow:\r
-#         res = uow.session.execute(select(deploymentmanager).where(\r
-#             deploymentmanager.c.id == nfdeploymentdescriptorid))\r
-#         first = res.first()\r
-#     return None if first is None else dict(first)\r
+    with uow:\r
+        entity = uow.nfdeployment_descs.get(nfdeploymentdescriptorid)\r
+        entity.name = input['name']\r
+        entity.description = input['description']\r
+        entity.inputParams = input['inputParams']\r
+        entity.outputParams = input['outputParams']\r
+        uow.commit()\r
+    return True\r
+\r
+\r
+def lcm_nfdeploymentdesc_delete(\r
+        nfdeploymentdescriptorid: str, uow: unit_of_work.AbstractUnitOfWork):\r
+\r
+    with uow:\r
+        uow.nfdeployment_descs.delete(nfdeploymentdescriptorid)\r
+        uow.commit()\r
+    return True\r
index 895bfcb..e9fd2e2 100644 (file)
@@ -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("/<deploymentManagerID>")
-@api_dms.param('deploymentManagerID', 'ID of the deployment manager')
-@api_dms.response(404, 'Deployment manager not found')
+@api_dms_lcm_v1.route("/<deploymentManagerID>")
+@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("/<deploymentManagerID>/O2dms_DeploymentLifecycle")
-@api_lcm_nfdeploymentDesc\
+@api_dms_lcm_v1\
+    .route("/<deploymentManagerID>/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("/<deploymentManagerID>/O2dms_DeploymentLifecycle/"
-           "<nfDeploymentDescriptorId>")
-@api_lcm_nfdeploymentDesc\
+           "NfDeploymentDescriptor/<nfDeploymentDescriptorId>")
+@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
index 0201451..e480e09 100644 (file)
@@ -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'),