pdu: list, create, show, delete
[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 from lib.osm.osm_rdcl_parser import OsmParser
25 import authosm.utils as osmutils
26 from sf_t3d.decorators import login_required
27
28 logging.basicConfig(level=logging.DEBUG)
29 log = logging.getLogger('instancehandler/view.py')
30
31
32 @login_required
33 def list(request, type=None):
34 user = osmutils.get_user(request)
35 project_id = user.project_id
36 client = Client()
37 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
45 if type == 'ns':
46 instance_list = client.ns_list(user.get_token())
47 elif type == 'vnf':
48 instance_list = client.vnf_list(user.get_token())
49 elif type == 'pdu':
50 instance_list = client.pdu_list(user.get_token())
51
52 result['instances'] = instance_list['data'] if instance_list and instance_list['error'] is False else []
53
54 return __response_handler(request, result, 'instance_list.html')
55
56 @login_required
57 def create(request, type=None):
58 result = {}
59 user = osmutils.get_user(request)
60 client = Client()
61 if type == 'ns':
62 try:
63
64 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)
125
126 @login_required
127 def ns_operations(request, instance_id=None, type=None):
128 user = osmutils.get_user(request)
129 project_id = user.project_id
130
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')
135 client = Client()
136 op_list = client.ns_op_list(user.get_token(), instance_id)
137 result['operations'] = op_list['data'] if op_list and op_list['error'] is False else []
138
139 return __response_handler(request, result, 'instance_operations_list.html')
140
141 @login_required
142 def ns_operation(request, op_id, instance_id=None, type=None):
143 user = osmutils.get_user(request)
144 client = Client()
145 result = client.ns_op(user.get_token(), op_id)
146 return __response_handler(request, result['data'])
147
148
149 @login_required
150 def action(request, instance_id=None, type=None):
151 user = osmutils.get_user(request)
152 client = Client()
153 # 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
162 result = client.ns_action(user.get_token(), instance_id, action_payload)
163 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)
170
171
172 @login_required
173 def delete(request, instance_id=None, type=None):
174 force = bool(request.GET.get('force', False))
175 result = {}
176 user = osmutils.get_user(request)
177 client = Client()
178 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)
182 print result
183 return __response_handler(request, result, 'instances:list', to_redirect=True, type='ns')
184
185 @login_required
186 def 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:
191 client = Client()
192 nsr_object = {'nsr': {}, 'vnfr': {}, 'vnfd': {}}
193 if type == 'ns':
194
195 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]
205
206 test = OsmParser()
207
208 result = test.nsr_to_graph(nsr_object)
209 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')
213
214
215 @login_required
216 def show(request, instance_id=None, type=None):
217 # result = {}
218 user = osmutils.get_user(request)
219 project_id = user.project_id
220 client = Client()
221 if type == 'ns':
222 result = client.ns_get(user.get_token(), instance_id)
223 elif type == 'vnf':
224 result = client.vnf_get(user.get_token(), instance_id)
225 elif type == 'pdu':
226 result = client.pdu_get(user.get_token(), instance_id)
227 print result
228 return __response_handler(request, result)
229
230
231 @login_required
232 def export_metric(request, instance_id=None, type=None):
233 metric_data = request.POST.dict()
234 user = osmutils.get_user(request)
235 project_id = user.project_id
236 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
245 result = client.ns_metric_export(user.get_token(), instance_id, metric_data)
246
247 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
254
255 @login_required
256 def create_alarm(request, instance_id=None, type=None):
257 metric_data = request.POST.dict()
258 print metric_data
259 user = osmutils.get_user(request)
260 project_id = user.project_id
261 client = Client()
262
263 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
274 result = client.ns_alarm_create(user.get_token(), instance_id, metric_data)
275 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)
281
282
283 def __response_handler(request, data_res, url=None, to_redirect=None, *args, **kwargs):
284 raw_content_types = request.META.get('HTTP_ACCEPT', '*/*').split(',')
285 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)
287 elif to_redirect:
288 return redirect(url, *args, **kwargs)
289 else:
290 return render(request, url, data_res)