summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lcm/lcm/nf/tests/const.py265
-rw-r--r--lcm/lcm/nf/tests/test_scale_vnf.py267
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.'
+ )