diff options
-rw-r--r-- | lcm/ns/ns_manual_scale.py | 4 | ||||
-rw-r--r-- | lcm/ns/vnfs/scale_vnfs.py | 68 | ||||
-rw-r--r-- | lcm/pub/tests/test_scaleaspect.py | 60 | ||||
-rw-r--r-- | lcm/pub/utils/scaleaspect.py | 176 |
4 files changed, 182 insertions, 126 deletions
diff --git a/lcm/ns/ns_manual_scale.py b/lcm/ns/ns_manual_scale.py index 7a17f583..e9373a70 100644 --- a/lcm/ns/ns_manual_scale.py +++ b/lcm/ns/ns_manual_scale.py @@ -23,7 +23,7 @@ from lcm.pub.database.models import JobModel, NSInstModel from lcm.pub.exceptions import NSLCMException from lcm.pub.utils.jobutil import JobUtil, JOB_MODEL_STATUS from lcm.pub.utils.values import ignore_case_get -from lcm.pub.utils.scaleaspect import get_scale_vnf_data_package +from lcm.pub.utils.scaleaspect import get_scale_vnf_data_info_list JOB_ERROR = 255 SCALE_TYPE = ("SCALE_NS", "SCALE_VNF") @@ -67,7 +67,7 @@ class NSManualScaleService(threading.Thread): # Get data if SCALE_NS self.scale_ns_data = ignore_case_get(self.request_data, 'scaleNsByStepsData') - self.scale_vnf_data = get_scale_vnf_data_package(self.scale_ns_data, self.ns_instance_id) + self.scale_vnf_data = get_scale_vnf_data_info_list(self.scale_ns_data, self.ns_instance_id) logger.debug('scale_vnf_data = %s' % self.scale_vnf_data) # Get data if SCALE_VNF if not self.scale_vnf_data: diff --git a/lcm/ns/vnfs/scale_vnfs.py b/lcm/ns/vnfs/scale_vnfs.py index fe6c1017..5b4e978a 100644 --- a/lcm/ns/vnfs/scale_vnfs.py +++ b/lcm/ns/vnfs/scale_vnfs.py @@ -34,7 +34,8 @@ class NFManualScaleService(threading.Thread): super(NFManualScaleService, self).__init__() self.vnf_instance_id = vnf_instance_id self.data = data - self.job_id = JobUtil.create_job("NF", JOB_TYPE.MANUAL_SCALE_VNF, vnf_instance_id) + self.job_id = JobUtil.create_job( + "NF", JOB_TYPE.MANUAL_SCALE_VNF, vnf_instance_id) self.scale_vnf_data = '' self.nf_model = {} self.nf_scale_params = [] @@ -63,44 +64,67 @@ class NFManualScaleService(threading.Thread): def get_and_check_params(self): nf_info = NfInstModel.objects.filter(nfinstid=self.vnf_instance_id) if not nf_info: - logger.error('NF instance[id=%s] does not exist' % self.vnf_instance_id) - raise NSLCMException('NF instance[id=%s] does not exist' % self.vnf_instance_id) - logger.debug('vnfd_model = %s, vnf_instance_id = %s' % (nf_info[0].vnfd_model, self.vnf_instance_id)) + logger.error( + 'NF instance[id=%s] does not exist' % + self.vnf_instance_id) + raise NSLCMException( + 'NF instance[id=%s] does not exist' % + self.vnf_instance_id) + logger.debug('vnfd_model = %s, vnf_instance_id = %s' % + (nf_info[0].vnfd_model, self.vnf_instance_id)) self.nf_model = json.loads(nf_info[0].vnfd_model) self.m_nf_inst_id = nf_info[0].mnfinstid self.vnfm_inst_id = nf_info[0].vnfm_inst_id self.scale_vnf_data = ignore_case_get(self.data, 'scaleVnfData') if not self.scale_vnf_data: - logger.error('scaleVnfData parameter does not exist or value incorrect') - raise NSLCMException('scaleVnfData parameter does not exist or value incorrect') - for vnf_data in self.scale_vnf_data: - scale_type = ignore_case_get(vnf_data, 'type') - aspect_id = ignore_case_get(vnf_data, 'aspectId') - number_of_steps = ignore_case_get(vnf_data, 'numberOfSteps') - self.nf_scale_params.append({ - 'type': scale_type, - 'aspectId': aspect_id, - 'numberOfSteps': number_of_steps, - 'additionalParam': {'vnfdModel': self.nf_model} - }) + logger.error( + 'scaleVnfData parameter does not exist or value incorrect') + raise NSLCMException( + 'scaleVnfData parameter does not exist or value incorrect') + + scale_type = ignore_case_get(self.scale_vnf_data, 'type') + aspect_id = ignore_case_get(self.scale_vnf_data, 'aspectId') + number_of_steps = ignore_case_get(self.scale_vnf_data, 'numberOfSteps') + self.nf_scale_params.append({ + 'type': scale_type, + 'aspectId': aspect_id, + 'numberOfSteps': number_of_steps, + 'additionalParam': {'vnfdModel': self.nf_model} + }) def send_nf_scaling_requests(self): for i in range(len(self.nf_scale_params)): - progress_range = [10 + 80 / len(self.nf_scale_params) * i, 10 + 80 / len(self.nf_scale_params) * (i + 1)] - self.send_nf_scaling_request(self.nf_scale_params[i], progress_range) + progress_range = [10 + + 80 / + len(self.nf_scale_params) * + i, 10 + + 80 / + len(self.nf_scale_params) * + (i + + 1)] + self.send_nf_scaling_request( + self.nf_scale_params[i], progress_range) def send_nf_scaling_request(self, scale_param, progress_range): req_param = json.JSONEncoder().encode(scale_param) - rsp = send_nf_scaling_request(self.vnfm_inst_id, self.m_nf_inst_id, req_param) + rsp = send_nf_scaling_request( + self.vnfm_inst_id, self.m_nf_inst_id, req_param) vnfm_job_id = ignore_case_get(rsp, 'jobId') - ret = wait_job_finish(self.vnfm_inst_id, self.job_id, vnfm_job_id, progress_range=progress_range, timeout=1200, - mode='1') + ret = wait_job_finish( + self.vnfm_inst_id, + self.job_id, + vnfm_job_id, + progress_range=progress_range, + timeout=1200, + mode='1') if ret != JOB_MODEL_STATUS.FINISHED: logger.error('[NF scale] nf scale failed') raise NSLCMException("nf scale failed") def update_nf_status(self, status=VNF_STATUS.ACTIVE): - NfInstModel.objects.filter(nfinstid=self.vnf_instance_id).update(status=status) + NfInstModel.objects.filter( + nfinstid=self.vnf_instance_id).update( + status=status) def update_job(self, progress, desc=''): JobUtil.add_job_status(self.job_id, progress, desc) diff --git a/lcm/pub/tests/test_scaleaspect.py b/lcm/pub/tests/test_scaleaspect.py index 35fda1de..7cfe3be6 100644 --- a/lcm/pub/tests/test_scaleaspect.py +++ b/lcm/pub/tests/test_scaleaspect.py @@ -1,11 +1,15 @@ from django.test import TestCase -from lcm.pub.utils.scaleaspect import get_vnf_scale_info_package -from lcm.pub.utils.scaleaspect import get_vnf_data_package 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.database.models import NfInstModel from lcm.pub.database.models import NSInstModel +from lcm.pub.msapi import catalog from lcm.pub.utils.timeutil import now_time import os +import mock class TestScaleAspect(TestCase): @@ -20,6 +24,12 @@ class TestScaleAspect(TestCase): self.initInstModel() + self.scaleNsData = { + "aspectId": "TIC_EDGE_IMS", + "numberOfSteps": "1", + "scalingDirection": "UP" + } + def initInstModel(self): self.nsd_id = "23" self.ns_inst_id = "1" @@ -96,14 +106,44 @@ class TestScaleAspect(TestCase): NSInstModel().clean() NfInstModel().clean() - def test_get_vnf_data_package(self): - vnf_data_package = get_vnf_data_package( - self.scaling_map_json, "1", "TIC_EDGE_IMS", "1", "IN") + 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__()) - def test_get_vnf_scale_info_package(self): - scale_vnf_info_list = get_vnf_scale_info_package( - self.scaling_map_json, "23", "TIC_EDGE_IMS", "1") - self.assertIsNotNone(scale_vnf_info_list) - self.assertEqual(2, scale_vnf_info_list.__len__()) + @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_set_scacle_vnf_instance_id(self): + vnf_scale_info_list = [ + { + "vnfd_id": "nf_zte_cscf", + "vnf_scaleAspectId": "mpu", + "numberOfSteps": "1" + }, + { + "vnfd_id": "nf_zte_hss", + "vnf_scaleAspectId": "mpu", + "numberOfSteps": "1" + } + ] + 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("231", result[0]["vnfInstanceId"]) + self.assertEqual("232", result[1]["vnfInstanceId"]) + self.assertNotIn("vnfd_id", result[0]) + self.assertNotIn("vnfd_id", result[1]) + + def test_get_nsdId(self): + nsd_id = get_nsdId("1") + self.assertEqual("23", nsd_id) diff --git a/lcm/pub/utils/scaleaspect.py b/lcm/pub/utils/scaleaspect.py index b0b5d383..e642ab01 100644 --- a/lcm/pub/utils/scaleaspect.py +++ b/lcm/pub/utils/scaleaspect.py @@ -27,13 +27,11 @@ SCALE_TYPE = ("SCALE_NS", "SCALE_VNF") scale_vnf_data_mapping = { "vnfInstanceId": "", - "scaleByStepData": [ - { - "type": "", - "aspectId": "", - "numberOfSteps": "" - } - ] + "scaleByStepData": { + "type": "", + "aspectId": "", + "numberOfSteps": "" + } } @@ -80,44 +78,6 @@ def get_vnf_scale_info(filename, ns_instanceId, aspect, step): return None -# Get the vnf scaling info according to the ns package id. -def get_vnf_scale_info_package(scalingmap_json, nsd_id, aspect, step): - scale_options = ignorcase_get(scalingmap_json, "scale_options") - for i in range(scale_options.__len__()): - ns_scale_option = scale_options[i] - if (ignorcase_get(ns_scale_option, "nsd_id") == nsd_id) and ( - ignorcase_get(ns_scale_option, "ns_scale_aspect") == aspect): - ns_scale_info_list = ignorcase_get( - ns_scale_option, "ns_scale_info") - for j in range(ns_scale_info_list.__len__()): - ns_scale_info = ns_scale_info_list[j] - if ns_scale_info["step"] == step: - vnf_scale_info_list = ns_scale_info["vnf_scale_info"] - - return vnf_scale_info_list - - return None - - -# Gets the vnf instance id according to the vnfd_id and modify the list of -# scaling vnf info accrodingly. -def deal_vnf_scale_info(vnf_scale_info_list): - result = list() - for i in range(vnf_scale_info_list.__len__()): - 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["vnfInstanceId"] = vnf_instance_id_list[index] - index += 1 - result.append(copy_vnf_scale_info) - - return result - - def get_vnf_instance_id_list(vnfd_id): kwargs = {} kwargs['package_id'] = vnfd_id @@ -151,29 +111,11 @@ def check_scale_list(vnf_scale_list, ns_instanceId, aspect, step): return vnf_scale_list -def set_scaleVnfData_type(vnf_scale_list, scale_type): - logger.debug( - "vnf_scale_list = %s, type = %s" % - (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["scaleByStepData"][0]["type"] = scale_type - scaleVnfData["scaleByStepData"][0]["aspectId"] = vnf_scale_list[i]["vnf_scaleAspectId"] - scaleVnfData["scaleByStepData"][0]["numberOfSteps"] = vnf_scale_list[i]["numberOfSteps"] - scaleVnfDataList.append(scaleVnfData) - logger.debug("scaleVnfDataList = %s" % scaleVnfDataList) - return scaleVnfDataList - - def get_vnfInstanceIdByName(name): return name -def get_vnf_data(filename, ns_instanceId, aspect, step, scale_type): +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) check_scale_list(vnf_scale_list, ns_instanceId, aspect, step) @@ -185,24 +127,6 @@ def get_vnf_data(filename, ns_instanceId, aspect, step, scale_type): # return Response(data={'success': 'success'},status=status.HTTP_200_OK) -# Get scaling data of vnf according to the package -def get_vnf_data_package( - scalingmap_json, - ns_instanceId, - aspect, - step, - scale_type): - nsd_id = get_nsdId(ns_instanceId) - vnf_scale_list = get_vnf_scale_info_package( - scalingmap_json, nsd_id, aspect, step) - check_scale_list(vnf_scale_list, ns_instanceId, aspect, step) - vnf_scale_list = deal_vnf_scale_info(vnf_scale_list) - scaleVnfDataList = set_scaleVnfData_type(vnf_scale_list, scale_type) - logger.debug("scaleVnfDataList = %s" % scaleVnfDataList) - - return scaleVnfDataList - - # Get the nsd id according to the ns instance id. def get_nsdId(ns_instanceId): if NSInstModel.objects.filter(id=ns_instanceId): @@ -234,7 +158,7 @@ def get_scale_vnf_data(scaleNsData, ns_InstanceId): logger.debug("filename = %s" % filename) aspect, numberOfSteps, scale_type = get_and_check_params( scaleNsData, ns_InstanceId) - return get_vnf_data( + return get_scale_vnf_data_list( filename, ns_InstanceId, aspect, @@ -242,16 +166,84 @@ def get_scale_vnf_data(scaleNsData, ns_InstanceId): scale_type) -# Get scaling vnf data according to package by the scaling map json file. -def get_scale_vnf_data_package(scaleNsData, ns_InstanceId): +# Get scaling vnf data info list according to the ns instance id and request ScaleNsData. +def get_scale_vnf_data_info_list(scaleNsData, ns_InstanceId): + # Gets the nsd id accordign to the ns instance id. + nsd_id = get_nsdId(ns_InstanceId) + # Gets the scalingmap json data from the package according to the ns instance id. scalingmap_json = catalog.get_scalingmap_json_package(ns_InstanceId) - logger.debug("scalingmap_json = %s" % scalingmap_json) + + # Gets and checks the values of parameters. aspect, numberOfSteps, scale_type = get_and_check_params( scaleNsData, ns_InstanceId) - return get_vnf_data_package( - scalingmap_json, - ns_InstanceId, - aspect, - numberOfSteps, - scale_type) + + # Firstly, gets the scaling vnf data info list from the scaling map json data. + scale_vnf_data_info_list_from_json = get_scale_vnf_data_from_json(scalingmap_json, nsd_id, aspect, numberOfSteps) + check_scale_list(scale_vnf_data_info_list_from_json, ns_InstanceId, aspect, numberOfSteps) + + # Secondly, adds the property of vnfInstanceId to the list according to the vnfd id. + scale_vnf_data_info_list = set_scacle_vnf_instance_id(scale_vnf_data_info_list_from_json) + check_scale_list(scale_vnf_data_info_list, ns_InstanceId, aspect, numberOfSteps) + + # Lastly, adds the property of type to the list acoording to the request ScaleNsData. + scale_vnf_data_info_list = set_scaleVnfData_type(scale_vnf_data_info_list, scale_type) + check_scale_list(scale_vnf_data_info_list, ns_InstanceId, aspect, numberOfSteps) + + return scale_vnf_data_info_list + + +# Get the vnf scaling info from the scaling_map.json according to the ns package id. +def get_scale_vnf_data_from_json(scalingmap_json, nsd_id, aspect, step): + scale_options = ignorcase_get(scalingmap_json, "scale_options") + for i in range(scale_options.__len__()): + ns_scale_option = scale_options[i] + if (ignorcase_get(ns_scale_option, "nsd_id") == nsd_id) and ( + ignorcase_get(ns_scale_option, "ns_scale_aspect") == aspect): + ns_scale_info_list = ignorcase_get( + ns_scale_option, "ns_scale_info") + for j in range(ns_scale_info_list.__len__()): + ns_scale_info = ns_scale_info_list[j] + if ns_scale_info["step"] == step: + vnf_scale_info_list = ns_scale_info["vnf_scale_info"] + + return vnf_scale_info_list + + return None + + +# Gets the vnf instance id according to the vnfd_id and modify the list of scaling vnf info accrodingly. +def set_scacle_vnf_instance_id(vnf_scale_info_list): + scale_vnf_data_info_list = [] + for i in range(vnf_scale_info_list.__len__()): + 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["vnfInstanceId"] = vnf_instance_id_list[index] + index += 1 + scale_vnf_data_info_list.append(copy_vnf_scale_info) + + return scale_vnf_data_info_list + + +# Sets the scaling type of vnf data info list. +def set_scaleVnfData_type(vnf_scale_list, scale_type): + logger.debug( + "vnf_scale_list = %s, type = %s" % + (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["scaleByStepData"]["type"] = scale_type + scaleVnfData["scaleByStepData"]["aspectId"] = vnf_scale_list[i]["vnf_scaleAspectId"] + scaleVnfData["scaleByStepData"]["numberOfSteps"] = vnf_scale_list[i]["numberOfSteps"] + scaleVnfDataList.append(scaleVnfData) + logger.debug("scaleVnfDataList = %s" % scaleVnfDataList) + return scaleVnfDataList |