9fddbc085713d27323d749df14fd8c52dfa3ebb2
[osm/LW-UI.git] / instancehandler / template / instance_list.html
1 {% extends "base.html" %}
2 {% load get %}
3 {% load staticfiles %}
4
5
6
7 {% block head_block %}
8 {{ block.super }}
9 <!-- Codemirror core CSS -->
10 <link rel="stylesheet" href="/static/bower_components/codemirror/lib/codemirror.css">
11 <link rel="stylesheet" href="/static/bower_components/codemirror/addon/fold/foldgutter.css" />
12 <link rel="stylesheet" href="/static/bower_components/codemirror/theme/neat.css">
13 <link rel="stylesheet" href="/static/bower_components/codemirror/addon/dialog/dialog.css">
14 <link rel="stylesheet" href="/static/bower_components/codemirror/addon/display/fullscreen.css">
15 <link rel="stylesheet" href="/static/bower_components/select2/dist/css/select2.min.css">
16 <link rel="stylesheet" href="/static/css/lwuitable.css">
17 <link rel="stylesheet" href="/static/bower_components/datatables.net-bs/css/dataTables.bootstrap.min.css">
18 {% endblock %}
19 {% block title_header_big %}
20 {{ block.super }}
21 {% endblock %}
22 {% block left_sidebar %}
23 {% include 'osm/osm_project_left_sidebar.html' %}
24 {% endblock %}
25
26
27 {% block breadcrumb_body %}
28 {{ block.super }}
29 <li><a href="{% url 'instances:list' type=type %}">{{ type|upper }} Instances</a></li>
30 {% endblock %}
31
32 {% block content_body %}
33 {{ block.super }}
34 {% include 'modal/instance_create.html' %}
35 {% csrf_token %}
36 <div class="row">
37 <div class="col-md-12">
38
39 {% if type == 'ns' %}
40 {% include 'instance_list_ns.html' %}
41 {% elif type == 'vnf' %}
42 {% include 'instance_list_vnf.html' %}
43 {% elif type == 'pdu' %}
44 {% include 'instance_list_pdu.html' %}
45 {% elif type == 'nsi' %}
46 {% include 'instance_list_nsi.html' %}
47 {% endif %}
48
49 </div>
50
51 </div>
52 {% include 'modal/instance_create.html' %}
53 {% include 'modal/instance_create_pdu.html' %}
54 {% include 'modal/instance_create_nsi.html' %}
55 {% include 'modal/instance_show.html' %}
56 {% include 'modal/instance_new_action.html' %}
57 {% include 'modal/instance_new_alarm.html' %}
58 {% include 'modal/instance_export_metric.html' %}
59 {% endblock %}
60
61 {% block resource_block %}
62 {{ block.super }}
63 <!-- Utility JS -->
64 <script src="/static/bower_components/select2/dist/js/select2.js"></script>
65 <script src="/static/bower_components/codemirror/lib/codemirror.js"></script>
66 <script src="/static/bower_components/codemirror/addon/fold/foldcode.js"></script>
67 <script src="/static/bower_components/codemirror/addon/fold/foldgutter.js"></script>
68 <script src="/static/bower_components/codemirror/addon/fold/brace-fold.js"></script>
69 <script src="/static/bower_components/codemirror/mode/javascript/javascript.js"></script>
70 <script src="/static/bower_components/codemirror/addon/search/searchcursor.js"></script>
71 <script src="/static/bower_components/codemirror/addon/search/search.js"></script>
72 <script src="/static/bower_components/codemirror/addon/dialog/dialog.js"></script>
73 <script src="/static/bower_components/codemirror/addon/display/autorefresh.js"></script>
74 <script src="/static/bower_components/codemirror/addon/edit/matchbrackets.js"></script>
75 <script src="/static/bower_components/codemirror/addon/edit/closebrackets.js"></script>
76 <script src="/static/bower_components/codemirror/addon/display/fullscreen.js"></script>
77 <script src="/static/bower_components/codemirror/keymap/sublime.js"></script>
78 <script src="/static/src/instancehandler/instance_list.js"></script>
79 <script src="/static/src/instancehandler/instance_create.js"></script>
80 <script src="/static/bower_components/datatables.net/js/jquery.dataTables.min.js"></script>
81 <script src="/static/bower_components/datatables.net-bs/js/dataTables.bootstrap.min.js"></script>
82
83 <script>
84 var table;
85 var instance_type = '{{ type }}';
86 var row_builder = {
87 'ns': [
88 {
89 "render": function (data, type, row) {
90 return row["short-name"];
91 },
92 "targets": 0
93 },
94 {
95 "render": function (data, type, row) {
96 return row["_id"];
97 },
98 "targets": 1
99 },
100 {
101 "render": function (data, type, row) {
102 return row["nsd-name-ref"];
103 },
104 "targets": 2
105 },
106 {
107 // "width": "5%",
108 "render": function (data, type, row) {
109 if(row["operational-status"] === 'failed')
110 return '<span class="label label-danger">'+ row["operational-status"] +'</span>';
111 if(row["operational-status"] === 'init')
112 return '<span class="label label-warning">'+ row["operational-status"] +'</span>';
113 if(row["operational-status"] === 'running')
114 return '<span class="label label-success">'+ row["operational-status"] +'</span>';
115 return ''+row["operational-status"]+'';
116 },
117 "targets": 3
118 },
119 {
120 // "width": "5%",
121 "render": function (data, type, row) {
122 if(row["config-status"] === 'failed')
123 return '<span class="label label-danger">'+ row["config-status"] +'</span>';
124 if(row["config-status"] === 'init')
125 return '<span class="label label-warning">'+ row["config-status"] +'</span>';
126 if(row["config-status"] === 'running')
127 return '<span class="label label-success">'+ row["config-status"] +'</span>';
128 if(row["config-status"] === 'configured')
129 return '<span class="label label-success">'+ row["config-status"] +'</span>';
130 return ''+row["operational-status"]+'';
131 },
132 "targets": 4
133 },
134 {
135 // "className": "ellipsis",
136 "render": function (data, type, row) {
137 return row["detailed-status"];
138 },
139 "targets": 5
140 },{
141 "width": "20%",
142 "render": function (data, type, row) {
143 var template = '<div class="btn-group">' +
144 ' <button type="button" class="btn btn-default"' +
145 ' onclick="javascript:showInstanceDetails(\''+instance_type+'\', \''+row["_id"]+'\')"' +
146 ' data-toggle="tooltip" data-placement="top" data-container="body" title="Show Info">' +
147 ' <i class="fa fa-info"></i>';
148 if (row["operational-status"] === "running") {
149 template += ' <button type="button" class="btn btn-default"' +
150 ' onclick="javascript:showTopology(\'' + instance_type + '\', \'' + row["_id"] + '\')"' +
151 ' data-toggle="tooltip" data-placement="top" data-container="body" title="Show Graph">' +
152 ' <i class="fa fa-sitemap"></i>' +
153 ' </button>';
154 }else{
155 template += ' <button type="button" disabled class="btn btn-default"' +
156 ' onclick="javascript:showTopology(\'' + instance_type + '\', \'' + row["_id"] + '\')"' +
157 ' data-toggle="tooltip" data-placement="top" data-container="body" title="Show Graph">' +
158 ' <i class="fa fa-sitemap"></i>' +
159 ' </button>';
160 }
161 template += ' <button type="button" class="btn btn-default"' +
162 ' onclick="javascript:deleteNs(\''+ row["short-name"] +'\', \''+row["_id"]+'\')"' +
163 ' data-toggle="tooltip" data-placement="top" data-container="body" title="Delete"><i' +
164 ' class="far fa-trash-alt"></i></button>' +
165 ' <button type="button" class="btn btn-default dropdown-toggle"' +
166 ' data-toggle="dropdown" aria-expanded="false">Actions' +
167 ' <span class="fa fa-caret-down"></span></button>' +
168 ' <ul class="dropdown-menu">' +
169 ' <li><a href="#"' +
170 ' onclick="javascript:performAction(\''+ row["short-name"] +'\', \''+row["_id"]+'\')">' +
171 ' <i class="fa fa-magic"></i> Exec NS Primitive</a></li>' +
172 ' <li>' +
173 ' <a href="/instances/ns/' +row["_id"] +'/operation">' +
174 ' <i class="fa fa-list"></i> History of operations</a></li>' +
175 ' <li class="divider"></li>' +
176 ' <li><a href="#"' +
177 ' onclick="javascript:newAlarmNs(\''+ row["short-name"] +'\', \''+row["_id"]+'\')">' +
178 ' <i class="far fa-bell"></i> New Alarm</a></li>' +
179 ' <li><a href="#"' +
180 ' onclick="javascript:exportMetricNs(\''+ row["short-name"] +'\', \''+row["_id"]+ '\')">' +
181 ' <i class="far fa-chart-bar"></i> Export metric</a></li>' +
182 ' <li class="divider"></li>' +
183 ' <li>' +
184 ' <a href="javascript:deleteNs(\''+ row["short-name"] +'\', \''+row["_id"]+'\', true)">' +
185 ' <i class="far fa-trash-alt" style="color:red" ></i> Force delete</a></li>' +
186 ' </ul>' +
187 '</div>';
188 return template;
189 },
190 "targets": 5,
191 "orderable": false
192 },
193
194 ],
195 'vnf': [
196 {
197 "render": function (data, type, row) {
198 return row["_id"];
199 },
200 "targets": 0
201 },
202 {
203 "render": function (data, type, row) {
204 return '<a href="javascript:openDescriptorView(\'vnfd\', \'' + row["vnfd-id"]+'\')"> ' + row["vnfd-ref"] +' </a>';
205 },
206 "targets": 1
207 },
208 {
209 "render": function (data, type, row) {
210 return row["member-vnf-index-ref"];
211 },
212 "targets": 2
213 },
214 {
215 "render": function (data, type, row) {
216 return row["nsr-id-ref"];
217 },
218 "targets": 3
219 },
220 {
221 "render": function (data, type, row) {
222 return moment.unix(row['created-time']).format('YYYY-MM-DD hh:mm:ss a');
223 },
224 "targets": 4
225 },
226 {
227 "render": function (data, type, row) {
228 return '<div class="btn-group">' +
229 ' <button type="button" class="btn btn-default"' +
230 ' onclick="javascript:showInstanceDetails(\''+instance_type+'\', \''+row["_id"]+'\')"' +
231 ' data-toggle="tooltip" data-placement="top" data-container="body" title="Show Info">' +
232 ' <i class="fa fa-info"></i>' +
233 ' </button>' +
234 ' </div>';
235 },
236 "targets": 5,
237 "orderable": false
238 },
239 ],
240 'pdu': [
241 {
242 "render": function (data, type, row) {
243 return row["_id"];
244 },
245 "targets": 0
246 },
247 {
248 "render": function (data, type, row) {
249 return row["name"];
250 },
251 "targets": 1
252 },
253 {
254 "render": function (data, type, row) {
255 return row["type"];
256 },
257 "targets": 2
258 },
259 {
260 "render": function (data, type, row) {
261 return row['_admin']['usageState'];
262 },
263 "targets": 3
264 },
265 {
266 "render": function (data, type, row) {
267 return moment.unix(row['_admin']['created']).format('YYYY-MM-DD hh:mm:ss a');
268 },
269 "targets": 4
270 },
271 {
272 "render": function (data, type, row) {
273 return '<div class="btn-group">' +
274 ' <button type="button" class="btn btn-default"' +
275 ' onclick="javascript:showInstanceDetails(\''+instance_type+'\', \''+row["_id"]+'\')"' +
276 ' data-toggle="tooltip" data-placement="top" data-container="body" title="Show Info">' +
277 ' <i class="fa fa-info"></i>' +
278 ' </button>' +
279 '<button type="button" class="btn btn-default"' +
280 ' onclick="javascript:deletePDU(\''+ row["name"] +'\', \''+row["_id"]+'\')"' +
281 ' data-toggle="tooltip" data-placement="top" data-container="body" title="Delete"><i' +
282 ' class="far fa-trash-alt"></i></button>'+
283 ' </div>';
284 },
285 "targets": 5,
286 "orderable": false
287 }
288 ],
289 'nsi': [
290 {
291 "render": function (data, type, row) {
292 return row["name"];
293 },
294 "targets": 0
295 },
296 {
297 "render": function (data, type, row) {
298 return row["_id"];
299 },
300 "targets": 1
301 },
302 {
303 "render": function (data, type, row) {
304 return row["nst-ref"];
305 },
306 "targets": 2
307 },
308 {
309 // "width": "5%",
310 "render": function (data, type, row) {
311 if(row["operational-status"] === 'failed')
312 return '<span class="label label-danger">'+ row["operational-status"] +'</span>';
313 if(row["operational-status"] === 'init')
314 return '<span class="label label-warning">'+ row["operational-status"] +'</span>';
315 if(row["operational-status"] === 'running')
316 return '<span class="label label-success">'+ row["operational-status"] +'</span>';
317 return ''+row["operational-status"]+'';
318 },
319 "targets": 3
320 },
321 {
322 // "width": "5%",
323 "render": function (data, type, row) {
324 if(row["config-status"] === 'failed')
325 return '<span class="label label-danger">'+ row["config-status"] +'</span>';
326 if(row["config-status"] === 'init')
327 return '<span class="label label-warning">'+ row["config-status"] +'</span>';
328 if(row["config-status"] === 'running')
329 return '<span class="label label-success">'+ row["config-status"] +'</span>';
330 if(row["config-status"] === 'configured')
331 return '<span class="label label-success">'+ row["config-status"] +'</span>';
332 return ''+row["operational-status"]+'';
333 },
334 "targets": 4
335 },
336 {
337 // "className": "ellipsis",
338 "render": function (data, type, row) {
339 return row["detailed-status"];
340 },
341 "targets": 5
342 },{
343 "width": "20%",
344 "render": function (data, type, row) {
345 var template = '<div class="btn-group">' +
346 ' <button type="button" class="btn btn-default"' +
347 ' onclick="javascript:showInstanceDetails(\''+instance_type+'\', \''+row["_id"]+'\')"' +
348 ' data-toggle="tooltip" data-placement="top" data-container="body" title="Show Info">' +
349 ' <i class="fa fa-info"></i>';
350 /* if (row["operational-status"] === "running") {
351 template += ' <button type="button" class="btn btn-default"' +
352 ' onclick="javascript:showTopology(\'' + instance_type + '\', \'' + row["_id"] + '\')"' +
353 ' data-toggle="tooltip" data-placement="top" data-container="body" title="Show Graph">' +
354 ' <i class="fa fa-sitemap"></i>' +
355 ' </button>';
356 }else{
357 template += ' <button type="button" disabled class="btn btn-default"' +
358 ' onclick="javascript:showTopology(\'' + instance_type + '\', \'' + row["_id"] + '\')"' +
359 ' data-toggle="tooltip" data-placement="top" data-container="body" title="Show Graph">' +
360 ' <i class="fa fa-sitemap"></i>' +
361 ' </button>';
362 } */
363 template += ' <button type="button" class="btn btn-default"' +
364 ' onclick="javascript:deleteNsi(\''+ row["name"] +'\', \''+row["_id"]+'\')"' +
365 ' data-toggle="tooltip" data-placement="top" data-container="body" title="Delete"><i' +
366 ' class="far fa-trash-alt"></i></button>' +
367 ' <button type="button" class="btn btn-default dropdown-toggle"' +
368 ' data-toggle="dropdown" aria-expanded="false">Actions' +
369 ' <span class="fa fa-caret-down"></span></button>' +
370 ' <ul class="dropdown-menu">' +
371 ' <li>' +
372 ' <a href="/instances/nsi/' +row["_id"] +'/operation">' +
373 ' <i class="fa fa-list"></i> History of operations</a></li>' +
374 ' <li class="divider"></li>' +
375
376 ' <li>' +
377 ' <a href="javascript:deleteNsi(\''+ row["name"] +'\', \''+row["_id"]+'\', true)">' +
378 ' <i class="far fa-trash-alt" style="color:red" ></i> Force delete</a></li>' +
379 ' </ul>' +
380 '</div>';
381 return template;
382 },
383 "targets": 5,
384 "orderable": false
385 },
386
387 ]
388 };
389 $(document).ready(function () {
390 table = $('#instances_table').DataTable({
391 responsive: true,
392 "ajax": {
393 "url": "/instances/" + instance_type + "/list/",
394 "dataSrc": function (json) {
395 return json.instances;
396 },
397 statusCode: {
398 401: function(){
399 console.log("no auth");
400 moveToLogin(window.location.pathname);
401 }
402 },
403 "error": function(hxr, error, thrown){
404 console.log(error);
405 }
406
407 },
408 "columns": row_builder[instance_type]
409 });
410
411
412 setInterval(function () {
413 table.ajax.reload();
414 }, 10000);
415
416
417 });
418
419 </script>
420
421 {% endblock %}
422
423 {% block footer %}
424 {% include "footer.html" %}
425 {% endblock %}