2 # Copyright 2018 EveryUP Srl
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 sf_t3d
.decorators
import login_required
22 from django
.http
import HttpResponse
23 from django
.shortcuts
import render
, redirect
26 from lib
.util
import Util
27 from lib
.osm
.osmclient
.clientv2
import Client
28 from lib
.osm
.osm_rdcl_parser
import OsmParser
29 from lib
.osm
.osm_util
import OsmUtil
30 import authosm
.utils
as osmutils
32 logging
.basicConfig(level
=logging
.DEBUG
)
33 log
= logging
.getLogger('descriptorhandler/view.py')
37 def show_descriptors(request
, descriptor_type
=None):
38 user
= osmutils
.get_user(request
)
39 project_id
= user
.project_id
42 if descriptor_type
== 'nsd':
43 descriptors
= client
.nsd_list(user
.get_token())
44 elif descriptor_type
== 'vnfd':
45 descriptors
= client
.vnfd_list(user
.get_token())
46 except Exception as e
:
50 url
= 'osm/osm_project_descriptors.html'
51 return __response_handler(request
, {
52 'descriptors': descriptors
['data'] if descriptors
and descriptors
['error'] is False else [],
53 'project_id': project_id
,
54 'project_type': 'osm',
55 'descriptor_type': descriptor_type
60 def delete_descriptor(request
, descriptor_type
=None, descriptor_id
=None):
61 user
= osmutils
.get_user(request
)
62 project_id
= user
.project_id
65 if descriptor_type
== 'nsd':
66 result
= client
.nsd_delete(user
.get_token(), descriptor_id
)
67 elif descriptor_type
== 'vnfd':
68 result
= client
.vnfd_delete(user
.get_token(), descriptor_id
)
69 except Exception as e
:
71 result
= {'error': True, 'data': str(e
)}
73 url
= 'osm/osm_project_descriptors.html'
76 if descriptor_type
== 'nsd':
77 descriptors
= client
.nsd_list(user
.get_token())
78 elif descriptor_type
== 'vnfd':
79 descriptors
= client
.vnfd_list(user
.get_token())
80 except Exception as e
:
83 return __response_handler(request
, {
84 'descriptors': descriptors
['data'] if descriptors
and descriptors
['error'] is False else [],
85 'project_id': project_id
,
86 'project_type': 'osm',
87 'descriptor_type': descriptor_type
,
89 'success': False if result
['error'] is True else True,
90 'message': 'An error occurred while processing your request.' if result
and result
['error'] is True else "Record deleted successfully"}
95 def clone_descriptor(request
, descriptor_type
=None, descriptor_id
=None):
96 user
= osmutils
.get_user(request
)
97 project_id
= user
.project_id
101 if descriptor_type
== 'nsd':
102 result
= client
.nsd_clone(user
.get_token(), descriptor_id
)
103 elif descriptor_type
== 'vnfd':
104 result
= client
.vnfd_clone(user
.get_token(), descriptor_id
)
106 log
.debug('Update descriptor: Unknown data type')
107 result
= {'error': True, 'data': 'Update descriptor: Unknown data type'}
108 except Exception as e
:
110 result
= {'error': True, 'data': str(e
)}
111 if result
['error'] == True:
112 return __response_handler(request
, result
['data'], url
=None,
113 status
=result
['data']['status'] if 'status' in result
['data'] else 500)
116 return __response_handler(request
, {}, url
=None, status
=200)
119 def addElement(request
, descriptor_type
=None, descriptor_id
=None, element_type
=None):
120 user
= osmutils
.get_user(request
)
121 project_id
= user
.project_id
123 if descriptor_type
== 'nsd':
124 descriptor_result
= client
.nsd_get(user
.get_token(), descriptor_id
)
125 element_id
= request
.POST
.get('id', '')
127 descriptor_updated
= util
.add_base_node('nsd', descriptor_result
, element_type
, element_id
, request
.POST
.dict())
128 result
= client
.nsd_update(user
.get_token(), descriptor_id
, descriptor_updated
)
129 if result
['error'] == True:
130 return __response_handler(request
, result
['data'], url
=None,
131 status
=result
['data']['status'] if 'status' in result
['data'] else 500)
135 if descriptor_type
== 'nsd':
136 result_graph
= parser
.nsd_to_graph(descriptor_updated
)
138 return __response_handler(request
, result_graph
, url
=None, status
=200)
140 elif descriptor_type
== 'vnfd':
141 descriptor_result
= client
.vnfd_get(user
.get_token(), descriptor_id
)
142 element_id
= request
.POST
.get('id', '')
144 descriptor_updated
= util
.add_base_node('vnfd', descriptor_result
, element_type
, element_id
, request
.POST
.dict())
145 result
= client
.vnfd_update(user
.get_token(), descriptor_id
, descriptor_updated
)
146 if result
['error'] == True:
147 return __response_handler(request
, result
['data'], url
=None,
148 status
=result
['data']['status'] if 'status' in result
['data'] else 500)
152 if descriptor_type
== 'vnfd':
153 result_graph
= parser
.vnfd_to_graph(descriptor_updated
)
155 return __response_handler(request
, result_graph
, url
=None, status
=200)
159 def removeElement(request
, descriptor_type
=None, descriptor_id
=None, element_type
=None):
160 user
= osmutils
.get_user(request
)
161 project_id
= user
.project_id
163 if descriptor_type
== 'nsd':
164 descriptor_result
= client
.nsd_get(user
.get_token(), descriptor_id
)
165 element_id
= request
.POST
.get('id', '')
167 descriptor_updated
= util
.remove_node('nsd', descriptor_result
, element_type
, element_id
, request
.POST
.dict())
168 result
= client
.nsd_update(user
.get_token(), descriptor_id
, descriptor_updated
)
169 if result
['error'] == True:
170 return __response_handler(request
, result
['data'], url
=None,
171 status
=result
['data']['status'] if 'status' in result
['data'] else 500)
175 if descriptor_type
== 'nsd':
176 result_graph
= parser
.nsd_to_graph(descriptor_updated
)
178 return __response_handler(request
, result_graph
, url
=None, status
=200)
180 elif descriptor_type
== 'vnfd':
181 descriptor_result
= client
.vnfd_get(user
.get_token(), descriptor_id
)
182 element_id
= request
.POST
.get('id', '')
184 descriptor_updated
= util
.remove_node('vnfd', descriptor_result
, element_type
, element_id
, request
.POST
.dict())
185 result
= client
.vnfd_update(user
.get_token(), descriptor_id
, descriptor_updated
)
186 if result
['error'] == True:
187 return __response_handler(request
, result
['data'], url
=None,
188 status
=result
['data']['status'] if 'status' in result
['data'] else 500)
192 if descriptor_type
== 'vnfd':
193 result_graph
= parser
.vnfd_to_graph(descriptor_updated
)
195 return __response_handler(request
, result_graph
, url
=None, status
=200)
198 def updateElement(request
, descriptor_type
=None, descriptor_id
=None, element_type
=None):
199 user
= osmutils
.get_user(request
)
200 project_id
= user
.project_id
202 if descriptor_type
== 'nsd':
203 descriptor_result
= client
.nsd_get(user
.get_token(), descriptor_id
)
205 payload
= request
.POST
.dict()
206 if element_type
== 'graph_params':
207 descriptor_updated
= util
.update_graph_params('nsd', descriptor_result
, json
.loads(payload
['update']))
209 descriptor_updated
= util
.update_node('nsd', descriptor_result
, element_type
, json
.loads(payload
['old']), json
.loads(payload
['update']))
210 result
= client
.nsd_update(user
.get_token(), descriptor_id
, descriptor_updated
)
211 if result
['error'] == True:
212 return __response_handler(request
, result
['data'], url
=None,
213 status
=result
['data']['status'] if 'status' in result
['data'] else 500)
217 if descriptor_type
== 'nsd':
218 result_graph
= parser
.nsd_to_graph(descriptor_updated
)
219 if descriptor_type
== 'vnfd':
220 descriptor_result
= client
.vnfd_get(user
.get_token(), descriptor_id
)
222 payload
= request
.POST
.dict()
223 if element_type
== 'graph_params':
224 descriptor_updated
= util
.update_graph_params('vnfd', descriptor_result
, json
.loads(payload
['update']))
226 descriptor_updated
= util
.update_node('vnfd', descriptor_result
, element_type
, json
.loads(payload
['old']), json
.loads(payload
['update']))
227 result
= client
.vnfd_update(user
.get_token(), descriptor_id
, descriptor_updated
)
228 if result
['error'] == True:
229 return __response_handler(request
, result
['data'], url
=None,
230 status
=result
['data']['status'] if 'status' in result
['data'] else 500)
233 if descriptor_type
== 'vnfd':
234 result_graph
= parser
.vnfd_to_graph(descriptor_updated
)
236 return __response_handler(request
, result_graph
, url
=None, status
=200)
239 def new_descriptor(request
, descriptor_type
=None):
240 user
= osmutils
.get_user(request
)
241 project_id
= user
.project_id
242 page
= 'descriptor_new.html'
243 if request
.method
== 'GET':
244 request_id
= request
.GET
.get('id', '')
246 return __response_handler(request
, {
247 'project_id': project_id
,
248 'descriptor_type': descriptor_type
,
249 'descriptor_id': request_id
,
251 elif request
.method
== 'POST':
252 data_type
= request
.POST
.get('type')
253 if data_type
== "file":
254 file_uploaded
= request
.FILES
['file']
258 if descriptor_type
== 'nsd':
259 result
= client
.nsd_onboard(user
.get_token(), file_uploaded
)
260 elif descriptor_type
== 'vnfd':
261 result
= client
.vnfd_onboard(user
.get_token(), file_uploaded
)
263 log
.debug('Create descriptor: Unknown data type')
264 result
= {'error': True, 'data': 'Create descriptor: Unknown data type'}
266 except Exception as e
:
268 result
= {'error': True, 'data': str(e
)}
270 result
= {'error': True, 'data': 'Create descriptor: Unknown data type'}
273 return __response_handler(request
, result
['data'], url
=None, status
=result
['data']['status'] if 'status' in result
['data'] else 500)
275 return __response_handler(request
, {}, url
=None, status
=200)
279 def edit_descriptor(request
, descriptor_id
=None, descriptor_type
=None):
280 user
= osmutils
.get_user(request
)
281 project_id
= user
.project_id
282 if request
.method
== 'POST':
283 new_data
= request
.POST
.get('text'),
284 data_type
= request
.POST
.get('type')
288 if descriptor_type
== 'nsd':
289 if data_type
== 'yaml':
290 new_data
= yaml
.load(request
.POST
.get('text'))
291 elif data_type
== 'json':
292 new_data
= json
.loads(request
.POST
.get('text'))
293 result
= client
.nsd_update(user
.get_token(), descriptor_id
, new_data
)
294 elif descriptor_type
== 'vnfd':
295 if data_type
== 'yaml':
296 new_data
= yaml
.load(request
.POST
.get('text'))
297 elif data_type
== 'json':
298 new_data
= json
.loads(request
.POST
.get('text'))
299 result
= client
.vnfd_update(user
.get_token(), descriptor_id
, new_data
)
302 log
.debug('Update descriptor: Unknown data type')
303 result
= {'error': True, 'data': 'Update descriptor: Unknown data type'}
304 except Exception as e
:
306 result
= {'error': True, 'data': str(e
)}
307 if result
['error'] == True:
308 return __response_handler(request
, result
['data'], url
=None, status
=result
['data']['status'] if 'status' in result
['data'] else 500)
311 return __response_handler(request
, {}, url
=None, status
=200)
313 elif request
.method
== 'GET':
315 page
= 'descriptor_view.html'
318 if descriptor_type
== 'nsd':
319 result
= client
.nsd_get(user
.get_token(), descriptor_id
)
320 elif descriptor_type
== 'vnfd':
321 result
= client
.vnfd_get(user
.get_token(), descriptor_id
)
323 except Exception as e
:
325 result
= {'error': True, 'data': str(e
)}
327 if isinstance(result
, dict) and 'error' in result
and result
['error']:
328 return render(request
, 'error.html')
330 descriptor_string_json
= json
.dumps(result
, indent
=2)
331 descriptor_string_yaml
= Util
.json2yaml(result
)
333 return render(request
, page
, {
334 'project_id': project_id
,
335 'descriptor_id': descriptor_id
,
336 'descriptor_type': descriptor_type
,
337 'descriptor_strings': {'descriptor_string_yaml': descriptor_string_yaml
,
338 'descriptor_string_json': descriptor_string_json
}})
342 def get_package_files_list(request
, descriptor_id
, descriptor_type
):
343 user
= osmutils
.get_user(request
)
346 if descriptor_type
== 'nsd':
347 artifacts_res
= client
.nsd_artifacts(user
.get_token(), descriptor_id
)
348 elif descriptor_type
== 'vnfd':
349 artifacts_res
= client
.vnf_packages_artifacts(user
.get_token(), descriptor_id
)
353 files_list
= yaml
.load(artifacts_res
['data'] if artifacts_res
and artifacts_res
['error'] is False else [])
354 result
= {'files': files_list
}
355 except Exception as e
:
358 result
= {'error_msg': 'Unknown error.'}
359 return __response_handler(request
, result
)
363 def download_pkg(request
, descriptor_id
, descriptor_type
):
364 user
= osmutils
.get_user(request
)
365 file_name
= "osm_export.tar.gz"
369 if descriptor_type
== 'nsd':
370 tar_pkg
= client
.get_nsd_pkg(user
.get_token(), descriptor_id
)
371 elif descriptor_type
== 'vnfd':
372 tar_pkg
= client
.get_vnfd_pkg(user
.get_token(), descriptor_id
)
374 except Exception as e
:
377 response
= HttpResponse(content_type
="application/tgz")
378 response
["Content-Disposition"] = "attachment; filename="+ file_name
379 response
.write(tar_pkg
.getvalue())
383 def open_composer(request
):
384 user
= osmutils
.get_user(request
)
385 project_id
= user
.project_id
386 descriptor_id
= request
.GET
.get('id')
387 descriptor_type
= request
.GET
.get('type')
391 raw_content_types
= request
.META
.get('HTTP_ACCEPT', '*/*').split(',')
392 if 'application/json' not in raw_content_types
:
393 return __response_handler(request
, {'type': descriptor_type
}, 'composer.html')
395 if descriptor_type
== 'nsd':
396 descriptor_result
= client
.nsd_get(user
.get_token(), descriptor_id
)
397 elif descriptor_type
== 'vnfd':
398 descriptor_result
= client
.vnfd_get(user
.get_token(), descriptor_id
)
400 except Exception as e
:
401 descriptor_result
= {'error': True, 'data': str(e
)}
403 if isinstance(descriptor_result
, dict) and 'error' in descriptor_result
and descriptor_result
['error']:
404 return render(request
, 'error.html')
408 if descriptor_type
== 'nsd':
409 result
= test
.nsd_to_graph(descriptor_result
)
410 elif descriptor_type
== 'vnfd':
411 result
= test
.vnfd_to_graph(descriptor_result
)
412 return __response_handler(request
, result
, 'composer.html')
414 return __response_handler(request
, result
, 'composer.html')
417 def get_available_nodes(request
):
418 user
= osmutils
.get_user(request
)
419 params
= request
.GET
.dict()
423 if params
['layer'] == 'nsd':
424 descriptors
= client
.vnfd_list(user
.get_token())
425 except Exception as e
:
428 if descriptors
and descriptors
['error'] is False:
429 for desc
in descriptors
['data']:
431 result
.append({'_id': desc
['_id'],'id': desc
['id'], 'name': desc
['short-name']})
433 return __response_handler(request
, {'descriptors': result
})
437 def custom_action(request
, descriptor_id
=None, descriptor_type
=None, action_name
=None):
438 if request
.method
== 'GET':
439 return globals()[action_name
](request
, descriptor_id
, descriptor_type
)
442 def __response_handler(request
, data_res
, url
=None, to_redirect
=None, *args
, **kwargs
):
443 raw_content_types
= request
.META
.get('HTTP_ACCEPT', '*/*').split(',')
444 if 'application/json' in raw_content_types
or url
is None:
445 return HttpResponse(json
.dumps(data_res
), content_type
="application/json", *args
, **kwargs
)
447 return redirect(url
, *args
, **kwargs
)
449 return render(request
, url
, data_res
)