blob: de21e9a22a8e68d3e9a0fcf280fdecf8f15e9e0c [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
18
19from django.contrib.auth.decorators import login_required
20from django.http import HttpResponse, JsonResponse
21from django.middleware.csrf import get_token
22from django.shortcuts import render, redirect
lombardoffb37bca2018-05-03 16:20:04 +020023from lib.util import Util
lombardoffb37bca2018-05-03 16:20:04 +020024from projecthandler.osm_model import OsmProject
lombardofr07930222018-06-19 16:59:45 +020025from lib.osm.osmclient.clientv2 import Client
lombardoffb37bca2018-05-03 16:20:04 +020026
27
28
lombardoffb37bca2018-05-03 16:20:04 +020029
30@login_required
31def home(request):
32 return render(request, 'home.html', {})
33
34
35@login_required
36def create_new_project(request):
lombardofr099364f2018-06-12 11:21:02 +020037 return render(request, 'home.html', {})
lombardoffb37bca2018-05-03 16:20:04 +020038
39
40@login_required
41def user_projects(request):
42 csrf_token_value = get_token(request)
lombardofr099364f2018-06-12 11:21:02 +020043 user = request.user
44 projects = user.get_projects()
lombardoffb37bca2018-05-03 16:20:04 +020045
46 return render(request, 'projectlist.html', {
47 'projects': list(projects),
48 'csrf_token': csrf_token_value
49 })
50
51
52@login_required
53def open_project(request, project_id=None):
54 try:
lombardofr099364f2018-06-12 11:21:02 +020055 user = request.user
56 client = Client()
57 nsd = client.nsd_list()
58 vnfd = client.vnfd_list()
59 ns = client.ns_list()
60 vnf = client.vnf_list()
61 project_overview = {
62 'owner': user.username,
63 'name': project_id,
64 'updated_date': '-',
65 'created_date': '-',
66 'info': '-',
67 'type': 'osm',
68 'nsd': len(nsd) if nsd else 0,
69 'vnfd': len(vnfd) if vnfd else 0,
70 'ns': len(ns) if ns else 0,
71 'vnf': len(vnf) if vnf else 0,
72 }
73 return render(request, 'osm/osm_project_details.html',
lombardoffb37bca2018-05-03 16:20:04 +020074 {'project_overview': project_overview, 'project_id': project_id})
75
76 except Exception as e:
77 print e
78 return render(request, 'error.html', {'error_msg': 'Error open project! Please retry.'})
79
80
81@login_required
82def delete_project(request, project_id=None):
83 if request.method == 'POST':
84
85 try:
lombardofr099364f2018-06-12 11:21:02 +020086 ##TODO delete project
lombardoffb37bca2018-05-03 16:20:04 +020087 return redirect('projects:projects_list')
88 except Exception as e:
89 print e
90 return render(request, 'error.html', {'error_msg': 'Error deleting Project.'})
91
92 elif request.method == 'GET':
93 try:
lombardofr099364f2018-06-12 11:21:02 +020094 return render(request, 'osm/osm_project_delete.html',
95 {'project_id': project_id, 'project_name': project_id})
lombardoffb37bca2018-05-03 16:20:04 +020096
97 except Exception as e:
98 print e
99 return render(request, 'error.html', {'error_msg': 'Project not found.'})
100
101
lombardoffb37bca2018-05-03 16:20:04 +0200102@login_required
103def show_descriptors(request, project_id=None, descriptor_type=None):
104 csrf_token_value = get_token(request)
lombardoffb37bca2018-05-03 16:20:04 +0200105
lombardofr099364f2018-06-12 11:21:02 +0200106 client = Client()
107 try:
108 if descriptor_type == 'nsd':
109 descriptors = client.nsd_list()
110
111 elif descriptor_type == 'vnfd':
112 descriptors = client.vnfd_list()
113 except Exception as e:
114 descriptors = []
115
116 url = 'osm/osm_project_descriptors.html'
lombardof07db64f2018-05-11 13:47:10 +0200117 return __response_handler(request, {
lombardofr099364f2018-06-12 11:21:02 +0200118 'descriptors': descriptors,
lombardoffb37bca2018-05-03 16:20:04 +0200119 'project_id': project_id,
lombardofr099364f2018-06-12 11:21:02 +0200120 'project_type': 'osm',
lombardoffb37bca2018-05-03 16:20:04 +0200121 "csrf_token_value": csrf_token_value,
122 'descriptor_type': descriptor_type
lombardof07db64f2018-05-11 13:47:10 +0200123 },url)
lombardoffb37bca2018-05-03 16:20:04 +0200124
125
126@login_required
lombardoffb37bca2018-05-03 16:20:04 +0200127def delete_descriptor(request, project_id=None, descriptor_type=None, descriptor_id=None):
128 csrf_token_value = get_token(request)
lombardofr099364f2018-06-12 11:21:02 +0200129
130 try:
131 client = Client()
132 if descriptor_type == 'nsd':
133 result = client.nsd_delete(descriptor_id)
134 elif descriptor_type == 'vnfd':
135 result = client.vnfd_delete(descriptor_id)
136
137 else:
138 return False
139
140 except Exception as e:
141 result = False
142 project_overview = OsmProject.get_overview_data()
lombardoffb37bca2018-05-03 16:20:04 +0200143 prj_token = project_overview['type']
144 page = prj_token + '/' + prj_token + '_project_descriptors.html'
145
146 return render(request, page, {
lombardofr099364f2018-06-12 11:21:02 +0200147 'descriptors': OsmProject.get_descriptors(descriptor_type),
lombardoffb37bca2018-05-03 16:20:04 +0200148 'project_id': project_id,
149 'project_overview_data': project_overview,
150 "csrf_token_value": csrf_token_value,
151 'descriptor_type': descriptor_type,
152 #'alert_message': {
153 # 'success': result,
154 # 'message': "Delete succeeded!" if result else 'Error in delete'}
155 })
156
157
158@login_required
lombardoffb37bca2018-05-03 16:20:04 +0200159def new_descriptor(request, project_id=None, descriptor_type=None):
lombardofr099364f2018-06-12 11:21:02 +0200160
161 project_overview = OsmProject.get_overview_data()
lombardoffb37bca2018-05-03 16:20:04 +0200162 prj_token = project_overview['type']
163 page = prj_token + '/descriptor/descriptor_new.html'
164 if request.method == 'GET':
165 request_id = request.GET.get('id', '')
lombardoffb37bca2018-05-03 16:20:04 +0200166 return render(request, page, {
167 'project_id': project_id,
168 'descriptor_type': descriptor_type,
169 'descriptor_id': request_id,
lombardof35dde052018-05-23 14:45:12 +0200170 'project_overview_data': project_overview
lombardoffb37bca2018-05-03 16:20:04 +0200171 })
172 elif request.method == 'POST':
173 csrf_token_value = get_token(request)
174 data_type = request.POST.get('type')
175 print "TYPE", data_type
176 if data_type == "file":
177 file_uploaded = request.FILES['file']
178 text = file_uploaded.read()
179 data_type = file_uploaded.name.split(".")[-1]
180 desc_name = file_uploaded.name.split(".")[0]
lombardofr099364f2018-06-12 11:21:02 +0200181 result = OsmProject.create_descriptor(desc_name, descriptor_type, text, data_type, file_uploaded)
lombardoffb37bca2018-05-03 16:20:04 +0200182 else:
183 text = request.POST.get('text')
184 desc_name = request.POST.get('id')
lombardofr099364f2018-06-12 11:21:02 +0200185 result = OsmProject.create_descriptor(desc_name, descriptor_type, text, data_type)
lombardoffb37bca2018-05-03 16:20:04 +0200186
187
188 response_data = {
189 'project_id': project_id,
190 'descriptor_type': descriptor_type,
lombardofr099364f2018-06-12 11:21:02 +0200191 'project_overview_data':OsmProject.get_overview_data(),
lombardoffb37bca2018-05-03 16:20:04 +0200192 'descriptor_id': result,
193 'alert_message': {
194 'success': True if result != False else False,
195 'message': "Descriptor created" if result else 'Error in creation'}
196 }
197 status_code = 200 if result != False else 500
198 response = HttpResponse(json.dumps(response_data), content_type="application/json", status=status_code)
199 response["Access-Control-Allow-Origin"] = "*"
200 return response
201
202
203@login_required
204def edit_descriptor(request, project_id=None, descriptor_id=None, descriptor_type=None):
205 if request.method == 'POST':
206 print "edit_descriptor"
lombardofr099364f2018-06-12 11:21:02 +0200207 result = OsmProject.edit_descriptor(descriptor_type, descriptor_id, request.POST.get('text'),
lombardoffb37bca2018-05-03 16:20:04 +0200208 request.POST.get('type'))
209 response_data = {
210 'project_id': project_id,
211 'descriptor_type': descriptor_type,
212 #'project_overview_data': projects[0].get_overview_data(),
213 'alert_message': {
214 'success': True if result else False,
215 'message': "Descriptor modified." if result else 'Error during descriptor editing.'}
216 }
217 status_code = 200 if result else 500
218 response = HttpResponse(json.dumps(response_data), content_type="application/json", status=status_code)
219 response["Access-Control-Allow-Origin"] = "*"
220 return response
221
222 elif request.method == 'GET':
223 csrf_token_value = get_token(request)
lombardofr099364f2018-06-12 11:21:02 +0200224 project_overview = OsmProject.get_overview_data()
lombardoffb37bca2018-05-03 16:20:04 +0200225 print project_overview
226 prj_token = project_overview['type']
227 page = prj_token + '/descriptor/descriptor_view.html'
228
lombardofr099364f2018-06-12 11:21:02 +0200229 descriptor = OsmProject.get_descriptor(descriptor_id, descriptor_type)
lombardoffb37bca2018-05-03 16:20:04 +0200230
231 descriptor_string_json = json.dumps(descriptor)
232 descriptor_string_yaml = Util.json2yaml(descriptor)
233 # print descriptor
234 return render(request, page, {
235 'project_id': project_id,
236 'descriptor_id': descriptor_id,
lombardofr099364f2018-06-12 11:21:02 +0200237 'project_overview_data': OsmProject.get_overview_data(),
lombardoffb37bca2018-05-03 16:20:04 +0200238 'descriptor_type': descriptor_type,
239 'descriptor_strings': {'descriptor_string_yaml': descriptor_string_yaml,
240 'descriptor_string_json': descriptor_string_json}})
241
242
lombardoffb37bca2018-05-03 16:20:04 +0200243# OSM specific method #
244def get_package_files_list(request, project_id, project, descriptor_id, descriptor_type):
245 files_list = []
246 try:
247 files_list = project.get_package_files_list(descriptor_type, descriptor_id)
248 result = {'files': files_list}
249 except Exception as e:
250 print e
251 url = 'error.html'
252 result = {'error_msg': 'Unknown error.'}
253 return __response_handler(request, result)
254
255
lombardofr099364f2018-06-12 11:21:02 +0200256def download_pkg(request, project_id, descriptor_id, descriptor_type):
257 tar_pkg = OsmProject.download_pkg(descriptor_id, descriptor_type)
lombardoffb37bca2018-05-03 16:20:04 +0200258
259 response = HttpResponse(content_type="application/tgz")
260 response["Content-Disposition"] = "attachment; filename=osm_export.tar.gz"
261 response.write(tar_pkg.getvalue())
262 return response
263
264
265def create_ns(request, project_id, project, descriptor_id, descriptor_type):
266 files_list = []
267 try:
268 ns_data={
269 "nsName": request.POST.get('nsName', 'WithoutName'),
270 "nsDescription": request.POST.get('nsDescription', ''),
271 "nsdId": request.POST.get('nsdId', ''),
272 "vimAccountId": request.POST.get('vimAccountId', ''),
273 "ssh-authorized-key": [
274 {
275 request.POST.get('key-pair-ref', ''): request.POST.get('keyValue', '')
276 }
277 ]
278 }
279 #result = project.create_ns(descriptor_type, descriptor_id, ns_data)
280
281 except Exception as e:
282 print e
283 url = 'error.html'
284 result = {'error_msg': 'Unknown error.'}
285 return __response_handler(request, result)
286
287# end OSM specific method #
288
289@login_required
290def custom_action(request, project_id=None, descriptor_id=None, descriptor_type=None, action_name=None):
291 if request.method == 'GET':
lombardoffb37bca2018-05-03 16:20:04 +0200292 print "Custom action: " + action_name
lombardofr099364f2018-06-12 11:21:02 +0200293 return globals()[action_name](request, project_id, descriptor_id, descriptor_type)
lombardoffb37bca2018-05-03 16:20:04 +0200294
295
296def __response_handler(request, data_res, url=None, to_redirect=None, *args, **kwargs):
297 raw_content_types = request.META.get('HTTP_ACCEPT', '*/*').split(',')
298 if 'application/json' in raw_content_types:
299 return JsonResponse(data_res)
300 elif to_redirect:
301 return redirect(url, *args, **kwargs)
302 else:
303 return render(request, url, data_res)