automatic reload on lists; new django decorator for ajax request
[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 {% endif %}
44
45 </div>
46
47 </div>
48 {% include 'modal/instance_create.html' %}
49 {% include 'modal/instance_show.html' %}
50 {% include 'modal/instance_new_action.html' %}
51 {% include 'modal/instance_new_alarm.html' %}
52 {% include 'modal/instance_export_metric.html' %}
53 {% endblock %}
54
55 {% block resource_block %}
56 {{ block.super }}
57 <!-- Utility JS -->
58 <script src="/static/bower_components/select2/dist/js/select2.js"></script>
59 <script src="/static/bower_components/codemirror/lib/codemirror.js"></script>
60 <script src="/static/bower_components/codemirror/addon/fold/foldcode.js"></script>
61 <script src="/static/bower_components/codemirror/addon/fold/foldgutter.js"></script>
62 <script src="/static/bower_components/codemirror/addon/fold/brace-fold.js"></script>
63 <script src="/static/bower_components/codemirror/mode/javascript/javascript.js"></script>
64 <script src="/static/bower_components/codemirror/addon/search/searchcursor.js"></script>
65 <script src="/static/bower_components/codemirror/addon/search/search.js"></script>
66 <script src="/static/bower_components/codemirror/addon/dialog/dialog.js"></script>
67 <script src="/static/bower_components/codemirror/addon/display/autorefresh.js"></script>
68 <script src="/static/bower_components/codemirror/addon/edit/matchbrackets.js"></script>
69 <script src="/static/bower_components/codemirror/addon/edit/closebrackets.js"></script>
70 <script src="/static/bower_components/codemirror/addon/display/fullscreen.js"></script>
71 <script src="/static/bower_components/codemirror/keymap/sublime.js"></script>
72 <script src="/static/src/instancehandler/instance_list.js"></script>
73 <script src="/static/src/instancehandler/instance_create.js"></script>
74 <script src="/static/bower_components/datatables.net/js/jquery.dataTables.min.js"></script>
75 <script src="/static/bower_components/datatables.net-bs/js/dataTables.bootstrap.min.js"></script>
76
77 <script>
78 var instance_type = '{{ type }}';
79 var row_builder = {
80 'ns': [
81 {
82 "render": function (data, type, row) {
83 return row["short-name"];
84 },
85 "targets": 0
86 },
87 {
88 "render": function (data, type, row) {
89 return row["_id"];
90 },
91 "targets": 1
92 },
93 {
94 "render": function (data, type, row) {
95 return row["nsd-name-ref"];
96 },
97 "targets": 2
98 },
99 {
100 // "width": "5%",
101 "render": function (data, type, row) {
102 if(row["operational-status"] === 'failed')
103 return '<span class="label label-danger">'+ row["operational-status"] +'</span>';
104 if(row["operational-status"] === 'init')
105 return '<span class="label label-warning">'+ row["operational-status"] +'</span>';
106 if(row["operational-status"] === 'running')
107 return '<span class="label label-success">'+ row["operational-status"] +'</span>';
108 return ''+row["operational-status"]+'';
109 },
110 "targets": 3
111 },
112 {
113 // "width": "5%",
114 "render": function (data, type, row) {
115 if(row["config-status"] === 'failed')
116 return '<span class="label label-danger">'+ row["config-status"] +'</span>';
117 if(row["config-status"] === 'init')
118 return '<span class="label label-warning">'+ row["config-status"] +'</span>';
119 if(row["config-status"] === 'running')
120 return '<span class="label label-success">'+ row["config-status"] +'</span>';
121 if(row["config-status"] === 'configured')
122 return '<span class="label label-success">'+ row["config-status"] +'</span>';
123 return ''+row["operational-status"]+'';
124 },
125 "targets": 4
126 },
127 {
128 // "className": "ellipsis",
129 "render": function (data, type, row) {
130 return row["detailed-status"];
131 },
132 "targets": 5
133 },{
134 // "width": "10%",
135 "render": function (data, type, row) {
136 return '<div class="btn-group">\n' +
137 ' <button type="button" class="btn btn-default"\n' +
138 ' onclick="javascript:showInstanceDetails(\''+instance_type+'\', \''+row["_id"]+'\')"\n' +
139 ' data-toggle="tooltip" data-placement="top" data-container="body" title="Show Info">\n' +
140 ' <i class="fa fa-info"></i>\n' +
141 ' </button>\n' +
142 ' <button type="button" class="btn btn-default"\n' +
143 ' onclick="javascript:deleteNs(\''+ row["short-name"] +'\', \''+row["_id"]+'\')"\n' +
144 ' data-toggle="tooltip" data-placement="top" data-container="body" title="Delete"><i\n' +
145 ' class="far fa-trash-alt"></i></button>\n' +
146 ' <button type="button" class="btn btn-default dropdown-toggle"\n' +
147 ' data-toggle="dropdown" aria-expanded="false">Actions\n' +
148 ' <span class="fa fa-caret-down"></span></button>\n' +
149 ' <ul class="dropdown-menu">\n' +
150 ' <li><a href="#"\n' +
151 ' onclick="javascript:performAction(\''+ row["short-name"] +'\', \''+row["_id"]+'\')">\n' +
152 ' <i class="fa fa-magic"></i> Exec NS Primitive</a></li>\n' +
153 ' <li>\n' +
154 ' <a href="/instances/ns/' +row["_id"] +'/operation">\n' +
155 ' <i class="fa fa-list"></i> Active operations</a></li>\n' +
156 ' <li class="divider"></li>\n' +
157 ' <li><a href="#"\n' +
158 ' onclick="javascript:newAlarmNs(\''+ row["short-name"] +'\', \''+row["_id"]+'\')">\n' +
159 ' <i class="far fa-bell"></i> New Alarm</a></li>\n' +
160 ' <li><a href="#"\n' +
161 ' onclick="javascript:exportMetricNs(\''+ row["short-name"] +'\', \''+row["_id"]+ '\')">\n' +
162 ' <i class="far fa-chart-bar"></i> Export metric</a></li>\n' +
163 ' <li class="divider"></li>\n' +
164 ' <li>\n' +
165 ' <a href="javascript:deleteNs(\''+ row["short-name"] +'\', \''+row["_id"]+'\', true)">\n' +
166 ' <i class="far fa-trash-alt" style="color:red" ></i> Force delete</a></li>\n' +
167 ' </ul>\n' +
168 '</div>';
169 },
170 "targets": 5
171 },
172
173 ],
174 'vnf': [ {
175 "render": function (data, type, row) {
176 return row["_id"];
177 },
178 "targets": 0
179 },
180 {
181 "render": function (data, type, row) {
182 return '<a href="javascript:openDescriptorView(\'vnfd\', \'' + row["_id"]+'\')"> ' + row["vnfd-ref"] +' </a>';
183 },
184 "targets": 1
185 },
186 {
187 "render": function (data, type, row) {
188 return row["member-vnf-index-ref"];
189 },
190 "targets": 2
191 },
192 {
193 "render": function (data, type, row) {
194 return row["nsr-id-ref"];
195 },
196 "targets": 3
197 },
198 {
199 "render": function (data, type, row) {
200 return moment.unix(row['created-time']).format('YYYY-MM-DD hh:mm:ss a');
201 },
202 "targets": 4
203 },
204 {
205 "render": function (data, type, row) {
206 return '<div class="btn-group">\n' +
207 ' <button type="button" class="btn btn-default"\n' +
208 ' onclick="javascript:showInstanceDetails(\''+instance_type+'\', \''+row["_id"]+'\')"\n' +
209 ' data-toggle="tooltip" data-placement="top" data-container="body" title="Show Info">\n' +
210 ' <i class="fa fa-info"></i>\n' +
211 ' </button>\n' +
212 ' </div>';
213 },
214 "targets": 5
215 },
216 ]
217 };
218 $(document).ready(function () {
219 var table = $('#instances_table').DataTable({
220 responsive: true,
221 "ajax": {
222 "url": "/instances/" + instance_type + "/list/",
223 "dataSrc": function (json) {
224 return json.instances;
225 },
226 statusCode: {
227 401: function(){
228 console.log("no auth");
229 moveToLogin(window.location.pathname);
230 }
231 },
232 "error": function(hxr, error, thrown){
233 console.log(error);
234 }
235
236 },
237 "columns": row_builder[instance_type]
238 });
239
240
241 setInterval(function () {
242 table.ajax.reload();
243 }, 10000);
244 });
245
246 </script>
247
248 {% endblock %}
249
250 {% block footer %}
251 {% include "footer.html" %}
252 {% endblock %}