1 # Copyright 2017 ZTE Corporation.
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
7 # http://www.apache.org/licenses/LICENSE-2.0
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
19 from lcm.pub.database.models import NfInstModel
20 from lcm.pub.database.models import NSInstModel
21 from lcm.ns.vnfs.const import VNF_STATUS
22 from lcm.pub.msapi import catalog
25 logger = logging.getLogger(__name__)
26 SCALE_TYPE = ("SCALE_NS", "SCALE_VNF")
28 scale_vnf_data_mapping = {
40 def ignorcase_get(args, key):
48 if old_key.upper() == key.upper():
53 def mapping_conv(keyword_map, rest_return):
55 for param in keyword_map:
56 if keyword_map[param]:
57 if isinstance(keyword_map[param], dict):
58 resp_data[param] = mapping_conv(
59 keyword_map[param], ignorcase_get(
62 resp_data[param] = ignorcase_get(rest_return, param)
66 def get_vnf_scale_info(filename, ns_instanceId, aspect, step):
67 json_data = get_json_data(filename)
68 scale_options = ignorcase_get(json_data, "scale_options")
69 for i in range(scale_options.__len__()):
70 ns_scale_option = scale_options[i]
71 if (ignorcase_get(ns_scale_option, "ns_instanceId") == ns_instanceId) \
72 and (ignorcase_get(ns_scale_option, "ns_scale_aspect") == aspect):
73 ns_scale_info_list = ignorcase_get(
74 ns_scale_option, "ns_scale_info_list")
75 for j in range(ns_scale_info_list.__len__()):
76 ns_scale_info = ns_scale_info_list[j]
77 if ns_scale_info["step"] == step:
78 return ns_scale_info["vnf_scale_info"]
83 # Get the vnf scaling info according to the ns package id.
84 def get_vnf_scale_info_package(scalingmap_json, nsd_id, aspect, step):
85 scale_options = ignorcase_get(scalingmap_json, "scale_options")
86 for i in range(scale_options.__len__()):
87 ns_scale_option = scale_options[i]
88 if (ignorcase_get(ns_scale_option, "nsd_id") == nsd_id) and (
89 ignorcase_get(ns_scale_option, "ns_scale_aspect") == aspect):
90 ns_scale_info_list = ignorcase_get(
91 ns_scale_option, "ns_scale_info")
92 for j in range(ns_scale_info_list.__len__()):
93 ns_scale_info = ns_scale_info_list[j]
94 if ns_scale_info["step"] == step:
95 vnf_scale_info_list = ns_scale_info["vnf_scale_info"]
97 return vnf_scale_info_list
102 # Gets the vnf instance id according to the vnfd_id and modify the list of
103 # scaling vnf info accrodingly.
104 def deal_vnf_scale_info(vnf_scale_info_list):
106 for i in range(vnf_scale_info_list.__len__()):
107 vnf_scale_info = vnf_scale_info_list[i]
108 vnfd_id = vnf_scale_info["vnfd_id"]
109 vnf_instance_id_list = get_vnf_instance_id_list(vnfd_id)
110 copy_vnf_scale_info = copy.deepcopy(vnf_scale_info)
111 copy_vnf_scale_info.pop("vnfd_id")
113 while index < vnf_instance_id_list.__len__():
114 copy_vnf_scale_info["vnfInstanceId"] = vnf_instance_id_list[index]
116 result.append(copy_vnf_scale_info)
121 def get_vnf_instance_id_list(vnfd_id):
123 kwargs['package_id'] = vnfd_id
124 kwargs['status'] = VNF_STATUS.ACTIVE
126 nf_model_list = NfInstModel.objects.filter(**kwargs)
127 vnf_instance_id_list = list()
128 for i in range(nf_model_list.__len__()):
129 vnf_instance_id_list.append(nf_model_list[i].nfinstid)
131 return vnf_instance_id_list
134 def get_json_data(filename):
137 data = json.JSONDecoder().decode(json_str)
142 def check_scale_list(vnf_scale_list, ns_instanceId, aspect, step):
143 if vnf_scale_list is None:
145 "The scaling option[ns=%s, aspect=%s, step=%s] does not exist. Pls check the config file." %
146 (ns_instanceId, aspect, step))
148 "The scaling option[ns=%s, aspect=%s, step=%s] does not exist. Pls check the config file." %
149 (ns_instanceId, aspect, step))
151 return vnf_scale_list
154 def set_scaleVnfData_type(vnf_scale_list, scale_type):
156 "vnf_scale_list = %s, type = %s" %
157 (vnf_scale_list, scale_type))
158 scaleVnfDataList = []
159 if vnf_scale_list is not None:
160 for i in range(vnf_scale_list.__len__()):
161 scaleVnfData = scale_vnf_data_mapping
162 scaleVnfData["vnfInstanceId"] = get_vnfInstanceIdByName(
163 vnf_scale_list[i]["vnfInstanceId"])
164 scaleVnfData["scaleByStepData"][0]["type"] = scale_type
165 scaleVnfData["scaleByStepData"][0]["aspectId"] = vnf_scale_list[i]["vnf_scaleAspectId"]
166 scaleVnfData["scaleByStepData"][0]["numberOfSteps"] = vnf_scale_list[i]["numberOfSteps"]
167 scaleVnfDataList.append(scaleVnfData)
168 logger.debug("scaleVnfDataList = %s" % scaleVnfDataList)
169 return scaleVnfDataList
172 def get_vnfInstanceIdByName(name):
176 def get_vnf_data(filename, ns_instanceId, aspect, step, scale_type):
178 vnf_scale_list = get_vnf_scale_info(filename, ns_instanceId, aspect, step)
179 check_scale_list(vnf_scale_list, ns_instanceId, aspect, step)
180 scaleVnfDataList = set_scaleVnfData_type(vnf_scale_list, scale_type)
181 logger.debug("scaleVnfDataList = %s" % scaleVnfDataList)
182 return scaleVnfDataList
184 # return Response(data={'error': e.message},status=status.HTTP_204_NO_CONTENT)
185 # return Response(data={'success': 'success'},status=status.HTTP_200_OK)
188 # Get scaling data of vnf according to the package
189 def get_vnf_data_package(
195 nsd_id = get_nsdId(ns_instanceId)
196 vnf_scale_list = get_vnf_scale_info_package(
197 scalingmap_json, nsd_id, aspect, step)
198 check_scale_list(vnf_scale_list, ns_instanceId, aspect, step)
199 vnf_scale_list = deal_vnf_scale_info(vnf_scale_list)
200 scaleVnfDataList = set_scaleVnfData_type(vnf_scale_list, scale_type)
201 logger.debug("scaleVnfDataList = %s" % scaleVnfDataList)
203 return scaleVnfDataList
206 # Get the nsd id according to the ns instance id.
207 def get_nsdId(ns_instanceId):
208 if NSInstModel.objects.filter(id=ns_instanceId):
209 nsd_id = NSInstModel.objects.filter(id=ns_instanceId)[0].nsd_id
215 def get_and_check_params(scaleNsData, ns_InstanceId):
217 if scaleNsData is None:
219 # raise NSLCMException("Error! scaleNsData in the request is Empty!")
221 scaleNsByStepsData = scaleNsData[0]["scaleNsByStepsData"]
222 if scaleNsByStepsData is None:
224 # raise NSLCMException("Error! scaleNsByStepsData in the request is Empty!")
226 aspect = scaleNsByStepsData[0]["aspectId"]
227 numberOfSteps = scaleNsByStepsData[0]["numberOfSteps"]
228 scale_type = scaleNsByStepsData[0]["scalingDirection"]
230 return ns_InstanceId, aspect, numberOfSteps, scale_type
233 def get_scale_vnf_data(scaleNsData, ns_InstanceId):
234 curdir_path = os.path.dirname(
237 os.path.abspath(__file__))))
238 filename = curdir_path + "/ns/data/scalemapping.json"
239 logger.debug("filename = %s" % filename)
240 ns_InstanceId, aspect, numberOfSteps, scale_type = get_and_check_params(
241 scaleNsData, ns_InstanceId)
250 # Get scaling vnf data according to package by the scaling map json file.
251 def get_scale_vnf_data_package(scaleNsData, ns_InstanceId):
253 scalingmap_json = catalog.get_scalingmap_json_package(ns_InstanceId)
254 logger.debug("scalingmap_json = %s" % scalingmap_json)
255 ns_InstanceId, aspect, numberOfSteps, scale_type = get_and_check_params(
256 scaleNsData, ns_InstanceId)
257 return get_vnf_data_package(