diff options
-rw-r--r-- | lcm/ns/data/scalemapping.json | 8 | ||||
-rw-r--r-- | lcm/pub/tests/__init__.py | 13 | ||||
-rw-r--r-- | lcm/pub/tests/test_scaleaspect.py | 287 | ||||
-rw-r--r-- | lcm/pub/utils/scaleaspect.py | 27 |
4 files changed, 293 insertions, 42 deletions
diff --git a/lcm/ns/data/scalemapping.json b/lcm/ns/data/scalemapping.json index 7b6765dd..3391595e 100644 --- a/lcm/ns/data/scalemapping.json +++ b/lcm/ns/data/scalemapping.json @@ -9,13 +9,13 @@ "vnf_scale_info":[ { "vnfd_id":"nf_zte_cscf", - "vnf_scaleAspectId": "gpu", + "vnf_scaleAspectId": "gsu", "numberOfSteps": "1" }, { "vnfd_id":"nf_zte_hss", "vnf_scaleAspectId": "gpu", - "numberOfSteps": "1" + "numberOfSteps": "3" } ] }, @@ -25,12 +25,12 @@ { "vnfd_id":"nf_zte_cscf", "vnf_scaleAspectId": "mpu", - "numberOfSteps": "1" + "numberOfSteps": "2" }, { "vnfd_id":"nf_zte_hss", "vnf_scaleAspectId": "mpu", - "numberOfSteps": "1" + "numberOfSteps": "4" } ] } diff --git a/lcm/pub/tests/__init__.py b/lcm/pub/tests/__init__.py index e69de29b..4f0b05c3 100644 --- a/lcm/pub/tests/__init__.py +++ b/lcm/pub/tests/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2016-2018 ZTE Corporation. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# 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. diff --git a/lcm/pub/tests/test_scaleaspect.py b/lcm/pub/tests/test_scaleaspect.py index 7cfe3be6..1f0ba388 100644 --- a/lcm/pub/tests/test_scaleaspect.py +++ b/lcm/pub/tests/test_scaleaspect.py @@ -1,9 +1,25 @@ +# Copyright 2016-2018 ZTE Corporation. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# 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. + from django.test import TestCase from lcm.pub.utils.scaleaspect import get_json_data from lcm.pub.utils.scaleaspect import get_nsdId from lcm.pub.utils.scaleaspect import get_scale_vnf_data_from_json from lcm.pub.utils.scaleaspect import get_scale_vnf_data_info_list from lcm.pub.utils.scaleaspect import set_scacle_vnf_instance_id +from lcm.pub.utils.scaleaspect import get_and_check_params +from lcm.pub.utils.scaleaspect import set_scaleVnfData_type from lcm.pub.database.models import NfInstModel from lcm.pub.database.models import NSInstModel from lcm.pub.msapi import catalog @@ -15,6 +31,43 @@ import mock class TestScaleAspect(TestCase): def setUp(self): + self.init_scaling_map_json() + self.initInstModel() + + self.init_scale_ns_data() + + self.vnf_scale_info_list = [ + { + "vnfd_id": "nf_zte_cscf", + "vnf_scaleAspectId": "mpu", + "numberOfSteps": "1" + }, + { + "vnfd_id": "nf_zte_hss", + "vnf_scaleAspectId": "gsu", + "numberOfSteps": "2" + } + ] + + def init_scale_ns_data(self): + self.ns_scale_aspect = "TIC_EDGE_IMS" + self.ns_scale_steps = "1" + self.ns_scale_direction = "SCALE_IN" + self.scaleNsData = { + "aspectId": self.ns_scale_aspect, + "numberOfSteps": self.ns_scale_steps, + "scalingDirection": self.ns_scale_direction + } + + self.ns_scale_aspect2 = "TIC_EDGE_HW" + self.ns_scale_steps2 = "4" + self.scaleNsData2 = { + "aspectId": self.ns_scale_aspect2, + "numberOfSteps": self.ns_scale_steps2, + "scalingDirection": self.ns_scale_direction + } + + def init_scaling_map_json(self): curdir_path = os.path.dirname( os.path.dirname( os.path.dirname( @@ -22,14 +75,6 @@ class TestScaleAspect(TestCase): filename = curdir_path + "/ns/data/scalemapping.json" self.scaling_map_json = get_json_data(filename) - self.initInstModel() - - self.scaleNsData = { - "aspectId": "TIC_EDGE_IMS", - "numberOfSteps": "1", - "scalingDirection": "UP" - } - def initInstModel(self): self.nsd_id = "23" self.ns_inst_id = "1" @@ -102,29 +147,142 @@ class TestScaleAspect(TestCase): '"description": "PGW VNFD description",' '"isShared":true,"vnfExtendType":"driver"}}') + def add_another_nf_instance(self): + # Create a third vnf instance + nf_inst_id = "233" + package_id = "nf_zte_hss" + nf_uuid = "ab34-3g5j-de13-ab85-ij93" + + NfInstModel.objects.create( + nfinstid=nf_inst_id, + nf_name=self.nf_name, + vnf_id=self.vnf_id, + vnfm_inst_id=self.vnfm_inst_id, + ns_inst_id=self.ns_inst_id, + max_cpu='14', + max_ram='12296', + max_hd='101', + max_shd="20", + max_net=10, + status='active', + mnfinstid=nf_uuid, + package_id=package_id, + vnfd_model='{"metadata": {"vnfdId": "1","vnfdName": "PGW001",' + '"vnfProvider": "zte","vnfdVersion": "V00001","vnfVersion": "V5.10.20",' + '"productType": "CN","vnfType": "PGW",' + '"description": "PGW VNFD description",' + '"isShared":true,"vnfExtendType":"driver"}}') + + def add_new_vnf_instance(self): + # Create a third vnf instance + nf_inst_id = "241" + package_id = "nf_hw_cscf" + nf_uuid = "ab34-3g5j-de13-aa85-ij93" + + NfInstModel.objects.create( + nfinstid=nf_inst_id, + nf_name=self.nf_name, + vnf_id=self.vnf_id, + vnfm_inst_id=self.vnfm_inst_id, + ns_inst_id=self.ns_inst_id, + max_cpu='14', + max_ram='12296', + max_hd='101', + max_shd="20", + max_net=10, + status='active', + mnfinstid=nf_uuid, + package_id=package_id, + vnfd_model='{"metadata": {"vnfdId": "1","vnfdName": "PGW001",' + '"vnfProvider": "zte","vnfdVersion": "V00001","vnfVersion": "V5.10.20",' + '"productType": "CN","vnfType": "PGW",' + '"description": "PGW VNFD description",' + '"isShared":true,"vnfExtendType":"driver"}}') + + # Create a third vnf instance + nf_inst_id = "242" + package_id = "nf_hw_hss" + nf_uuid = "ab34-3g5j-de13-aa85-id93" + + NfInstModel.objects.create( + nfinstid=nf_inst_id, + nf_name=self.nf_name, + vnf_id=self.vnf_id, + vnfm_inst_id=self.vnfm_inst_id, + ns_inst_id=self.ns_inst_id, + max_cpu='14', + max_ram='12296', + max_hd='101', + max_shd="20", + max_net=10, + status='active', + mnfinstid=nf_uuid, + package_id=package_id, + vnfd_model='{"metadata": {"vnfdId": "1","vnfdName": "PGW001",' + '"vnfProvider": "zte","vnfdVersion": "V00001","vnfVersion": "V5.10.20",' + '"productType": "CN","vnfType": "PGW",' + '"description": "PGW VNFD description",' + '"isShared":true,"vnfExtendType":"driver"}}') + def tearDown(self): NSInstModel().clean() NfInstModel().clean() + def test_get_and_check_params(self): + aspect, numberOfSteps, scale_type = get_and_check_params( + self.scaleNsData, "1") + self.assertEqual(aspect, self.ns_scale_aspect) + self.assertEqual(numberOfSteps, self.ns_scale_steps) + self.assertEqual(scale_type, self.ns_scale_direction) + def test_get_scale_vnf_data_from_json(self): vnf_data_package = get_scale_vnf_data_from_json( self.scaling_map_json, "23", "TIC_EDGE_IMS", "1") self.assertIsNotNone(vnf_data_package) self.assertEqual(2, vnf_data_package.__len__()) + self.assertIsNotNone(vnf_data_package) + self.assertEqual(2, vnf_data_package.__len__()) + self.assertEqual("nf_zte_cscf", vnf_data_package[0]["vnfd_id"]) + self.assertEqual("1", vnf_data_package[0]["numberOfSteps"]) + self.assertEqual("gsu", vnf_data_package[0]["vnf_scaleAspectId"]) + self.assertEqual("nf_zte_hss", vnf_data_package[1]["vnfd_id"]) + self.assertEqual("3", vnf_data_package[1]["numberOfSteps"]) + self.assertEqual("gpu", vnf_data_package[1]["vnf_scaleAspectId"]) - @mock.patch.object(catalog, 'get_scalingmap_json_package') - def test_get_scale_vnf_data_info_list( - self, mock_get_scalingmap_json_package): - mock_get_scalingmap_json_package.return_value = self.scaling_map_json - - scale_vnf_data = get_scale_vnf_data_info_list(self.scaleNsData, "1") - self.assertIsNotNone(scale_vnf_data) - self.assertEqual(2, scale_vnf_data.__len__()) + def test_get_scale_vnf_data_from_json_2(self): + vnf_data_package = get_scale_vnf_data_from_json( + self.scaling_map_json, "23", "TIC_EDGE_IMS", "2") + self.assertIsNotNone(vnf_data_package) + self.assertEqual(2, vnf_data_package.__len__()) + self.assertEqual("nf_zte_cscf", vnf_data_package[0]["vnfd_id"]) + self.assertEqual("2", vnf_data_package[0]["numberOfSteps"]) + self.assertEqual("mpu", vnf_data_package[0]["vnf_scaleAspectId"]) + self.assertEqual("nf_zte_hss", vnf_data_package[1]["vnfd_id"]) + self.assertEqual("4", vnf_data_package[1]["numberOfSteps"]) + self.assertEqual("mpu", vnf_data_package[1]["vnf_scaleAspectId"]) def test_set_scacle_vnf_instance_id(self): + result = set_scacle_vnf_instance_id(self.vnf_scale_info_list) + self.assertEqual(2, result.__len__()) + self.assertEqual(result[0]["numberOfSteps"], + self.vnf_scale_info_list[0]["numberOfSteps"]) + self.assertEqual( + result[0]["vnf_scaleAspectId"], + self.vnf_scale_info_list[0]["vnf_scaleAspectId"]) + self.assertEqual(result[1]["numberOfSteps"], + self.vnf_scale_info_list[1]["numberOfSteps"]) + self.assertEqual( + result[1]["vnf_scaleAspectId"], + self.vnf_scale_info_list[1]["vnf_scaleAspectId"]) + self.assertEqual("231", result[0]["vnfInstanceId"]) + self.assertEqual("232", result[1]["vnfInstanceId"]) + self.assertNotIn("vnfd_id", result[0]) + self.assertNotIn("vnfd_id", result[1]) + + def test_set_scacle_vnf_instance_id_2(self): vnf_scale_info_list = [ { - "vnfd_id": "nf_zte_cscf", + "vnfd_id": "error1", "vnf_scaleAspectId": "mpu", "numberOfSteps": "1" }, @@ -135,15 +293,98 @@ class TestScaleAspect(TestCase): } ] result = set_scacle_vnf_instance_id(vnf_scale_info_list) - self.assertEqual(result[0]["numberOfSteps"], vnf_scale_info_list[0]["numberOfSteps"]) - self.assertEqual(result[0]["vnf_scaleAspectId"], vnf_scale_info_list[0]["vnf_scaleAspectId"]) - self.assertEqual(result[1]["numberOfSteps"], vnf_scale_info_list[0]["numberOfSteps"]) - self.assertEqual(result[1]["vnf_scaleAspectId"], vnf_scale_info_list[0]["vnf_scaleAspectId"]) + self.assertEqual(1, result.__len__()) + self.assertEqual( + result[0]["numberOfSteps"], + vnf_scale_info_list[0]["numberOfSteps"]) + self.assertEqual( + result[0]["vnf_scaleAspectId"], + vnf_scale_info_list[0]["vnf_scaleAspectId"]) + self.assertEqual("232", result[0]["vnfInstanceId"]) + self.assertNotIn("vnfd_id", result[0]) + + def test_set_scacle_vnf_instance_id_3(self): + vnf_scale_info_list = [ + { + "vnfd_id": "error1", + "vnf_scaleAspectId": "mpu", + "numberOfSteps": "1" + }, + { + "vnfd_id": "error2", + "vnf_scaleAspectId": "gsu", + "numberOfSteps": "1" + } + ] + result = set_scacle_vnf_instance_id(vnf_scale_info_list) + self.assertEqual(0, result.__len__()) + + def test_set_scacle_vnf_instance_id_4(self): + self.add_another_nf_instance() + result = set_scacle_vnf_instance_id(self.vnf_scale_info_list) + self.assertEqual(3, result.__len__()) self.assertEqual("231", result[0]["vnfInstanceId"]) self.assertEqual("232", result[1]["vnfInstanceId"]) - self.assertNotIn("vnfd_id", result[0]) - self.assertNotIn("vnfd_id", result[1]) + self.assertEqual("233", result[2]["vnfInstanceId"]) + + def test_set_scaleVnfData_type(self): + vnf_scale_list = set_scacle_vnf_instance_id(self.vnf_scale_info_list) + result = set_scaleVnfData_type(vnf_scale_list, self.ns_scale_direction) + self.assertEqual(2, result.__len__()) + self.assertNotIn("scaleByStepData", result) + self.assertEqual( + self.ns_scale_direction, + result[0]["scaleByStepData"]["type"]) + self.assertEqual("mpu", result[0]["scaleByStepData"]["aspectId"]) + self.assertNotIn("vnf_scaleAspectId", result[0]["scaleByStepData"]) + self.assertEqual("1", result[0]["scaleByStepData"]["numberOfSteps"]) + self.assertEqual( + self.ns_scale_direction, + result[1]["scaleByStepData"]["type"]) + self.assertEqual("gsu", result[1]["scaleByStepData"]["aspectId"]) + self.assertNotIn("vnf_scaleAspectId", result[1]["scaleByStepData"]) + self.assertEqual("2", result[1]["scaleByStepData"]["numberOfSteps"]) def test_get_nsdId(self): nsd_id = get_nsdId("1") self.assertEqual("23", nsd_id) + + @mock.patch.object(catalog, 'get_scalingmap_json_package') + def test_get_scale_vnf_data_info_list( + self, mock_get_scalingmap_json_package): + mock_get_scalingmap_json_package.return_value = self.scaling_map_json + + scale_vnf_data = get_scale_vnf_data_info_list(self.scaleNsData, "1") + self.assertIsNotNone(scale_vnf_data) + self.assertEqual(2, scale_vnf_data.__len__()) + + @mock.patch.object(catalog, 'get_scalingmap_json_package') + def test_get_scale_vnf_data_info_list_2( + self, mock_get_scalingmap_json_package): + mock_get_scalingmap_json_package.return_value = self.scaling_map_json + + scale_vnf_data = None + is_exception_caught = False + try: + scale_vnf_data = get_scale_vnf_data_info_list( + self.scaleNsData2, "1") + except Exception: + is_exception_caught = True + self.assertTrue(is_exception_caught) + self.assertIsNone(scale_vnf_data) + + @mock.patch.object(catalog, 'get_scalingmap_json_package') + def test_get_scale_vnf_data_info_list_3( + self, mock_get_scalingmap_json_package): + mock_get_scalingmap_json_package.return_value = self.scaling_map_json + self.add_new_vnf_instance() + + scale_vnf_data = None + is_exception_caught = False + try: + scale_vnf_data = get_scale_vnf_data_info_list( + self.scaleNsData2, "1") + except Exception: + is_exception_caught = True + self.assertFalse(is_exception_caught) + self.assertEqual(2, scale_vnf_data.__len__()) diff --git a/lcm/pub/utils/scaleaspect.py b/lcm/pub/utils/scaleaspect.py index e642ab01..a8a9c987 100644 --- a/lcm/pub/utils/scaleaspect.py +++ b/lcm/pub/utils/scaleaspect.py @@ -85,8 +85,12 @@ def get_vnf_instance_id_list(vnfd_id): nf_model_list = NfInstModel.objects.filter(**kwargs) vnf_instance_id_list = list() - for i in range(nf_model_list.__len__()): - vnf_instance_id_list.append(nf_model_list[i].nfinstid) + nf_model_len = nf_model_list.__len__() + if nf_model_len == 0: + logger.error("No VNF instances found(vnfd_id=%s)" % vnfd_id) + else: + for i in range(nf_model_len): + vnf_instance_id_list.append(nf_model_list[i].nfinstid) return vnf_instance_id_list @@ -100,7 +104,7 @@ def get_json_data(filename): def check_scale_list(vnf_scale_list, ns_instanceId, aspect, step): - if vnf_scale_list is None: + if vnf_scale_list is None or vnf_scale_list.__len__() == 0: logger.debug( "The scaling option[ns=%s, aspect=%s, step=%s] does not exist. Pls check the config file." % (ns_instanceId, aspect, step)) @@ -111,10 +115,6 @@ def check_scale_list(vnf_scale_list, ns_instanceId, aspect, step): return vnf_scale_list -def get_vnfInstanceIdByName(name): - return name - - def get_scale_vnf_data_list(filename, ns_instanceId, aspect, step, scale_type): vnf_scale_list = get_vnf_scale_info(filename, ns_instanceId, aspect, step) @@ -123,9 +123,6 @@ def get_scale_vnf_data_list(filename, ns_instanceId, aspect, step, scale_type): logger.debug("scaleVnfDataList = %s" % scaleVnfDataList) return scaleVnfDataList - # return Response(data={'error': e.message},status=status.HTTP_204_NO_CONTENT) - # return Response(data={'success': 'success'},status=status.HTTP_200_OK) - # Get the nsd id according to the ns instance id. def get_nsdId(ns_instanceId): @@ -209,6 +206,7 @@ def get_scale_vnf_data_from_json(scalingmap_json, nsd_id, aspect, step): return vnf_scale_info_list + logger.error("get_scale_vnf_data_from_json method retuan null") return None @@ -219,10 +217,10 @@ def set_scacle_vnf_instance_id(vnf_scale_info_list): vnf_scale_info = vnf_scale_info_list[i] vnfd_id = vnf_scale_info["vnfd_id"] vnf_instance_id_list = get_vnf_instance_id_list(vnfd_id) - copy_vnf_scale_info = copy.deepcopy(vnf_scale_info) - copy_vnf_scale_info.pop("vnfd_id") index = 0 while index < vnf_instance_id_list.__len__(): + copy_vnf_scale_info = copy.deepcopy(vnf_scale_info) + copy_vnf_scale_info.pop("vnfd_id") copy_vnf_scale_info["vnfInstanceId"] = vnf_instance_id_list[index] index += 1 scale_vnf_data_info_list.append(copy_vnf_scale_info) @@ -238,9 +236,8 @@ def set_scaleVnfData_type(vnf_scale_list, scale_type): scaleVnfDataList = [] if vnf_scale_list is not None: for i in range(vnf_scale_list.__len__()): - scaleVnfData = scale_vnf_data_mapping - scaleVnfData["vnfInstanceId"] = get_vnfInstanceIdByName( - vnf_scale_list[i]["vnfInstanceId"]) + scaleVnfData = copy.deepcopy(scale_vnf_data_mapping) + scaleVnfData["vnfInstanceId"] = vnf_scale_list[i]["vnfInstanceId"] scaleVnfData["scaleByStepData"]["type"] = scale_type scaleVnfData["scaleByStepData"]["aspectId"] = vnf_scale_list[i]["vnf_scaleAspectId"] scaleVnfData["scaleByStepData"]["numberOfSteps"] = vnf_scale_list[i]["numberOfSteps"] |