Update o2dms lcm api 13/7113/1
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 06:01:31 +0000 (14:01 +0800)
Signed-off-by: Bin Yang <bin.yang@windriver.com>
Change-Id: I86445cd818441826e17da9b946b480c29f94a401

o2app/adapter/unit_of_work.py
o2dms/adapter/dms_repository.py
o2dms/adapter/orm.py
o2dms/domain/dms.py
o2dms/domain/dms_repo.py
o2dms/views/dms_dto.py
o2dms/views/dms_lcm_view.py
o2dms/views/dms_route.py

index 2a8663d..e488542 100644 (file)
@@ -52,6 +52,10 @@ class SqlAlchemyUnitOfWork(AbstractUnitOfWork):
             .DeploymentManagerSqlAlchemyRepository(self.session)\r
         self.nfdeployment_descs = dms_repository\\r
             .NfDeploymentDescSqlAlchemyRepository(self.session)\r
+        self.nfdeployments = dms_repository\\r
+            .NfDeploymentSqlAlchemyRepository(self.session)\r
+        self.ocloudvresources = dms_repository\\r
+            .NfOCloudVResourceSqlAlchemyRepository(self.session)\r
         return super().__enter__()\r
 \r
     def __exit__(self, *args):\r
@@ -83,3 +87,9 @@ class SqlAlchemyUnitOfWork(AbstractUnitOfWork):
         for entry in self.nfdeployment_descs.seen:\r
             while entry.events:\r
                 yield entry.events.pop(0)\r
+        for entry in self.nfdeployments.seen:\r
+            while entry.events:\r
+                yield entry.events.pop(0)\r
+        for entry in self.ocloudvresources.seen:\r
+            while entry.events:\r
+                yield entry.events.pop(0)\r
index 5dd2bb1..2c7c3ca 100644 (file)
@@ -41,3 +41,57 @@ class NfDeploymentDescSqlAlchemyRepository(dms_repo
         self.session.query(dms.NfDeploymentDesc).filter_by(
             id=nfdeployment_desc_id
         ).delete()
+
+
+class NfDeploymentSqlAlchemyRepository(
+        dms_repo.NfDeploymentRepository):
+
+    def __init__(self, session):
+        super().__init__()
+        self.session = session
+
+    def _add(self, nfdeployment: dms.NfDeployment):
+        self.session.add(nfdeployment)
+
+    def _get(self, nfdeployment_id) -> dms.NfDeployment:
+        return self.session.query(dms.NfDeployment).filter_by(
+            id=nfdeployment_id).first()
+
+    def _list(self) -> List[dms.NfDeployment]:
+        return self.session.query()
+
+    def _update(self, nfdeployment_id, **kwargs):
+        self.session.query(dms.NfDeployment).filter_by(
+            id=nfdeployment_id).update(**kwargs)
+
+    def _delete(self, nfdeployment_id):
+        self.session.query(dms.NfDeployment).filter_by(
+            id=nfdeployment_id
+        ).delete()
+
+
+class NfOCloudVResourceSqlAlchemyRepository(
+        dms_repo.NfOCloudVResourceRepository):
+
+    def __init__(self, session):
+        super().__init__()
+        self.session = session
+
+    def _add(self, nfocloudvres: dms.NfOCloudVResource):
+        self.session.add(nfocloudvres)
+
+    def _get(self, nfocloudvres_id) -> dms.NfOCloudVResource:
+        return self.session.query(dms.NfOCloudVResource).filter_by(
+            id=nfocloudvres_id).first()
+
+    def _list(self) -> List[dms.NfOCloudVResource]:
+        return self.session.query()
+
+    def _update(self, nfocloudvres, **kwargs):
+        self.session.query(dms.NfOCloudVResource).filter_by(
+            id=nfocloudvres).update(**kwargs)
+
+    def _delete(self, nfocloudvres):
+        self.session.query(dms.NfOCloudVResource).filter_by(
+            id=nfocloudvres
+        ).delete()
index 05821dc..1c2c93a 100644 (file)
@@ -50,11 +50,49 @@ nfDeploymentDesc = Table(
     # Column("extensions", String(1024))\r
 )\r
 \r
+nfDeployment = Table(\r
+    "nfDeployment",\r
+    metadata,\r
+    Column("updatetime", DateTime),\r
+    Column("createtime", DateTime),\r
+    Column("hash", String(255)),\r
+    Column("version_number", Integer),\r
+\r
+    Column("id", String(255), primary_key=True),\r
+    Column("deploymentManagerId", String(255)),\r
+    Column("name", String(255)),\r
+    Column("description", String(255)),\r
+    Column("descriptorId", String(255)),\r
+    Column("parentDeploymentId", String(255)),\r
+    Column("status", Integer)\r
+)\r
+\r
+nfOCloudVResource = Table(\r
+    "nfOcloudVRes",\r
+    metadata,\r
+    Column("updatetime", DateTime),\r
+    Column("createtime", DateTime),\r
+    Column("hash", String(255)),\r
+    Column("version_number", Integer),\r
+\r
+    Column("id", String(255), primary_key=True),\r
+    Column("deploymentManagerId", String(255)),\r
+    Column("name", String(255)),\r
+    Column("description", String(255)),\r
+    Column("descriptorId", String(255)),\r
+    Column("vresourceType", String(255)),\r
+    Column("status", Integer),\r
+    Column("metadata", String(2048)),\r
+    Column("nfDeploymentId", String(255))\r
+)\r
+\r
 \r
 def start_o2dms_mappers(engine=None):\r
     logger.info("Starting O2 DMS mappers")\r
 \r
     mapper(dmsModel.NfDeploymentDesc, nfDeploymentDesc)\r
+    mapper(dmsModel.NfDeployment, nfDeployment)\r
+    mapper(dmsModel.NfOCloudVResource, nfOCloudVResource)\r
 \r
     if engine is not None:\r
         metadata.create_all(engine)\r
index 31932ee..28faf3c 100644 (file)
@@ -29,3 +29,34 @@ class NfDeploymentDesc(AgRoot):
         self.inputParams = inputParams\r
         self.outputParams = outputParams\r
         # self.extensions = []\r
+\r
+\r
+class NfDeployment(AgRoot):\r
+    def __init__(self, id: str, name: str, dmsId: str, description: str = '',\r
+                 descriptorId: str = '', parentId: str = '',) -> None:\r
+        super().__init__()\r
+        self.id = id\r
+        self.version_number = 0\r
+        self.deploymentManagerId = dmsId\r
+        self.name = name\r
+        self.description = description\r
+        self.descriptorId = descriptorId\r
+        self.parentDeploymentId = parentId\r
+        self.status = 0\r
+\r
+\r
+class NfOCloudVResource(AgRoot):\r
+    def __init__(self, id: str, name: str, dmsId: str, description: str = '',\r
+                 descriptorId: str = '', nfDeploymentId: str = '',\r
+                 vresourceType: int = 0,) -> None:\r
+        super().__init__()\r
+        self.id = id\r
+        self.version_number = 0\r
+        self.deploymentManagerId = dmsId\r
+        self.name = name\r
+        self.description = description\r
+        self.descriptorId = descriptorId\r
+        self.nfDeploymentId = nfDeploymentId\r
+        self.vresourceType = vresourceType\r
+        self.status = 0\r
+        self.metadata = []\r
index 2564a81..c53d90f 100644 (file)
@@ -17,6 +17,46 @@ from typing import List, Set
 from o2dms.domain import dms\r
 \r
 \r
+class NfDeploymentRepository(abc.ABC):\r
+    def __init__(self):\r
+        self.seen = set()  # type: Set[dms.NfDeployment]\r
+\r
+    def add(self, nfdeployment: dms.NfDeployment):\r
+        self._add(nfdeployment)\r
+        self.seen.add(nfdeployment)\r
+\r
+    def get(self, nfdeployment_id) -> dms.NfDeployment:\r
+        nfdeployment = self._get(nfdeployment_id)\r
+        if nfdeployment:\r
+            self.seen.add(nfdeployment)\r
+        return nfdeployment\r
+\r
+    def list(self) -> List[dms.NfDeployment]:\r
+        return self._list()\r
+\r
+    def update(self, id, **kwargs):\r
+        self._update(id, **kwargs)\r
+\r
+    def delete(self, nfdeployment_id):\r
+        self._delete(nfdeployment_id)\r
+\r
+    @abc.abstractmethod\r
+    def _add(self, nfdeployment: dms.NfDeployment):\r
+        raise NotImplementedError\r
+\r
+    @abc.abstractmethod\r
+    def _get(self, nfdeployment_id) -> dms.NfDeployment:\r
+        raise NotImplementedError\r
+\r
+    @abc.abstractmethod\r
+    def _update(self,  id, **kwargs):\r
+        raise NotImplementedError\r
+\r
+    @abc.abstractmethod\r
+    def _delete(self, nfdeployment_id):\r
+        raise NotImplementedError\r
+\r
+\r
 class NfDeploymentDescRepository(abc.ABC):\r
     def __init__(self):\r
         self.seen = set()  # type: Set[dms.NfDeploymentDesc]\r
@@ -49,9 +89,49 @@ class NfDeploymentDescRepository(abc.ABC):
         raise NotImplementedError\r
 \r
     @abc.abstractmethod\r
-    def _update(self, nfdeployment_descriptor: dms.NfDeploymentDesc):\r
+    def _update(self,  id, **kwargs):\r
         raise NotImplementedError\r
 \r
     @abc.abstractmethod\r
     def _delete(self, nfdeployment_descriptor_id):\r
         raise NotImplementedError\r
+\r
+\r
+class NfOCloudVResourceRepository(abc.ABC):\r
+    def __init__(self):\r
+        self.seen = set()  # type: Set[dms.NfOCloudVResource]\r
+\r
+    def add(self, nfocloudvres: dms.NfOCloudVResource):\r
+        self._add(nfocloudvres)\r
+        self.seen.add(nfocloudvres)\r
+\r
+    def get(self, nfocloudvres_id) -> dms.NfOCloudVResource:\r
+        nfocloudvres = self._get(nfocloudvres_id)\r
+        if nfocloudvres:\r
+            self.seen.add(nfocloudvres)\r
+        return nfocloudvres\r
+\r
+    def list(self) -> List[dms.NfOCloudVResource]:\r
+        return self._list()\r
+\r
+    def update(self, nfocloudvres_id, **kwargs):\r
+        self._update(nfocloudvres_id, **kwargs)\r
+\r
+    def delete(self, nfocloudvres_id):\r
+        self._delete(nfocloudvres_id)\r
+\r
+    @abc.abstractmethod\r
+    def _add(self, nfocloudvres: dms.NfOCloudVResource):\r
+        raise NotImplementedError\r
+\r
+    @abc.abstractmethod\r
+    def _get(self, nfocloudvres_id) -> dms.NfOCloudVResource:\r
+        raise NotImplementedError\r
+\r
+    @abc.abstractmethod\r
+    def _update(self,  nfocloudvres_id, **kwargs):\r
+        raise NotImplementedError\r
+\r
+    @abc.abstractmethod\r
+    def _delete(self, nfocloudvres_id):\r
+        raise NotImplementedError\r
index 4acc9a3..e52bc3e 100644 (file)
@@ -33,7 +33,7 @@ class DmsDTO:
 
 
 class DmsLcmNfDeploymentDescriptorDTO:
-    dmslcm_NfDeploymentDescriptor_get = api_dms_lcm_v1.model(
+    NfDeploymentDescriptor_get = api_dms_lcm_v1.model(
         "NfDeploymentDescriptorGetDto",
         {
             'id': fields.String(
@@ -65,7 +65,7 @@ class DmsLcmNfDeploymentDescriptorDTO:
     )
 
     NfDeploymentDescriptor_update = api_dms_lcm_v1.model(
-        "NfDeploymentDescriptorCreateDto",
+        "NfDeploymentDescriptorUpdateDto",
         {
             'name': fields.String,
             'description': fields.String,
@@ -73,3 +73,64 @@ class DmsLcmNfDeploymentDescriptorDTO:
             'outputParams': fields.String
         }
     )
+
+
+class DmsLcmNfDeploymentDTO:
+    NfDeployment_get = api_dms_lcm_v1.model(
+        "NfDeploymentGetDto",
+        {
+            'id': fields.String(
+                required=True,
+                description='NfDeployment ID'),
+            'name': fields.String,
+            'description': fields.String,
+            'descriptorId': fields.String,
+            'parentDeploymentId': fields.String,
+            'status': fields.Integer
+        }
+    )
+
+    NfDeployment_create = api_dms_lcm_v1.model(
+        "NfDeploymentCreateDto",
+        {
+            'name': fields.String,
+            'description': fields.String,
+            'descriptorId': fields.String,
+            'parentDeploymentId': fields.String
+        }
+    )
+
+    NfDeployment_create_post_resp = api_dms_lcm_v1.model(
+        "NfDeploymentCreateRespDto",
+        {
+            'id': fields.String(
+                required=True, description='NfDeployment ID'),
+        }
+    )
+
+    NfDeployment_update = api_dms_lcm_v1.model(
+        "NfDeploymentUpdateDto",
+        {
+            'name': fields.String,
+            'description': fields.String,
+            'descriptorId': fields.String,
+            'parentDeploymentId': fields.String
+        }
+    )
+
+
+class DmsLcmNfOCloudVResourceDTO:
+    NfOCloudVResource_get = api_dms_lcm_v1.model(
+        "NfOCloudVResourceGetDto",
+        {
+            'id': fields.String(
+                required=True,
+                description='NfOCloudVResource ID'),
+            'name': fields.String,
+            'description': fields.String,
+            'descriptorId': fields.String,
+            'vresourceType': fields.String,
+            'status': fields.Integer,
+            'metadata': fields.String
+        }
+    )
index ab84fba..186c9c3 100644 (file)
@@ -16,9 +16,10 @@ from sqlalchemy import select
 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.adapter.orm import nfDeploymentDesc, nfDeployment, nfOCloudVResource\r
 from o2dms.views.dms_dto import DmsLcmNfDeploymentDescriptorDTO\r
-from o2dms.domain.dms import NfDeploymentDesc\r
+from o2dms.views.dms_dto import DmsLcmNfDeploymentDTO\r
+from o2dms.domain.dms import NfDeploymentDesc, NfDeployment\r
 \r
 \r
 def deployment_managers(uow: unit_of_work.AbstractUnitOfWork):\r
@@ -91,3 +92,77 @@ def lcm_nfdeploymentdesc_delete(
         uow.nfdeployment_descs.delete(nfdeploymentdescriptorid)\r
         uow.commit()\r
     return True\r
+\r
+\r
+def lcm_nfdeployment_list(\r
+        deploymentManagerID: str, uow: unit_of_work.AbstractUnitOfWork):\r
+    with uow:\r
+        res = uow.session.execute(select(nfDeployment).where(\r
+            nfDeployment.c.deploymentManagerId == deploymentManagerID))\r
+    return [dict(r) for r in res]\r
+\r
+\r
+def lcm_nfdeployment_one(\r
+        nfdeploymentid: str, uow: unit_of_work.AbstractUnitOfWork):\r
+    with uow:\r
+        res = uow.session.execute(select(nfDeployment).where(\r
+            nfDeployment.c.id == nfdeploymentid))\r
+        first = res.first()\r
+    return None if first is None else dict(first)\r
+\r
+\r
+def lcm_nfdeployment_create(\r
+        deploymentManagerId: str,\r
+        input: DmsLcmNfDeploymentDTO.\r
+        NfDeployment_create,\r
+        uow: unit_of_work.AbstractUnitOfWork):\r
+\r
+    id = str(uuid.uuid4())\r
+    entity = NfDeployment(\r
+        id, input['name'], deploymentManagerId, input['description'],\r
+        input['descriptorId'], input['parentDeploymentId'])\r
+    with uow:\r
+        uow.nfdeployments.add(entity)\r
+        uow.commit()\r
+    return id\r
+\r
+\r
+def lcm_nfdeployment_update(\r
+        nfdeploymentdescriptorid: str,\r
+        input: DmsLcmNfDeploymentDTO.NfDeployment_update,\r
+        uow: unit_of_work.AbstractUnitOfWork):\r
+\r
+    with uow:\r
+        entity = uow.nfdeployments.get(nfdeploymentdescriptorid)\r
+        entity.name = input['name']\r
+        entity.description = input['description']\r
+        entity.inputParams = input['descriptorId']\r
+        entity.outputParams = input['parentDeploymentId']\r
+        uow.commit()\r
+    return True\r
+\r
+\r
+def lcm_nfdeployment_delete(\r
+        nfdeploymentdescriptorid: str, uow: unit_of_work.AbstractUnitOfWork):\r
+\r
+    with uow:\r
+        uow.nfdeployments.delete(nfdeploymentdescriptorid)\r
+        uow.commit()\r
+    return True\r
+\r
+\r
+def lcm_nfocloudvresource_list(\r
+        nfDeploymentId: str, uow: unit_of_work.AbstractUnitOfWork):\r
+    with uow:\r
+        res = uow.session.execute(select(nfOCloudVResource).where(\r
+            nfOCloudVResource.c.nfDeploymentId == nfDeploymentId))\r
+    return [dict(r) for r in res]\r
+\r
+\r
+def lcm_nfocloudvresource_one(\r
+        ocloudvresourceId: str, uow: unit_of_work.AbstractUnitOfWork):\r
+    with uow:\r
+        res = uow.session.execute(select(nfOCloudVResource).where(\r
+            nfOCloudVResource.c.id == ocloudvresourceId))\r
+        first = res.first()\r
+    return None if first is None else dict(first)\r
index e9fd2e2..0fc6e69 100644 (file)
@@ -17,6 +17,8 @@ from flask_restx import Resource
 
 from o2common.config import config
 from o2dms.views.dms_dto import DmsDTO, DmsLcmNfDeploymentDescriptorDTO
+from o2dms.views.dms_dto import DmsLcmNfDeploymentDTO
+from o2dms.views.dms_dto import DmsLcmNfOCloudVResourceDTO
 from o2dms.views import dms_lcm_view, api_dms_lcm_v1
 
 apibase = config.get_o2dms_api_base()
@@ -50,7 +52,7 @@ class DmsGetRouter(Resource):
 @api_dms_lcm_v1.response(404, 'DMS LCM not found')
 class DmsLcmNfDeploymentDescListRouter(Resource):
 
-    model = DmsLcmNfDeploymentDescriptorDTO.dmslcm_NfDeploymentDescriptor_get
+    model = DmsLcmNfDeploymentDescriptorDTO.NfDeploymentDescriptor_get
 
     createdto = DmsLcmNfDeploymentDescriptorDTO.NfDeploymentDescriptor_create
     post_resp = DmsLcmNfDeploymentDescriptorDTO.\
@@ -82,7 +84,7 @@ class DmsLcmNfDeploymentDescListRouter(Resource):
 @api_dms_lcm_v1.response(404, 'DMS LCM not found')
 class DmsLcmNfDeploymentDescGetRouter(Resource):
 
-    model = DmsLcmNfDeploymentDescriptorDTO.dmslcm_NfDeploymentDescriptor_get
+    model = DmsLcmNfDeploymentDescriptorDTO.NfDeploymentDescriptor_get
     updatedto = DmsLcmNfDeploymentDescriptorDTO.\
         NfDeploymentDescriptor_update
 
@@ -114,6 +116,127 @@ class DmsLcmNfDeploymentDescGetRouter(Resource):
         return '', 204
 
 
+# LCM services #
+@api_dms_lcm_v1\
+    .route("/<deploymentManagerID>/O2dms_DeploymentLifecycle/"
+           "NfDeployment")
+@api_dms_lcm_v1\
+    .param('deploymentManagerID', 'ID of the deployment manager')
+@api_dms_lcm_v1.response(404, 'DMS LCM not found')
+class DmsLcmNfDeploymentListRouter(Resource):
+
+    model = DmsLcmNfDeploymentDTO.NfDeployment_get
+
+    createdto = DmsLcmNfDeploymentDTO.NfDeployment_create
+    post_resp = DmsLcmNfDeploymentDTO.\
+        NfDeployment_create_post_resp
+
+    @api_dms_lcm_v1.doc('Get a list of NfDeployment')
+    @api_dms_lcm_v1.marshal_list_with(model)
+    def get(self, deploymentManagerID):
+        return dms_lcm_view.lcm_nfdeployment_list(
+            deploymentManagerID, bus.uow)
+
+    @api_dms_lcm_v1.doc('Create a NfDeployment')
+    @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_nfdeployment_create(
+            deploymentManagerID, data, bus.uow)
+        return {"id": id}, 201
+
+
+@api_dms_lcm_v1\
+    .route("/<deploymentManagerID>/O2dms_DeploymentLifecycle/"
+           "NfDeployment/<nfDeploymentId>")
+@api_dms_lcm_v1\
+    .param('deploymentManagerID', 'ID of the deployment manager')
+@api_dms_lcm_v1.param('nfDeploymentId',
+                      'ID of the NfDeployment')
+@api_dms_lcm_v1.response(404, 'DMS LCM not found')
+class DmsLcmNfDeploymentGetRouter(Resource):
+
+    model = DmsLcmNfDeploymentDTO.NfDeployment_get
+    updatedto = DmsLcmNfDeploymentDTO.\
+        NfDeployment_update
+
+    @api_dms_lcm_v1.doc('Get a NfDeploymentDescriptor')
+    @api_dms_lcm_v1.marshal_with(model)
+    def get(self, nfDeploymentId, deploymentManagerID):
+        result = dms_lcm_view\
+            .lcm_nfdeployment_one(nfDeploymentId, bus.uow)
+        if result is not None:
+            return result
+        api_dms_lcm_v1.abort(
+            404, "NfDeploymentDescriptor {} doesn't exist".format(
+                nfDeploymentId))
+
+    @api_dms_lcm_v1.doc('Update a NfDeployment')
+    @api_dms_lcm_v1.expect(updatedto)
+    def put(self, nfDeploymentId, deploymentManagerID):
+        data = api_dms_lcm_v1.payload
+        dms_lcm_view.lcm_nfdeployment_update(
+            nfDeploymentId, data, bus.uow)
+        return {}, 201
+
+    @api_dms_lcm_v1.doc('Delete NfDeployment by ID')
+    @api_dms_lcm_v1.response(204, 'NfDeployment deleted')
+    def delete(self, nfDeploymentId, deploymentManagerID):
+        with bus.uow:
+            bus.uow.nfdeployments.delete(nfDeploymentId)
+            bus.uow.commit()
+        return '', 204
+
+
+# LCM services #
+@api_dms_lcm_v1\
+    .route("/<deploymentManagerID>/O2dms_DeploymentLifecycle/"
+           "NfDeployment/<nfDeploymentId>/NfOCloudVirtualResource")
+@api_dms_lcm_v1\
+    .param('deploymentManagerID', 'ID of the Deployment Manager')
+@api_dms_lcm_v1.param('nfDeploymentId',
+                      'ID of the NfDeployment')
+@api_dms_lcm_v1.response(404, 'DMS LCM not found')
+class DmsLcmNfOCloudVResListRouter(Resource):
+
+    model = DmsLcmNfOCloudVResourceDTO.NfOCloudVResource_get
+
+    @api_dms_lcm_v1.doc('Get a list of NfOCloudVirtualResource')
+    @api_dms_lcm_v1.marshal_list_with(model)
+    def get(self, nfDeploymentId, deploymentManagerID):
+        return dms_lcm_view.lcm_nfocloudvresource_list(
+            nfDeploymentId, bus.uow)
+
+
+@api_dms_lcm_v1\
+    .route("/<deploymentManagerID>/O2dms_DeploymentLifecycle/"
+           "NfDeployment/<nfDeploymentId>"
+           "NfOCloudVirtualResource/<nfOCloudVirtualResourceId>")
+@api_dms_lcm_v1\
+    .param('deploymentManagerID', 'ID of the deployment manager')
+@api_dms_lcm_v1.param('nfDeploymentId',
+                      'ID of the NfDeployment')
+@api_dms_lcm_v1.param('nfOCloudVirtualResourceId',
+                      'ID of the NfOCloudVirtualResource')
+@api_dms_lcm_v1.response(404, 'DMS LCM not found')
+class DmsLcmNfOCloudVResGetRouter(Resource):
+
+    model = DmsLcmNfOCloudVResourceDTO.NfOCloudVResource_get
+
+    @api_dms_lcm_v1.doc('Get a NfOCloudVirtualResource')
+    @api_dms_lcm_v1.marshal_with(model)
+    def get(self, nfOCloudVirtualResourceId,
+            nfDeploymentId, deploymentManagerID):
+        result = dms_lcm_view\
+            .lcm_nfocloudvresource_one(nfOCloudVirtualResourceId, bus.uow)
+        if result is not None:
+            return result
+        api_dms_lcm_v1.abort(
+            404, "NfOCloudVirtualResource {} doesn't exist".format(
+                nfOCloudVirtualResourceId))
+
+
 def configure_namespace(app, bus_new):
     app.add_namespace(api_dms_lcm_v1, path=apibase)