diff options
author | Fu Jinhua <fu.jinhua@zte.com.cn> | 2018-09-14 00:29:49 +0000 |
---|---|---|
committer | Gerrit Code Review <gerrit@onap.org> | 2018-09-14 00:29:49 +0000 |
commit | bc8b0bb9c90d4e287c96327383e6e37d4b76629d (patch) | |
tree | 369663e0dd0a5c0e684d47de3f7ca9175ed61f7d | |
parent | dbfe80a42cb1dd4724834c612556ac3a0f23e59f (diff) | |
parent | 004ef955dd9fc0fc8b5ce875d3f080c1df4cf5f7 (diff) |
Merge "Fix errors in placeVnf and add test cases"
-rw-r--r-- | lcm/ns_vnfs/biz/place_vnfs.py | 30 | ||||
-rw-r--r-- | lcm/ns_vnfs/tests/tests.py | 309 |
2 files changed, 327 insertions, 12 deletions
diff --git a/lcm/ns_vnfs/biz/place_vnfs.py b/lcm/ns_vnfs/biz/place_vnfs.py index 84577b26..18a529e8 100644 --- a/lcm/ns_vnfs/biz/place_vnfs.py +++ b/lcm/ns_vnfs/biz/place_vnfs.py @@ -30,7 +30,7 @@ class PlaceVnfs(object): logger.error("Error occurred in Homing: OOF Async Callback Response is empty") return False if self.data.get('requestStatus') == "completed": - if self.data.get("solutions").get("placementSolutions"): + if self.data.get("solutions").get("placementSolutions") is not None: self.placements = self.data.get("solutions").get("placementSolutions") logger.debug("Got placement solutions in OOF Async Callback response") return True @@ -39,10 +39,14 @@ class PlaceVnfs(object): "does not contain placement solution") return False else: - logger.error( - "Error occurred in Homing: Request has not been completed, the request status is %s, " - "the status message is %s" % self.data.get('requestStatus'), - self.data.get("statusMessage")) + if self.data.get("statusMessage"): + logger.error( + "Error occurred in Homing: Request has not been completed, the request status is %s, " + "the status message is %s" % (self.data.get('requestStatus'), self.data.get("statusMessage"))) + else: + logger.error( + "Error occurred in Homing: Request has not been completed, the request status is %s, " + % self.data.get('requestStatus')) return False def extract(self): @@ -53,9 +57,14 @@ class PlaceVnfs(object): self.update_response_to_db(self.data.get("requestId"), self.data.get("transactionId"), self.data.get("requestStatus"), "none", "none", "none", "none") return + if self.placements == [] or self.placements == [[]]: + logger.debug("No solution found for request %s " % self.data.get("requestId")) + self.update_response_to_db(self.data.get("requestId"), self.data.get("transactionId"), + self.data.get("requestStatus"), "no-solution", "no-solution", + "no-solution", "no-solution") + return for item in self.placements: - if not item: - logger.debug("No solution found for request %s " % self.data.get("requestId")) + if not isinstance(item, list): self.update_response_to_db(self.data.get("requestId"), self.data.get("transactionId"), self.data.get("requestStatus"), "no-solution", "no-solution", "no-solution", "no-solution") @@ -94,8 +103,7 @@ class PlaceVnfs(object): transactionId=self.data.get("transactionId"), requestStatus=self.data.get("requestStatus"), vimId=vim_info['vimId'], - cloudOwner=placement.get("solution").get( - "cloudOwner"), + cloudOwner=placement.get("solution").get("cloudOwner"), cloudRegionId=vim_info['locationId'], vduInfo=vduinfo ) @@ -106,7 +114,7 @@ class PlaceVnfs(object): def get_info_from_directives(self, directives): vduinfo = [] - for directive in directives: + for directive in directives.get("directives"): if directive.get("type") == "tocsa.nodes.nfv.Vdu.Compute": vdu = {"vduName": directive.get("id")} other_directives = [] @@ -137,5 +145,5 @@ class PlaceVnfs(object): vim_id=vimId, cloud_owner=cloudOwner, cloud_region_id=cloudRegionId, - vduinfo=vduInfo + vdu_info=vduInfo ) diff --git a/lcm/ns_vnfs/tests/tests.py b/lcm/ns_vnfs/tests/tests.py index b70d00e3..2490b92e 100644 --- a/lcm/ns_vnfs/tests/tests.py +++ b/lcm/ns_vnfs/tests/tests.py @@ -18,7 +18,7 @@ import mock from django.test import TestCase, Client from rest_framework import status -from lcm.pub.database.models import NfInstModel, JobModel, NSInstModel, VmInstModel +from lcm.pub.database.models import NfInstModel, JobModel, NSInstModel, VmInstModel, OOFDataModel from lcm.pub.exceptions import NSLCMException from lcm.pub.utils import restcall from lcm.pub.utils.jobutil import JOB_MODEL_STATUS @@ -31,6 +31,7 @@ from lcm.ns_vnfs.biz.scale_vnfs import NFManualScaleService 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 class TestGetVnfViews(TestCase): @@ -630,6 +631,218 @@ class TestGetVimInfoViews(TestCase): self.assertEqual(expect_data["url"], context["url"]) +class TestPlaceVnfViews(TestCase): + def setUp(self): + self.vnf_inst_id = "1234" + self.vnf_inst_name = "vG" + self.client = Client() + OOFDataModel.objects.all().delete() + OOFDataModel.objects.create( + request_id="1234", + transaction_id="1234", + request_status="init", + request_module_name=self.vnf_inst_name, + service_resource_id=self.vnf_inst_id, + vim_id="", + cloud_owner="", + cloud_region_id="", + vdu_info="", + ) + + def tearDown(self): + OOFDataModel.objects.all().delete() + + @mock.patch.object(restcall, 'call_req') + def test_place_vnf(self, mock_call_req): + vdu_info_json = [{ + "vduName": "vG_0", + "flavorName": "HPA.flavor.1", + "directive": [] + }] + PlaceVnfs(vnf_place_request).extract() + db_info = OOFDataModel.objects.filter(request_id=vnf_place_request.get("requestId"), transaction_id=vnf_place_request.get("transactionId")) + self.assertEqual(db_info[0].request_status, "completed") + self.assertEqual(db_info[0].vim_id, "CloudOwner1_DLLSTX1A") + self.assertEqual(db_info[0].cloud_owner, "CloudOwner1") + self.assertEqual(db_info[0].cloud_region_id, "DLLSTX1A") + self.assertEqual(db_info[0].vdu_info, json.dumps(vdu_info_json)) + + def test_place_vnf_with_invalid_response(self): + resp = { + "requestId": "1234", + "transactionId": "1234", + "statusMessage": "xx", + "requestStatus": "pending", + "solutions": { + "placementSolutions": [ + [ + { + "resourceModuleName": self.vnf_inst_name, + "serviceResourceId": self.vnf_inst_id, + "solution": { + "identifierType": "serviceInstanceId", + "identifiers": [ + "xx" + ], + "cloudOwner": "CloudOwner1 " + }, + "assignmentInfo": [] + } + ] + ], + "licenseSolutions": [ + { + "resourceModuleName": "string", + "serviceResourceId": "string", + "entitlementPoolUUID": [ + "string" + ], + "licenseKeyGroupUUID": [ + "string" + ], + "entitlementPoolInvariantUUID": [ + "string" + ], + "licenseKeyGroupInvariantUUID": [ + "string" + ] + } + ] + } + } + 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, "pending") + 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") + + def test_place_vnf_with_no_assignment_info(self): + resp = { + "requestId": "1234", + "transactionId": "1234", + "statusMessage": "xx", + "requestStatus": "completed", + "solutions": { + "placementSolutions": [ + [ + { + "resourceModuleName": self.vnf_inst_name, + "serviceResourceId": self.vnf_inst_id, + "solution": { + "identifierType": "serviceInstanceId", + "identifiers": [ + "xx" + ], + "cloudOwner": "CloudOwner1 " + } + } + ] + ], + "licenseSolutions": [ + { + "resourceModuleName": "string", + "serviceResourceId": "string", + "entitlementPoolUUID": [ + "string" + ], + "licenseKeyGroupUUID": [ + "string" + ], + "entitlementPoolInvariantUUID": [ + "string" + ], + "licenseKeyGroupInvariantUUID": [ + "string" + ] + } + ] + } + } + 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, "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") + + def test_place_vnf_no_directives(self): + resp = { + "requestId": "1234", + "transactionId": "1234", + "statusMessage": "xx", + "requestStatus": "completed", + "solutions": { + "placementSolutions": [ + [ + { + "resourceModuleName": self.vnf_inst_name, + "serviceResourceId": self.vnf_inst_id, + "solution": { + "identifierType": "serviceInstanceId", + "identifiers": [ + "xx" + ], + "cloudOwner": "CloudOwner1 " + }, + "assignmentInfo": [ + {"key": "locationId", + "value": "DLLSTX1A" + } + ] + } + ] + ], + "licenseSoutions": [ + { + "resourceModuleName": "string", + "serviceResourceId": "string", + "entitlementPoolUUID": [ + "string" + ], + "licenseKeyGroupUUID": [ + "string" + ], + "entitlementPoolInvariantUUID": [ + "string" + ], + "licenseKeyGroupInvariantUUID": [ + "string" + ] + } + ] + } + } + 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, "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") + + def test_place_vnf_with_no_solution(self): + resp = { + "requestId": "1234", + "transactionId": "1234", + "statusMessage": "xx", + "requestStatus": "completed", + "solutions": { + "placementSolutions": [], + "licenseSoutions": [] + } + } + 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") + + vnfd_model_dict = { 'local_storages': [], 'vdus': [ @@ -1377,3 +1590,97 @@ nf_package_info = { }, "imageInfo": [] } + +vnf_place_request = { + "requestId": "1234", + "transactionId": "1234", + "statusMessage": "xx", + "requestStatus": "completed", + "solutions": { + "placementSolutions": [ + [ + { + "resourceModuleName": "vG", + "serviceResourceId": "1234", + "solution": { + "identifierType": "serviceInstanceId", + "identifiers": [ + "xx" + ], + "cloudOwner": "CloudOwner1" + }, + "assignmentInfo": [ + {"key": "isRehome", + "value": "false" + }, + {"key": "locationId", + "value": "DLLSTX1A" + }, + {"key": "locationType", + "value": "openstack-cloud" + }, + {"key": "vimId", + "value": "CloudOwner1_DLLSTX1A" + }, + {"key": "physicalLocationId", + "value": "DLLSTX1223" + }, + {"key": "oofDirectives", + "value": { + "directives": [ + { + "id": "vG_0", + "type": "tocsa.nodes.nfv.Vdu.Compute", + "directives": [ + { + "type": "flavor_directive", + "attributes": [ + { + "attribute_name": "flavor_name", + "attribute_value": "HPA.flavor.1" + } + ] + } + ] + }, + { + "id": "", + "type": "vnf", + "directives": [ + {"type": " ", + "attributes": [ + { + "attribute_name": " ", + "attribute_value": " " + } + ] + } + ] + } + ] + } + } + ] + } + ] + ], + "licenseSolutions": [ + { + "resourceModuleName": "string", + "serviceResourceId": "string", + "entitlementPoolUUID": [ + "string" + ], + "licenseKeyGroupUUID": [ + "string" + ], + "entitlementPoolInvariantUUID": [ + "string" + ], + "licenseKeyGroupInvariantUUID": [ + "string" + ] + } + ] + } +} |