blob: ad7ead7debb274a89767568a7cb035315b94243e [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
lombardofr4908f382018-09-10 11:36:06 +020018#from django.contrib.auth.decorators import login_required
lombardoffb37bca2018-05-03 16:20:04 +020019from django.http import HttpResponse, JsonResponse
lombardofdd73c0c2018-05-09 10:46:49 +020020import yaml
lombardofrf5776442018-06-26 10:37:40 +020021import json
lombardoffb37bca2018-05-03 16:20:04 +020022import logging
lombardofrf5776442018-06-26 10:37:40 +020023from lib.osm.osmclient.clientv2 import Client
lombardofre6eb7432018-10-28 19:43:46 +010024from lib.osm.osm_rdcl_parser import OsmParser
lombardofr99f922f2018-07-17 17:27:36 +020025import authosm.utils as osmutils
lombardofr4908f382018-09-10 11:36:06 +020026from sf_t3d.decorators import login_required
lombardofrf5776442018-06-26 10:37:40 +020027
28logging.basicConfig(level=logging.DEBUG)
29log = logging.getLogger('instancehandler/view.py')
lombardoffb37bca2018-05-03 16:20:04 +020030
lombardofr4908f382018-09-10 11:36:06 +020031
lombardoffb37bca2018-05-03 16:20:04 +020032@login_required
lombardofr99f922f2018-07-17 17:27:36 +020033def list(request, type=None):
34 user = osmutils.get_user(request)
35 project_id = user.project_id
lombardoffb37bca2018-05-03 16:20:04 +020036 client = Client()
lombardofr4908f382018-09-10 11:36:06 +020037 result = {'type': type, 'project_id': project_id}
38 if "OSM_ERROR" in request.session:
39 result['alert_error'] = request.session["OSM_ERROR"]
40 del request.session["OSM_ERROR"]
41 raw_content_types = request.META.get('HTTP_ACCEPT', '*/*').split(',')
42 if 'application/json' not in raw_content_types:
43 return __response_handler(request, result, 'instance_list.html')
44 instance_list = None
lombardoffb37bca2018-05-03 16:20:04 +020045 if type == 'ns':
lombardofr99f922f2018-07-17 17:27:36 +020046 instance_list = client.ns_list(user.get_token())
lombardof647aa2e2018-05-26 17:11:13 +020047 elif type == 'vnf':
lombardofr99f922f2018-07-17 17:27:36 +020048 instance_list = client.vnf_list(user.get_token())
lombardofrb58d5d82019-01-04 15:25:45 +010049 elif type == 'pdu':
50 instance_list = client.pdu_list(user.get_token())
lombardoffb37bca2018-05-03 16:20:04 +020051
lombardofr4908f382018-09-10 11:36:06 +020052 result['instances'] = instance_list['data'] if instance_list and instance_list['error'] is False else []
lombardofr0b4fb872018-07-24 17:10:48 +020053
lombardofa03da5e2018-06-02 18:36:44 +020054 return __response_handler(request, result, 'instance_list.html')
lombardoffb37bca2018-05-03 16:20:04 +020055
lombardoffb37bca2018-05-03 16:20:04 +020056@login_required
lombardofrb58d5d82019-01-04 15:25:45 +010057def create(request, type=None):
lombardoffb37bca2018-05-03 16:20:04 +020058 result = {}
lombardofr99f922f2018-07-17 17:27:36 +020059 user = osmutils.get_user(request)
lombardoffb37bca2018-05-03 16:20:04 +020060 client = Client()
lombardofrb58d5d82019-01-04 15:25:45 +010061 if type == 'ns':
62 try:
lombardofrf5776442018-06-26 10:37:40 +020063
lombardofrb58d5d82019-01-04 15:25:45 +010064 ns_data = {
65 "nsName": request.POST.get('nsName', 'WithoutName'),
66 "nsDescription": request.POST.get('nsDescription', ''),
67 "nsdId": request.POST.get('nsdId', ''),
68 "vimAccountId": request.POST.get('vimAccountId', ''),
69 }
70 if 'ssh_key' in request.POST and request.POST.get('ssh_key') != '':
71 ns_data["ssh_keys"] = [request.POST.get('ssh_key')]
72
73 if 'config' in request.POST:
74 ns_config = yaml.load(request.POST.get('config'))
75 if isinstance(ns_config, dict):
76 if "vim-network-name" in ns_config:
77 ns_config["vld"] = ns_config.pop("vim-network-name")
78 if "vld" in ns_config:
79 print ns_config
80 for vld in ns_config["vld"]:
81 if vld.get("vim-network-name"):
82 if isinstance(vld["vim-network-name"], dict):
83 vim_network_name_dict = {}
84 for vim_account, vim_net in vld["vim-network-name"].items():
85 vim_network_name_dict[ns_data["vimAccountId"]] = vim_net
86 vld["vim-network-name"] = vim_network_name_dict
87 ns_data["vld"] = ns_config["vld"]
88 if "vnf" in ns_config:
89 for vnf in ns_config["vnf"]:
90 if vnf.get("vim_account"):
91 vnf["vimAccountId"] = ns_data["vimAccountId"]
92
93 ns_data["vnf"] = ns_config["vnf"]
94 except Exception as e:
95 request.session["OSM_ERROR"] = "Error creating the NS; Invalid parameters provided."
96 return __response_handler(request, {}, 'instances:list', to_redirect=True, type='ns', )
97 result = client.ns_create(user.get_token(), ns_data)
98 return __response_handler(request, result, 'instances:list', to_redirect=True, type='ns')
99 elif type == 'pdu':
100 interface_param_name = request.POST.getlist('interfaces_name')
101 interface_param_ip = request.POST.getlist('interfaces_ip')
102 interface_param_mgmt = request.POST.getlist('interfaces_mgmt')
103 interface_param_netname = request.POST.getlist('interfaces_vimnetname')
104
105 pdu_payload = {
106 "name": request.POST.get('name'),
107 "type": request.POST.get('pdu_type'),
108 "vim_accounts": request.POST.getlist('pdu_vim_accounts'),
109 "description": request.POST.get('description'),
110 "interfaces": []
111 }
112 for i in (0,len(interface_param_name)-1):
113 pdu_payload['interfaces'].append({
114 'name': interface_param_name[i],
115 'mgmt': True if interface_param_mgmt[i] == 'true' else False,
116 'ip-address': interface_param_ip[i],
117 'vim-network-name': interface_param_netname[i]
118 })
119 result = client.pdu_create(user.get_token(), pdu_payload)
120 if result['error']:
121 return __response_handler(request, result['data'], url=None,
122 status=result['data']['status'] if 'status' in result['data'] else 500)
123 else:
124 return __response_handler(request, {}, url=None, status=200)
lombardoffb37bca2018-05-03 16:20:04 +0200125
lombardof74ed51a2018-05-11 01:07:01 +0200126@login_required
lombardofr99f922f2018-07-17 17:27:36 +0200127def ns_operations(request, instance_id=None, type=None):
128 user = osmutils.get_user(request)
129 project_id = user.project_id
lombardofr4908f382018-09-10 11:36:06 +0200130
131 result = {'type': 'ns', 'project_id': project_id, 'instance_id': instance_id}
132 raw_content_types = request.META.get('HTTP_ACCEPT', '*/*').split(',')
133 if 'application/json' not in raw_content_types:
134 return __response_handler(request, result, 'instance_operations_list.html')
lombardof74ed51a2018-05-11 01:07:01 +0200135 client = Client()
lombardofr99f922f2018-07-17 17:27:36 +0200136 op_list = client.ns_op_list(user.get_token(), instance_id)
lombardofr4908f382018-09-10 11:36:06 +0200137 result['operations'] = op_list['data'] if op_list and op_list['error'] is False else []
lombardofrf5776442018-06-26 10:37:40 +0200138
lombardofr4908f382018-09-10 11:36:06 +0200139 return __response_handler(request, result, 'instance_operations_list.html')
lombardof74ed51a2018-05-11 01:07:01 +0200140
141@login_required
lombardofr99f922f2018-07-17 17:27:36 +0200142def ns_operation(request, op_id, instance_id=None, type=None):
143 user = osmutils.get_user(request)
lombardof74ed51a2018-05-11 01:07:01 +0200144 client = Client()
lombardofr99f922f2018-07-17 17:27:36 +0200145 result = client.ns_op(user.get_token(), op_id)
lombardofrf5776442018-06-26 10:37:40 +0200146 return __response_handler(request, result['data'])
147
lombardoffb37bca2018-05-03 16:20:04 +0200148
149@login_required
lombardofr99f922f2018-07-17 17:27:36 +0200150def action(request, instance_id=None, type=None):
151 user = osmutils.get_user(request)
lombardoffb37bca2018-05-03 16:20:04 +0200152 client = Client()
lombardoffb37bca2018-05-03 16:20:04 +0200153 # result = client.ns_action(instance_id, action_payload)
154 primitive_param_keys = request.POST.getlist('primitive_params_name')
155 primitive_param_value = request.POST.getlist('primitive_params_value')
156 action_payload = {
157 "vnf_member_index": request.POST.get('vnf_member_index'),
158 "primitive": request.POST.get('primitive'),
159 "primitive_params": {k: v for k, v in zip(primitive_param_keys, primitive_param_value) if len(k) > 0}
160 }
161
lombardofr99f922f2018-07-17 17:27:36 +0200162 result = client.ns_action(user.get_token(), instance_id, action_payload)
lombardofrf5776442018-06-26 10:37:40 +0200163 print result
164 if result['error']:
165 return __response_handler(request, result['data'], url=None,
166 status=result['data']['status'] if 'status' in result['data'] else 500)
167
168 else:
169 return __response_handler(request, {}, url=None, status=200)
lombardoffb37bca2018-05-03 16:20:04 +0200170
171
172@login_required
lombardofr99f922f2018-07-17 17:27:36 +0200173def delete(request, instance_id=None, type=None):
lombardof7e33ad62018-06-03 16:13:38 +0200174 force = bool(request.GET.get('force', False))
lombardoffb37bca2018-05-03 16:20:04 +0200175 result = {}
lombardofr99f922f2018-07-17 17:27:36 +0200176 user = osmutils.get_user(request)
lombardoffb37bca2018-05-03 16:20:04 +0200177 client = Client()
lombardofrb58d5d82019-01-04 15:25:45 +0100178 if type == 'ns':
179 result = client.ns_delete(user.get_token(), instance_id, force)
180 elif type == 'pdu':
181 result = client.pdu_delete(user.get_token(), instance_id)
lombardoffb37bca2018-05-03 16:20:04 +0200182 print result
lombardofrc9488202018-07-24 14:38:16 +0200183 return __response_handler(request, result, 'instances:list', to_redirect=True, type='ns')
lombardofr99f922f2018-07-17 17:27:36 +0200184
lombardofre6eb7432018-10-28 19:43:46 +0100185@login_required
lombardofr99f922f2018-07-17 17:27:36 +0200186def show_topology(request, instance_id=None, type=None):
187 user = osmutils.get_user(request)
188 project_id = user.project_id
189 raw_content_types = request.META.get('HTTP_ACCEPT', '*/*').split(',')
190 if 'application/json' in raw_content_types:
lombardofre6eb7432018-10-28 19:43:46 +0100191 client = Client()
192 nsr_object = {'nsr': {}, 'vnfr': {}, 'vnfd': {}}
193 if type == 'ns':
lombardofr99f922f2018-07-17 17:27:36 +0200194
lombardofre6eb7432018-10-28 19:43:46 +0100195 nsr_resp = client.ns_get(user.get_token(), instance_id)
196 nsr_object['nsr'] = nsr_resp['data']
197 if 'constituent-vnfr-ref' in nsr_object['nsr'] :
198 for vnfr_id in nsr_object['nsr']['constituent-vnfr-ref']:
199 vnfr_resp = client.vnf_get(user.get_token(), vnfr_id)
200 vnfr = vnfr_resp['data']
201 nsr_object['vnfr'][vnfr['id']] = vnfr
202 if vnfr['vnfd-id'] not in nsr_object['vnfd']:
203 vnfd_resp = client.vnfd_get(user.get_token(), vnfr['vnfd-id'])
204 nsr_object['vnfd'][vnfr['vnfd-id']] = vnfd_resp['vnfd:vnfd-catalog']['vnfd'][0]
lombardofr99f922f2018-07-17 17:27:36 +0200205
lombardofre6eb7432018-10-28 19:43:46 +0100206 test = OsmParser()
lombardofr99f922f2018-07-17 17:27:36 +0200207
lombardofre6eb7432018-10-28 19:43:46 +0100208 result = test.nsr_to_graph(nsr_object)
lombardofr99f922f2018-07-17 17:27:36 +0200209 return __response_handler(request, result)
210 else:
211 result = {'type': type, 'project_id': project_id, 'instance_id': instance_id}
212 return __response_handler(request, result, 'instance_topology_view.html')
lombardoffb37bca2018-05-03 16:20:04 +0200213
214
215@login_required
lombardofr99f922f2018-07-17 17:27:36 +0200216def show(request, instance_id=None, type=None):
lombardoffb37bca2018-05-03 16:20:04 +0200217 # result = {}
lombardofr99f922f2018-07-17 17:27:36 +0200218 user = osmutils.get_user(request)
219 project_id = user.project_id
lombardoffb37bca2018-05-03 16:20:04 +0200220 client = Client()
lombardof647aa2e2018-05-26 17:11:13 +0200221 if type == 'ns':
lombardofr99f922f2018-07-17 17:27:36 +0200222 result = client.ns_get(user.get_token(), instance_id)
lombardof647aa2e2018-05-26 17:11:13 +0200223 elif type == 'vnf':
lombardofr99f922f2018-07-17 17:27:36 +0200224 result = client.vnf_get(user.get_token(), instance_id)
lombardofrb58d5d82019-01-04 15:25:45 +0100225 elif type == 'pdu':
226 result = client.pdu_get(user.get_token(), instance_id)
lombardoffb37bca2018-05-03 16:20:04 +0200227 print result
228 return __response_handler(request, result)
229
lombardofrf5776442018-06-26 10:37:40 +0200230
lombardofr99624b52018-06-18 15:54:24 +0200231@login_required
lombardofr99f922f2018-07-17 17:27:36 +0200232def export_metric(request, instance_id=None, type=None):
lombardofr99624b52018-06-18 15:54:24 +0200233 metric_data = request.POST.dict()
lombardofr99f922f2018-07-17 17:27:36 +0200234 user = osmutils.get_user(request)
235 project_id = user.project_id
lombardofr99624b52018-06-18 15:54:24 +0200236 client = Client()
237 keys = ["collection_period",
238 "vnf_member_index",
239 "metric_name",
240 "correlation_id",
241 "vdu_name",
242 "collection_unit"]
243 metric_data = dict(filter(lambda i: i[0] in keys and len(i[1]) > 0, metric_data.items()))
244
lombardofr99f922f2018-07-17 17:27:36 +0200245 result = client.ns_metric_export(user.get_token(), instance_id, metric_data)
lombardofr99624b52018-06-18 15:54:24 +0200246
lombardofrf5776442018-06-26 10:37:40 +0200247 if result['error']:
248 print result
249 return __response_handler(request, result['data'], url=None,
250 status=result['data']['status'] if 'status' in result['data'] else 500)
251 else:
252 return __response_handler(request, {}, url=None, status=200)
253
lombardofr99624b52018-06-18 15:54:24 +0200254
255@login_required
lombardofr99f922f2018-07-17 17:27:36 +0200256def create_alarm(request, instance_id=None, type=None):
lombardofr99624b52018-06-18 15:54:24 +0200257 metric_data = request.POST.dict()
258 print metric_data
lombardofr99f922f2018-07-17 17:27:36 +0200259 user = osmutils.get_user(request)
260 project_id = user.project_id
lombardofr99624b52018-06-18 15:54:24 +0200261 client = Client()
262
lombardofr99624b52018-06-18 15:54:24 +0200263 keys = ["threshold_value",
264 "vnf_member_index",
265 "metric_name",
266 "vdu_name",
267 "alarm_name",
268 "correlation_id",
269 "statistic",
270 "operation",
271 "severity"]
272 metric_data = dict(filter(lambda i: i[0] in keys and len(i[1]) > 0, metric_data.items()))
273
lombardofr99f922f2018-07-17 17:27:36 +0200274 result = client.ns_alarm_create(user.get_token(), instance_id, metric_data)
lombardofrf5776442018-06-26 10:37:40 +0200275 if result['error']:
276 print result
277 return __response_handler(request, result['data'], url=None,
278 status=result['data']['status'] if 'status' in result['data'] else 500)
279 else:
280 return __response_handler(request, {}, url=None, status=200)
lombardofr99624b52018-06-18 15:54:24 +0200281
lombardoffb37bca2018-05-03 16:20:04 +0200282
283def __response_handler(request, data_res, url=None, to_redirect=None, *args, **kwargs):
284 raw_content_types = request.META.get('HTTP_ACCEPT', '*/*').split(',')
lombardofrb58d5d82019-01-04 15:25:45 +0100285 if not to_redirect and ('application/json' in raw_content_types or url is None):
286 return HttpResponse(json.dumps(data_res), content_type="application/json", *args, **kwargs)
lombardoffb37bca2018-05-03 16:20:04 +0200287 elif to_redirect:
288 return redirect(url, *args, **kwargs)
289 else:
290 return render(request, url, data_res)