aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lcm/ns/ns_manual_scale.py4
-rw-r--r--lcm/ns/vnfs/scale_vnfs.py68
-rw-r--r--lcm/pub/tests/test_scaleaspect.py60
-rw-r--r--lcm/pub/utils/scaleaspect.py176
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