d71cd3278f17ea46efa346ce7c65ef385e8e15d8
[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
35 user = osmutils.get_user(request)
36 project_id = user.project_id
37 client = Client()
38 result = {'type': type, 'project_id': project_id}
39 if "OSM_ERROR" in request.session:
40 result['alert_error'] = request.session["OSM_ERROR"]
41 del request.session["OSM_ERROR"]
42 raw_content_types = request.META.get('HTTP_ACCEPT', '*/*').split(',')
43 if 'application/json' not in raw_content_types:
44 return __response_handler(request, result, 'instance_list.html')
45 instance_list = None
46 if type == 'ns':
47 instance_list = client.ns_list(user.get_token())
48 elif type == 'vnf':
49 instance_list = client.vnf_list(user.get_token())
50
51 result['instances'] = instance_list['data'] if instance_list and instance_list['error'] is False else []
52
53 return __response_handler(request, result, 'instance_list.html')
54
55
56 @login_required
57 def create(request):
58 result = {}
59 try:
60
61 ns_data = {
62 "nsName": request.POST.get('nsName', 'WithoutName'),
63 "nsDescription": request.POST.get('nsDescription', ''),
64 "nsdId": request.POST.get('nsdId', ''),
65 "vimAccountId": request.POST.get('vimAccountId', ''),
66 }
67 if 'ssh_key' in request.POST and request.POST.get('ssh_key') != '':
68 ns_data["ssh_keys"] = [request.POST.get('ssh_key')]
69
70 if 'config' in request.POST:
71 ns_config = yaml.load(request.POST.get('config'))
72 if isinstance(ns_config, dict):
73 if "vim-network-name" in ns_config:
74 ns_config["vld"] = ns_config.pop("vim-network-name")
75 if "vld" in ns_config:
76 print ns_config
77 for vld in ns_config["vld"]:
78 if vld.get("vim-network-name"):
79 if isinstance(vld["vim-network-name"], dict):
80 vim_network_name_dict = {}
81 for vim_account, vim_net in vld["vim-network-name"].items():
82 vim_network_name_dict[ns_data["vimAccountId"]] = vim_net
83 vld["vim-network-name"] = vim_network_name_dict
84 ns_data["vld"] = ns_config["vld"]
85 if "vnf" in ns_config:
86 for vnf in ns_config["vnf"]:
87 if vnf.get("vim_account"):
88 vnf["vimAccountId"] = ns_data["vimAccountId"]
89
90 ns_data["vnf"] = ns_config["vnf"]
91 except Exception as e:
92 request.session["OSM_ERROR"] = "Error creating the NS; Invalid parameters provided."
93 return __response_handler(request, {}, 'instances:list', to_redirect=True, type='ns', )
94
95 print ns_data
96 user = osmutils.get_user(request)
97 client = Client()
98 result = client.ns_create(user.get_token(), ns_data)
99 return __response_handler(request, result, 'instances:list', to_redirect=True, type='ns',)
100
101
102 @login_required
103 def ns_operations(request, instance_id=None, type=None):
104 user = osmutils.get_user(request)
105 project_id = user.project_id
106
107 result = {'type': 'ns', 'project_id': project_id, 'instance_id': instance_id}
108 raw_content_types = request.META.get('HTTP_ACCEPT', '*/*').split(',')
109 if 'application/json' not in raw_content_types:
110 return __response_handler(request, result, 'instance_operations_list.html')
111 client = Client()
112 op_list = client.ns_op_list(user.get_token(), instance_id)
113 result['operations'] = op_list['data'] if op_list and op_list['error'] is False else []
114
115 return __response_handler(request, result, 'instance_operations_list.html')
116
117 @login_required
118 def ns_operation(request, op_id, instance_id=None, type=None):
119 user = osmutils.get_user(request)
120 client = Client()
121 result = client.ns_op(user.get_token(), op_id)
122 return __response_handler(request, result['data'])
123
124
125 @login_required
126 def action(request, instance_id=None, type=None):
127 user = osmutils.get_user(request)
128 client = Client()
129 # result = client.ns_action(instance_id, action_payload)
130 primitive_param_keys = request.POST.getlist('primitive_params_name')
131 primitive_param_value = request.POST.getlist('primitive_params_value')
132 action_payload = {
133 "vnf_member_index": request.POST.get('vnf_member_index'),
134 "primitive": request.POST.get('primitive'),
135 "primitive_params": {k: v for k, v in zip(primitive_param_keys, primitive_param_value) if len(k) > 0}
136 }
137
138 result = client.ns_action(user.get_token(), instance_id, action_payload)
139 print result
140 if result['error']:
141 return __response_handler(request, result['data'], url=None,
142 status=result['data']['status'] if 'status' in result['data'] else 500)
143
144 else:
145 return __response_handler(request, {}, url=None, status=200)
146
147
148 @login_required
149 def delete(request, instance_id=None, type=None):
150 force = bool(request.GET.get('force', False))
151 result = {}
152 user = osmutils.get_user(request)
153 client = Client()
154 result = client.ns_delete(user.get_token(), instance_id, force)
155 print result
156 return __response_handler(request, result, 'instances:list', to_redirect=True, type='ns')
157
158 @login_required
159 def show_topology(request, instance_id=None, type=None):
160 user = osmutils.get_user(request)
161 project_id = user.project_id
162 raw_content_types = request.META.get('HTTP_ACCEPT', '*/*').split(',')
163 if 'application/json' in raw_content_types:
164 client = Client()
165 nsr_object = {'nsr': {}, 'vnfr': {}, 'vnfd': {}}
166 if type == 'ns':
167
168 nsr_resp = client.ns_get(user.get_token(), instance_id)
169 nsr_object['nsr'] = nsr_resp['data']
170 if 'constituent-vnfr-ref' in nsr_object['nsr'] :
171 for vnfr_id in nsr_object['nsr']['constituent-vnfr-ref']:
172 vnfr_resp = client.vnf_get(user.get_token(), vnfr_id)
173 vnfr = vnfr_resp['data']
174 nsr_object['vnfr'][vnfr['id']] = vnfr
175 if vnfr['vnfd-id'] not in nsr_object['vnfd']:
176 vnfd_resp = client.vnfd_get(user.get_token(), vnfr['vnfd-id'])
177 nsr_object['vnfd'][vnfr['vnfd-id']] = vnfd_resp['vnfd:vnfd-catalog']['vnfd'][0]
178
179
180
181 test = OsmParser()
182 #print nsr_object
183
184 result = test.nsr_to_graph(nsr_object)
185 return __response_handler(request, result)
186 else:
187 result = {'type': type, 'project_id': project_id, 'instance_id': instance_id}
188 return __response_handler(request, result, 'instance_topology_view.html')
189
190
191 @login_required
192 def show(request, instance_id=None, type=None):
193 # result = {}
194 user = osmutils.get_user(request)
195 project_id = user.project_id
196 client = Client()
197 if type == 'ns':
198 result = client.ns_get(user.get_token(), instance_id)
199 elif type == 'vnf':
200 result = client.vnf_get(user.get_token(), instance_id)
201 print result
202 return __response_handler(request, result)
203
204
205 @login_required
206 def export_metric(request, instance_id=None, type=None):
207 metric_data = request.POST.dict()
208 user = osmutils.get_user(request)
209 project_id = user.project_id
210 client = Client()
211 keys = ["collection_period",
212 "vnf_member_index",
213 "metric_name",
214 "correlation_id",
215 "vdu_name",
216 "collection_unit"]
217 metric_data = dict(filter(lambda i: i[0] in keys and len(i[1]) > 0, metric_data.items()))
218
219 result = client.ns_metric_export(user.get_token(), instance_id, metric_data)
220
221 if result['error']:
222 print result
223 return __response_handler(request, result['data'], url=None,
224 status=result['data']['status'] if 'status' in result['data'] else 500)
225 else:
226 return __response_handler(request, {}, url=None, status=200)
227
228
229 @login_required
230 def create_alarm(request, instance_id=None, type=None):
231 metric_data = request.POST.dict()
232 print metric_data
233 user = osmutils.get_user(request)
234 project_id = user.project_id
235 client = Client()
236
237 keys = ["threshold_value",
238 "vnf_member_index",
239 "metric_name",
240 "vdu_name",
241 "alarm_name",
242 "correlation_id",
243 "statistic",
244 "operation",
245 "severity"]
246 metric_data = dict(filter(lambda i: i[0] in keys and len(i[1]) > 0, metric_data.items()))
247
248 result = client.ns_alarm_create(user.get_token(), instance_id, metric_data)
249 if result['error']:
250 print result
251 return __response_handler(request, result['data'], url=None,
252 status=result['data']['status'] if 'status' in result['data'] else 500)
253 else:
254 return __response_handler(request, {}, url=None, status=200)
255
256
257 def __response_handler(request, data_res, url=None, to_redirect=None, *args, **kwargs):
258 raw_content_types = request.META.get('HTTP_ACCEPT', '*/*').split(',')
259 if 'application/json' in raw_content_types or url is None:
260 return HttpResponse(json.dumps(data_res), content_type="application/json")
261 elif to_redirect:
262 return redirect(url, *args, **kwargs)
263 else:
264 return render(request, url, data_res)