Fix vfc-lcm/pub/scaleaspect pep8 issue
[vfc/nfvo/lcm.git] / lcm / pub / utils / scaleaspect.py
1 # Copyright 2017 ZTE Corporation.
2 #
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
6 #
7 #         http://www.apache.org/licenses/LICENSE-2.0
8 #
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.
14
15 import json
16 import logging
17 import os
18
19 logger = logging.getLogger(__name__)
20 SCALE_TYPE = ("SCALE_NS", "SCALE_VNF")
21
22 scale_vnf_data_mapping = {
23     "vnfInstanceId": "",
24     "scaleByStepData": [
25         {
26             "type": "",
27             "aspectId": "",
28             "numberOfSteps": ""
29         }
30     ]
31 }
32
33
34 def ignorcase_get(args, key):
35     if not key:
36         return ""
37     if not args:
38         return ""
39     if key in args:
40         return args[key]
41     for old_key in args:
42         if old_key.upper() == key.upper():
43             return args[old_key]
44     return ""
45
46
47 def mapping_conv(keyword_map, rest_return):
48     resp_data = {}
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))
53             else:
54                 resp_data[param] = ignorcase_get(rest_return, param)
55     return resp_data
56
57
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"]
70
71     return None
72
73
74 def get_json_data(filename):
75     f = open(filename)
76     json_str = f.read()
77     data = json.JSONDecoder().decode(json_str)
78     f.close()
79     return data
80
81
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))
88     else:
89         return vnf_scale_list
90
91
92 def set_scaleVnfData_type(vnf_scale_list, scale_type):
93     logger.debug("vnf_scale_list = %s, type = %s" % (vnf_scale_list, scale_type))
94     scaleVnfDataList = []
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
105
106
107 def get_vnfInstanceIdByName(name):
108     return name
109
110
111 def get_vnf_data(filename, ns_instanceId, aspect, step, scale_type):
112
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
118
119     # return Response(data={'error': e.message},status=status.HTTP_204_NO_CONTENT)
120     # return Response(data={'success': 'success'},status=status.HTTP_200_OK)
121
122
123 def get_and_check_params(scaleNsData, ns_InstanceId):
124
125     if scaleNsData is None:
126         pass
127         # raise NSLCMException("Error! scaleNsData in the request is Empty!")
128
129     scaleNsByStepsData = scaleNsData[0]["scaleNsByStepsData"]
130     if scaleNsByStepsData is None:
131         pass
132         # raise NSLCMException("Error! scaleNsByStepsData in the request is Empty!")
133
134     aspect = scaleNsByStepsData[0]["aspectId"]
135     numberOfSteps = scaleNsByStepsData[0]["numberOfSteps"]
136     scale_type = scaleNsByStepsData[0]["scalingDirection"]
137
138     return ns_InstanceId, aspect, numberOfSteps, scale_type
139
140
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)