2 # Copyright 2017 CNIT - Consorzio Nazionale Interuniversitario per le Telecomunicazioni
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
8 # http://www.apache.org/licenses/LICENSE-2.0
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.
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
30 logging
.basicConfig(level
=logging
.DEBUG
)
31 log
= logging
.getLogger('projecthandler/view.py')
36 return render(request
, 'home.html', {})
40 def create_new_project(request
):
41 if request
.method
== 'POST':
43 new_project_dict
= request
.POST
.dict()
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']:
49 return __response_handler(request
, result
['data'], url
=None,
50 status
=result
['data']['status'] if 'status' in result
['data'] else 500)
52 return __response_handler(request
, {}, url
=None, status
=200)
56 def user_projects(request
):
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 [],
65 def open_project(request
, project_id
=None):
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'])
75 'owner': user
.username
,
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,
86 return render(request
, 'osm/osm_project_details.html',
87 {'project_overview': project_overview
, 'project_id': project_id
})
89 except Exception as e
:
91 return render(request
, 'error.html', {'error_msg': 'Error open project! Please retry.'})
95 def delete_project(request
, project_id
=None):
97 result
= client
.project_delete(request
.session
['token'], project_id
)
98 if isinstance(result
, dict) and 'error' in result
and result
['error']:
100 return __response_handler(request
, result
['data'], url
=None,
101 status
=result
['data']['status'] if 'status' in result
['data'] else 500)
103 return __response_handler(request
, {}, url
=None, status
=200)
107 def show_descriptors(request
, project_id
=None, descriptor_type
=None):
109 print request
.GET
.dict()
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
:
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
129 def delete_descriptor(request
, project_id
=None, descriptor_type
=None, descriptor_id
=None):
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
:
139 result
= {'error': True, 'data': str(e
)}
141 url
= 'osm/osm_project_descriptors.html'
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
:
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
,
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"}
164 def new_descriptor(request
, project_id
=None, descriptor_type
=None):
166 page
= 'osm/descriptor/descriptor_new.html'
167 if request
.method
== 'GET':
168 request_id
= request
.GET
.get('id', '')
170 return __response_handler(request
, {
171 'project_id': project_id
,
172 'descriptor_type': descriptor_type
,
173 'descriptor_id': request_id
,
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']
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
)
188 log
.debug('Create descriptor: Unknown data type')
189 result
= {'error': True, 'data': 'Create descriptor: Unknown data type'}
191 except Exception as e
:
193 result
= {'error': True, 'data': str(e
)}
195 result
= {'error': True, 'data': 'Create descriptor: Unknown data type'}
199 return __response_handler(request
, result
['data'], url
=None, status
=result
['data']['status'] if 'status' in result
['data'] else 500)
201 return __response_handler(request
, {}, url
=None, status
=200)
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')
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'))
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'))
226 result
= client
.vnfd_update(request
.session
['token'], descriptor_id
, new_data
)
229 log
.debug('Update descriptor: Unknown data type')
230 result
= {'error': True, 'data': 'Update descriptor: Unknown data type'}
231 except Exception as e
:
233 result
= {'error': True, 'data': str(e
)}
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)
239 return __response_handler(request
, {}, url
=None, status
=200)
241 elif request
.method
== 'GET':
243 page
= 'osm/descriptor/descriptor_view.html'
246 if descriptor_type
== 'nsd':
247 result
= client
.nsd_get(request
.session
['token'], descriptor_id
)
249 elif descriptor_type
== 'vnfd':
250 result
= client
.vnfd_get(request
.session
['token'], descriptor_id
)
253 except Exception as e
:
255 result
= {'error': True, 'data': str(e
)}
257 if isinstance(result
, dict) and 'error' in result
and result
['error']:
258 return render(request
, 'error.html')
260 descriptor_string_json
= json
.dumps(result
, indent
=2)
261 descriptor_string_yaml
= Util
.json2yaml(result
)
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
}})
272 def get_package_files_list(request
, project_id
, descriptor_id
, descriptor_type
):
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
)
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
:
288 result
= {'error_msg': 'Unknown error.'}
289 return __response_handler(request
, result
)
292 def download_pkg(request
, project_id
, descriptor_id
, descriptor_type
):
293 file_name
= "osm_export.tar.gz"
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
)
302 except Exception as e
:
305 response
= HttpResponse(content_type
="application/tgz")
306 response
["Content-Disposition"] = "attachment; filename="+ file_name
307 response
.write(tar_pkg
.getvalue())
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
)
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
)
323 return redirect(url
, *args
, **kwargs
)
325 return render(request
, url
, data_res
)