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 logger = logging.getLogger(__name__)
20 SCALE_TYPE = ("SCALE_NS", "SCALE_VNF")
22 scale_vnf_data_mapping = {
34 def ignorcase_get(args, key):
42 if old_key.upper() == key.upper():
47 def mapping_conv(keyword_map, rest_return):
49 for param in keyword_map:
50 if keyword_map[param]:
51 if isinstance(keyword_map[param], dict):
52 resp_data[param] = mapping_conv(keyword_map[param], ignorcase_get(rest_return, param))
54 resp_data[param] = ignorcase_get(rest_return, param)
58 def get_vnf_scale_info(filename, ns_instanceId, aspect, step):
59 json_data = get_json_data(filename)
60 scale_options = ignorcase_get(json_data, "scale_options")
61 for i in range(scale_options.__len__()):
62 ns_scale_option = scale_options[i]
63 if (ignorcase_get(ns_scale_option, "ns_instanceId") == ns_instanceId) \
64 and (ignorcase_get(ns_scale_option, "ns_scale_aspect") == aspect):
65 ns_scale_info_list = ignorcase_get(ns_scale_option, "ns_scale_info_list")
66 for j in range(ns_scale_info_list.__len__()):
67 ns_scale_info = ns_scale_info_list[j]
68 if ns_scale_info["step"] == step:
69 return ns_scale_info["vnf_scale_list"]
74 def get_json_data(filename):
77 data = json.JSONDecoder().decode(json_str)
82 def check_scale_list(vnf_scale_list, ns_instanceId, aspect, step):
83 if vnf_scale_list is None:
84 logger.debug("The scaling option[ns=%s, aspect=%s, step=%s] does not exist. Pls check the config file."
85 % (ns_instanceId, aspect, step))
86 raise Exception("The scaling option[ns=%s, aspect=%s, step=%s] does not exist. Pls check the config file."
87 % (ns_instanceId, aspect, step))
92 def set_scaleVnfData_type(vnf_scale_list, scale_type):
93 logger.debug("vnf_scale_list = %s, type = %s" % (vnf_scale_list, scale_type))
95 if vnf_scale_list is not None:
96 for i in range(vnf_scale_list.__len__()):
97 scaleVnfData = scale_vnf_data_mapping
98 scaleVnfData["vnfInstanceId"] = get_vnfInstanceIdByName(vnf_scale_list[i]["vnfInstanceId"])
99 scaleVnfData["scaleByStepData"][0]["type"] = scale_type
100 scaleVnfData["scaleByStepData"][0]["aspectId"] = vnf_scale_list[i]["vnf_scaleAspectId"]
101 scaleVnfData["scaleByStepData"][0]["numberOfSteps"] = vnf_scale_list[i]["numberOfSteps"]
102 scaleVnfDataList.append(scaleVnfData)
103 logger.debug("scaleVnfDataList = %s" % scaleVnfDataList)
104 return scaleVnfDataList
107 def get_vnfInstanceIdByName(name):
111 def get_vnf_data(filename, ns_instanceId, aspect, step, scale_type):
113 vnf_scale_list = get_vnf_scale_info(filename, ns_instanceId, aspect, step)
114 check_scale_list(vnf_scale_list, ns_instanceId, aspect, step)
115 scaleVnfDataList = set_scaleVnfData_type(vnf_scale_list, scale_type)
116 logger.debug("scaleVnfDataList = %s" % scaleVnfDataList)
117 return scaleVnfDataList
119 # return Response(data={'error': e.message},status=status.HTTP_204_NO_CONTENT)
120 # return Response(data={'success': 'success'},status=status.HTTP_200_OK)
123 def get_and_check_params(scaleNsData, ns_InstanceId):
125 if scaleNsData is None:
127 # raise NSLCMException("Error! scaleNsData in the request is Empty!")
129 scaleNsByStepsData = scaleNsData[0]["scaleNsByStepsData"]
130 if scaleNsByStepsData is None:
132 # raise NSLCMException("Error! scaleNsByStepsData in the request is Empty!")
134 aspect = scaleNsByStepsData[0]["aspectId"]
135 numberOfSteps = scaleNsByStepsData[0]["numberOfSteps"]
136 scale_type = scaleNsByStepsData[0]["scalingDirection"]
138 return ns_InstanceId, aspect, numberOfSteps, scale_type
141 def get_scale_vnf_data(scaleNsData, ns_InstanceId):
142 curdir_path = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
143 filename = curdir_path + "/ns/data/scalemapping.json"
144 logger.debug("filename = %s" % filename)
145 ns_InstanceId, aspect, numberOfSteps, scale_type = get_and_check_params(scaleNsData, ns_InstanceId)
146 return get_vnf_data(filename, ns_InstanceId, aspect, numberOfSteps, scale_type)