working on client v2: projects and instances
[osm/LW-UI.git] / instancehandler / views.py
1 #
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
17 from django.shortcuts import render, redirect
18 from django.contrib.auth.decorators import login_required
19 from django.http import HttpResponse, JsonResponse
20 import yaml
21 import json
22 import logging
23 from lib.osm.osmclient.clientv2 import Client
24
25 logging.basicConfig(level=logging.DEBUG)
26 log = logging.getLogger('instancehandler/view.py')
27
28
29 @login_required
30 def list(request, project_id=None, type=None):
31 client = Client()
32 if type == 'ns':
33 instance_list = client.ns_list(request.session['token'])
34 elif type == 'vnf':
35 instance_list = client.vnf_list(request.session['token'])
36
37 result = {'instances': instance_list['data'] if instance_list and instance_list['error'] is False else [],
38 'type': type, 'project_id': project_id}
39
40 return __response_handler(request, result, 'instance_list.html')
41
42
43 @login_required
44 def create(request, project_id=None):
45 result = {}
46 ns_data = {
47 "nsName": request.POST.get('nsName', 'WithoutName'),
48 "nsDescription": request.POST.get('nsDescription', ''),
49 "nsdId": request.POST.get('nsdId', ''),
50 "vimAccountId": request.POST.get('vimAccountId', ''),
51 }
52 if 'ssh_key' in request.POST and request.POST.get('ssh_key') != '':
53 ns_data["ssh-authorized-key"] = [request.POST.get('ssh_key')]
54
55 if 'config' in request.POST:
56 ns_config = yaml.load(request.POST.get('config'))
57 if isinstance(ns_config, dict):
58 if "vim-network-name" in ns_config:
59 ns_config["vld"] = ns_config.pop("vim-network-name")
60 if "vld" in ns_config:
61 for vld in ns_config["vld"]:
62 if vld.get("vim-network-name"):
63 if isinstance(vld["vim-network-name"], dict):
64 vim_network_name_dict = {}
65 for vim_account, vim_net in vld["vim-network-name"].items():
66 vim_network_name_dict[ns_data["vimAccountId"]] = vim_net
67 vld["vim-network-name"] = vim_network_name_dict
68 ns_data["vld"] = ns_config["vld"]
69 if "vnf" in ns_config:
70 for vnf in ns_config["vnf"]:
71 if vnf.get("vim_account"):
72 vnf["vimAccountId"] = ns_data["vimAccountId"]
73
74 ns_data["vnf"] = ns_config["vnf"]
75 print ns_data
76 client = Client()
77 result = client.ns_create(request.session['token'], ns_data)
78 return __response_handler(request, result, 'projects:instances:list', to_redirect=True, type='ns',
79 project_id=project_id)
80
81
82 @login_required
83 def ns_operations(request, project_id=None, instance_id=None, type=None):
84 client = Client()
85 op_list = client.ns_op_list(request.session['token'], instance_id)
86 return __response_handler(request,
87 {'operations': op_list['data'] if op_list and op_list['error'] is False else [],
88 'type': 'ns', 'project_id': project_id}, 'instance_operations_list.html')
89
90
91 @login_required
92 def ns_operation(request, op_id, project_id=None, instance_id=None, type=None):
93 client = Client()
94 result = client.ns_op(request.session['token'], op_id)
95 return __response_handler(request, result['data'])
96
97
98 @login_required
99 def action(request, project_id=None, instance_id=None, type=None):
100 client = Client()
101
102 # result = client.ns_action(instance_id, action_payload)
103 primitive_param_keys = request.POST.getlist('primitive_params_name')
104 primitive_param_value = request.POST.getlist('primitive_params_value')
105 action_payload = {
106 "vnf_member_index": request.POST.get('vnf_member_index'),
107 "primitive": request.POST.get('primitive'),
108 "primitive_params": {k: v for k, v in zip(primitive_param_keys, primitive_param_value) if len(k) > 0}
109 }
110
111 result = client.ns_action(request.session['token'], instance_id, action_payload)
112 print result
113 if result['error']:
114 return __response_handler(request, result['data'], url=None,
115 status=result['data']['status'] if 'status' in result['data'] else 500)
116
117 else:
118 return __response_handler(request, {}, url=None, status=200)
119
120
121 @login_required
122 def delete(request, project_id=None, instance_id=None, type=None):
123 force = bool(request.GET.get('force', False))
124 result = {}
125 client = Client()
126 result = client.ns_delete(request.session['token'], instance_id, force)
127 print result
128 return __response_handler(request, result, 'projects:instances:list', to_redirect=True, type='ns',
129 project_id=project_id)
130
131
132 @login_required
133 def show(request, project_id=None, instance_id=None, type=None):
134 # result = {}
135 client = Client()
136 if type == 'ns':
137 result = client.ns_get(request.session['token'], instance_id)
138 elif type == 'vnf':
139 result = client.vnf_get(request.session['token'], instance_id)
140 print result
141 return __response_handler(request, result)
142
143
144 @login_required
145 def export_metric(request, project_id=None, instance_id=None, type=None):
146 metric_data = request.POST.dict()
147
148 client = Client()
149 keys = ["collection_period",
150 "vnf_member_index",
151 "metric_name",
152 "correlation_id",
153 "vdu_name",
154 "collection_unit"]
155 metric_data = dict(filter(lambda i: i[0] in keys and len(i[1]) > 0, metric_data.items()))
156
157 result = client.ns_metric_export(request.session['token'], instance_id, metric_data)
158
159 if result['error']:
160 print result
161 return __response_handler(request, result['data'], url=None,
162 status=result['data']['status'] if 'status' in result['data'] else 500)
163 else:
164 return __response_handler(request, {}, url=None, status=200)
165
166
167 @login_required
168 def create_alarm(request, project_id=None, instance_id=None, type=None):
169 metric_data = request.POST.dict()
170 print metric_data
171 client = Client()
172
173 keys = ["threshold_value",
174 "vnf_member_index",
175 "metric_name",
176 "vdu_name",
177 "alarm_name",
178 "correlation_id",
179 "statistic",
180 "operation",
181 "severity"]
182 metric_data = dict(filter(lambda i: i[0] in keys and len(i[1]) > 0, metric_data.items()))
183
184 result = client.ns_alarm_create(request.session['token'], instance_id, metric_data)
185 if result['error']:
186 print result
187 return __response_handler(request, result['data'], url=None,
188 status=result['data']['status'] if 'status' in result['data'] else 500)
189 else:
190 return __response_handler(request, {}, url=None, status=200)
191
192
193 def __response_handler(request, data_res, url=None, to_redirect=None, *args, **kwargs):
194 raw_content_types = request.META.get('HTTP_ACCEPT', '*/*').split(',')
195 if 'application/json' in raw_content_types or url is None:
196 return HttpResponse(json.dumps(data_res), content_type="application/json", *args, **kwargs)
197 elif to_redirect:
198 return redirect(url, *args, **kwargs)
199 else:
200 return render(request, url, data_res)