some fix on delete action
[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 def show_topology(request, instance_id=None, type=None):
139 user = osmutils.get_user(request)
140 project_id = user.project_id
141 raw_content_types = request.META.get('HTTP_ACCEPT', '*/*').split(',')
142 if 'application/json' in raw_content_types:
143 result = {'vertices': [
144 {"info": {"type": "vnf", "property": {"custom_label": ""},
145 "group": []}, "id": "ping"},
146 {"info": {"type": "vnf", "property": {"custom_label": ""},
147 "group": []}, "id": "pong"},
148 {"info": {"type": "vdu", "property": {"custom_label": ""},
149 "group": ['pong']}, "id": "pong/ubuntu"},
150 {"info": {"type": "vdu", "property": {"custom_label": ""},
151 "group": ['ping']}, "id": "ping/ubuntu"},
152 {"info": {"type": "cp", "property": {"custom_label": ""},
153 "group": ['ping']}, "id": "ping/cp0"},
154 {"info": {"type": "cp", "property": {"custom_label": ""},
155 "group": ['ping']}, "id": "ping/cp1"},
156 {"info": {"type": "cp", "property": {"custom_label": ""},
157 "group": ['pong']}, "id": "pong/cp0"},
158 {"info": {"type": "cp", "property": {"custom_label": ""},
159 "group": ['pong']}, "id": "pong/cp1"},
160 {"info": {"type": "ns_vl", "property": {"custom_label": ""},
161 "group": []}, "id": "mgmt_vl"},
162 ],
163 'edges': [
164 # {"source": "ping", "group": [], "target": "ping/cp0", "view": "Data"},
165 {"source": "pong/ubuntu", "group": ['pong'], "target": "pong/cp0", "view": "vnf"},
166 {"source": "ping/ubuntu", "group": ['ping'], "target": "ping/cp0", "view": "vnf"},
167 {"source": "pong/ubuntu", "group": ['pong'], "target": "pong/cp1", "view": "vnf"},
168 {"source": "ping/ubuntu", "group": ['ping'], "target": "ping/cp1", "view": "vnf"},
169 {"source": "pong", "group": [], "target": "mgmt_vl", "view": "ns"},
170 {"source": "ping", "group": [], "target": "mgmt_vl", "view": "ns"},
171 ], 'graph_parameters': [],
172 'model': {
173 "layer": {
174
175 "ns": {
176 "nodes": {
177 "vnf": {
178 "addable": {
179 "callback": "addNode"
180 },
181 "removable": {
182 "callback": "removeNode"
183 },
184 "expands": "vnf"
185 },
186 "ns_vl": {
187 "addable": {
188 "callback": "addNode"
189 },
190 "removable": {
191 "callback": "removeNode"
192 }
193 },
194
195 },
196 "allowed_edges": {
197 "ns_vl": {
198 "destination": {
199 "vnf": {
200 "callback": "addLink",
201 "direct_edge": False,
202 "removable": {
203 "callback": "removeLink"
204 }
205 }
206 }
207 },
208 "vnf": {
209 "destination": {
210 "ns_vl": {
211 "callback": "addLink",
212 "direct_edge": False,
213 "removable": {
214 "callback": "removeLink"
215 }
216 },
217
218 }
219 }
220
221 }
222 },
223 "vnf": {
224 "nodes": {
225 "vdu": {
226 "addable": {
227 "callback": "addNode"
228 },
229 "removable": {
230 "callback": "removeNode"
231 }
232 },
233 "cp": {
234 "addable": {
235 "callback": "addNode"
236 },
237 "removable": {
238 "callback": "removeNode"
239 }
240 },
241
242 },
243 "allowed_edges": {
244 "vdu": {
245 "destination": {
246 "cp": {
247 "callback": "addLink",
248 "direct_edge": False,
249 "removable": {
250 "callback": "removeLink"
251 }
252 }
253 }
254 },
255 "cp": {
256 "destination": {
257 "vdu": {
258 "callback": "addLink",
259 "direct_edge": False,
260 "removable": {
261 "callback": "removeLink"
262 }
263 }
264 }
265 }
266 }
267 },
268 "name": "OSM",
269 "version": 1,
270 "nodes": {
271 "vnf": {
272 "label": "vnf"
273 },
274 "ns_vl": {
275 "label": "vl"
276 },
277 "cp": {
278 "label": "cp"
279 },
280 "vdu": {
281 "label": "vdu"
282 }
283 },
284 "description": "osm"
285 }
286 }}
287 return __response_handler(request, result)
288 else:
289 result = {'type': type, 'project_id': project_id, 'instance_id': instance_id}
290 return __response_handler(request, result, 'instance_topology_view.html')
291
292
293 @login_required
294 def show(request, instance_id=None, type=None):
295 # result = {}
296 user = osmutils.get_user(request)
297 project_id = user.project_id
298 client = Client()
299 if type == 'ns':
300 result = client.ns_get(user.get_token(), instance_id)
301 elif type == 'vnf':
302 result = client.vnf_get(user.get_token(), instance_id)
303 print result
304 return __response_handler(request, result)
305
306
307 @login_required
308 def export_metric(request, instance_id=None, type=None):
309 metric_data = request.POST.dict()
310 user = osmutils.get_user(request)
311 project_id = user.project_id
312 client = Client()
313 keys = ["collection_period",
314 "vnf_member_index",
315 "metric_name",
316 "correlation_id",
317 "vdu_name",
318 "collection_unit"]
319 metric_data = dict(filter(lambda i: i[0] in keys and len(i[1]) > 0, metric_data.items()))
320
321 result = client.ns_metric_export(user.get_token(), instance_id, metric_data)
322
323 if result['error']:
324 print result
325 return __response_handler(request, result['data'], url=None,
326 status=result['data']['status'] if 'status' in result['data'] else 500)
327 else:
328 return __response_handler(request, {}, url=None, status=200)
329
330
331 @login_required
332 def create_alarm(request, instance_id=None, type=None):
333 metric_data = request.POST.dict()
334 print metric_data
335 user = osmutils.get_user(request)
336 project_id = user.project_id
337 client = Client()
338
339 keys = ["threshold_value",
340 "vnf_member_index",
341 "metric_name",
342 "vdu_name",
343 "alarm_name",
344 "correlation_id",
345 "statistic",
346 "operation",
347 "severity"]
348 metric_data = dict(filter(lambda i: i[0] in keys and len(i[1]) > 0, metric_data.items()))
349
350 result = client.ns_alarm_create(user.get_token(), instance_id, metric_data)
351 if result['error']:
352 print result
353 return __response_handler(request, result['data'], url=None,
354 status=result['data']['status'] if 'status' in result['data'] else 500)
355 else:
356 return __response_handler(request, {}, url=None, status=200)
357
358
359 def __response_handler(request, data_res, url=None, to_redirect=None, *args, **kwargs):
360 raw_content_types = request.META.get('HTTP_ACCEPT', '*/*').split(',')
361 if 'application/json' in raw_content_types or url is None:
362 return HttpResponse(json.dumps(data_res), content_type="application/json")
363 elif to_redirect:
364 return redirect(url, *args, **kwargs)
365 else:
366 return render(request, url, data_res)