0d50e109265fc9e5f6b91b965139ca765714d63f
[osm/LW-UI.git] / projecthandler / views.py
1 #
2 # Copyright 2017 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 import json
18 import logging
19
20 import yaml
21 from django.contrib.auth.decorators import login_required
22 from django.http import HttpResponse, JsonResponse
23 from django.middleware.csrf import get_token
24 from django.shortcuts import render, redirect
25 from lib.util import Util
26 from projecthandler.osm_model import OsmProject
27 from lib.osm.osmclient.clientv2 import Client
28
29
30 logging.basicConfig(level=logging.DEBUG)
31 log = logging.getLogger('projecthandler/view.py')
32
33
34 @login_required
35 def home(request):
36 return render(request, 'home.html', {})
37
38
39 @login_required
40 def create_new_project(request):
41 if request.method == 'POST':
42 client = Client()
43 new_project_dict = request.POST.dict()
44 keys = ["name"]
45 project_data = dict(filter(lambda i: i[0] in keys and len(i[1]) > 0, new_project_dict.items()))
46 result = client.project_create(request.session['token'], project_data)
47 if isinstance(result, dict) and 'error' in result and result['error']:
48 print result
49 return __response_handler(request, result['data'], url=None,
50 status=result['data']['status'] if 'status' in result['data'] else 500)
51 else:
52 return __response_handler(request, {}, url=None, status=200)
53
54
55 @login_required
56 def user_projects(request):
57 client = Client()
58 result = client.project_list(request.session['token'])
59 return render(request, 'projectlist.html', {
60 'projects': result['data'] if result and result['error'] is False else [],
61 })
62
63
64 @login_required
65 def open_project(request, project_id=None):
66 try:
67 user = request.user
68 client = Client()
69 ##TODO change with adhoc api call
70 nsd = client.nsd_list(request.session['token'])
71 vnfd = client.vnfd_list(request.session['token'])
72 ns = client.ns_list(request.session['token'])
73 vnf = client.vnf_list(request.session['token'])
74 project_overview = {
75 'owner': user.username,
76 'name': project_id,
77 'updated_date': '-',
78 'created_date': '-',
79 'info': '-',
80 'type': 'osm',
81 'nsd': len(nsd['data']) if nsd and nsd['error'] is False else 0,
82 'vnfd': len(vnfd['data']) if vnfd and vnfd['error'] is False else 0,
83 'ns': len(ns['data']) if ns and ns['error'] is False else 0,
84 'vnf': len(vnf['data']) if vnf and vnf['error'] is False else 0,
85 }
86 return render(request, 'osm/osm_project_details.html',
87 {'project_overview': project_overview, 'project_id': project_id})
88
89 except Exception as e:
90 print e
91 return render(request, 'error.html', {'error_msg': 'Error open project! Please retry.'})
92
93
94 @login_required
95 def delete_project(request, project_id=None):
96 client = Client()
97 result = client.project_delete(request.session['token'], project_id)
98 if isinstance(result, dict) and 'error' in result and result['error']:
99 print result
100 return __response_handler(request, result['data'], url=None,
101 status=result['data']['status'] if 'status' in result['data'] else 500)
102 else:
103 return __response_handler(request, {}, url=None, status=200)
104
105
106 @login_required
107 def show_descriptors(request, project_id=None, descriptor_type=None):
108 client = Client()
109 print request.GET.dict()
110 try:
111 if descriptor_type == 'nsd':
112 descriptors = client.nsd_list(request.session['token'])
113 elif descriptor_type == 'vnfd':
114 descriptors = client.vnfd_list(request.session['token'])
115 except Exception as e:
116 log.exception(e)
117 descriptors = []
118
119 url = 'osm/osm_project_descriptors.html'
120 return __response_handler(request, {
121 'descriptors': descriptors['data'] if descriptors and descriptors['error'] is False else [],
122 'project_id': project_id,
123 'project_type': 'osm',
124 'descriptor_type': descriptor_type
125 },url)
126
127
128 @login_required
129 def delete_descriptor(request, project_id=None, descriptor_type=None, descriptor_id=None):
130
131 try:
132 client = Client()
133 if descriptor_type == 'nsd':
134 result = client.nsd_delete(request.session['token'], descriptor_id)
135 elif descriptor_type == 'vnfd':
136 result = client.vnfd_delete(request.session['token'], descriptor_id)
137 except Exception as e:
138 log.exception(e)
139 result = {'error': True, 'data': str(e)}
140
141 url = 'osm/osm_project_descriptors.html'
142 descriptors = {}
143 try:
144 if descriptor_type == 'nsd':
145 descriptors = client.nsd_list(request.session['token'])
146 elif descriptor_type == 'vnfd':
147 descriptors = client.vnfd_list(request.session['token'])
148 except Exception as e:
149 log.exception(e)
150
151 return __response_handler(request, {
152 'descriptors': descriptors['data'] if descriptors and descriptors['error'] is False else [],
153 'project_id': project_id,
154 'project_type': 'osm',
155 'descriptor_type': descriptor_type,
156 'alert_message': {
157 'success': False if result['error'] is True else True,
158 'message': 'An error occurred while processing your request.' if result and result['error'] is True else "Record deleted successfully"}
159 }, url)
160
161
162
163 @login_required
164 def new_descriptor(request, project_id=None, descriptor_type=None):
165
166 page = 'osm/descriptor/descriptor_new.html'
167 if request.method == 'GET':
168 request_id = request.GET.get('id', '')
169
170 return __response_handler(request, {
171 'project_id': project_id,
172 'descriptor_type': descriptor_type,
173 'descriptor_id': request_id,
174 }, page)
175 elif request.method == 'POST':
176 data_type = request.POST.get('type')
177 print "TYPE", data_type
178 if data_type == "file":
179 file_uploaded = request.FILES['file']
180
181 try:
182 client = Client()
183 if descriptor_type == 'nsd':
184 result = client.nsd_onboard(request.session['token'], file_uploaded)
185 elif descriptor_type == 'vnfd':
186 result = client.vnfd_onboard(request.session['token'], file_uploaded)
187 else:
188 log.debug('Create descriptor: Unknown data type')
189 result = {'error': True, 'data': 'Create descriptor: Unknown data type'}
190
191 except Exception as e:
192 log.exception(e)
193 result = {'error': True, 'data': str(e)}
194 else:
195 result = {'error': True, 'data': 'Create descriptor: Unknown data type'}
196
197 if result['error']:
198 print result
199 return __response_handler(request, result['data'], url=None, status=result['data']['status'] if 'status' in result['data'] else 500)
200 else:
201 return __response_handler(request, {}, url=None, status=200)
202
203
204 @login_required
205 def edit_descriptor(request, project_id=None, descriptor_id=None, descriptor_type=None):
206 if request.method == 'POST':
207 print "edit_descriptor"
208 new_data = request.POST.get('text'),
209 data_type = request.POST.get('type')
210 #print new_data
211 try:
212 client = Client()
213 if descriptor_type == 'nsd':
214 if data_type == 'yaml':
215 new_data = yaml.load(request.POST.get('text'))
216 elif data_type == 'json':
217 new_data = json.loads(request.POST.get('text'))
218 print new_data
219 result = client.nsd_update(request.session['token'], descriptor_id, new_data)
220 elif descriptor_type == 'vnfd':
221 if data_type == 'yaml':
222 new_data = yaml.load(request.POST.get('text'))
223 elif data_type == 'json':
224 new_data = json.loads(request.POST.get('text'))
225 print new_data
226 result = client.vnfd_update(request.session['token'], descriptor_id, new_data)
227
228 else:
229 log.debug('Update descriptor: Unknown data type')
230 result = {'error': True, 'data': 'Update descriptor: Unknown data type'}
231 except Exception as e:
232 log.exception(e)
233 result = {'error': True, 'data': str(e)}
234 print result
235 if result['error'] == True:
236 return __response_handler(request, result['data'], url=None, status=result['data']['status'] if 'status' in result['data'] else 500)
237
238 else:
239 return __response_handler(request, {}, url=None, status=200)
240
241 elif request.method == 'GET':
242
243 page = 'osm/descriptor/descriptor_view.html'
244 try:
245 client = Client()
246 if descriptor_type == 'nsd':
247 result = client.nsd_get(request.session['token'], descriptor_id)
248 print result
249 elif descriptor_type == 'vnfd':
250 result = client.vnfd_get(request.session['token'], descriptor_id)
251
252 print result
253 except Exception as e:
254 log.exception(e)
255 result = {'error': True, 'data': str(e)}
256
257 if isinstance(result, dict) and 'error' in result and result['error']:
258 return render(request, 'error.html')
259
260 descriptor_string_json = json.dumps(result, indent=2)
261 descriptor_string_yaml = Util.json2yaml(result)
262 # print descriptor
263 return render(request, page, {
264 'project_id': project_id,
265 'descriptor_id': descriptor_id,
266 'descriptor_type': descriptor_type,
267 'descriptor_strings': {'descriptor_string_yaml': descriptor_string_yaml,
268 'descriptor_string_json': descriptor_string_json}})
269
270
271 @login_required
272 def get_package_files_list(request, project_id, descriptor_id, descriptor_type):
273 files_list = []
274 try:
275 client = Client()
276 if descriptor_type == 'nsd':
277 artifacts_res = client.nsd_artifacts(request.session['token'], descriptor_id)
278 elif descriptor_type == 'vnfd':
279 artifacts_res = client.vnf_packages_artifacts(request.session['token'], descriptor_id)
280 else:
281 return False
282
283 files_list = yaml.load(artifacts_res['data'] if artifacts_res and artifacts_res['error'] is False else [])
284 result = {'files': files_list}
285 except Exception as e:
286 log.exception(e)
287 url = 'error.html'
288 result = {'error_msg': 'Unknown error.'}
289 return __response_handler(request, result)
290
291 @login_required
292 def download_pkg(request, project_id, descriptor_id, descriptor_type):
293 file_name = "osm_export.tar.gz"
294 tar_pkg = None
295 try:
296 client = Client()
297 if descriptor_type == 'nsd':
298 tar_pkg = client.get_nsd_pkg(request.session['token'], descriptor_id)
299 elif descriptor_type == 'vnfd':
300 tar_pkg = client.get_vnfd_pkg(request.session['token'], descriptor_id)
301
302 except Exception as e:
303 log.exception(e)
304
305 response = HttpResponse(content_type="application/tgz")
306 response["Content-Disposition"] = "attachment; filename="+ file_name
307 response.write(tar_pkg.getvalue())
308 return response
309
310
311 @login_required
312 def custom_action(request, project_id=None, descriptor_id=None, descriptor_type=None, action_name=None):
313 if request.method == 'GET':
314 print "Custom action: " + action_name
315 return globals()[action_name](request, project_id, descriptor_id, descriptor_type)
316
317
318 def __response_handler(request, data_res, url=None, to_redirect=None, *args, **kwargs):
319 raw_content_types = request.META.get('HTTP_ACCEPT', '*/*').split(',')
320 if 'application/json' in raw_content_types or url is None:
321 return HttpResponse(json.dumps(data_res), content_type="application/json", *args, **kwargs)
322 elif to_redirect:
323 return redirect(url, *args, **kwargs)
324 else:
325 return render(request, url, data_res)