149b9c1c8dd2e49c506257bd25540affbbd8ada8
[osm/LW-UI.git] / instancehandler / views.py
1 #
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
17 from django.shortcuts import render, redirect
18 from django.contrib.auth.decorators import login_required
19 from django.http import HttpResponse, JsonResponse
20 import yaml
21 import json
22 import logging
23 from lib.osm.osmclient.clientv2 import Client
24 import authosm.utils as osmutils
25
26 logging.basicConfig(level=logging.DEBUG)
27 log = logging.getLogger('instancehandler/view.py')
28
29 @login_required
30 def list(request, type=None):
31 user = osmutils.get_user(request)
32 project_id = user.project_id
33 client = Client()
34 if type == 'ns':
35 instance_list = client.ns_list(user.get_token())
36 elif type == 'vnf':
37 instance_list = client.vnf_list(user.get_token())
38
39 result = {'instances': instance_list['data'] if instance_list and instance_list['error'] is False else [],
40 'type': type, 'project_id': project_id}
41
42 return __response_handler(request, result, 'instance_list.html')
43
44
45 @login_required
46 def create(request):
47 result = {}
48 ns_data = {
49 "nsName": request.POST.get('nsName', 'WithoutName'),
50 "nsDescription": request.POST.get('nsDescription', ''),
51 "nsdId": request.POST.get('nsdId', ''),
52 "vimAccountId": request.POST.get('vimAccountId', ''),
53 }
54 if 'ssh_key' in request.POST and request.POST.get('ssh_key') != '':
55 ns_data["ssh-authorized-key"] = [request.POST.get('ssh_key')]
56
57 if 'config' in request.POST:
58 ns_config = yaml.load(request.POST.get('config'))
59 if isinstance(ns_config, dict):
60 if "vim-network-name" in ns_config:
61 ns_config["vld"] = ns_config.pop("vim-network-name")
62 if "vld" in ns_config:
63 for vld in ns_config["vld"]:
64 if vld.get("vim-network-name"):
65 if isinstance(vld["vim-network-name"], dict):
66 vim_network_name_dict = {}
67 for vim_account, vim_net in vld["vim-network-name"].items():
68 vim_network_name_dict[ns_data["vimAccountId"]] = vim_net
69 vld["vim-network-name"] = vim_network_name_dict
70 ns_data["vld"] = ns_config["vld"]
71 if "vnf" in ns_config:
72 for vnf in ns_config["vnf"]:
73 if vnf.get("vim_account"):
74 vnf["vimAccountId"] = ns_data["vimAccountId"]
75
76 ns_data["vnf"] = ns_config["vnf"]
77 print ns_data
78 user = osmutils.get_user(request)
79 client = Client()
80 result = client.ns_create(user.get_token(), ns_data)
81 return __response_handler(request, result, 'instances:list', to_redirect=True, type='ns',
82 )
83
84
85 @login_required
86 def ns_operations(request, instance_id=None, type=None):
87 user = osmutils.get_user(request)
88 project_id = user.project_id
89 client = Client()
90 op_list = client.ns_op_list(user.get_token(), instance_id)
91 return __response_handler(request,
92 {'operations': op_list['data'] if op_list and op_list['error'] is False else [],
93 'type': 'ns', 'project_id': project_id}, 'instance_operations_list.html')
94
95
96 @login_required
97 def ns_operation(request, op_id, instance_id=None, type=None):
98 user = osmutils.get_user(request)
99 client = Client()
100 result = client.ns_op(user.get_token(), op_id)
101 return __response_handler(request, result['data'])
102
103
104 @login_required
105 def action(request, instance_id=None, type=None):
106 user = osmutils.get_user(request)
107 client = Client()
108 # result = client.ns_action(instance_id, action_payload)
109 primitive_param_keys = request.POST.getlist('primitive_params_name')
110 primitive_param_value = request.POST.getlist('primitive_params_value')
111 action_payload = {
112 "vnf_member_index": request.POST.get('vnf_member_index'),
113 "primitive": request.POST.get('primitive'),
114 "primitive_params": {k: v for k, v in zip(primitive_param_keys, primitive_param_value) if len(k) > 0}
115 }
116
117 result = client.ns_action(user.get_token(), instance_id, action_payload)
118 print result
119 if result['error']:
120 return __response_handler(request, result['data'], url=None,
121 status=result['data']['status'] if 'status' in result['data'] else 500)
122
123 else:
124 return __response_handler(request, {}, url=None, status=200)
125
126
127 @login_required
128 def delete(request, instance_id=None, type=None):
129 force = bool(request.GET.get('force', False))
130 result = {}
131 user = osmutils.get_user(request)
132 client = Client()
133 result = client.ns_delete(user.get_token(), instance_id, force)
134 print result
135 return __response_handler(request, result, 'instances:list', to_redirect=True, type='ns',
136 )
137
138
139 def show_topology(request, instance_id=None, type=None):
140 user = osmutils.get_user(request)
141 project_id = user.project_id
142 raw_content_types = request.META.get('HTTP_ACCEPT', '*/*').split(',')
143 if 'application/json' in raw_content_types:
144 result = {'vertices': [
145 {"info": {"type": "vnf", "property": {"custom_label": ""},
146 "group": []}, "id": "ping"},
147 {"info": {"type": "vnf", "property": {"custom_label": ""},
148 "group": []}, "id": "pong"},
149 {"info": {"type": "vdu", "property": {"custom_label": ""},
150 "group": ['pong']}, "id": "pong/ubuntu"},
151 {"info": {"type": "vdu", "property": {"custom_label": ""},
152 "group": ['ping']}, "id": "ping/ubuntu"},
153 {"info": {"type": "cp", "property": {"custom_label": ""},
154 "group": ['ping']}, "id": "ping/cp0"},
155 {"info": {"type": "cp", "property": {"custom_label": ""},
156 "group": ['ping']}, "id": "ping/cp1"},
157 {"info": {"type": "cp", "property": {"custom_label": ""},
158 "group": ['pong']}, "id": "pong/cp0"},
159 {"info": {"type": "cp", "property": {"custom_label": ""},
160 "group": ['pong']}, "id": "pong/cp1"},
161 {"info": {"type": "ns_vl", "property": {"custom_label": ""},
162 "group": []}, "id": "mgmt_vl"},
163 ],
164 'edges': [
165 # {"source": "ping", "group": [], "target": "ping/cp0", "view": "Data"},
166 {"source": "pong/ubuntu", "group": ['pong'], "target": "pong/cp0", "view": "vnf"},
167 {"source": "ping/ubuntu", "group": ['ping'], "target": "ping/cp0", "view": "vnf"},
168 {"source": "pong/ubuntu", "group": ['pong'], "target": "pong/cp1", "view": "vnf"},
169 {"source": "ping/ubuntu", "group": ['ping'], "target": "ping/cp1", "view": "vnf"},
170 {"source": "pong", "group": [], "target": "mgmt_vl", "view": "ns"},
171 {"source": "ping", "group": [], "target": "mgmt_vl", "view": "ns"},
172 ], 'graph_parameters': [],
173 'model': {
174 "layer": {
175
176 "ns": {
177 "nodes": {
178 "vnf": {
179 "addable": {
180 "callback": "addNode"
181 },
182 "removable": {
183 "callback": "removeNode"
184 },
185 "expands": "vnf"
186 },
187 "ns_vl": {
188 "addable": {
189 "callback": "addNode"
190 },
191 "removable": {
192 "callback": "removeNode"
193 }
194 },
195
196 },
197 "allowed_edges": {
198 "ns_vl": {
199 "destination": {
200 "vnf": {
201 "callback": "addLink",
202 "direct_edge": False,
203 "removable": {
204 "callback": "removeLink"
205 }
206 }
207 }
208 },
209 "vnf": {
210 "destination": {
211 "ns_vl": {
212 "callback": "addLink",
213 "direct_edge": False,
214 "removable": {
215 "callback": "removeLink"
216 }
217 },
218
219 }
220 }
221
222 }
223 },
224 "vnf": {
225 "nodes": {
226 "vdu": {
227 "addable": {
228 "callback": "addNode"
229 },
230 "removable": {
231 "callback": "removeNode"
232 }
233 },
234 "cp": {
235 "addable": {
236 "callback": "addNode"
237 },
238 "removable": {
239 "callback": "removeNode"
240 }
241 },
242
243 },
244 "allowed_edges": {
245 "vdu": {
246 "destination": {
247 "cp": {
248 "callback": "addLink",
249 "direct_edge": False,
250 "removable": {
251 "callback": "removeLink"
252 }
253 }
254 }
255 },
256 "cp": {
257 "destination": {
258 "vdu": {
259 "callback": "addLink",
260 "direct_edge": False,
261 "removable": {
262 "callback": "removeLink"
263 }
264 }
265 }
266 }
267 }
268 },
269 "name": "OSM",
270 "version": 1,
271 "nodes": {
272 "vnf": {
273 "label": "vnf"
274 },
275 "ns_vl": {
276 "label": "vl"
277 },
278 "cp": {
279 "label": "cp"
280 },
281 "vdu": {
282 "label": "vdu"
283 }
284 },
285 "description": "osm"
286 }
287 }}
288 return __response_handler(request, result)
289 else:
290 result = {'type': type, 'project_id': project_id, 'instance_id': instance_id}
291 return __response_handler(request, result, 'instance_topology_view.html')
292
293
294 @login_required
295 def show(request, instance_id=None, type=None):
296 # result = {}
297 user = osmutils.get_user(request)
298 project_id = user.project_id
299 client = Client()
300 if type == 'ns':
301 result = client.ns_get(user.get_token(), instance_id)
302 elif type == 'vnf':
303 result = client.vnf_get(user.get_token(), instance_id)
304 print result
305 return __response_handler(request, result)
306
307
308 @login_required
309 def export_metric(request, instance_id=None, type=None):
310 metric_data = request.POST.dict()
311 user = osmutils.get_user(request)
312 project_id = user.project_id
313 client = Client()
314 keys = ["collection_period",
315 "vnf_member_index",
316 "metric_name",
317 "correlation_id",
318 "vdu_name",
319 "collection_unit"]
320 metric_data = dict(filter(lambda i: i[0] in keys and len(i[1]) > 0, metric_data.items()))
321
322 result = client.ns_metric_export(user.get_token(), instance_id, metric_data)
323
324 if result['error']:
325 print result
326 return __response_handler(request, result['data'], url=None,
327 status=result['data']['status'] if 'status' in result['data'] else 500)
328 else:
329 return __response_handler(request, {}, url=None, status=200)
330
331
332 @login_required
333 def create_alarm(request, instance_id=None, type=None):
334 metric_data = request.POST.dict()
335 print metric_data
336 user = osmutils.get_user(request)
337 project_id = user.project_id
338 client = Client()
339
340 keys = ["threshold_value",
341 "vnf_member_index",
342 "metric_name",
343 "vdu_name",
344 "alarm_name",
345 "correlation_id",
346 "statistic",
347 "operation",
348 "severity"]
349 metric_data = dict(filter(lambda i: i[0] in keys and len(i[1]) > 0, metric_data.items()))
350
351 result = client.ns_alarm_create(user.get_token(), instance_id, metric_data)
352 if result['error']:
353 print result
354 return __response_handler(request, result['data'], url=None,
355 status=result['data']['status'] if 'status' in result['data'] else 500)
356 else:
357 return __response_handler(request, {}, url=None, status=200)
358
359
360 def __response_handler(request, data_res, url=None, to_redirect=None, *args, **kwargs):
361 raw_content_types = request.META.get('HTTP_ACCEPT', '*/*').split(',')
362 if 'application/json' in raw_content_types or url is None:
363 return HttpResponse(json.dumps(data_res), content_type="application/json", *args, **kwargs)
364 elif to_redirect:
365 return redirect(url, *args, **kwargs)
366 else:
367 return render(request, url, data_res)