blob: e38e586f468f70168ffc7d4ac15e0c9abab04a94 [file] [log] [blame]
lombardoffb37bca2018-05-03 16:20:04 +02001#
2# Copyright 2018 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
17from django.shortcuts import render, redirect
lombardofr4908f382018-09-10 11:36:06 +020018#from django.contrib.auth.decorators import login_required
lombardoffb37bca2018-05-03 16:20:04 +020019from django.http import HttpResponse, JsonResponse
lombardofdd73c0c2018-05-09 10:46:49 +020020import yaml
lombardofrf5776442018-06-26 10:37:40 +020021import json
lombardoffb37bca2018-05-03 16:20:04 +020022import logging
lombardofrf5776442018-06-26 10:37:40 +020023from lib.osm.osmclient.clientv2 import Client
lombardofre6eb7432018-10-28 19:43:46 +010024from lib.osm.osm_rdcl_parser import OsmParser
lombardofr99f922f2018-07-17 17:27:36 +020025import authosm.utils as osmutils
lombardofr4908f382018-09-10 11:36:06 +020026from sf_t3d.decorators import login_required
lombardofrf5776442018-06-26 10:37:40 +020027
28logging.basicConfig(level=logging.DEBUG)
29log = logging.getLogger('instancehandler/view.py')
lombardoffb37bca2018-05-03 16:20:04 +020030
lombardofr4908f382018-09-10 11:36:06 +020031
lombardoffb37bca2018-05-03 16:20:04 +020032@login_required
lombardofr99f922f2018-07-17 17:27:36 +020033def list(request, type=None):
lombardofr4908f382018-09-10 11:36:06 +020034
lombardofr99f922f2018-07-17 17:27:36 +020035 user = osmutils.get_user(request)
36 project_id = user.project_id
lombardoffb37bca2018-05-03 16:20:04 +020037 client = Client()
lombardofr4908f382018-09-10 11:36:06 +020038 result = {'type': type, 'project_id': project_id}
39 if "OSM_ERROR" in request.session:
40 result['alert_error'] = request.session["OSM_ERROR"]
41 del request.session["OSM_ERROR"]
42 raw_content_types = request.META.get('HTTP_ACCEPT', '*/*').split(',')
43 if 'application/json' not in raw_content_types:
44 return __response_handler(request, result, 'instance_list.html')
45 instance_list = None
lombardoffb37bca2018-05-03 16:20:04 +020046 if type == 'ns':
lombardofr99f922f2018-07-17 17:27:36 +020047 instance_list = client.ns_list(user.get_token())
lombardof647aa2e2018-05-26 17:11:13 +020048 elif type == 'vnf':
lombardofr99f922f2018-07-17 17:27:36 +020049 instance_list = client.vnf_list(user.get_token())
lombardoffb37bca2018-05-03 16:20:04 +020050
lombardofr4908f382018-09-10 11:36:06 +020051 result['instances'] = instance_list['data'] if instance_list and instance_list['error'] is False else []
lombardofr0b4fb872018-07-24 17:10:48 +020052
lombardofa03da5e2018-06-02 18:36:44 +020053 return __response_handler(request, result, 'instance_list.html')
lombardoffb37bca2018-05-03 16:20:04 +020054
55
56@login_required
lombardofr99f922f2018-07-17 17:27:36 +020057def create(request):
lombardoffb37bca2018-05-03 16:20:04 +020058 result = {}
lombardofr0b4fb872018-07-24 17:10:48 +020059 try:
lombardofdd73c0c2018-05-09 10:46:49 +020060
lombardofr0b4fb872018-07-24 17:10:48 +020061 ns_data = {
62 "nsName": request.POST.get('nsName', 'WithoutName'),
63 "nsDescription": request.POST.get('nsDescription', ''),
64 "nsdId": request.POST.get('nsdId', ''),
65 "vimAccountId": request.POST.get('vimAccountId', ''),
66 }
67 if 'ssh_key' in request.POST and request.POST.get('ssh_key') != '':
lombardofrd3e9f5c2018-10-02 11:51:03 +020068 ns_data["ssh_keys"] = request.POST.get('ssh_key')
lombardofdd73c0c2018-05-09 10:46:49 +020069
lombardofr0b4fb872018-07-24 17:10:48 +020070 if 'config' in request.POST:
71 ns_config = yaml.load(request.POST.get('config'))
72 if isinstance(ns_config, dict):
73 if "vim-network-name" in ns_config:
74 ns_config["vld"] = ns_config.pop("vim-network-name")
75 if "vld" in ns_config:
76 print ns_config
77 for vld in ns_config["vld"]:
78 if vld.get("vim-network-name"):
79 if isinstance(vld["vim-network-name"], dict):
80 vim_network_name_dict = {}
81 for vim_account, vim_net in vld["vim-network-name"].items():
82 vim_network_name_dict[ns_data["vimAccountId"]] = vim_net
83 vld["vim-network-name"] = vim_network_name_dict
84 ns_data["vld"] = ns_config["vld"]
85 if "vnf" in ns_config:
86 for vnf in ns_config["vnf"]:
87 if vnf.get("vim_account"):
88 vnf["vimAccountId"] = ns_data["vimAccountId"]
89
90 ns_data["vnf"] = ns_config["vnf"]
91 except Exception as e:
92 request.session["OSM_ERROR"] = "Error creating the NS; Invalid parameters provided."
93 return __response_handler(request, {}, 'instances:list', to_redirect=True, type='ns', )
94
lombardoffb37bca2018-05-03 16:20:04 +020095 print ns_data
lombardofr99f922f2018-07-17 17:27:36 +020096 user = osmutils.get_user(request)
lombardoffb37bca2018-05-03 16:20:04 +020097 client = Client()
lombardofr99f922f2018-07-17 17:27:36 +020098 result = client.ns_create(user.get_token(), ns_data)
lombardofr0b4fb872018-07-24 17:10:48 +020099 return __response_handler(request, result, 'instances:list', to_redirect=True, type='ns',)
lombardofrf5776442018-06-26 10:37:40 +0200100
lombardoffb37bca2018-05-03 16:20:04 +0200101
lombardof74ed51a2018-05-11 01:07:01 +0200102@login_required
lombardofr99f922f2018-07-17 17:27:36 +0200103def ns_operations(request, instance_id=None, type=None):
104 user = osmutils.get_user(request)
105 project_id = user.project_id
lombardofr4908f382018-09-10 11:36:06 +0200106
107 result = {'type': 'ns', 'project_id': project_id, 'instance_id': instance_id}
108 raw_content_types = request.META.get('HTTP_ACCEPT', '*/*').split(',')
109 if 'application/json' not in raw_content_types:
110 return __response_handler(request, result, 'instance_operations_list.html')
lombardof74ed51a2018-05-11 01:07:01 +0200111 client = Client()
lombardofr99f922f2018-07-17 17:27:36 +0200112 op_list = client.ns_op_list(user.get_token(), instance_id)
lombardofr4908f382018-09-10 11:36:06 +0200113 result['operations'] = op_list['data'] if op_list and op_list['error'] is False else []
lombardofrf5776442018-06-26 10:37:40 +0200114
lombardofr4908f382018-09-10 11:36:06 +0200115 return __response_handler(request, result, 'instance_operations_list.html')
lombardof74ed51a2018-05-11 01:07:01 +0200116
117@login_required
lombardofr99f922f2018-07-17 17:27:36 +0200118def ns_operation(request, op_id, instance_id=None, type=None):
119 user = osmutils.get_user(request)
lombardof74ed51a2018-05-11 01:07:01 +0200120 client = Client()
lombardofr99f922f2018-07-17 17:27:36 +0200121 result = client.ns_op(user.get_token(), op_id)
lombardofrf5776442018-06-26 10:37:40 +0200122 return __response_handler(request, result['data'])
123
lombardoffb37bca2018-05-03 16:20:04 +0200124
125@login_required
lombardofr99f922f2018-07-17 17:27:36 +0200126def action(request, instance_id=None, type=None):
127 user = osmutils.get_user(request)
lombardoffb37bca2018-05-03 16:20:04 +0200128 client = Client()
lombardoffb37bca2018-05-03 16:20:04 +0200129 # result = client.ns_action(instance_id, action_payload)
130 primitive_param_keys = request.POST.getlist('primitive_params_name')
131 primitive_param_value = request.POST.getlist('primitive_params_value')
132 action_payload = {
133 "vnf_member_index": request.POST.get('vnf_member_index'),
134 "primitive": request.POST.get('primitive'),
135 "primitive_params": {k: v for k, v in zip(primitive_param_keys, primitive_param_value) if len(k) > 0}
136 }
137
lombardofr99f922f2018-07-17 17:27:36 +0200138 result = client.ns_action(user.get_token(), instance_id, action_payload)
lombardofrf5776442018-06-26 10:37:40 +0200139 print result
140 if result['error']:
141 return __response_handler(request, result['data'], url=None,
142 status=result['data']['status'] if 'status' in result['data'] else 500)
143
144 else:
145 return __response_handler(request, {}, url=None, status=200)
lombardoffb37bca2018-05-03 16:20:04 +0200146
147
148@login_required
lombardofr99f922f2018-07-17 17:27:36 +0200149def delete(request, instance_id=None, type=None):
lombardof7e33ad62018-06-03 16:13:38 +0200150 force = bool(request.GET.get('force', False))
lombardoffb37bca2018-05-03 16:20:04 +0200151 result = {}
lombardofr99f922f2018-07-17 17:27:36 +0200152 user = osmutils.get_user(request)
lombardoffb37bca2018-05-03 16:20:04 +0200153 client = Client()
lombardofr99f922f2018-07-17 17:27:36 +0200154 result = client.ns_delete(user.get_token(), instance_id, force)
lombardoffb37bca2018-05-03 16:20:04 +0200155 print result
lombardofrc9488202018-07-24 14:38:16 +0200156 return __response_handler(request, result, 'instances:list', to_redirect=True, type='ns')
lombardofr99f922f2018-07-17 17:27:36 +0200157
lombardofre6eb7432018-10-28 19:43:46 +0100158@login_required
lombardofr99f922f2018-07-17 17:27:36 +0200159def show_topology(request, instance_id=None, type=None):
160 user = osmutils.get_user(request)
161 project_id = user.project_id
162 raw_content_types = request.META.get('HTTP_ACCEPT', '*/*').split(',')
163 if 'application/json' in raw_content_types:
lombardofre6eb7432018-10-28 19:43:46 +0100164 client = Client()
165 nsr_object = {'nsr': {}, 'vnfr': {}, 'vnfd': {}}
166 if type == 'ns':
lombardofr99f922f2018-07-17 17:27:36 +0200167
lombardofre6eb7432018-10-28 19:43:46 +0100168 nsr_resp = client.ns_get(user.get_token(), instance_id)
169 nsr_object['nsr'] = nsr_resp['data']
170 if 'constituent-vnfr-ref' in nsr_object['nsr'] :
171 for vnfr_id in nsr_object['nsr']['constituent-vnfr-ref']:
172 vnfr_resp = client.vnf_get(user.get_token(), vnfr_id)
173 vnfr = vnfr_resp['data']
174 nsr_object['vnfr'][vnfr['id']] = vnfr
175 if vnfr['vnfd-id'] not in nsr_object['vnfd']:
176 vnfd_resp = client.vnfd_get(user.get_token(), vnfr['vnfd-id'])
177 nsr_object['vnfd'][vnfr['vnfd-id']] = vnfd_resp['vnfd:vnfd-catalog']['vnfd'][0]
lombardofr99f922f2018-07-17 17:27:36 +0200178
lombardofr99f922f2018-07-17 17:27:36 +0200179
lombardofr99f922f2018-07-17 17:27:36 +0200180
lombardofre6eb7432018-10-28 19:43:46 +0100181 test = OsmParser()
182 #print nsr_object
lombardofr99f922f2018-07-17 17:27:36 +0200183
lombardofre6eb7432018-10-28 19:43:46 +0100184 result = test.nsr_to_graph(nsr_object)
lombardofr99f922f2018-07-17 17:27:36 +0200185 return __response_handler(request, result)
186 else:
187 result = {'type': type, 'project_id': project_id, 'instance_id': instance_id}
188 return __response_handler(request, result, 'instance_topology_view.html')
lombardoffb37bca2018-05-03 16:20:04 +0200189
190
191@login_required
lombardofr99f922f2018-07-17 17:27:36 +0200192def show(request, instance_id=None, type=None):
lombardoffb37bca2018-05-03 16:20:04 +0200193 # result = {}
lombardofr99f922f2018-07-17 17:27:36 +0200194 user = osmutils.get_user(request)
195 project_id = user.project_id
lombardoffb37bca2018-05-03 16:20:04 +0200196 client = Client()
lombardof647aa2e2018-05-26 17:11:13 +0200197 if type == 'ns':
lombardofr99f922f2018-07-17 17:27:36 +0200198 result = client.ns_get(user.get_token(), instance_id)
lombardof647aa2e2018-05-26 17:11:13 +0200199 elif type == 'vnf':
lombardofr99f922f2018-07-17 17:27:36 +0200200 result = client.vnf_get(user.get_token(), instance_id)
lombardoffb37bca2018-05-03 16:20:04 +0200201 print result
202 return __response_handler(request, result)
203
lombardofrf5776442018-06-26 10:37:40 +0200204
lombardofr99624b52018-06-18 15:54:24 +0200205@login_required
lombardofr99f922f2018-07-17 17:27:36 +0200206def export_metric(request, instance_id=None, type=None):
lombardofr99624b52018-06-18 15:54:24 +0200207 metric_data = request.POST.dict()
lombardofr99f922f2018-07-17 17:27:36 +0200208 user = osmutils.get_user(request)
209 project_id = user.project_id
lombardofr99624b52018-06-18 15:54:24 +0200210 client = Client()
211 keys = ["collection_period",
212 "vnf_member_index",
213 "metric_name",
214 "correlation_id",
215 "vdu_name",
216 "collection_unit"]
217 metric_data = dict(filter(lambda i: i[0] in keys and len(i[1]) > 0, metric_data.items()))
218
lombardofr99f922f2018-07-17 17:27:36 +0200219 result = client.ns_metric_export(user.get_token(), instance_id, metric_data)
lombardofr99624b52018-06-18 15:54:24 +0200220
lombardofrf5776442018-06-26 10:37:40 +0200221 if result['error']:
222 print result
223 return __response_handler(request, result['data'], url=None,
224 status=result['data']['status'] if 'status' in result['data'] else 500)
225 else:
226 return __response_handler(request, {}, url=None, status=200)
227
lombardofr99624b52018-06-18 15:54:24 +0200228
229@login_required
lombardofr99f922f2018-07-17 17:27:36 +0200230def create_alarm(request, instance_id=None, type=None):
lombardofr99624b52018-06-18 15:54:24 +0200231 metric_data = request.POST.dict()
232 print metric_data
lombardofr99f922f2018-07-17 17:27:36 +0200233 user = osmutils.get_user(request)
234 project_id = user.project_id
lombardofr99624b52018-06-18 15:54:24 +0200235 client = Client()
236
lombardofr99624b52018-06-18 15:54:24 +0200237 keys = ["threshold_value",
238 "vnf_member_index",
239 "metric_name",
240 "vdu_name",
241 "alarm_name",
242 "correlation_id",
243 "statistic",
244 "operation",
245 "severity"]
246 metric_data = dict(filter(lambda i: i[0] in keys and len(i[1]) > 0, metric_data.items()))
247
lombardofr99f922f2018-07-17 17:27:36 +0200248 result = client.ns_alarm_create(user.get_token(), instance_id, metric_data)
lombardofrf5776442018-06-26 10:37:40 +0200249 if result['error']:
250 print result
251 return __response_handler(request, result['data'], url=None,
252 status=result['data']['status'] if 'status' in result['data'] else 500)
253 else:
254 return __response_handler(request, {}, url=None, status=200)
lombardofr99624b52018-06-18 15:54:24 +0200255
lombardoffb37bca2018-05-03 16:20:04 +0200256
257def __response_handler(request, data_res, url=None, to_redirect=None, *args, **kwargs):
258 raw_content_types = request.META.get('HTTP_ACCEPT', '*/*').split(',')
259 if 'application/json' in raw_content_types or url is None:
lombardofrc9488202018-07-24 14:38:16 +0200260 return HttpResponse(json.dumps(data_res), content_type="application/json")
lombardoffb37bca2018-05-03 16:20:04 +0200261 elif to_redirect:
262 return redirect(url, *args, **kwargs)
263 else:
264 return render(request, url, data_res)