diff options
-rwxr-xr-x | docker/Dockerfile | 2 | ||||
-rw-r--r-- | lcm/ns_vnfs/biz/grant_vnf.py | 10 | ||||
-rw-r--r-- | lcm/ns_vnfs/biz/place_vnfs.py | 17 | ||||
-rw-r--r-- | lcm/ns_vnfs/serializers/serializers.py | 72 | ||||
-rw-r--r-- | lcm/ns_vnfs/tests/tests.py | 42 |
5 files changed, 93 insertions, 50 deletions
diff --git a/docker/Dockerfile b/docker/Dockerfile index 32fc8020..2caaf3ee 100755 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -28,7 +28,7 @@ ADD . /service WORKDIR /service # get binary zip from nexus - vfc-nfvo-lcm -RUN wget -q -O vfc-nfvo-lcm.zip 'https://nexus.onap.org/service/local/artifact/maven/redirect?r=snapshots&g=org.onap.vfc.nfvo.lcm&a=vfc-nfvo-lcm&v=LATEST&e=zip' && \ +RUN wget -q -O vfc-nfvo-lcm.zip 'https://nexus.onap.org/service/local/artifact/maven/redirect?r=staging&g=org.onap.vfc.nfvo.lcm&a=vfc-nfvo-lcm&v=LATEST&e=zip' && \ unzip vfc-nfvo-lcm.zip && \ rm -rf vfc-nfvo-lcm.zip diff --git a/lcm/ns_vnfs/biz/grant_vnf.py b/lcm/ns_vnfs/biz/grant_vnf.py index faeebecb..6987fc07 100644 --- a/lcm/ns_vnfs/biz/grant_vnf.py +++ b/lcm/ns_vnfs/biz/grant_vnf.py @@ -105,12 +105,14 @@ class GrantVnf(object): offs = OOFDataModel.objects.filter(service_resource_id=ignore_case_get(self.data, "vnfInstanceId")) if offs.exists(): - for off in offs: + vdu_info = json.loads(offs[0].vdu_info) + grant_resp['vimAssets'] = {'computeResourceFlavours': []} + for vdu in vdu_info: grant_resp['vimAssets']['computeResourceFlavours'].append({ - 'vimConnectionId': off.vim_id, - 'resourceProviderId': off.vdu_name, + 'vimConnectionId': offs[0].vim_id, + 'resourceProviderId': vdu.get("vduName"), 'vnfdVirtualComputeDescId': None, # TODO: required - 'vimFlavourId': off.flavor_name + 'vimFlavourId': vdu.get("flavorName") }) # grant_resp['additionalparams'][off.vim_id] = off.directive diff --git a/lcm/ns_vnfs/biz/place_vnfs.py b/lcm/ns_vnfs/biz/place_vnfs.py index a63c04e3..e288f9dd 100644 --- a/lcm/ns_vnfs/biz/place_vnfs.py +++ b/lcm/ns_vnfs/biz/place_vnfs.py @@ -64,14 +64,14 @@ class PlaceVnfs(object): if self.placements == [] or self.placements == [[]]: logger.debug("No solution found for request %s " % self.request_id) self.update_response_to_db(self.request_id, self.transaction_id, - self.data.get("requestStatus"), "no-solution", "no-solution", - "no-solution", "no-solution") + self.data.get("requestStatus"), "none", "none", + "none", "none") return for item in self.placements: if not isinstance(item, list): self.update_response_to_db(self.request_id, self.transaction_id, - self.data.get("requestStatus"), "no-solution", "no-solution", - "no-solution", "no-solution") + self.data.get("requestStatus"), "none", "none", + "none", "none") continue for placement in item: assignmentInfo = placement.get("assignmentInfo") @@ -106,8 +106,15 @@ class PlaceVnfs(object): cloud_owner = placement.get("solution").get("cloudOwner") \ if placement.get("solution").get("cloudOwner") \ else vim_info.get("cloudOwner") + location_id = vim_info.get("locationId") + if not cloud_owner or not location_id: + self.update_response_to_db(self.request_id, + self.transaction_id, + self.data.get("requestStatus"), "none", "none", + "none", "none") + return vim_id = vim_info['vimId'] if vim_info.get('vimId') \ - else cloud_owner + "_" + vim_info.get("locationId") + else cloud_owner + "_" + location_id self.update_response_to_db(requestId=self.request_id, transactionId=self.transaction_id, requestStatus=self.data.get("requestStatus"), diff --git a/lcm/ns_vnfs/serializers/serializers.py b/lcm/ns_vnfs/serializers/serializers.py index 7dd01150..0d7b8a84 100644 --- a/lcm/ns_vnfs/serializers/serializers.py +++ b/lcm/ns_vnfs/serializers/serializers.py @@ -18,7 +18,7 @@ from rest_framework import serializers class InstVnfReqSerializer(serializers.Serializer): vnfIndex = serializers.CharField(help_text="Index of VNF", required=True) nsInstanceId = serializers.CharField(help_text="ID of NS instance", required=True) - additionalParamForVnf = serializers.CharField(help_text="Additional param for VNF", required=False, allow_null=True) + additionalParamForVnf = serializers.CharField(help_text="Additional param for VNF", required=False, allow_null=True, allow_blank=True) class InstVnfRespSerializer(serializers.Serializer): @@ -28,7 +28,7 @@ class InstVnfRespSerializer(serializers.Serializer): class VnfVmsSerializer(serializers.Serializer): vmID = serializers.CharField(help_text="ID of VM", required=True) - vmName = serializers.CharField(help_text="Name of VM", required=False, allow_null=True) + vmName = serializers.CharField(help_text="Name of VM", required=False, allow_null=True, allow_blank=True) class GetVnfRespSerializer(serializers.Serializer): @@ -40,7 +40,7 @@ class GetVnfRespSerializer(serializers.Serializer): class TerminateVnfReqSerializer(serializers.Serializer): terminationType = serializers.CharField(help_text="Termination Type", required=False, allow_null=True) - gracefulTerminationTimeout = serializers.CharField(help_text="Graceful Termination Timeout", required=False, allow_null=True) + gracefulTerminationTimeout = serializers.CharField(help_text="Graceful Termination Timeout", required=False, allow_null=True, allow_blank=True) class TerminateVnfRespSerializer(serializers.Serializer): @@ -49,19 +49,19 @@ class TerminateVnfRespSerializer(serializers.Serializer): class ResourceChangeSerializer(serializers.Serializer): type = serializers.ChoiceField(help_text="Change Type", choices=["VDU"], required=True) - resourceDefinitionId = serializers.CharField(help_text="Identifier of resource", required=False, allow_null=True) - vdu = serializers.CharField(help_text="Identifier identifier of VDU", required=False, allow_null=True) + resourceDefinitionId = serializers.CharField(help_text="Identifier of resource", required=False, allow_null=True, allow_blank=True) + vdu = serializers.CharField(help_text="Identifier identifier of VDU", required=False, allow_null=True, allow_blank=True) class GrantVnfReqSerializer(serializers.Serializer): vnfInstanceId = serializers.CharField(help_text="ID of VNF instance", required=True) - vnfDescriptorId = serializers.CharField(help_text="ID of VNF Descriptor", required=False, allow_null=True) + vnfDescriptorId = serializers.CharField(help_text="ID of VNF Descriptor", required=False, allow_null=True, allow_blank=True) lifecycleOperation = serializers.ChoiceField( help_text="Lifecycle Operation", choices=["Terminal", "Instantiate", "Scalein", "Scaleout", "Scaledown", "Scaleup", "Heal"], required=True ) - jobId = serializers.CharField(help_text="ID of Job", required=False, allow_null=True) + jobId = serializers.CharField(help_text="ID of Job", required=False, allow_null=True, allow_blank=True) addResource = ResourceChangeSerializer(help_text="Add resources", many=True) removeResource = ResourceChangeSerializer(help_text="Remove resources", many=True) additionalParam = serializers.DictField( @@ -83,21 +83,21 @@ class VimSerializer(serializers.Serializer): class GrantVnfRespSerializer(serializers.Serializer): - vnfInstanceId = serializers.CharField(help_text="ID of VNF instance", required=False, allow_null=True) + vnfInstanceId = serializers.CharField(help_text="ID of VNF instance", required=False, allow_null=True, allow_blank=True) vim = VimSerializer(help_text="VIM Info", required=True) class AffectedVnfcSerializer(serializers.Serializer): - vnfcInstanceId = serializers.CharField(help_text="ID of VNFC instance", required=False, allow_null=True) - vduId = serializers.CharField(help_text="ID of VDU in VNFD", required=False, allow_null=True) + vnfcInstanceId = serializers.CharField(help_text="ID of VNFC instance", required=False, allow_null=True, allow_blank=True) + vduId = serializers.CharField(help_text="ID of VDU in VNFD", required=False, allow_null=True, allow_blank=True) changeType = serializers.ChoiceField( help_text="Type of Change", choices=["added", "removed", "modified"], required=True ) - vimId = serializers.CharField(help_text="ID of VIM", required=False, allow_null=True) - vmId = serializers.CharField(help_text="ID of virtual machine", required=False, allow_null=True) - vmName = serializers.CharField(help_text="Name of virtual machine", required=False, allow_null=True) + vimId = serializers.CharField(help_text="ID of VIM", required=False, allow_null=True, allow_blank=True) + vmId = serializers.CharField(help_text="ID of virtual machine", required=False, allow_null=True, allow_blank=True) + vmName = serializers.CharField(help_text="Name of virtual machine", required=False, allow_null=True, allow_blank=True) class NetworkResourceSerializer(serializers.Serializer): @@ -106,13 +106,13 @@ class NetworkResourceSerializer(serializers.Serializer): choices=["network", "port"], required=True ) - resourceId = serializers.CharField(help_text="ID of network resource", required=False, allow_null=True) - resourceName = serializers.CharField(help_text="Name of network resource", required=False, allow_null=True) + resourceId = serializers.CharField(help_text="ID of network resource", required=False, allow_null=True, allow_blank=True) + resourceName = serializers.CharField(help_text="Name of network resource", required=False, allow_null=True, allow_blank=True) class AffectedVirtualLinkSerializer(serializers.Serializer): - vlInstanceId = serializers.CharField(help_text="ID of VL instance", required=False, allow_null=True) - vldId = serializers.CharField(help_text="ID of VLD in VNFD", required=False, allow_null=True) + vlInstanceId = serializers.CharField(help_text="ID of VL instance", required=False, allow_null=True, allow_blank=True) + vldId = serializers.CharField(help_text="ID of VLD in VNFD", required=False, allow_null=True, allow_blank=True) changeType = serializers.ChoiceField( help_text="Type of Change", choices=["added", "removed", "modified"], @@ -122,13 +122,13 @@ class AffectedVirtualLinkSerializer(serializers.Serializer): class PortResourceSerializer(serializers.Serializer): - vimId = serializers.CharField(help_text="ID of VIM", required=False, allow_null=True) - resourceId = serializers.CharField(help_text="ID of Resource", required=False, allow_null=True) - resourceName = serializers.CharField(help_text="Name of Resource", required=False, allow_null=True) - tenant = serializers.CharField(help_text="ID of Tenant", required=False, allow_null=True) - ipAddress = serializers.CharField(help_text="IP address of port", required=False, allow_null=True) - macAddress = serializers.CharField(help_text="MAC address of port", required=False, allow_null=True) - instId = serializers.CharField(help_text="Instance id of server to which the port is attached to", required=False, allow_null=True) + vimId = serializers.CharField(help_text="ID of VIM", required=False, allow_null=True, allow_blank=True) + resourceId = serializers.CharField(help_text="ID of Resource", required=False, allow_null=True, allow_blank=True) + resourceName = serializers.CharField(help_text="Name of Resource", required=False, allow_null=True, allow_blank=True) + tenant = serializers.CharField(help_text="ID of Tenant", required=False, allow_null=True, allow_blank=True) + ipAddress = serializers.CharField(help_text="IP address of port", required=False, allow_null=True, allow_blank=True) + macAddress = serializers.CharField(help_text="MAC address of port", required=False, allow_null=True, allow_blank=True) + instId = serializers.CharField(help_text="Instance id of server to which the port is attached to", required=False, allow_null=True, allow_blank=True) class AffectedCpSerializer(serializers.Serializer): @@ -137,11 +137,11 @@ class AffectedCpSerializer(serializers.Serializer): choices=["added", "removed", "modified"], required=True ) - virtualLinkInstanceId = serializers.CharField(help_text="ID of VL instance", required=False, allow_null=True) - cpInstanceId = serializers.CharField(help_text="ID of CP instance", required=False, allow_null=True) - cpdId = serializers.CharField(help_text="ID of CPD in VNFD", required=False, allow_null=True) - ownerType = serializers.CharField(help_text="Type of Owner", required=False, allow_null=True) - ownerId = serializers.CharField(help_text="ID of Owner", required=False, allow_null=True) + virtualLinkInstanceId = serializers.CharField(help_text="ID of VL instance", required=False, allow_null=True, allow_blank=True) + cpInstanceId = serializers.CharField(help_text="ID of CP instance", required=False, allow_null=True, allow_blank=True) + cpdId = serializers.CharField(help_text="ID of CPD in VNFD", required=False, allow_null=True, allow_blank=True) + ownerType = serializers.CharField(help_text="Type of Owner", required=False, allow_null=True, allow_blank=True) + ownerId = serializers.CharField(help_text="ID of Owner", required=False, allow_null=True, allow_blank=True) portResource = PortResourceSerializer(help_text="Port Resource", required=False, allow_null=True) @@ -160,8 +160,8 @@ class NotifyLcmReqSerializer(serializers.Serializer): choices=["Terminal", "Instantiate", "Scalein", "Scaleout", "Scaledown", "Scaleup", "Heal"], required=True ) - jobId = serializers.CharField(help_text="ID of Job", required=False, allow_null=True) - vnfdmodule = serializers.CharField(help_text="VNFD Module", required=False, allow_null=True) + jobId = serializers.CharField(help_text="ID of Job", required=False, allow_null=True, allow_blank=True) + vnfdmodule = serializers.CharField(help_text="VNFD Module", required=False, allow_null=True, allow_blank=True) affectedVnfc = AffectedVnfcSerializer(help_text="Affected VNFC", many=True) affectedVl = AffectedVirtualLinkSerializer(help_text="Affected VL", many=True) affectedCp = AffectedCpSerializer(help_text="Affected CP", many=True) @@ -174,8 +174,8 @@ class ScaleVnfDataSerializer(serializers.Serializer): choices=["SCALE_IN", "SCALE_OUT"], required=True ) - aspectId = serializers.CharField(help_text="Aspect ID of the VNF that is requested to be scaled", required=False, allow_null=True) - numberOfSteps = serializers.CharField(help_text="Number of scaling steps to be executed as part of this ScaleVnf operation", required=False, allow_null=True) + aspectId = serializers.CharField(help_text="Aspect ID of the VNF that is requested to be scaled", required=False, allow_null=True, allow_blank=True) + numberOfSteps = serializers.CharField(help_text="Number of scaling steps to be executed as part of this ScaleVnf operation", required=False, allow_null=True, allow_blank=True) additionalParam = serializers.DictField( help_text="Additional parameters passed by the NFVO as input to the scaling process, specific to the VNF being scaled", child=serializers.CharField(help_text="Additional parameters", allow_blank=True), @@ -246,7 +246,7 @@ class CandidateSerializer(serializers.Serializer): required=True ) cloudOwner = serializers.CharField( - help_text="The name of a cloud owner. Only required if identifier Type is cloudRegionId", required=False) + help_text="The name of a cloud owner. Only required if identifier Type is cloudRegionId", required=False, allow_null=True, allow_blank=True) class LicenseSolutionSerializer(serializers.Serializer): @@ -306,8 +306,8 @@ class SolutionSerializer(serializers.Serializer): class PlaceVnfReqSerializer(serializers.Serializer): requestId = serializers.CharField(help_text="ID of Homing Request", required=True) - transactionId = serializers.CharField(help_text="ID of Homing Transaction", required=True, allow_null=False) - statusMessage = serializers.CharField(help_text="Status Message of Request", required=False, allow_null=True) + transactionId = serializers.CharField(help_text="ID of Homing Transaction", required=True, allow_null=False, allow_blank=True) + statusMessage = serializers.CharField(help_text="Status Message of Request", required=False, allow_null=True, allow_blank=True) requestStatus = serializers.ChoiceField( help_text="The Status of a Request", choices=["completed", "failed", "pending"], diff --git a/lcm/ns_vnfs/tests/tests.py b/lcm/ns_vnfs/tests/tests.py index db5931e9..422182ad 100644 --- a/lcm/ns_vnfs/tests/tests.py +++ b/lcm/ns_vnfs/tests/tests.py @@ -26,6 +26,7 @@ from lcm.pub.utils.jobutil import JobUtil, JOB_TYPE from lcm.pub.utils.timeutil import now_time from lcm.pub.utils.values import ignore_case_get from lcm.ns_vnfs.biz.create_vnfs import CreateVnfs +from lcm.ns_vnfs.biz.grant_vnf import GrantVnf from lcm.ns_vnfs.biz.heal_vnfs import NFHealService from lcm.ns_vnfs.biz.scale_vnfs import NFManualScaleService from lcm.ns_vnfs.biz.subscribe import SubscriptionDeletion @@ -33,6 +34,7 @@ from lcm.ns_vnfs.biz.terminate_nfs import TerminateVnfs from lcm.ns_vnfs.const import VNF_STATUS, INST_TYPE from lcm.ns_vnfs.biz import create_vnfs from lcm.ns_vnfs.biz.place_vnfs import PlaceVnfs +from lcm.pub.msapi import resmgr class TestGetVnfViews(TestCase): @@ -930,10 +932,42 @@ class TestPlaceVnfViews(TestCase): PlaceVnfs(resp).extract() db_info = OOFDataModel.objects.filter(request_id=resp.get("requestId"), transaction_id=resp.get("transactionId")) self.assertEqual(db_info[0].request_status, "completed") - self.assertEqual(db_info[0].vim_id, "no-solution") - self.assertEqual(db_info[0].cloud_owner, "no-solution") - self.assertEqual(db_info[0].cloud_region_id, "no-solution") - self.assertEqual(db_info[0].vdu_info, "no-solution") + self.assertEqual(db_info[0].vim_id, "none") + self.assertEqual(db_info[0].cloud_owner, "none") + self.assertEqual(db_info[0].cloud_region_id, "none") + self.assertEqual(db_info[0].vdu_info, "none") + + +class TestGrantVnfViews(TestCase): + def setUp(self): + self.vnf_inst_id = str(uuid.uuid4()) + self.data = { + "vnfInstanceId": self.vnf_inst_id, + "vnfLcmOpOccId": "1234" + } + vdu_info_dict = [{"vduName": "vg", "flavorName": "flavor_1", "directive": []}] + OOFDataModel(request_id='1234', transaction_id='1234', request_status='done', request_module_name='vg', + service_resource_id=self.vnf_inst_id, vim_id='cloudOwner_casa', cloud_owner='cloudOwner', + cloud_region_id='casa', vdu_info=json.dumps(vdu_info_dict)).save() + + def tearDown(self): + OOFDataModel.objects.all().delete() + + @mock.patch.object(resmgr, "grant_vnf") + def test_exec_grant(self, mock_grant): + resmgr_grant_resp = { + "vim": { + "vimId": "cloudOwner_casa", + "accessInfo": { + "tenant": "tenantA" + } + } + } + mock_grant.return_value = resmgr_grant_resp + resp = GrantVnf(self.data).exec_grant() + self.assertEquals(resp['vimAssets']['computeResourceFlavours'][0]['vimConnectionId'], 'cloudOwner_casa') + self.assertEquals(resp['vimAssets']['computeResourceFlavours'][0]['resourceProviderId'], 'vg') + self.assertEquals(resp['vimAssets']['computeResourceFlavours'][0]['vimFlavourId'], 'flavor_1') vnfd_model_dict = { |