From 89b6e7c193199259cda3f01b46082cc4e8cc9ffd Mon Sep 17 00:00:00 2001 From: hongyuzhao Date: Mon, 15 Jul 2019 15:22:28 +0800 Subject: [PATCH] improve code coverage rate (scale vnf) after vfclcm upgraded from python2 to python3 Change-Id: I7ce2ada651e5b8fe84deac87e82c8791cf6f5916 Issue-ID: VFC-1429 Signed-off-by: hongyuzhao --- lcm/lcm/nf/tests/const.py | 265 ++++++++++++++++++++++++++++++++++-- lcm/lcm/nf/tests/test_scale_vnf.py | 267 ++++++++++++++++++++++++++++++++++++- 2 files changed, 519 insertions(+), 13 deletions(-) diff --git a/lcm/lcm/nf/tests/const.py b/lcm/lcm/nf/tests/const.py index 7debe6bc..c9509513 100644 --- a/lcm/lcm/nf/tests/const.py +++ b/lcm/lcm/nf/tests/const.py @@ -18,14 +18,13 @@ instantiate_grant_result = { { "vimid": 'vim_1', "accessInfo": - { - "tenant": 'chinamobile' - } + { + "tenant": 'chinamobile' + } }, ], "vnfId": "413aa1fe-b4d1-11e8-8268-dff5aab95c63", - "vimAssets": - { + "vimAssets": { "computeResourceFlavours": [ { "resourceProviderId": "vgw", @@ -36,7 +35,6 @@ instantiate_grant_result = { } } - inst_req_data = { "flavourId": "flavour_1", "instantiationLevelId": "instantiationLevel_1", @@ -122,7 +120,6 @@ inst_req_data = { } } - vnfd_model_dict = { 'metadata': { 'vendor': 'zte', @@ -443,7 +440,6 @@ c1_data_get_tenant_id_1 = { ] } - # create_volume c2_data_create_volume = { "id": "4bd3e9eb-cd8b-456a-8589-910836a0ab31", @@ -835,7 +831,6 @@ vnfpackage_info = { } } - single_vnf_lcm_op = { "id": "99442b18-a5c7-11e8-998c-bf1755941f16", "operationState": "STARTING", @@ -860,7 +855,6 @@ single_vnf_lcm_op = { } } - vnflcmop_with_exclude_default = [{ "id": "99442b18-a5c7-11e8-998c-bf1755941f16", "operationState": "STARTING", @@ -880,7 +874,6 @@ vnflcmop_with_exclude_default = [{ } }] - multiple_vnf_lcm_op = [{ "id": "a6b9415c-ab99-11e8-9d37-dbb5e0378955", "operationState": "STARTING", @@ -1172,3 +1165,253 @@ multiple_vnf_lcm_op = [{ # } # } # } +vnfd_for_scale = { + "volume_storages": [], + "vnf": { + "type": "tosca.nodes.nfv.VNF", + "requirements": { + "virtual_link": [ + "ext_cp", + "virtual_link" + ] + }, + "properties": { + "descriptor_id": "b1bb0ce7-1234-4fa7-95ed-4840d70a1179", + "flavour_description": "simple", + "descriptor_verison": "1.0", + "software_version": "1.0.0", + "template_name": "test", + "vnfm_info": [ + "vnfm" + ], + "descriptor_version": "1.0.0", + "provider": "zte", + "flavour_id": "simple", + "product_name": "test" + }, + "capabilities": { + + }, + "metadata": { + "template_name": "test", + "template_version": "1.0", + "template_author": "ZTE" + } + }, + "vdus": [ + { + "description": "", + "virtual_storages": [ + + ], + "vdu_id": "sunshine", + "artifacts": [ + { + "artifact_name": "sw_image", + "type": "tosca.artifacts.nfv.SwImage", + "file": "sss.vmdk" + } + ], + "dependencies": [ + + ], + "virtual_compute": { + "virtual_cpu": { + "num_virtual_cpu": 2 + }, + "virtual_memory": { + "virtual_mem_size": "4096 MB" + }, + "virtual_local_storage": [ + { + "size_of_storage": "40 GB" + } + ] + }, + "vls": [ + + ], + "cps": [ + "ext_cp" + ], + "type": "tosca.nodes.nfv.Vdu.Compute", + "properties": { + "vdu_profile": { + "max_number_of_instances": 3, + "min_number_of_instances": 1 + }, + "name": "sunshine1234", + "sw_image_data": { + "operating_system": "linux", + "name": "ubuntu", + "checksum": { + "hash": "d0e7828293355a07c2dccaaa765c80b507e60e6167067c950dc2e6b0da0dbd34", + "algorithm": "SHA-256" + }, + "min_ram": "2 GB", + "disk_format": "qcow2", + "version": 16.04, + "container_format": "bare", + "min_disk": "2 GB", + "size": "2 GB" + }, + "description": "vdu test", + "location_info": { + "vimid": "", + "tenant": "", + "availability_zone": "", + "vnfId": "", + "vnfName": "", + "cloudOwner": "", + "cloudRegionId": "", + "vduInfo": [ + { + "vduName": "sunshine1234", + "flavorId": "12345", + "directive": "" + } + ] + } + } + } + ], + "description": "test", + "inputs": { + + }, + "graph": { + "sunshine": [ + "ext_cp" + ], + "ext_cp": [ + + ] + }, + "basepath": "/tmp/tmpil6wVG", + "vnf_exposed": { + "external_cps": [ + { + "key_name": "virtual_link", + "cpd_id": "ext_cp" + } + ], + "forward_cps": [ + + ] + }, + "policies": [ + { + "type": "tosca.policies.nfv.InstantiationLevels", + "targets": "", + "properties": { + "default_level": "instantiation_level_1", + "levels": { + "instantiation_level_1": { + "scale_info": { + "sunshine_aspect": { + "scale_level": 0 + } + }, + "description": "vnf test instantiation_level_1" + }, + "instantiation_level_2": { + "scale_info": { + "sunshine_aspect": { + "scale_level": 1 + } + }, + "description": "vnf test instantiation_level_2" + }, + "instantiation_level_3": { + "scale_info": { + "sunshine_aspect": { + "scale_level": 2 + } + }, + "description": "vnf test instantiation_level_3" + } + } + } + }, + { + "type": "tosca.policies.nfv.VduInstantiationLevels", + "targets": [ + "sunshine" + ], + "properties": { + "levels": { + "instantiation_level_1": { + "number_of_instances": 1 + }, + "instantiation_level_2": { + "number_of_instances": 2 + }, + "instantiation_level_3": { + "number_of_instances": 3 + } + } + } + }, + { + "type": "tosca.policies.nfv.ScalingAspects", + "targets": "", + "properties": { + "aspects": { + "sunshine_aspect": { + "max_scale_level": 2, + "description": "sunshine aspect", + "name": "sunshine_aspect", + "step_deltas": [ + "sunshine_delta" + ] + } + } + } + }, + { + "type": "tosca.policies.nfv.VduInitialDelta", + "targets": [ + "sunshine" + ], + "properties": { + "initial_delta": { + "number_of_instances": 1 + } + } + }, + { + "type": "tosca.policies.nfv.VduScalingAspectDeltas", + "targets": [ + "sunshine" + ], + "properties": { + "deltas": { + "sunshine_delta": { + "number_of_instances": 1 + } + }, + "aspect": "sunshine_aspect" + } + } + ], + "vls": [ + + ], + "cps": [ + { + "vl_id": "", + "description": "", + "vdu_id": "sunshine", + "properties": { + "trunk_mode": "false" + }, + "cp_id": "ext_cp", + "cpd_id": "ext_cp" + } + ], + "metadata": { + "template_name": "test", + "template_version": "1.0", + "template_author": "ZTE" + } +} diff --git a/lcm/lcm/nf/tests/test_scale_vnf.py b/lcm/lcm/nf/tests/test_scale_vnf.py index bb470fa8..6c27fcd5 100644 --- a/lcm/lcm/nf/tests/test_scale_vnf.py +++ b/lcm/lcm/nf/tests/test_scale_vnf.py @@ -11,11 +11,18 @@ # 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. +import json +import mock +from . import const from django.test import TestCase from rest_framework import status from rest_framework.test import APIClient - -from lcm.pub.database.models import NfInstModel +from lcm.pub.database.models import NfInstModel, JobStatusModel, StorageInstModel, NetworkInstModel, \ + SubNetworkInstModel, PortInstModel, FlavourInstModel, VmInstModel, VNFCInstModel +from lcm.pub.utils import restcall +from lcm.pub.vimapi import api +from lcm.pub.utils.jobutil import JobUtil +from lcm.nf.biz.scale_vnf import ScaleVnf class TestNfScale(TestCase): @@ -39,6 +46,14 @@ class TestNfScale(TestCase): def tearDown(self): NfInstModel.objects.filter(nfinstid='12345').delete() + def assert_job_result(self, job_id, job_progress, job_detail): + jobs = JobStatusModel.objects.filter( + jobid=job_id, + progress=job_progress, + descp=job_detail + ) + self.assertEqual(1, len(jobs)) + def test_scale_vnf_not_found(self): url = "/api/vnflcm/v1/vnf_instances/12/scale" response = self.client.post(url, @@ -70,3 +85,251 @@ class TestNfScale(TestCase): format='json') NfInstModel.objects.filter(nfinstid='678').delete() self.assertEqual(status.HTTP_400_BAD_REQUEST, response.status_code) + + @mock.patch.object(restcall, 'call_req') + @mock.patch.object(api, 'call') + def test_scale_out_vnf_success(self, mock_call, mock_call_req): + self.nf_inst_id = '6789' + res_cache = {"volume": {}, "flavor": {}, "port": {}} + # res_cache["volume"]["volume_storage1"] = "vol1" + # res_cache["flavor"]["vdu1Id"] = "flavor1" + res_cache["port"]["ext_cp"] = "port1" + NfInstModel(nfinstid=self.nf_inst_id, + nf_name='VNF1', + nf_desc="VNF DESC", + vnfdid="1", + netype="XGW", + vendor="ZTE", + vnfSoftwareVersion="V1", + version="V1", + package_id="2", + status='INSTANTIATED', + vnfd_model=json.dumps(const.vnfd_for_scale), + vimInfo=json.dumps({}), + resInfo=json.dumps(res_cache)).save() + StorageInstModel.objects.create( + storageid="1", + vimid="1", + resourceid="11", + insttype=0, + instid=self.nf_inst_id, + is_predefined=1 + ) + NetworkInstModel.objects.create( + networkid='1', + vimid='1', + resourceid='1', + name='pnet_network', + is_predefined=1, + tenant='admin', + insttype=0, + instid=self.nf_inst_id + ) + SubNetworkInstModel.objects.create( + subnetworkid='1', + vimid='1', + resourceid='1', + networkid='1', + is_predefined=1, + name='sub_pnet', + tenant='admin', + insttype=0, + instid=self.nf_inst_id + ) + PortInstModel.objects.create( + portid='1', + networkid='1', + subnetworkid='1', + vimid='1', + resourceid='1', + is_predefined=1, + name='ext_cp', + tenant='admin', + insttype=0, + instid=self.nf_inst_id + ) + FlavourInstModel.objects.create( + flavourid="1", + vimid="1", + resourceid="11", + instid=self.nf_inst_id, + is_predefined=1, + name="Flavor_sunshine" + ) + VmInstModel.objects.create( + vmid="1", + vimid="1", + resourceid="11", + insttype=0, + instid=self.nf_inst_id, + vmname="test_01", + is_predefined=1, + operationalstate=1 + ) + r1_apply_grant_result = [ + 0, + json.JSONEncoder().encode(const.instantiate_grant_result), + '200' + ] + mock_call_req.side_effect = [ + r1_apply_grant_result, + ] + mock_call.side_effect = [ + const.c1_data_get_tenant_id, + const.c7_data_create_flavor, + const.c8_data_list_image, + const.c9_data_create_vm, + const.c10_data_get_vm + ] + + self.job_id = JobUtil.create_job('NF', 'SCALE', self.nf_inst_id) + JobUtil.add_job_status(self.job_id, 0, "VNF_SCALE_READY", ) + + ScaleVnf( + {"type": "SCALE_OUT", + "aspectId": "sunshine_aspect"}, + nf_inst_id=self.nf_inst_id, + job_id=self.job_id + ).run() + + NfInstModel.objects.filter(nfinstid=self.nf_inst_id).delete() + # print([job.descp for job in JobStatusModel.objects.filter(jobid=self.job_id)]) + self.assert_job_result( + self.job_id, + 100, + 'Scale Vnf success.' + ) + + @mock.patch.object(restcall, 'call_req') + @mock.patch.object(api, 'call') + def test_scale_in_vnf_success(self, mock_call, mock_call_req): + self.nf_inst_id = '6789' + res_cache = {"volume": {}, "flavor": {}, "port": {}} + # res_cache["volume"]["volume_storage1"] = "vol1" + # res_cache["flavor"]["vdu1Id"] = "flavor1" + res_cache["port"]["ext_cp"] = "port1" + NfInstModel(nfinstid=self.nf_inst_id, + nf_name='VNF1', + nf_desc="VNF DESC", + vnfdid="1", + netype="XGW", + vendor="ZTE", + vnfSoftwareVersion="V1", + version="V1", + package_id="2", + status='INSTANTIATED', + vnfd_model=json.dumps(const.vnfd_for_scale), + vimInfo=json.dumps({}), + resInfo=json.dumps(res_cache)).save() + StorageInstModel.objects.create( + storageid="1", + vimid="1", + resourceid="11", + insttype=0, + instid=self.nf_inst_id, + is_predefined=1 + ) + NetworkInstModel.objects.create( + networkid='1', + vimid='1', + resourceid='1', + name='pnet_network', + is_predefined=1, + tenant='admin', + insttype=0, + instid=self.nf_inst_id + ) + SubNetworkInstModel.objects.create( + subnetworkid='1', + vimid='1', + resourceid='1', + networkid='1', + is_predefined=1, + name='sub_pnet', + tenant='admin', + insttype=0, + instid=self.nf_inst_id + ) + PortInstModel.objects.create( + portid='1', + networkid='1', + subnetworkid='1', + vimid='1', + resourceid='1', + is_predefined=1, + name='ext_cp', + tenant='admin', + insttype=0, + instid=self.nf_inst_id + ) + FlavourInstModel.objects.create( + flavourid="1", + vimid="1", + resourceid="11", + instid=self.nf_inst_id, + is_predefined=1, + name="Flavor_sunshine" + ) + VmInstModel.objects.create( + vmid="1", + vimid="1", + resourceid="11", + insttype=0, + instid=self.nf_inst_id, + vmname="test_01", + is_predefined=1, + operationalstate=1 + ) + VmInstModel.objects.create( + vmid="2", + vimid="1", + resourceid="22", + insttype=0, + instid=self.nf_inst_id, + vmname="test_02", + is_predefined=1, + operationalstate=1 + ) + VNFCInstModel.objects.create( + vnfcinstanceid="1", + instid=self.nf_inst_id, + vmid="1" + ) + VNFCInstModel.objects.create( + vnfcinstanceid="2", + instid=self.nf_inst_id, + vmid="2" + ) + r1_apply_grant_result = [ + 0, + json.JSONEncoder().encode(const.instantiate_grant_result), + '200' + ] + mock_call_req.side_effect = [ + r1_apply_grant_result, + ] + mock_call.side_effect = [ + const.c1_data_get_tenant_id, + const.c7_data_create_flavor, + const.c8_data_list_image, + const.c9_data_create_vm, + const.c10_data_get_vm + ] + + self.job_id = JobUtil.create_job('NF', 'SCALE', self.nf_inst_id) + JobUtil.add_job_status(self.job_id, 0, "VNF_SCALE_READY", ) + + ScaleVnf( + {"type": "SCALE_IN", + "aspectId": "sunshine_aspect"}, + nf_inst_id=self.nf_inst_id, + job_id=self.job_id + ).run() + + NfInstModel.objects.filter(nfinstid=self.nf_inst_id).delete() + print([job.descp for job in JobStatusModel.objects.filter(jobid=self.job_id)]) + self.assert_job_result( + self.job_id, + 100, + 'Scale Vnf success.' + ) -- 2.16.6