de21e9a22a8e68d3e9a0fcf280fdecf8f15e9e0c
[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
19 from django.contrib.auth.decorators import login_required
20 from django.http import HttpResponse, JsonResponse
21 from django.middleware.csrf import get_token
22 from django.shortcuts import render, redirect
23 from lib.util import Util
24 from projecthandler.osm_model import OsmProject
25 from lib.osm.osmclient.clientv2 import Client
26
27
28
29
30 @login_required
31 def home(request):
32 return render(request, 'home.html', {})
33
34
35 @login_required
36 def create_new_project(request):
37 return render(request, 'home.html', {})
38
39
40 @login_required
41 def user_projects(request):
42 csrf_token_value = get_token(request)
43 user = request.user
44 projects = user.get_projects()
45
46 return render(request, 'projectlist.html', {
47 'projects': list(projects),
48 'csrf_token': csrf_token_value
49 })
50
51
52 @login_required
53 def open_project(request, project_id=None):
54 try:
55 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',
74 {'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
82 def delete_project(request, project_id=None):
83 if request.method == 'POST':
84
85 try:
86 ##TODO delete project
87 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:
94 return render(request, 'osm/osm_project_delete.html',
95 {'project_id': project_id, 'project_name': project_id})
96
97 except Exception as e:
98 print e
99 return render(request, 'error.html', {'error_msg': 'Project not found.'})
100
101
102 @login_required
103 def show_descriptors(request, project_id=None, descriptor_type=None):
104 csrf_token_value = get_token(request)
105
106 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'
117 return __response_handler(request, {
118 'descriptors': descriptors,
119 'project_id': project_id,
120 'project_type': 'osm',
121 "csrf_token_value": csrf_token_value,
122 'descriptor_type': descriptor_type
123 },url)
124
125
126 @login_required
127 def delete_descriptor(request, project_id=None, descriptor_type=None, descriptor_id=None):
128 csrf_token_value = get_token(request)
129
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()
143 prj_token = project_overview['type']
144 page = prj_token + '/' + prj_token + '_project_descriptors.html'
145
146 return render(request, page, {
147 'descriptors': OsmProject.get_descriptors(descriptor_type),
148 '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
159 def new_descriptor(request, project_id=None, descriptor_type=None):
160
161 project_overview = OsmProject.get_overview_data()
162 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', '')
166 return render(request, page, {
167 'project_id': project_id,
168 'descriptor_type': descriptor_type,
169 'descriptor_id': request_id,
170 'project_overview_data': project_overview
171 })
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]
181 result = OsmProject.create_descriptor(desc_name, descriptor_type, text, data_type, file_uploaded)
182 else:
183 text = request.POST.get('text')
184 desc_name = request.POST.get('id')
185 result = OsmProject.create_descriptor(desc_name, descriptor_type, text, data_type)
186
187
188 response_data = {
189 'project_id': project_id,
190 'descriptor_type': descriptor_type,
191 'project_overview_data':OsmProject.get_overview_data(),
192 '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
204 def edit_descriptor(request, project_id=None, descriptor_id=None, descriptor_type=None):
205 if request.method == 'POST':
206 print "edit_descriptor"
207 result = OsmProject.edit_descriptor(descriptor_type, descriptor_id, request.POST.get('text'),
208 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)
224 project_overview = OsmProject.get_overview_data()
225 print project_overview
226 prj_token = project_overview['type']
227 page = prj_token + '/descriptor/descriptor_view.html'
228
229 descriptor = OsmProject.get_descriptor(descriptor_id, descriptor_type)
230
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,
237 'project_overview_data': OsmProject.get_overview_data(),
238 'descriptor_type': descriptor_type,
239 'descriptor_strings': {'descriptor_string_yaml': descriptor_string_yaml,
240 'descriptor_string_json': descriptor_string_json}})
241
242
243 # OSM specific method #
244 def 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
256 def download_pkg(request, project_id, descriptor_id, descriptor_type):
257 tar_pkg = OsmProject.download_pkg(descriptor_id, descriptor_type)
258
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
265 def 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
290 def custom_action(request, project_id=None, descriptor_id=None, descriptor_type=None, action_name=None):
291 if request.method == 'GET':
292 print "Custom action: " + action_name
293 return globals()[action_name](request, project_id, descriptor_id, descriptor_type)
294
295
296 def __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)