blob: 53dfb22d2a617963807d25abb25ec6a5775b4a7e [file] [log] [blame]
lombardoffb37bca2018-05-03 16:20:04 +02001#
2# Copyright 2018 CNIT - Consorzio Nazionale Interuniversitario per le Telecomunicazioni
3#
4# Licensed under the Apache License, Version 2.0 (the "License");
5# you may not use this file except in compliance with the License.
6# You may obtain a copy of the License at
7#
8# http://www.apache.org/licenses/LICENSE-2.0
9#
10# Unless required by applicable law or agreed to in writing, software
11# distributed under the License is distributed on an BASIS,
12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13# See the License for the specific language governing permissions and
14# limitations under the License.
15#
16
17from django.shortcuts import render, redirect
lombardoffb37bca2018-05-03 16:20:04 +020018from django.http import HttpResponse, JsonResponse
lombardofdd73c0c2018-05-09 10:46:49 +020019import yaml
lombardofrf5776442018-06-26 10:37:40 +020020import json
lombardoffb37bca2018-05-03 16:20:04 +020021import logging
lombardofrf5776442018-06-26 10:37:40 +020022from lib.osm.osmclient.clientv2 import Client
lombardofre6eb7432018-10-28 19:43:46 +010023from lib.osm.osm_rdcl_parser import OsmParser
lombardofr99f922f2018-07-17 17:27:36 +020024import authosm.utils as osmutils
lombardofr4908f382018-09-10 11:36:06 +020025from sf_t3d.decorators import login_required
lombardofrf5776442018-06-26 10:37:40 +020026
27logging.basicConfig(level=logging.DEBUG)
28log = logging.getLogger('instancehandler/view.py')
lombardoffb37bca2018-05-03 16:20:04 +020029
lombardofr4908f382018-09-10 11:36:06 +020030
lombardoffb37bca2018-05-03 16:20:04 +020031@login_required
lombardofr99f922f2018-07-17 17:27:36 +020032def list(request, type=None):
33 user = osmutils.get_user(request)
34 project_id = user.project_id
lombardoffb37bca2018-05-03 16:20:04 +020035 client = Client()
lombardofr4908f382018-09-10 11:36:06 +020036 result = {'type': type, 'project_id': project_id}
37 if "OSM_ERROR" in request.session:
38 result['alert_error'] = request.session["OSM_ERROR"]
39 del request.session["OSM_ERROR"]
40 raw_content_types = request.META.get('HTTP_ACCEPT', '*/*').split(',')
41 if 'application/json' not in raw_content_types:
42 return __response_handler(request, result, 'instance_list.html')
43 instance_list = None
lombardoffb37bca2018-05-03 16:20:04 +020044 if type == 'ns':
lombardofr99f922f2018-07-17 17:27:36 +020045 instance_list = client.ns_list(user.get_token())
lombardof647aa2e2018-05-26 17:11:13 +020046 elif type == 'vnf':
lombardofr99f922f2018-07-17 17:27:36 +020047 instance_list = client.vnf_list(user.get_token())
lombardofrb58d5d82019-01-04 15:25:45 +010048 elif type == 'pdu':
49 instance_list = client.pdu_list(user.get_token())
lombardofrcf3a1f02019-01-21 15:43:52 +010050 elif type == 'nsi':
51 instance_list = client.nsi_list(user.get_token())
lombardoffb37bca2018-05-03 16:20:04 +020052
lombardofr4908f382018-09-10 11:36:06 +020053 result['instances'] = instance_list['data'] if instance_list and instance_list['error'] is False else []
lombardofr0b4fb872018-07-24 17:10:48 +020054
lombardofa03da5e2018-06-02 18:36:44 +020055 return __response_handler(request, result, 'instance_list.html')
lombardoffb37bca2018-05-03 16:20:04 +020056
lombardoffb37bca2018-05-03 16:20:04 +020057@login_required
lombardofrb58d5d82019-01-04 15:25:45 +010058def create(request, type=None):
lombardoffb37bca2018-05-03 16:20:04 +020059 result = {}
lombardofrcf3a1f02019-01-21 15:43:52 +010060 config_vim_account_id = {}
lombardofr99f922f2018-07-17 17:27:36 +020061 user = osmutils.get_user(request)
lombardoffb37bca2018-05-03 16:20:04 +020062 client = Client()
lombardofrcf3a1f02019-01-21 15:43:52 +010063
lombardofrb58d5d82019-01-04 15:25:45 +010064 if type == 'ns':
65 try:
lombardofrf5776442018-06-26 10:37:40 +020066
lombardofrb58d5d82019-01-04 15:25:45 +010067 ns_data = {
68 "nsName": request.POST.get('nsName', 'WithoutName'),
69 "nsDescription": request.POST.get('nsDescription', ''),
70 "nsdId": request.POST.get('nsdId', ''),
71 "vimAccountId": request.POST.get('vimAccountId', ''),
72 }
73 if 'ssh_key' in request.POST and request.POST.get('ssh_key') != '':
74 ns_data["ssh_keys"] = [request.POST.get('ssh_key')]
75
76 if 'config' in request.POST:
77 ns_config = yaml.load(request.POST.get('config'))
78 if isinstance(ns_config, dict):
79 if "vim-network-name" in ns_config:
80 ns_config["vld"] = ns_config.pop("vim-network-name")
81 if "vld" in ns_config:
82 print ns_config
83 for vld in ns_config["vld"]:
84 if vld.get("vim-network-name"):
85 if isinstance(vld["vim-network-name"], dict):
86 vim_network_name_dict = {}
87 for vim_account, vim_net in vld["vim-network-name"].items():
88 vim_network_name_dict[ns_data["vimAccountId"]] = vim_net
89 vld["vim-network-name"] = vim_network_name_dict
90 ns_data["vld"] = ns_config["vld"]
91 if "vnf" in ns_config:
92 for vnf in ns_config["vnf"]:
93 if vnf.get("vim_account"):
94 vnf["vimAccountId"] = ns_data["vimAccountId"]
95
96 ns_data["vnf"] = ns_config["vnf"]
97 except Exception as e:
98 request.session["OSM_ERROR"] = "Error creating the NS; Invalid parameters provided."
99 return __response_handler(request, {}, 'instances:list', to_redirect=True, type='ns', )
100 result = client.ns_create(user.get_token(), ns_data)
101 return __response_handler(request, result, 'instances:list', to_redirect=True, type='ns')
lombardofrcf3a1f02019-01-21 15:43:52 +0100102
103 elif type == 'nsi':
104 try:
105 nsi_data = {
106 "nsiName": request.POST.get('nsiName', 'WithoutName'),
107 "nsiDescription": request.POST.get('nsiDescription', ''),
108 "nstId": request.POST.get('nstId', ''),
109 "vimAccountId": request.POST.get('vimAccountId', ''),
110 }
111
112 if 'ssh_key' in request.POST and request.POST.get('ssh_key') != '':
113 nsi_data["ssh_keys"] = [request.POST.get('ssh_key')]
114 except Exception as e:
115 request.session["OSM_ERROR"] = "Error creating the NSI; Invalid parameters provided."
116 return __response_handler(request, {}, 'instances:list', to_redirect=True, type=type)
117 result = client.nsi_create(user.get_token(), nsi_data)
118 return __response_handler(request, result, 'instances:list', to_redirect=True, type=type)
119
lombardofrb58d5d82019-01-04 15:25:45 +0100120 elif type == 'pdu':
121 interface_param_name = request.POST.getlist('interfaces_name')
122 interface_param_ip = request.POST.getlist('interfaces_ip')
123 interface_param_mgmt = request.POST.getlist('interfaces_mgmt')
124 interface_param_netname = request.POST.getlist('interfaces_vimnetname')
125
126 pdu_payload = {
127 "name": request.POST.get('name'),
128 "type": request.POST.get('pdu_type'),
129 "vim_accounts": request.POST.getlist('pdu_vim_accounts'),
130 "description": request.POST.get('description'),
131 "interfaces": []
132 }
133 for i in (0,len(interface_param_name)-1):
134 pdu_payload['interfaces'].append({
135 'name': interface_param_name[i],
136 'mgmt': True if interface_param_mgmt[i] == 'true' else False,
137 'ip-address': interface_param_ip[i],
138 'vim-network-name': interface_param_netname[i]
139 })
140 result = client.pdu_create(user.get_token(), pdu_payload)
141 if result['error']:
142 return __response_handler(request, result['data'], url=None,
143 status=result['data']['status'] if 'status' in result['data'] else 500)
144 else:
145 return __response_handler(request, {}, url=None, status=200)
lombardoffb37bca2018-05-03 16:20:04 +0200146
lombardof74ed51a2018-05-11 01:07:01 +0200147@login_required
lombardofr99f922f2018-07-17 17:27:36 +0200148def ns_operations(request, instance_id=None, type=None):
149 user = osmutils.get_user(request)
150 project_id = user.project_id
lombardofr4908f382018-09-10 11:36:06 +0200151
lombardofrcf3a1f02019-01-21 15:43:52 +0100152 result = {'type': type, 'project_id': project_id, 'instance_id': instance_id}
lombardofr4908f382018-09-10 11:36:06 +0200153 raw_content_types = request.META.get('HTTP_ACCEPT', '*/*').split(',')
154 if 'application/json' not in raw_content_types:
155 return __response_handler(request, result, 'instance_operations_list.html')
lombardof74ed51a2018-05-11 01:07:01 +0200156 client = Client()
lombardofrcf3a1f02019-01-21 15:43:52 +0100157 if type == 'ns':
158 op_list = client.ns_op_list(user.get_token(), instance_id)
159 elif type == 'nsi':
160 op_list = client.nsi_op_list(user.get_token(), instance_id)
lombardofr4908f382018-09-10 11:36:06 +0200161 result['operations'] = op_list['data'] if op_list and op_list['error'] is False else []
lombardofrf5776442018-06-26 10:37:40 +0200162
lombardofr4908f382018-09-10 11:36:06 +0200163 return __response_handler(request, result, 'instance_operations_list.html')
lombardof74ed51a2018-05-11 01:07:01 +0200164
165@login_required
lombardofr99f922f2018-07-17 17:27:36 +0200166def ns_operation(request, op_id, instance_id=None, type=None):
167 user = osmutils.get_user(request)
lombardof74ed51a2018-05-11 01:07:01 +0200168 client = Client()
lombardofr99f922f2018-07-17 17:27:36 +0200169 result = client.ns_op(user.get_token(), op_id)
lombardofrf5776442018-06-26 10:37:40 +0200170 return __response_handler(request, result['data'])
171
lombardoffb37bca2018-05-03 16:20:04 +0200172
173@login_required
lombardofr99f922f2018-07-17 17:27:36 +0200174def action(request, instance_id=None, type=None):
175 user = osmutils.get_user(request)
lombardoffb37bca2018-05-03 16:20:04 +0200176 client = Client()
lombardoffb37bca2018-05-03 16:20:04 +0200177 # result = client.ns_action(instance_id, action_payload)
178 primitive_param_keys = request.POST.getlist('primitive_params_name')
179 primitive_param_value = request.POST.getlist('primitive_params_value')
180 action_payload = {
181 "vnf_member_index": request.POST.get('vnf_member_index'),
182 "primitive": request.POST.get('primitive'),
183 "primitive_params": {k: v for k, v in zip(primitive_param_keys, primitive_param_value) if len(k) > 0}
184 }
185
lombardofr99f922f2018-07-17 17:27:36 +0200186 result = client.ns_action(user.get_token(), instance_id, action_payload)
lombardofrf5776442018-06-26 10:37:40 +0200187 print result
188 if result['error']:
189 return __response_handler(request, result['data'], url=None,
190 status=result['data']['status'] if 'status' in result['data'] else 500)
lombardofrf5776442018-06-26 10:37:40 +0200191 else:
192 return __response_handler(request, {}, url=None, status=200)
lombardoffb37bca2018-05-03 16:20:04 +0200193
194
195@login_required
lombardofr99f922f2018-07-17 17:27:36 +0200196def delete(request, instance_id=None, type=None):
lombardof7e33ad62018-06-03 16:13:38 +0200197 force = bool(request.GET.get('force', False))
lombardoffb37bca2018-05-03 16:20:04 +0200198 result = {}
lombardofr99f922f2018-07-17 17:27:36 +0200199 user = osmutils.get_user(request)
lombardoffb37bca2018-05-03 16:20:04 +0200200 client = Client()
lombardofrb58d5d82019-01-04 15:25:45 +0100201 if type == 'ns':
202 result = client.ns_delete(user.get_token(), instance_id, force)
203 elif type == 'pdu':
204 result = client.pdu_delete(user.get_token(), instance_id)
lombardofrcf3a1f02019-01-21 15:43:52 +0100205 elif type == 'nsi':
206 result = client.nsi_delete(user.get_token(), instance_id, force)
207
208 if result['error']:
209 return __response_handler(request, result['data'], url=None,
210 status=result['data']['status'] if 'status' in result['data'] else 500)
211 else:
212 return __response_handler(request, {}, url=None, status=200)
lombardofr99f922f2018-07-17 17:27:36 +0200213
lombardofre6eb7432018-10-28 19:43:46 +0100214@login_required
lombardofr99f922f2018-07-17 17:27:36 +0200215def show_topology(request, instance_id=None, type=None):
216 user = osmutils.get_user(request)
217 project_id = user.project_id
218 raw_content_types = request.META.get('HTTP_ACCEPT', '*/*').split(',')
219 if 'application/json' in raw_content_types:
lombardofre6eb7432018-10-28 19:43:46 +0100220 client = Client()
221 nsr_object = {'nsr': {}, 'vnfr': {}, 'vnfd': {}}
222 if type == 'ns':
lombardofr99f922f2018-07-17 17:27:36 +0200223
lombardofre6eb7432018-10-28 19:43:46 +0100224 nsr_resp = client.ns_get(user.get_token(), instance_id)
225 nsr_object['nsr'] = nsr_resp['data']
226 if 'constituent-vnfr-ref' in nsr_object['nsr'] :
227 for vnfr_id in nsr_object['nsr']['constituent-vnfr-ref']:
228 vnfr_resp = client.vnf_get(user.get_token(), vnfr_id)
229 vnfr = vnfr_resp['data']
230 nsr_object['vnfr'][vnfr['id']] = vnfr
231 if vnfr['vnfd-id'] not in nsr_object['vnfd']:
232 vnfd_resp = client.vnfd_get(user.get_token(), vnfr['vnfd-id'])
233 nsr_object['vnfd'][vnfr['vnfd-id']] = vnfd_resp['vnfd:vnfd-catalog']['vnfd'][0]
lombardofr99f922f2018-07-17 17:27:36 +0200234
lombardofre6eb7432018-10-28 19:43:46 +0100235 test = OsmParser()
lombardofr99f922f2018-07-17 17:27:36 +0200236
lombardofre6eb7432018-10-28 19:43:46 +0100237 result = test.nsr_to_graph(nsr_object)
lombardofr99f922f2018-07-17 17:27:36 +0200238 return __response_handler(request, result)
239 else:
240 result = {'type': type, 'project_id': project_id, 'instance_id': instance_id}
241 return __response_handler(request, result, 'instance_topology_view.html')
lombardoffb37bca2018-05-03 16:20:04 +0200242
243
244@login_required
lombardofr99f922f2018-07-17 17:27:36 +0200245def show(request, instance_id=None, type=None):
lombardoffb37bca2018-05-03 16:20:04 +0200246 # result = {}
lombardofr99f922f2018-07-17 17:27:36 +0200247 user = osmutils.get_user(request)
248 project_id = user.project_id
lombardoffb37bca2018-05-03 16:20:04 +0200249 client = Client()
lombardof647aa2e2018-05-26 17:11:13 +0200250 if type == 'ns':
lombardofr99f922f2018-07-17 17:27:36 +0200251 result = client.ns_get(user.get_token(), instance_id)
lombardof647aa2e2018-05-26 17:11:13 +0200252 elif type == 'vnf':
lombardofr99f922f2018-07-17 17:27:36 +0200253 result = client.vnf_get(user.get_token(), instance_id)
lombardofrb58d5d82019-01-04 15:25:45 +0100254 elif type == 'pdu':
255 result = client.pdu_get(user.get_token(), instance_id)
lombardofrcf3a1f02019-01-21 15:43:52 +0100256 elif type == 'nsi':
257 result = client.nsi_get(user.get_token(), instance_id)
lombardoffb37bca2018-05-03 16:20:04 +0200258 print result
259 return __response_handler(request, result)
260
lombardofrf5776442018-06-26 10:37:40 +0200261
lombardofr99624b52018-06-18 15:54:24 +0200262@login_required
lombardofr99f922f2018-07-17 17:27:36 +0200263def export_metric(request, instance_id=None, type=None):
lombardofr99624b52018-06-18 15:54:24 +0200264 metric_data = request.POST.dict()
lombardofr99f922f2018-07-17 17:27:36 +0200265 user = osmutils.get_user(request)
266 project_id = user.project_id
lombardofr99624b52018-06-18 15:54:24 +0200267 client = Client()
268 keys = ["collection_period",
269 "vnf_member_index",
270 "metric_name",
271 "correlation_id",
272 "vdu_name",
273 "collection_unit"]
274 metric_data = dict(filter(lambda i: i[0] in keys and len(i[1]) > 0, metric_data.items()))
275
lombardofr99f922f2018-07-17 17:27:36 +0200276 result = client.ns_metric_export(user.get_token(), instance_id, metric_data)
lombardofr99624b52018-06-18 15:54:24 +0200277
lombardofrf5776442018-06-26 10:37:40 +0200278 if result['error']:
279 print result
280 return __response_handler(request, result['data'], url=None,
281 status=result['data']['status'] if 'status' in result['data'] else 500)
282 else:
283 return __response_handler(request, {}, url=None, status=200)
284
lombardofr99624b52018-06-18 15:54:24 +0200285
286@login_required
lombardofr99f922f2018-07-17 17:27:36 +0200287def create_alarm(request, instance_id=None, type=None):
lombardofr99624b52018-06-18 15:54:24 +0200288 metric_data = request.POST.dict()
289 print metric_data
lombardofr99f922f2018-07-17 17:27:36 +0200290 user = osmutils.get_user(request)
291 project_id = user.project_id
lombardofr99624b52018-06-18 15:54:24 +0200292 client = Client()
293
lombardofr99624b52018-06-18 15:54:24 +0200294 keys = ["threshold_value",
295 "vnf_member_index",
296 "metric_name",
297 "vdu_name",
298 "alarm_name",
299 "correlation_id",
300 "statistic",
301 "operation",
302 "severity"]
303 metric_data = dict(filter(lambda i: i[0] in keys and len(i[1]) > 0, metric_data.items()))
304
lombardofr99f922f2018-07-17 17:27:36 +0200305 result = client.ns_alarm_create(user.get_token(), instance_id, metric_data)
lombardofrf5776442018-06-26 10:37:40 +0200306 if result['error']:
307 print result
308 return __response_handler(request, result['data'], url=None,
309 status=result['data']['status'] if 'status' in result['data'] else 500)
310 else:
311 return __response_handler(request, {}, url=None, status=200)
lombardofr99624b52018-06-18 15:54:24 +0200312
lombardoffb37bca2018-05-03 16:20:04 +0200313
314def __response_handler(request, data_res, url=None, to_redirect=None, *args, **kwargs):
315 raw_content_types = request.META.get('HTTP_ACCEPT', '*/*').split(',')
lombardofrb58d5d82019-01-04 15:25:45 +0100316 if not to_redirect and ('application/json' in raw_content_types or url is None):
317 return HttpResponse(json.dumps(data_res), content_type="application/json", *args, **kwargs)
lombardoffb37bca2018-05-03 16:20:04 +0200318 elif to_redirect:
319 return redirect(url, *args, **kwargs)
320 else:
321 return render(request, url, data_res)