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 sf_t3d
.decorators
import login_required
22 from django
.http
import HttpResponse
, JsonResponse
23 from django
.shortcuts
import render
, redirect
25 from authosm
.exceptions
import OSMAuthException
26 from lib
.util
import Util
27 from lib
.osm
.osmclient
.clientv2
import Client
28 import authosm
.utils
as osmutils
31 logging
.basicConfig(level
=logging
.DEBUG
)
32 log
= logging
.getLogger('projecthandler/view.py')
37 return render(request
, 'home.html', {})
41 def create_new_project(request
):
42 if request
.method
== 'POST':
43 user
= osmutils
.get_user(request
)
45 new_project_dict
= request
.POST
.dict()
47 project_data
= dict(filter(lambda i
: i
[0] in keys
and len(i
[1]) > 0, new_project_dict
.items()))
48 result
= client
.project_create(user
.get_token(), project_data
)
49 if isinstance(result
, dict) and 'error' in result
and result
['error']:
51 return __response_handler(request
, result
['data'], url
=None,
52 status
=result
['data']['status'] if 'status' in result
['data'] else 500)
54 return __response_handler(request
, {}, url
=None, status
=200)
58 def user_projects(request
):
59 user
= osmutils
.get_user(request
)
61 result
= client
.project_list(user
.get_token())
62 return __response_handler(request
,{
63 'projects': result
['data'] if result
and result
['error'] is False else [],
67 def open_composer(request
):
68 user
= osmutils
.get_user(request
)
69 project_id
= user
.project_id
70 result
= {'project_id': project_id
,
72 {"info": {"type": "vnf", "property": {"custom_label": ""},
73 "group": []}, "id": "vm"},
74 {"info": {"type": "vnf", "property": {"custom_label": ""},
75 "group": []}, "id": "vlan"},
76 {"info": {"type": "vnf", "property": {"custom_label": ""},
77 "group": []}, "id": "firewall"},
78 {"info": {"type": "vnf", "property": {"custom_label": ""},
79 "group": []}, "id": "ping"},
81 {"info": {"type": "ns_vl", "property": {"custom_label": ""},
82 "group": []}, "id": "vl1"},
83 {"info": {"type": "ns_vl", "property": {"custom_label": ""},
84 "group": []}, "id": "vl2"},
85 {"info": {"type": "ns_vl", "property": {"custom_label": ""},
86 "group": []}, "id": "vl3"},
89 {"source": "vm", "group": [], "target": "vl3", "view": "ns"},
90 {"source": "vlan", "group": [], "target": "vl3", "view": "ns"},
91 {"source": "vlan", "group": [], "target": "vl1", "view": "ns"},
92 {"source": "firewall", "group": [], "target": "vl1", "view": "ns"},
93 {"source": "firewall", "group": [], "target": "vl2", "view": "ns"},
94 {"source": "ping", "group": [], "target": "vl2", "view": "ns"},
103 "callback": "addNode"
106 "callback": "removeNode"
112 "callback": "addNode"
115 "callback": "removeNode"
124 "callback": "addLink",
125 "direct_edge": False,
127 "callback": "removeLink"
135 "callback": "addLink",
136 "direct_edge": False,
138 "callback": "removeLink"
151 "callback": "addNode"
154 "callback": "removeNode"
159 "callback": "addNode"
162 "callback": "removeNode"
171 "callback": "addLink",
172 "direct_edge": False,
174 "callback": "removeLink"
182 "callback": "addLink",
183 "direct_edge": False,
185 "callback": "removeLink"
208 "description": "osm",
211 "file": "osm_controller.js",
212 "class": "OsmController"
215 "file": "osm_controller.js",
216 "class": "OsmController"
219 "file": "osm_controller.js",
220 "class": "OsmController"
223 "file": "osm_controller.js",
224 "class": "OsmController"
230 return __response_handler(request
, result
, 'project_graph_base.html')
233 def get_available_nodes(request
):
235 params
= request
.GET
.dict()
237 'ns': [{"types": [{"name": "Generic", "id": "vnf"},
238 {"name": "ping", "id": "vnf"},
239 {"name": "pong", "id": "vnf"},
240 {"name": "hackfest1-vm", "id": "vnf"}], "category_name": "Vnf"},
241 {"types": [{"name": "VL", "id": "ns_vl"}], "category_name": "VirtualLink"}],
242 'vnf': [{"types": [{"name": "VDU", "id": "vdu"}], "category_name": "Vdu"},
243 {"types": [{"name": "CP", "id": "cp"}], "category_name": "CP"}]
246 return __response_handler(request
, nodes
[params
['layer']])
250 def open_project(request
):
251 user
= osmutils
.get_user(request
)
252 project_id
= user
.project_id
256 ##TODO change with adhoc api call
257 prj
= client
.project_get(user
.get_token(), project_id
)
258 nsd
= client
.nsd_list(user
.get_token())
259 vnfd
= client
.vnfd_list(user
.get_token())
260 ns
= client
.ns_list(user
.get_token())
261 vnf
= client
.vnf_list(user
.get_token())
263 'owner': user
.username
,
265 'updated_date': prj
['data']['_admin']['modified'] if prj
and prj
['error'] is False else '-',
266 'created_date': prj
['data']['_admin']['created'] if prj
and prj
['error'] is False else '-',
269 'nsd': len(nsd
['data']) if nsd
and nsd
['error'] is False else 0,
270 'vnfd': len(vnfd
['data']) if vnfd
and vnfd
['error'] is False else 0,
271 'ns': len(ns
['data']) if ns
and ns
['error'] is False else 0,
272 'vnf': len(vnf
['data']) if vnf
and vnf
['error'] is False else 0,
274 return render(request
, 'osm/osm_project_details.html',
275 {'project_overview': project_overview
, 'project_id': project_id
})
277 except Exception as e
:
279 return render(request
, 'error.html', {'error_msg': 'Error open project! Please retry.'})
283 def delete_project(request
, project_id
):
284 user
= osmutils
.get_user(request
)
287 result
= client
.project_delete(user
.get_token(), project_id
)
288 if isinstance(result
, dict) and 'error' in result
and result
['error']:
290 return __response_handler(request
, result
['data'], url
=None,
291 status
=result
['data']['status'] if 'status' in result
['data'] else 500)
293 return __response_handler(request
, {}, url
=None, status
=200)
297 def switch_project(request
, project_id
):
298 user
= osmutils
.get_user(request
)
299 user
.switch_project(project_id
)
300 return redirect('projects:open_project')
304 def edit_project(request
, project_id
):
305 if request
.method
== 'POST':
306 user
= osmutils
.get_user(request
)
308 project_dict
= request
.POST
.dict()
310 project_data
= dict(filter(lambda i
: i
[0] in keys
and len(i
[1]) > 0, project_dict
.items()))
311 result
= client
.project_edit(user
.get_token(), project_id
, project_data
)
312 if isinstance(result
, dict) and 'error' in result
and result
['error']:
314 return __response_handler(request
, result
['data'], url
=None,
315 status
=result
['data']['status'] if 'status' in result
['data'] else 500)
317 return __response_handler(request
, {}, url
=None, status
=200)
321 def show_descriptors(request
, descriptor_type
=None):
322 user
= osmutils
.get_user(request
)
323 project_id
= user
.project_id
325 print request
.GET
.dict()
327 if descriptor_type
== 'nsd':
328 descriptors
= client
.nsd_list(user
.get_token())
329 elif descriptor_type
== 'vnfd':
330 descriptors
= client
.vnfd_list(user
.get_token())
331 except Exception as e
:
335 url
= 'osm/osm_project_descriptors.html'
336 return __response_handler(request
, {
337 'descriptors': descriptors
['data'] if descriptors
and descriptors
['error'] is False else [],
338 'project_id': project_id
,
339 'project_type': 'osm',
340 'descriptor_type': descriptor_type
345 def delete_descriptor(request
, descriptor_type
=None, descriptor_id
=None):
346 user
= osmutils
.get_user(request
)
347 project_id
= user
.project_id
350 if descriptor_type
== 'nsd':
351 result
= client
.nsd_delete(user
.get_token(), descriptor_id
)
352 elif descriptor_type
== 'vnfd':
353 result
= client
.vnfd_delete(user
.get_token(), descriptor_id
)
354 except Exception as e
:
356 result
= {'error': True, 'data': str(e
)}
358 url
= 'osm/osm_project_descriptors.html'
361 if descriptor_type
== 'nsd':
362 descriptors
= client
.nsd_list(user
.get_token())
363 elif descriptor_type
== 'vnfd':
364 descriptors
= client
.vnfd_list(user
.get_token())
365 except Exception as e
:
368 return __response_handler(request
, {
369 'descriptors': descriptors
['data'] if descriptors
and descriptors
['error'] is False else [],
370 'project_id': project_id
,
371 'project_type': 'osm',
372 'descriptor_type': descriptor_type
,
374 'success': False if result
['error'] is True else True,
375 'message': 'An error occurred while processing your request.' if result
and result
['error'] is True else "Record deleted successfully"}
380 def clone_descriptor(request
, descriptor_type
=None, descriptor_id
=None):
381 user
= osmutils
.get_user(request
)
382 project_id
= user
.project_id
386 if descriptor_type
== 'nsd':
387 result
= client
.nsd_clone(user
.get_token(), descriptor_id
)
388 elif descriptor_type
== 'vnfd':
389 result
= client
.vnfd_clone(user
.get_token(), descriptor_id
)
391 log
.debug('Update descriptor: Unknown data type')
392 result
= {'error': True, 'data': 'Update descriptor: Unknown data type'}
393 except Exception as e
:
395 result
= {'error': True, 'data': str(e
)}
397 if result
['error'] == True:
398 return __response_handler(request
, result
['data'], url
=None,
399 status
=result
['data']['status'] if 'status' in result
['data'] else 500)
402 return __response_handler(request
, {}, url
=None, status
=200)
407 def new_descriptor(request
, descriptor_type
=None):
408 user
= osmutils
.get_user(request
)
409 project_id
= user
.project_id
410 page
= 'osm/descriptor/descriptor_new.html'
411 if request
.method
== 'GET':
412 request_id
= request
.GET
.get('id', '')
414 return __response_handler(request
, {
415 'project_id': project_id
,
416 'descriptor_type': descriptor_type
,
417 'descriptor_id': request_id
,
419 elif request
.method
== 'POST':
420 data_type
= request
.POST
.get('type')
421 print "TYPE", data_type
422 if data_type
== "file":
423 file_uploaded
= request
.FILES
['file']
427 if descriptor_type
== 'nsd':
428 result
= client
.nsd_onboard(user
.get_token(), file_uploaded
)
429 elif descriptor_type
== 'vnfd':
430 result
= client
.vnfd_onboard(user
.get_token(), file_uploaded
)
432 log
.debug('Create descriptor: Unknown data type')
433 result
= {'error': True, 'data': 'Create descriptor: Unknown data type'}
435 except Exception as e
:
437 result
= {'error': True, 'data': str(e
)}
439 result
= {'error': True, 'data': 'Create descriptor: Unknown data type'}
443 return __response_handler(request
, result
['data'], url
=None, status
=result
['data']['status'] if 'status' in result
['data'] else 500)
445 return __response_handler(request
, {}, url
=None, status
=200)
449 def edit_descriptor(request
, descriptor_id
=None, descriptor_type
=None):
450 user
= osmutils
.get_user(request
)
451 project_id
= user
.project_id
452 if request
.method
== 'POST':
453 print "edit_descriptor"
454 new_data
= request
.POST
.get('text'),
455 data_type
= request
.POST
.get('type')
459 if descriptor_type
== 'nsd':
460 if data_type
== 'yaml':
461 new_data
= yaml
.load(request
.POST
.get('text'))
462 elif data_type
== 'json':
463 new_data
= json
.loads(request
.POST
.get('text'))
465 result
= client
.nsd_update(user
.get_token(), descriptor_id
, new_data
)
466 elif descriptor_type
== 'vnfd':
467 if data_type
== 'yaml':
468 new_data
= yaml
.load(request
.POST
.get('text'))
469 elif data_type
== 'json':
470 new_data
= json
.loads(request
.POST
.get('text'))
472 result
= client
.vnfd_update(user
.get_token(), descriptor_id
, new_data
)
475 log
.debug('Update descriptor: Unknown data type')
476 result
= {'error': True, 'data': 'Update descriptor: Unknown data type'}
477 except Exception as e
:
479 result
= {'error': True, 'data': str(e
)}
481 if result
['error'] == True:
482 return __response_handler(request
, result
['data'], url
=None, status
=result
['data']['status'] if 'status' in result
['data'] else 500)
485 return __response_handler(request
, {}, url
=None, status
=200)
487 elif request
.method
== 'GET':
489 page
= 'osm/descriptor/descriptor_view.html'
492 if descriptor_type
== 'nsd':
493 result
= client
.nsd_get(user
.get_token(), descriptor_id
)
495 elif descriptor_type
== 'vnfd':
496 result
= client
.vnfd_get(user
.get_token(), descriptor_id
)
499 except Exception as e
:
501 result
= {'error': True, 'data': str(e
)}
503 if isinstance(result
, dict) and 'error' in result
and result
['error']:
504 return render(request
, 'error.html')
506 descriptor_string_json
= json
.dumps(result
, indent
=2)
507 descriptor_string_yaml
= Util
.json2yaml(result
)
509 return render(request
, page
, {
510 'project_id': project_id
,
511 'descriptor_id': descriptor_id
,
512 'descriptor_type': descriptor_type
,
513 'descriptor_strings': {'descriptor_string_yaml': descriptor_string_yaml
,
514 'descriptor_string_json': descriptor_string_json
}})
518 def get_package_files_list(request
, descriptor_id
, descriptor_type
):
519 user
= osmutils
.get_user(request
)
522 if descriptor_type
== 'nsd':
523 artifacts_res
= client
.nsd_artifacts(user
.get_token(), descriptor_id
)
524 elif descriptor_type
== 'vnfd':
525 artifacts_res
= client
.vnf_packages_artifacts(user
.get_token(), descriptor_id
)
529 files_list
= yaml
.load(artifacts_res
['data'] if artifacts_res
and artifacts_res
['error'] is False else [])
530 result
= {'files': files_list
}
531 except Exception as e
:
534 result
= {'error_msg': 'Unknown error.'}
535 return __response_handler(request
, result
)
538 def download_pkg(request
, descriptor_id
, descriptor_type
):
539 user
= osmutils
.get_user(request
)
540 file_name
= "osm_export.tar.gz"
544 if descriptor_type
== 'nsd':
545 tar_pkg
= client
.get_nsd_pkg(user
.get_token(), descriptor_id
)
546 elif descriptor_type
== 'vnfd':
547 tar_pkg
= client
.get_vnfd_pkg(user
.get_token(), descriptor_id
)
549 except Exception as e
:
552 response
= HttpResponse(content_type
="application/tgz")
553 response
["Content-Disposition"] = "attachment; filename="+ file_name
554 response
.write(tar_pkg
.getvalue())
559 def custom_action(request
, descriptor_id
=None, descriptor_type
=None, action_name
=None):
560 if request
.method
== 'GET':
561 print "Custom action: " + action_name
562 return globals()[action_name
](request
, descriptor_id
, descriptor_type
)
565 def __response_handler(request
, data_res
, url
=None, to_redirect
=None, *args
, **kwargs
):
566 raw_content_types
= request
.META
.get('HTTP_ACCEPT', '*/*').split(',')
567 if 'application/json' in raw_content_types
or url
is None:
568 return HttpResponse(json
.dumps(data_res
), content_type
="application/json", *args
, **kwargs
)
570 return redirect(url
, *args
, **kwargs
)
572 return render(request
, url
, data_res
)