improve code coverage rate (scale vnf) after vfclcm upgraded from python2 to python3 29/91429/4
authorhongyuzhao <zhao.hongyu@zte.com.cn>
Mon, 15 Jul 2019 07:22:28 +0000 (15:22 +0800)
committerhongyuzhao <zhao.hongyu@zte.com.cn>
Mon, 15 Jul 2019 09:09:27 +0000 (17:09 +0800)
Change-Id: I7ce2ada651e5b8fe84deac87e82c8791cf6f5916
Issue-ID: VFC-1429
Signed-off-by: hongyuzhao <zhao.hongyu@zte.com.cn>
lcm/lcm/nf/tests/const.py
lcm/lcm/nf/tests/test_scale_vnf.py

index 7debe6b..c950951 100644 (file)
@@ -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"
+    }
+}
index bb470fa..6c27fcd 100644 (file)
 # 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.'
+        )