blob: 0d50e109265fc9e5f6b91b965139ca765714d63f [file] [log] [blame]
lombardoffb37bca2018-05-03 16:20:04 +02001#
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
17import json
lombardofr1cdb5942018-06-26 10:37:40 +020018import logging
lombardoffb37bca2018-05-03 16:20:04 +020019
lombardofr1cdb5942018-06-26 10:37:40 +020020import yaml
lombardoffb37bca2018-05-03 16:20:04 +020021from django.contrib.auth.decorators import login_required
22from django.http import HttpResponse, JsonResponse
23from django.middleware.csrf import get_token
24from django.shortcuts import render, redirect
lombardoffb37bca2018-05-03 16:20:04 +020025from lib.util import Util
lombardoffb37bca2018-05-03 16:20:04 +020026from projecthandler.osm_model import OsmProject
lombardofr672969e2018-06-19 16:59:45 +020027from lib.osm.osmclient.clientv2 import Client
lombardoffb37bca2018-05-03 16:20:04 +020028
29
lombardofr1cdb5942018-06-26 10:37:40 +020030logging.basicConfig(level=logging.DEBUG)
31log = logging.getLogger('projecthandler/view.py')
lombardoffb37bca2018-05-03 16:20:04 +020032
lombardoffb37bca2018-05-03 16:20:04 +020033
34@login_required
35def home(request):
36 return render(request, 'home.html', {})
37
38
39@login_required
40def create_new_project(request):
lombardofr137eeb12018-06-26 23:44:40 +020041 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)
lombardoffb37bca2018-05-03 16:20:04 +020053
54
55@login_required
56def user_projects(request):
lombardofr137eeb12018-06-26 23:44:40 +020057 client = Client()
58 result = client.project_list(request.session['token'])
lombardoffb37bca2018-05-03 16:20:04 +020059 return render(request, 'projectlist.html', {
lombardofr137eeb12018-06-26 23:44:40 +020060 'projects': result['data'] if result and result['error'] is False else [],
lombardoffb37bca2018-05-03 16:20:04 +020061 })
62
63
64@login_required
65def open_project(request, project_id=None):
66 try:
lombardofr84d0a012018-06-12 11:21:02 +020067 user = request.user
68 client = Client()
lombardofr1cdb5942018-06-26 10:37:40 +020069 ##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'])
lombardofr84d0a012018-06-12 11:21:02 +020074 project_overview = {
75 'owner': user.username,
76 'name': project_id,
77 'updated_date': '-',
78 'created_date': '-',
79 'info': '-',
80 'type': 'osm',
lombardofr1cdb5942018-06-26 10:37:40 +020081 '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,
lombardofr84d0a012018-06-12 11:21:02 +020085 }
86 return render(request, 'osm/osm_project_details.html',
lombardoffb37bca2018-05-03 16:20:04 +020087 {'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
95def delete_project(request, project_id=None):
lombardofr137eeb12018-06-26 23:44:40 +020096 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)
lombardoffb37bca2018-05-03 16:20:04 +0200104
105
lombardoffb37bca2018-05-03 16:20:04 +0200106@login_required
107def show_descriptors(request, project_id=None, descriptor_type=None):
lombardofr84d0a012018-06-12 11:21:02 +0200108 client = Client()
lombardofr1cdb5942018-06-26 10:37:40 +0200109 print request.GET.dict()
lombardofr84d0a012018-06-12 11:21:02 +0200110 try:
111 if descriptor_type == 'nsd':
lombardofr1cdb5942018-06-26 10:37:40 +0200112 descriptors = client.nsd_list(request.session['token'])
lombardofr84d0a012018-06-12 11:21:02 +0200113 elif descriptor_type == 'vnfd':
lombardofr1cdb5942018-06-26 10:37:40 +0200114 descriptors = client.vnfd_list(request.session['token'])
lombardofr84d0a012018-06-12 11:21:02 +0200115 except Exception as e:
lombardofr1cdb5942018-06-26 10:37:40 +0200116 log.exception(e)
lombardofr84d0a012018-06-12 11:21:02 +0200117 descriptors = []
118
119 url = 'osm/osm_project_descriptors.html'
lombardof07db64f2018-05-11 13:47:10 +0200120 return __response_handler(request, {
lombardofr1cdb5942018-06-26 10:37:40 +0200121 'descriptors': descriptors['data'] if descriptors and descriptors['error'] is False else [],
lombardoffb37bca2018-05-03 16:20:04 +0200122 'project_id': project_id,
lombardofr84d0a012018-06-12 11:21:02 +0200123 'project_type': 'osm',
lombardoffb37bca2018-05-03 16:20:04 +0200124 'descriptor_type': descriptor_type
lombardof07db64f2018-05-11 13:47:10 +0200125 },url)
lombardoffb37bca2018-05-03 16:20:04 +0200126
127
128@login_required
lombardoffb37bca2018-05-03 16:20:04 +0200129def delete_descriptor(request, project_id=None, descriptor_type=None, descriptor_id=None):
lombardofr84d0a012018-06-12 11:21:02 +0200130
131 try:
132 client = Client()
133 if descriptor_type == 'nsd':
lombardofr1cdb5942018-06-26 10:37:40 +0200134 result = client.nsd_delete(request.session['token'], descriptor_id)
lombardofr84d0a012018-06-12 11:21:02 +0200135 elif descriptor_type == 'vnfd':
lombardofr1cdb5942018-06-26 10:37:40 +0200136 result = client.vnfd_delete(request.session['token'], descriptor_id)
lombardofr84d0a012018-06-12 11:21:02 +0200137 except Exception as e:
lombardofr1cdb5942018-06-26 10:37:40 +0200138 log.exception(e)
139 result = {'error': True, 'data': str(e)}
lombardoffb37bca2018-05-03 16:20:04 +0200140
lombardofr1cdb5942018-06-26 10:37:40 +0200141 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 [],
lombardoffb37bca2018-05-03 16:20:04 +0200153 'project_id': project_id,
lombardofr1cdb5942018-06-26 10:37:40 +0200154 'project_type': 'osm',
lombardoffb37bca2018-05-03 16:20:04 +0200155 'descriptor_type': descriptor_type,
lombardofr1cdb5942018-06-26 10:37:40 +0200156 '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
lombardoffb37bca2018-05-03 16:20:04 +0200161
162
163@login_required
lombardoffb37bca2018-05-03 16:20:04 +0200164def new_descriptor(request, project_id=None, descriptor_type=None):
lombardofr84d0a012018-06-12 11:21:02 +0200165
lombardofr1cdb5942018-06-26 10:37:40 +0200166 page = 'osm/descriptor/descriptor_new.html'
lombardoffb37bca2018-05-03 16:20:04 +0200167 if request.method == 'GET':
168 request_id = request.GET.get('id', '')
lombardofr1cdb5942018-06-26 10:37:40 +0200169
170 return __response_handler(request, {
lombardoffb37bca2018-05-03 16:20:04 +0200171 'project_id': project_id,
172 'descriptor_type': descriptor_type,
173 'descriptor_id': request_id,
lombardofr1cdb5942018-06-26 10:37:40 +0200174 }, page)
lombardoffb37bca2018-05-03 16:20:04 +0200175 elif request.method == 'POST':
lombardoffb37bca2018-05-03 16:20:04 +0200176 data_type = request.POST.get('type')
177 print "TYPE", data_type
178 if data_type == "file":
179 file_uploaded = request.FILES['file']
lombardofr1cdb5942018-06-26 10:37:40 +0200180
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)}
lombardoffb37bca2018-05-03 16:20:04 +0200194 else:
lombardofr1cdb5942018-06-26 10:37:40 +0200195 result = {'error': True, 'data': 'Create descriptor: Unknown data type'}
lombardoffb37bca2018-05-03 16:20:04 +0200196
lombardofr1cdb5942018-06-26 10:37:40 +0200197 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)
lombardofr1cdb5942018-06-26 10:37:40 +0200200 else:
201 return __response_handler(request, {}, url=None, status=200)
lombardoffb37bca2018-05-03 16:20:04 +0200202
203
204@login_required
205def edit_descriptor(request, project_id=None, descriptor_id=None, descriptor_type=None):
206 if request.method == 'POST':
207 print "edit_descriptor"
lombardofr1cdb5942018-06-26 10:37:40 +0200208 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)
lombardoffb37bca2018-05-03 16:20:04 +0200240
241 elif request.method == 'GET':
lombardoffb37bca2018-05-03 16:20:04 +0200242
lombardofr1cdb5942018-06-26 10:37:40 +0200243 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)
lombardoffb37bca2018-05-03 16:20:04 +0200251
lombardofr1cdb5942018-06-26 10:37:40 +0200252 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)
lombardoffb37bca2018-05-03 16:20:04 +0200262 # print descriptor
263 return render(request, page, {
264 'project_id': project_id,
265 'descriptor_id': descriptor_id,
lombardoffb37bca2018-05-03 16:20:04 +0200266 'descriptor_type': descriptor_type,
267 'descriptor_strings': {'descriptor_string_yaml': descriptor_string_yaml,
268 'descriptor_string_json': descriptor_string_json}})
269
270
lombardofr1cdb5942018-06-26 10:37:40 +0200271@login_required
272def get_package_files_list(request, project_id, descriptor_id, descriptor_type):
lombardoffb37bca2018-05-03 16:20:04 +0200273 files_list = []
274 try:
lombardofr1cdb5942018-06-26 10:37:40 +0200275 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 [])
lombardoffb37bca2018-05-03 16:20:04 +0200284 result = {'files': files_list}
285 except Exception as e:
lombardofr1cdb5942018-06-26 10:37:40 +0200286 log.exception(e)
lombardoffb37bca2018-05-03 16:20:04 +0200287 url = 'error.html'
288 result = {'error_msg': 'Unknown error.'}
289 return __response_handler(request, result)
290
lombardofr1cdb5942018-06-26 10:37:40 +0200291@login_required
lombardofr84d0a012018-06-12 11:21:02 +0200292def download_pkg(request, project_id, descriptor_id, descriptor_type):
lombardofr1cdb5942018-06-26 10:37:40 +0200293 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)
lombardoffb37bca2018-05-03 16:20:04 +0200304
305 response = HttpResponse(content_type="application/tgz")
lombardofr1cdb5942018-06-26 10:37:40 +0200306 response["Content-Disposition"] = "attachment; filename="+ file_name
lombardoffb37bca2018-05-03 16:20:04 +0200307 response.write(tar_pkg.getvalue())
308 return response
309
310
lombardoffb37bca2018-05-03 16:20:04 +0200311@login_required
312def custom_action(request, project_id=None, descriptor_id=None, descriptor_type=None, action_name=None):
313 if request.method == 'GET':
lombardoffb37bca2018-05-03 16:20:04 +0200314 print "Custom action: " + action_name
lombardofr84d0a012018-06-12 11:21:02 +0200315 return globals()[action_name](request, project_id, descriptor_id, descriptor_type)
lombardoffb37bca2018-05-03 16:20:04 +0200316
317
318def __response_handler(request, data_res, url=None, to_redirect=None, *args, **kwargs):
319 raw_content_types = request.META.get('HTTP_ACCEPT', '*/*').split(',')
lombardofr1cdb5942018-06-26 10:37:40 +0200320 if 'application/json' in raw_content_types or url is None:
321 return HttpResponse(json.dumps(data_res), content_type="application/json", *args, **kwargs)
lombardoffb37bca2018-05-03 16:20:04 +0200322 elif to_redirect:
323 return redirect(url, *args, **kwargs)
324 else:
325 return render(request, url, data_res)