X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=projecthandler%2Fviews.py;h=1f1573de3180cdf9ee3ec4c3818677f0fb5cb5f9;hb=78e7188849e9acdb565a4598dba733b69faa764f;hp=8c553a4d56eb90072c2e762600915007b8ccb18e;hpb=fb37bca4b7e8178c65df2f1496afe372c1d55e78;p=osm%2FLW-UI.git diff --git a/projecthandler/views.py b/projecthandler/views.py index 8c553a4..1f1573d 100644 --- a/projecthandler/views.py +++ b/projecthandler/views.py @@ -15,26 +15,22 @@ # import json +import logging -from django.contrib.auth.decorators import login_required +import yaml +from sf_t3d.decorators import login_required from django.http import HttpResponse, JsonResponse -from django.middleware.csrf import get_token from django.shortcuts import render, redirect -from django.template.loader import render_to_string -from lib.util import Util -from sf_user.models import CustomUser -import tarfile - - -from projecthandler.osm_model import OsmProject -from projecthandler.models import Project - -Project.add_project_type('osm', OsmProject) +from authosm.exceptions import OSMAuthException +from lib.util import Util +from lib.osm.osmclient.clientv2 import Client +import authosm.utils as osmutils +logging.basicConfig(level=logging.DEBUG) +log = logging.getLogger('projecthandler/view.py') -from projecthandler.models import Repository @login_required def home(request): @@ -44,95 +40,238 @@ def home(request): @login_required def create_new_project(request): if request.method == 'POST': - error_msgs = [] - user = CustomUser.objects.get(id=request.user.id) - name = request.POST.get('name', 'WithoutName') - info = request.POST.get('info', ' ') - type = request.POST.get('type', '') - start_from = request.POST.get('startfrom', 'scratch') - - project_types = Project.get_project_types() - if type in project_types: - project_class = project_types[type] - + user = osmutils.get_user(request) + client = Client() + new_project_dict = request.POST.dict() + keys = ["name"] + project_data = dict(filter(lambda i: i[0] in keys and len(i[1]) > 0, new_project_dict.items())) + result = client.project_create(user.get_token(), project_data) + if isinstance(result, dict) and 'error' in result and result['error']: + print result + return __response_handler(request, result['data'], url=None, + status=result['data']['status'] if 'status' in result['data'] else 500) else: - # FIXME this error is not handled - error_msgs.append('Project type undefined.') - return render(request, 'error.html', - {'error_msg': 'Error creating new project, project type undefined. Please retry.'}) - - try: - - if start_from == 'scratch': - print 'from scratch' - data_project = {} - - elif start_from == 'files': - print 'from files' - data_project = project_class.data_project_from_files(request) - - elif start_from == 'example': - print 'from example' - data_project = project_class.data_project_from_example(request) - - project = project_class.create_project(name, user, False, info, data_project) - # print project.get_dataproject() - - - except Exception as e: - print 'Error creating ' + type + ' project! Please retry.' - print e - return render(request, 'error.html', {'error_msg': 'Error creating ' + type + ' project! Please retry.'}) - return redirect('projects:open_project', project_id=project.id) - - elif request.method == 'GET': - csrf_token_value = get_token(request) - result = {} - data_type_selector = [{ - 'id': '-1', - 'text': 'Select an option' - }] - type_example_files = {} - type_container_template = '' - project_types = Project.get_project_types() - print "project_types", project_types.keys() - for type in project_types: - project_class = project_types[type] - type_example_files.update(project_class.get_example_list()) - data_type_selector.append({ - 'id': type, - 'text': type, - 'value': type - }) - type_container_template += render_to_string(type + '/' + type + '_new_project.html') - - result.update({'type_example_files': json.dumps(type_example_files)}) - result.update({'data_type_selector': json.dumps(data_type_selector)}) - result.update({'type_container_template': type_container_template}) - result.update({'csrf_token': csrf_token_value}) - return render(request, 'new_project.html', result) + return __response_handler(request, {}, url=None, status=200) @login_required def user_projects(request): - csrf_token_value = get_token(request) - user = CustomUser.objects.get(id=request.user.id) - projects = Project.objects.filter(owner=user).select_subclasses() - - return render(request, 'projectlist.html', { - 'projects': list(projects), - 'csrf_token': csrf_token_value - }) + user = osmutils.get_user(request) + client = Client() + result = client.project_list(user.get_token()) + return __response_handler(request,{ + 'projects': result['data'] if result and result['error'] is False else [], + },'projectlist.html') + + +def open_composer(request): + user = osmutils.get_user(request) + project_id = user.project_id + result = {'project_id': project_id, + 'vertices': [ + {"info": {"type": "vnf", "property": {"custom_label": ""}, + "group": []}, "id": "vm"}, + {"info": {"type": "vnf", "property": {"custom_label": ""}, + "group": []}, "id": "vlan"}, + {"info": {"type": "vnf", "property": {"custom_label": ""}, + "group": []}, "id": "firewall"}, + {"info": {"type": "vnf", "property": {"custom_label": ""}, + "group": []}, "id": "ping"}, + + {"info": {"type": "ns_vl", "property": {"custom_label": ""}, + "group": []}, "id": "vl1"}, + {"info": {"type": "ns_vl", "property": {"custom_label": ""}, + "group": []}, "id": "vl2"}, + {"info": {"type": "ns_vl", "property": {"custom_label": ""}, + "group": []}, "id": "vl3"}, + ], + 'edges': [ + {"source": "vm", "group": [], "target": "vl3", "view": "ns"}, + {"source": "vlan", "group": [], "target": "vl3", "view": "ns"}, + {"source": "vlan", "group": [], "target": "vl1", "view": "ns"}, + {"source": "firewall", "group": [], "target": "vl1", "view": "ns"}, + {"source": "firewall", "group": [], "target": "vl2", "view": "ns"}, + {"source": "ping", "group": [], "target": "vl2", "view": "ns"}, + ], + 'model': { + "layer": { + + "ns": { + "nodes": { + "vnf": { + "addable": { + "callback": "addNode" + }, + "removable": { + "callback": "removeNode" + }, + "expands": "vnf" + }, + "ns_vl": { + "addable": { + "callback": "addNode" + }, + "removable": { + "callback": "removeNode" + } + }, + + }, + "allowed_edges": { + "ns_vl": { + "destination": { + "vnf": { + "callback": "addLink", + "direct_edge": False, + "removable": { + "callback": "removeLink" + } + } + } + }, + "vnf": { + "destination": { + "ns_vl": { + "callback": "addLink", + "direct_edge": False, + "removable": { + "callback": "removeLink" + } + }, + + } + } + + } + }, + "vnf": { + "nodes": { + "vdu": { + "addable": { + "callback": "addNode" + }, + "removable": { + "callback": "removeNode" + } + }, + "cp": { + "addable": { + "callback": "addNode" + }, + "removable": { + "callback": "removeNode" + } + }, + + }, + "allowed_edges": { + "vdu": { + "destination": { + "cp": { + "callback": "addLink", + "direct_edge": False, + "removable": { + "callback": "removeLink" + } + } + } + }, + "cp": { + "destination": { + "vdu": { + "callback": "addLink", + "direct_edge": False, + "removable": { + "callback": "removeLink" + } + } + } + } + } + }, + "name": "OSM", + "version": 1, + "nodes": { + "vnf": { + "label": "vnf" + }, + "ns_vl": { + "label": "vl" + }, + "cp": { + "label": "cp" + }, + "vdu": { + "label": "vdu" + } + }, + "description": "osm", + "callback": { + "addNode": { + "file": "osm_controller.js", + "class": "OsmController" + }, + "removeNode": { + "file": "osm_controller.js", + "class": "OsmController" + }, + "addLink": { + "file": "osm_controller.js", + "class": "OsmController" + }, + "removeLink": { + "file": "osm_controller.js", + "class": "OsmController" + } + } + + } + }} + return __response_handler(request, result, 'project_graph_base.html') + + +def get_available_nodes(request): + + params = request.GET.dict() + nodes = { + 'ns': [{"types": [{"name": "Generic", "id": "vnf"}, + {"name": "ping", "id": "vnf"}, + {"name": "pong", "id": "vnf"}, + {"name": "hackfest1-vm", "id": "vnf"}], "category_name": "Vnf"}, + {"types": [{"name": "VL", "id": "ns_vl"}], "category_name": "VirtualLink"}], + 'vnf': [{"types": [{"name": "VDU", "id": "vdu"}], "category_name": "Vdu"}, + {"types": [{"name": "CP", "id": "cp"}], "category_name": "CP"}] + } + + return __response_handler(request, nodes[params['layer']]) @login_required -def open_project(request, project_id=None): +def open_project(request): + user = osmutils.get_user(request) + project_id = user.project_id try: - projects = Project.objects.filter(id=project_id).select_subclasses() - project_overview = projects[0].get_overview_data() - prj_token = project_overview['type'] - print request.COOKIES.keys() - return render(request, prj_token + '/' + prj_token + '_project_details.html', + + client = Client() + ##TODO change with adhoc api call + prj = client.project_get(user.get_token(), project_id) + nsd = client.nsd_list(user.get_token()) + vnfd = client.vnfd_list(user.get_token()) + ns = client.ns_list(user.get_token()) + vnf = client.vnf_list(user.get_token()) + project_overview = { + 'owner': user.username, + 'name': project_id, + 'updated_date': prj['data']['_admin']['modified'] if prj and prj['error'] is False else '-', + 'created_date': prj['data']['_admin']['created'] if prj and prj['error'] is False else '-', + + 'type': 'osm', + 'nsd': len(nsd['data']) if nsd and nsd['error'] is False else 0, + 'vnfd': len(vnfd['data']) if vnfd and vnfd['error'] is False else 0, + 'ns': len(ns['data']) if ns and ns['error'] is False else 0, + 'vnf': len(vnf['data']) if vnf and vnf['error'] is False else 0, + } + return render(request, 'osm/osm_project_details.html', {'project_overview': project_overview, 'project_id': project_id}) except Exception as e: @@ -141,396 +280,292 @@ def open_project(request, project_id=None): @login_required -def delete_project(request, project_id=None): - if request.method == 'POST': +def delete_project(request, project_id): + user = osmutils.get_user(request) + + client = Client() + result = client.project_delete(user.get_token(), project_id) + if isinstance(result, dict) and 'error' in result and result['error']: + print result + return __response_handler(request, result['data'], url=None, + status=result['data']['status'] if 'status' in result['data'] else 500) + else: + return __response_handler(request, {}, url=None, status=200) - try: - Project.objects.filter(id=project_id).delete() - return redirect('projects:projects_list') - except Exception as e: - print e - return render(request, 'error.html', {'error_msg': 'Error deleting Project.'}) - elif request.method == 'GET': - try: - projects = Project.objects.filter(id=project_id).select_subclasses() - project_overview = projects[0].get_overview_data() - prj_token = project_overview['type'] - # example: 'etsi/etsi_project_delete.html' - print prj_token + '/' + prj_token + '_project_delete.html', project_overview['name'] - return render(request, prj_token + '/' + prj_token + '_project_delete.html', - {'project_id': project_id, 'project_name': project_overview['name']}) +@login_required +def switch_project(request, project_id): + user = osmutils.get_user(request) + user.switch_project(project_id) + return redirect('projects:open_project') - except Exception as e: - print e - return render(request, 'error.html', {'error_msg': 'Project not found.'}) +@login_required +def edit_project(request, project_id): + if request.method == 'POST': + user = osmutils.get_user(request) + client = Client() + project_dict = request.POST.dict() + keys = ["name"] + project_data = dict(filter(lambda i: i[0] in keys and len(i[1]) > 0, project_dict.items())) + result = client.project_edit(user.get_token(), project_id, project_data) + if isinstance(result, dict) and 'error' in result and result['error']: + print result + return __response_handler(request, result['data'], url=None, + status=result['data']['status'] if 'status' in result['data'] else 500) + else: + return __response_handler(request, {}, url=None, status=200) @login_required -def show_descriptors(request, project_id=None, descriptor_type=None): - csrf_token_value = get_token(request) - projects = Project.objects.filter(id=project_id).select_subclasses() - project_overview = projects[0].get_overview_data() - prj_token = project_overview['type'] - - page = prj_token + '/' + prj_token + '_project_descriptors.html' +def show_descriptors(request, descriptor_type=None): + user = osmutils.get_user(request) + project_id = user.project_id + client = Client() + print request.GET.dict() + try: + if descriptor_type == 'nsd': + descriptors = client.nsd_list(user.get_token()) + elif descriptor_type == 'vnfd': + descriptors = client.vnfd_list(user.get_token()) + except Exception as e: + log.exception(e) + descriptors = [] - return render(request, page, { - 'descriptors': projects[0].get_descriptors(descriptor_type), + url = 'osm/osm_project_descriptors.html' + return __response_handler(request, { + 'descriptors': descriptors['data'] if descriptors and descriptors['error'] is False else [], 'project_id': project_id, - 'project_type': prj_token, - 'project_overview_data': project_overview, - "csrf_token_value": csrf_token_value, + 'project_type': 'osm', 'descriptor_type': descriptor_type - }) + },url) @login_required -def graph(request, project_id=None): - if request.method == 'GET': - csrf_token_value = get_token(request) - projects = Project.objects.filter(id=project_id).select_subclasses() - project_overview = projects[0].get_overview_data() - prj_token = project_overview['type'] - # example : 'etsi/project_graph.html' - return render(request, prj_token + '/project_graph.html', { - 'project_id': project_id, - 'project_overview_data': projects[0].get_overview_data(), - 'collapsed_sidebar': False - }) - - -@login_required -def graph_data(request, project_id=None, descriptor_id=None): - print 'graph_data', project_id, descriptor_id - projects = Project.objects.filter(id=project_id).select_subclasses() - project_overview = projects[0].get_overview_data() - # data = projects[0].get_overview_data() - prj_token = project_overview['type'] - - topology = projects[0].get_graph_data_json_topology(descriptor_id) - response = HttpResponse(topology, content_type="application/json") - response["Access-Control-Allow-Origin"] = "*" - - return response +def delete_descriptor(request, descriptor_type=None, descriptor_id=None): + user = osmutils.get_user(request) + project_id = user.project_id + try: + client = Client() + if descriptor_type == 'nsd': + result = client.nsd_delete(user.get_token(), descriptor_id) + elif descriptor_type == 'vnfd': + result = client.vnfd_delete(user.get_token(), descriptor_id) + except Exception as e: + log.exception(e) + result = {'error': True, 'data': str(e)} + url = 'osm/osm_project_descriptors.html' + descriptors = {} + try: + if descriptor_type == 'nsd': + descriptors = client.nsd_list(user.get_token()) + elif descriptor_type == 'vnfd': + descriptors = client.vnfd_list(user.get_token()) + except Exception as e: + log.exception(e) -@login_required -def delete_descriptor(request, project_id=None, descriptor_type=None, descriptor_id=None): - csrf_token_value = get_token(request) - projects = Project.objects.filter(id=project_id).select_subclasses() - result = projects[0].delete_descriptor(descriptor_type, descriptor_id) - project_overview = projects[0].get_overview_data() - prj_token = project_overview['type'] - page = prj_token + '/' + prj_token + '_project_descriptors.html' - - return render(request, page, { - 'descriptors': projects[0].get_descriptors(descriptor_type), + return __response_handler(request, { + 'descriptors': descriptors['data'] if descriptors and descriptors['error'] is False else [], 'project_id': project_id, - 'project_overview_data': project_overview, - "csrf_token_value": csrf_token_value, + 'project_type': 'osm', 'descriptor_type': descriptor_type, - #'alert_message': { - # 'success': result, - # 'message': "Delete succeeded!" if result else 'Error in delete'} - }) + 'alert_message': { + 'success': False if result['error'] is True else True, + 'message': 'An error occurred while processing your request.' if result and result['error'] is True else "Record deleted successfully"} + }, url) @login_required -def clone_descriptor(request, project_id=None, descriptor_type=None, descriptor_id=None): - csrf_token_value = get_token(request) - projects = Project.objects.filter(id=project_id).select_subclasses() - new_id = request.GET.get('newid', '') - result = projects[0].clone_descriptor(descriptor_type, descriptor_id, new_id) - project_overview = projects[0].get_overview_data() - prj_token = project_overview['type'] - page = prj_token + '/' + prj_token + '_project_descriptors.html' - - return render(request, page, { - 'descriptors': projects[0].get_descriptors(descriptor_type), - 'project_id': project_id, - 'project_overview_data': project_overview, - "csrf_token_value": csrf_token_value, - 'descriptor_type': descriptor_type, - 'alert_message': { - 'success': result, - 'message': "Cloned!" if result else 'Error in cloning'} - }) +def clone_descriptor(request, descriptor_type=None, descriptor_id=None): + user = osmutils.get_user(request) + project_id = user.project_id + + try: + client = Client() + if descriptor_type == 'nsd': + result = client.nsd_clone(user.get_token(), descriptor_id) + elif descriptor_type == 'vnfd': + result = client.vnfd_clone(user.get_token(), descriptor_id) + else: + log.debug('Update descriptor: Unknown data type') + result = {'error': True, 'data': 'Update descriptor: Unknown data type'} + except Exception as e: + log.exception(e) + result = {'error': True, 'data': str(e)} + print result + if result['error'] == True: + return __response_handler(request, result['data'], url=None, + status=result['data']['status'] if 'status' in result['data'] else 500) + + else: + return __response_handler(request, {}, url=None, status=200) + @login_required -def new_descriptor(request, project_id=None, descriptor_type=None): - projects = Project.objects.filter(id=project_id).select_subclasses() - project_overview = projects[0].get_overview_data() - prj_token = project_overview['type'] - page = prj_token + '/descriptor/descriptor_new.html' +def new_descriptor(request, descriptor_type=None): + user = osmutils.get_user(request) + project_id = user.project_id + page = 'osm/descriptor/descriptor_new.html' if request.method == 'GET': request_id = request.GET.get('id', '') - json_template = projects[0].get_new_descriptor(descriptor_type, request_id) - print 'new descriptor GET', json_template - - descriptor_string_yaml = Util.json2yaml(json_template) - descriptor_string_json = json.dumps(json_template) - - return render(request, page, { + return __response_handler(request, { 'project_id': project_id, 'descriptor_type': descriptor_type, 'descriptor_id': request_id, - 'project_overview_data': project_overview, - 'descriptor_strings': {'descriptor_string_yaml': descriptor_string_yaml, - 'descriptor_string_json': descriptor_string_json} - }) + }, page) elif request.method == 'POST': - csrf_token_value = get_token(request) data_type = request.POST.get('type') print "TYPE", data_type if data_type == "file": file_uploaded = request.FILES['file'] - text = file_uploaded.read() - data_type = file_uploaded.name.split(".")[-1] - desc_name = file_uploaded.name.split(".")[0] - result = projects[0].create_descriptor(desc_name, descriptor_type, text, data_type, file_uploaded) - else: - text = request.POST.get('text') - desc_name = request.POST.get('id') - result = projects[0].create_descriptor(desc_name, descriptor_type, text, data_type) + try: + client = Client() + if descriptor_type == 'nsd': + result = client.nsd_onboard(user.get_token(), file_uploaded) + elif descriptor_type == 'vnfd': + result = client.vnfd_onboard(user.get_token(), file_uploaded) + else: + log.debug('Create descriptor: Unknown data type') + result = {'error': True, 'data': 'Create descriptor: Unknown data type'} + + except Exception as e: + log.exception(e) + result = {'error': True, 'data': str(e)} + else: + result = {'error': True, 'data': 'Create descriptor: Unknown data type'} - response_data = { - 'project_id': project_id, - 'descriptor_type': descriptor_type, - 'project_overview_data': projects[0].get_overview_data(), - 'descriptor_id': result, - 'alert_message': { - 'success': True if result != False else False, - 'message': "Descriptor created" if result else 'Error in creation'} - } - status_code = 200 if result != False else 500 - response = HttpResponse(json.dumps(response_data), content_type="application/json", status=status_code) - response["Access-Control-Allow-Origin"] = "*" - return response + if result['error']: + print result + return __response_handler(request, result['data'], url=None, status=result['data']['status'] if 'status' in result['data'] else 500) + else: + return __response_handler(request, {}, url=None, status=200) @login_required -def edit_descriptor(request, project_id=None, descriptor_id=None, descriptor_type=None): +def edit_descriptor(request, descriptor_id=None, descriptor_type=None): + user = osmutils.get_user(request) + project_id = user.project_id if request.method == 'POST': print "edit_descriptor" - projects = Project.objects.filter(id=project_id).select_subclasses() - result = projects[0].edit_descriptor(descriptor_type, descriptor_id, request.POST.get('text'), - request.POST.get('type')) - response_data = { - 'project_id': project_id, - 'descriptor_type': descriptor_type, - #'project_overview_data': projects[0].get_overview_data(), - 'alert_message': { - 'success': True if result else False, - 'message': "Descriptor modified." if result else 'Error during descriptor editing.'} - } - status_code = 200 if result else 500 - response = HttpResponse(json.dumps(response_data), content_type="application/json", status=status_code) - response["Access-Control-Allow-Origin"] = "*" - return response + new_data = request.POST.get('text'), + data_type = request.POST.get('type') + #print new_data + try: + client = Client() + if descriptor_type == 'nsd': + if data_type == 'yaml': + new_data = yaml.load(request.POST.get('text')) + elif data_type == 'json': + new_data = json.loads(request.POST.get('text')) + print new_data + result = client.nsd_update(user.get_token(), descriptor_id, new_data) + elif descriptor_type == 'vnfd': + if data_type == 'yaml': + new_data = yaml.load(request.POST.get('text')) + elif data_type == 'json': + new_data = json.loads(request.POST.get('text')) + print new_data + result = client.vnfd_update(user.get_token(), descriptor_id, new_data) + + else: + log.debug('Update descriptor: Unknown data type') + result = {'error': True, 'data': 'Update descriptor: Unknown data type'} + except Exception as e: + log.exception(e) + result = {'error': True, 'data': str(e)} + print result + if result['error'] == True: + return __response_handler(request, result['data'], url=None, status=result['data']['status'] if 'status' in result['data'] else 500) + + else: + return __response_handler(request, {}, url=None, status=200) elif request.method == 'GET': - csrf_token_value = get_token(request) - projects = Project.objects.filter(id=project_id).select_subclasses() - project_overview = projects[0].get_overview_data() - print project_overview - prj_token = project_overview['type'] - page = prj_token + '/descriptor/descriptor_view.html' - descriptor = projects[0].get_descriptor(descriptor_id, descriptor_type) + page = 'osm/descriptor/descriptor_view.html' + try: + client = Client() + if descriptor_type == 'nsd': + result = client.nsd_get(user.get_token(), descriptor_id) + print result + elif descriptor_type == 'vnfd': + result = client.vnfd_get(user.get_token(), descriptor_id) + + print result + except Exception as e: + log.exception(e) + result = {'error': True, 'data': str(e)} + + if isinstance(result, dict) and 'error' in result and result['error']: + return render(request, 'error.html') - descriptor_string_json = json.dumps(descriptor) - descriptor_string_yaml = Util.json2yaml(descriptor) + descriptor_string_json = json.dumps(result, indent=2) + descriptor_string_yaml = Util.json2yaml(result) # print descriptor return render(request, page, { 'project_id': project_id, 'descriptor_id': descriptor_id, - 'project_overview_data': projects[0].get_overview_data(), 'descriptor_type': descriptor_type, 'descriptor_strings': {'descriptor_string_yaml': descriptor_string_yaml, 'descriptor_string_json': descriptor_string_json}}) @login_required -def graph_positions(request, project_id=None): - if request.method == 'POST': - projects = Project.objects.filter(id=project_id).select_subclasses() - result = projects[0].edit_graph_positions(json.loads(request.POST.get('positions'))) - status_code = 200 if result else 500 - response = HttpResponse(json.dumps({}), content_type="application/json", status=status_code) - response["Access-Control-Allow-Origin"] = "*" - return response - - -@login_required -def add_element(request, project_id=None): - if request.method == 'POST': - projects = Project.objects.filter(id=project_id).select_subclasses() - result = projects[0].get_add_element(request) - - status_code = 200 if result else 500 - response = HttpResponse(json.dumps({}), content_type="application/json", status=status_code) - response["Access-Control-Allow-Origin"] = "*" - return response - - -@login_required -def remove_element(request, project_id=None): - if request.method == 'POST': - projects = Project.objects.filter(id=project_id).select_subclasses() - result = projects[0].get_remove_element(request) - - status_code = 200 if result else 500 - response = HttpResponse(json.dumps({}), content_type="application/json", status=status_code) - response["Access-Control-Allow-Origin"] = "*" - return response - - -@login_required -def add_link(request, project_id=None): - if request.method == 'POST': - projects = Project.objects.filter(id=project_id).select_subclasses() - result = projects[0].get_add_link(request) - - status_code = 200 if result else 500 - response = HttpResponse(json.dumps({}), content_type="application/json", status=status_code) - response["Access-Control-Allow-Origin"] = "*" - return response - - -@login_required -def remove_link(request, project_id=None): - if request.method == 'POST': - projects = Project.objects.filter(id=project_id).select_subclasses() - result = projects[0].get_remove_link(request) - - status_code = 200 if result else 500 - response = HttpResponse(json.dumps({}), content_type="application/json", status=status_code) - response["Access-Control-Allow-Origin"] = "*" - return response - -@login_required -def get_available_nodes(request, project_id=None): - if request.method == 'GET': - csrf_token_value = get_token(request) - projects = Project.objects.filter(id=project_id).select_subclasses() - print "get_available_nodes", request.GET.dict() - result = projects[0].get_available_nodes(request.GET.dict()) - status_code = 500 if result == None else 200 - print json.dumps(result) - response = HttpResponse(json.dumps(result), content_type="application/json", status=status_code) - response["Access-Control-Allow-Origin"] = "*" - return response - -@login_required -def overviewelement(request, project_id=None): - if request.method == 'GET': - result = {} - error_msg = None - try: - projects = Project.objects.filter(id=project_id).select_subclasses() - project = projects[0] - parameters = request.GET.dict() - print "parameters", parameters - result = project.get_node_overview(**parameters) - except Exception as e: - error_msg = str(e) - - if error_msg is not None: - return JsonResponse({'error': {'error_msg': str(error_msg)}}) - - return JsonResponse({'node_overview': result}) - -# ETSI specific method # -@login_required -def add_node_to_vnffg(request, project_id=None): - print "add_node_to_vnffg" # TODO log - if request.method == 'POST': - projects = Project.objects.filter(id=project_id).select_subclasses() - result = projects[0].add_node_to_vnffg(request) - - status_code = 200 if result else 500 - response = HttpResponse(json.dumps({}), content_type="application/json", status=status_code) - response["Access-Control-Allow-Origin"] = "*" - return response - - -@login_required -def unused_vnf(request, project_id=None, nsd_id=None): - if request.method == 'GET': - print 'in method unused_vnf : ', project_id, nsd_id # TODO log - projects = Project.objects.filter(id=project_id).select_subclasses() - result = projects[0].get_unused_vnf(nsd_id) - status_code = 500 if result == None else 200 - response = HttpResponse(json.dumps(result), content_type="application/json", status=status_code) - response["Access-Control-Allow-Origin"] = "*" - return response - -# end ETSI specific method # - - -# OSM specific method # -def get_package_files_list(request, project_id, project, descriptor_id, descriptor_type): - files_list = [] +def get_package_files_list(request, descriptor_id, descriptor_type): + user = osmutils.get_user(request) try: - files_list = project.get_package_files_list(descriptor_type, descriptor_id) + client = Client() + if descriptor_type == 'nsd': + artifacts_res = client.nsd_artifacts(user.get_token(), descriptor_id) + elif descriptor_type == 'vnfd': + artifacts_res = client.vnf_packages_artifacts(user.get_token(), descriptor_id) + else: + return False + + files_list = yaml.load(artifacts_res['data'] if artifacts_res and artifacts_res['error'] is False else []) result = {'files': files_list} except Exception as e: - print e + log.exception(e) url = 'error.html' result = {'error_msg': 'Unknown error.'} return __response_handler(request, result) +@login_required +def download_pkg(request, descriptor_id, descriptor_type): + user = osmutils.get_user(request) + file_name = "osm_export.tar.gz" + tar_pkg = None + try: + client = Client() + if descriptor_type == 'nsd': + tar_pkg = client.get_nsd_pkg(user.get_token(), descriptor_id) + elif descriptor_type == 'vnfd': + tar_pkg = client.get_vnfd_pkg(user.get_token(), descriptor_id) -def download_pkg(request, project_id, project, descriptor_id, descriptor_type): - tar_pkg = project.download_pkg(project, descriptor_id, descriptor_type) + except Exception as e: + log.exception(e) response = HttpResponse(content_type="application/tgz") - response["Content-Disposition"] = "attachment; filename=osm_export.tar.gz" + response["Content-Disposition"] = "attachment; filename="+ file_name response.write(tar_pkg.getvalue()) return response -def create_ns(request, project_id, project, descriptor_id, descriptor_type): - files_list = [] - try: - ns_data={ - "nsName": request.POST.get('nsName', 'WithoutName'), - "nsDescription": request.POST.get('nsDescription', ''), - "nsdId": request.POST.get('nsdId', ''), - "vimAccountId": request.POST.get('vimAccountId', ''), - "ssh-authorized-key": [ - { - request.POST.get('key-pair-ref', ''): request.POST.get('keyValue', '') - } - ] - } - #result = project.create_ns(descriptor_type, descriptor_id, ns_data) - - except Exception as e: - print e - url = 'error.html' - result = {'error_msg': 'Unknown error.'} - return __response_handler(request, result) - -# end OSM specific method # - @login_required -def custom_action(request, project_id=None, descriptor_id=None, descriptor_type=None, action_name=None): +def custom_action(request, descriptor_id=None, descriptor_type=None, action_name=None): if request.method == 'GET': - projects = Project.objects.filter(id=project_id).select_subclasses() print "Custom action: " + action_name - return globals()[action_name](request, project_id, projects[0], descriptor_id, descriptor_type) + return globals()[action_name](request, descriptor_id, descriptor_type) def __response_handler(request, data_res, url=None, to_redirect=None, *args, **kwargs): raw_content_types = request.META.get('HTTP_ACCEPT', '*/*').split(',') - if 'application/json' in raw_content_types: - return JsonResponse(data_res) + if 'application/json' in raw_content_types or url is None: + return HttpResponse(json.dumps(data_res), content_type="application/json", *args, **kwargs) elif to_redirect: return redirect(url, *args, **kwargs) else: