root / ui / templates / list.html @ 146b6003
History | View | Annotate | Download (8.6 kB)
1 | 42f67a2a | Dimitris Moraitis | {% load i18n %} |
---|---|---|---|
2 | 42f67a2a | Dimitris Moraitis | |
3 | 1c86af5b | Christodoulos Psaltis | <div id="machinesview" class="list"> |
4 | 1c86af5b | Christodoulos Psaltis | <div id="spinner"></div> |
5 | b303ba05 | Christodoulos Psaltis | <div class="actions"> |
6 | 379a34cf | Dimitris Moraitis | <a id="action-start">Start</a> |
7 | 379a34cf | Dimitris Moraitis | <a id="action-reboot">Reboot</a> |
8 | 379a34cf | Dimitris Moraitis | <a id="action-shutdown">Shutdown</a> |
9 | b303ba05 | Christodoulos Psaltis | <br /> |
10 | 379a34cf | Dimitris Moraitis | <a id="action-destroy">Destroy</a> |
11 | b303ba05 | Christodoulos Psaltis | <br /> |
12 | 379a34cf | Dimitris Moraitis | <a id="action-details">Show Details</a> |
13 | 379a34cf | Dimitris Moraitis | <a id="action-group">Add to group</a> |
14 | b303ba05 | Christodoulos Psaltis | <br /> |
15 | 379a34cf | Dimitris Moraitis | <a id="action-band">Out of band</a> |
16 | b303ba05 | Christodoulos Psaltis | <br /> |
17 | 379a34cf | Dimitris Moraitis | <a id="action-attach">Attach disk</a> |
18 | 379a34cf | Dimitris Moraitis | <a id="action-detach">Detach disk</a> |
19 | b303ba05 | Christodoulos Psaltis | <br /> |
20 | 379a34cf | Dimitris Moraitis | <a id="action-connect">Connect to network</a> |
21 | 379a34cf | Dimitris Moraitis | <a id="action-disconnect">Disconnect from net</a> |
22 | b303ba05 | Christodoulos Psaltis | </div>
|
23 | 008b3ae8 | Christodoulos Psaltis | <table class="list-machines" style="display: none"> |
24 | 1c86af5b | Christodoulos Psaltis | <thead>
|
25 | 1c86af5b | Christodoulos Psaltis | <tr>
|
26 | 1e03328c | Christodoulos Psaltis | <th id="selection" class="select-running"> |
27 | 1e03328c | Christodoulos Psaltis | <input type="checkbox"/> |
28 | 164d6386 | Christodoulos Psaltis | <div class="expand-icon"></div> |
29 | 164d6386 | Christodoulos Psaltis | <ul style="display: none"> |
30 | bd96a56b | Christodoulos Psaltis | <li class="select-all" ><a href="#">all</a></li> |
31 | bd96a56b | Christodoulos Psaltis | <li class="select-none"><a href="#">none</a></li> |
32 | bd96a56b | Christodoulos Psaltis | <li class="select-group"><a href="#">group</a></li> |
33 | 164d6386 | Christodoulos Psaltis | </ul>
|
34 | 164d6386 | Christodoulos Psaltis | </th>
|
35 | 7dda8900 | Christodoulos Psaltis | <th id="os">OS</th> |
36 | 7dda8900 | Christodoulos Psaltis | <th id="name">Name</th> |
37 | 7dda8900 | Christodoulos Psaltis | <th id="ip">IP</th> |
38 | 7dda8900 | Christodoulos Psaltis | <th id="group">Group</th> |
39 | 7dda8900 | Christodoulos Psaltis | <th id="status">Status</th> |
40 | 4da3085a | Dimitris Moraitis | </tr>
|
41 | 4da3085a | Dimitris Moraitis | </thead>
|
42 | 48ce8b68 | Christodoulos Psaltis | <tbody class="machines"></tbody> |
43 | 1c86af5b | Christodoulos Psaltis | </table>
|
44 | b303ba05 | Christodoulos Psaltis | </div>
|
45 | c3b3043d | Dimitris Moraitis | |
46 | c3b3043d | Dimitris Moraitis | <script>
|
47 | 35b8688f | Christodoulos Psaltis | // select/deselect all from checkbox widget of table headers
|
48 | 35b8688f | Christodoulos Psaltis | $("table thead tr th#selection :checkbox").live('change', function() {
|
49 | 35b8688f | Christodoulos Psaltis | if ( $(this).is(":checked") ) {
|
50 | 008b3ae8 | Christodoulos Psaltis | $(":checkbox").attr("checked", true);
|
51 | 35b8688f | Christodoulos Psaltis | }
|
52 | 35b8688f | Christodoulos Psaltis | else {
|
53 | 008b3ae8 | Christodoulos Psaltis | $(":checkbox").attr("checked", false);
|
54 | 35b8688f | Christodoulos Psaltis | }
|
55 | 4da3085a | Dimitris Moraitis | updateActions();
|
56 | 35b8688f | Christodoulos Psaltis | });
|
57 | 35b8688f | Christodoulos Psaltis | |
58 | bd96a56b | Christodoulos Psaltis | // select all/none/group from drop down menu
|
59 | bd96a56b | Christodoulos Psaltis | $("table thead tr th#selection ul li").live('click', function() {
|
60 | 1e03328c | Christodoulos Psaltis | // all or none?
|
61 | bd96a56b | Christodoulos Psaltis | if ( $(this).attr("class") == "select-all" || $(this).attr("class") == "select-none") {
|
62 | bd96a56b | Christodoulos Psaltis | var all = ($(this).attr("class") == "select-all");
|
63 | bd96a56b | Christodoulos Psaltis | // toggle checkboxes
|
64 | 008b3ae8 | Christodoulos Psaltis | $(":checkbox").attr("checked", all);
|
65 | bd96a56b | Christodoulos Psaltis | } else if ($(this).attr("class") == "select-group"){
|
66 | bd96a56b | Christodoulos Psaltis | // TODO: This shoud select only the vms in the selected group
|
67 | bd96a56b | Christodoulos Psaltis | // right now the folowing has the functionality of select-all
|
68 | 008b3ae8 | Christodoulos Psaltis | $(":checkbox").attr("checked", true);
|
69 | bd96a56b | Christodoulos Psaltis | }
|
70 | 1e03328c | Christodoulos Psaltis | // update actions
|
71 | 1e03328c | Christodoulos Psaltis | updateActions();
|
72 | 217b2431 | Dimitris Moraitis | return false;
|
73 | 1e03328c | Christodoulos Psaltis | });
|
74 | 1e03328c | Christodoulos Psaltis | |
75 | 164d6386 | Christodoulos Psaltis | // menu toggle, running menu
|
76 | 008b3ae8 | Christodoulos Psaltis | $("table.list-machines thead tr th#selection div.expand-icon").live('click', function () {
|
77 | 008b3ae8 | Christodoulos Psaltis | $("table.list-machines thead tr th#selection ul").slideToggle('medium');
|
78 | 164d6386 | Christodoulos Psaltis | return false;
|
79 | 164d6386 | Christodoulos Psaltis | });
|
80 | 164d6386 | Christodoulos Psaltis | |
81 | 008b3ae8 | Christodoulos Psaltis | $("table.list-machines thead tr th#selection ul").live('click', function () {
|
82 | 008b3ae8 | Christodoulos Psaltis | $("table.list-machines thead tr th#selection ul").slideToggle('medium');
|
83 | 164d6386 | Christodoulos Psaltis | return false;
|
84 | 164d6386 | Christodoulos Psaltis | });
|
85 | 164d6386 | Christodoulos Psaltis | |
86 | bd96a56b | Christodoulos Psaltis | // TODO: This should be populated with more rules for all available states
|
87 | a9d8ed3a | Christodoulos Psaltis | var actions = { 'reboot': ['ACTIVE', 'REBOOT', 'multiple'],
|
88 | a9d8ed3a | Christodoulos Psaltis | 'shutdown': ['ACTIVE', 'REBOOT', 'multiple'],
|
89 | a9d8ed3a | Christodoulos Psaltis | 'connect': ['ACTIVE', ],
|
90 | a9d8ed3a | Christodoulos Psaltis | 'disconnect': ['ACTIVE', 'network'],
|
91 | a9d8ed3a | Christodoulos Psaltis | 'band': ['ACTIVE', 'REBOOT'],
|
92 | a9d8ed3a | Christodoulos Psaltis | 'details': ['ACTIVE', 'REBOOT', 'STOPPED'],
|
93 | a9d8ed3a | Christodoulos Psaltis | 'start': ['STOPPED', 'multiple'],
|
94 | 48ce8b68 | Christodoulos Psaltis | 'destroy': ['ACTIVE', 'STOPPED', 'REBOOT', 'ERROR', 'multiple'],
|
95 | a9d8ed3a | Christodoulos Psaltis | 'group': ['ACTIVE', 'STOPPED', 'REBOOT','multiple'],
|
96 | 0604f74f | Dimitris Moraitis | };
|
97 | 0604f74f | Dimitris Moraitis | |
98 | 379a34cf | Dimitris Moraitis | // on checkbox click, update the actions
|
99 | fb66080c | Dimitris Moraitis | $("tbody input[type='checkbox']").live('change', function() { updateActions(); });
|
100 | 4da3085a | Dimitris Moraitis | |
101 | d7c4ab32 | Dimitris Moraitis | // destroy action
|
102 | ae0aea6d | Dimitris Moraitis | $("a.enabled#action-destroy").live('click', function() {
|
103 | 217b2431 | Dimitris Moraitis | var checked = $("table.list-machines tbody input[type='checkbox']:checked");
|
104 | 42f67a2a | Dimitris Moraitis | var serverIDs = [], serverNames=[];
|
105 | 217b2431 | Dimitris Moraitis | checked.each(function(i,c) {
|
106 | 48ce8b68 | Christodoulos Psaltis | serverID=c.id;
|
107 | 42f67a2a | Dimitris Moraitis | serverIDs.push(serverID);
|
108 | 48ce8b68 | Christodoulos Psaltis | serverNames.push($('#'+serverID+' span.name').text());
|
109 | 217b2431 | Dimitris Moraitis | });
|
110 | 42f67a2a | Dimitris Moraitis | confirm_action('destroy', destroy, serverIDs, serverNames);
|
111 | 217b2431 | Dimitris Moraitis | return false;
|
112 | d7c4ab32 | Dimitris Moraitis | });
|
113 | d7c4ab32 | Dimitris Moraitis | |
114 | a37690bd | Markos Gogoulos | |
115 | ae0aea6d | Dimitris Moraitis | $("a.enabled#action-reboot").live('click', function() {
|
116 | 42f67a2a | Dimitris Moraitis | var checked = $("table.list-machines tbody input[type='checkbox']:checked");
|
117 | 42f67a2a | Dimitris Moraitis | var serverIDs = [], serverNames=[];
|
118 | 217b2431 | Dimitris Moraitis | checked.each(function(i,c) {
|
119 | 48ce8b68 | Christodoulos Psaltis | serverID=c.id;
|
120 | 42f67a2a | Dimitris Moraitis | serverIDs.push(serverID);
|
121 | 48ce8b68 | Christodoulos Psaltis | serverNames.push($('#'+serverID+' span.name').text());
|
122 | 217b2431 | Dimitris Moraitis | });
|
123 | 42f67a2a | Dimitris Moraitis | confirm_action('reboot', reboot, serverIDs, serverNames);
|
124 | 217b2431 | Dimitris Moraitis | return false;
|
125 | d7c4ab32 | Dimitris Moraitis | });
|
126 | d7c4ab32 | Dimitris Moraitis | |
127 | a37690bd | Markos Gogoulos | |
128 | a37690bd | Markos Gogoulos | $("a.enabled#action-start").live('click', function() {
|
129 | 42f67a2a | Dimitris Moraitis | var checked = $("table.list-machines tbody input[type='checkbox']:checked");
|
130 | 42f67a2a | Dimitris Moraitis | var serverIDs = [], serverNames=[];
|
131 | 217b2431 | Dimitris Moraitis | checked.each(function(i,c) {
|
132 | 48ce8b68 | Christodoulos Psaltis | serverID=c.id;
|
133 | 42f67a2a | Dimitris Moraitis | serverIDs.push(serverID);
|
134 | 48ce8b68 | Christodoulos Psaltis | serverNames.push($('#'+serverID+' span.name').text());
|
135 | 217b2431 | Dimitris Moraitis | });
|
136 | 2ed4ced5 | Markos Gogoulos | // confirm_action('start', start, serverIDs, serverNames);
|
137 | 2ed4ced5 | Markos Gogoulos | start(serverIDs);
|
138 | 217b2431 | Dimitris Moraitis | return false;
|
139 | a37690bd | Markos Gogoulos | });
|
140 | a37690bd | Markos Gogoulos | |
141 | a37690bd | Markos Gogoulos | |
142 | a37690bd | Markos Gogoulos | $("a.enabled#action-shutdown").live('click', function() {
|
143 | 42f67a2a | Dimitris Moraitis | var checked = $("table.list-machines tbody input[type='checkbox']:checked");
|
144 | 42f67a2a | Dimitris Moraitis | var serverIDs = [], serverNames=[];
|
145 | 217b2431 | Dimitris Moraitis | checked.each(function(i,c) {
|
146 | 48ce8b68 | Christodoulos Psaltis | serverID=c.id;
|
147 | 42f67a2a | Dimitris Moraitis | serverIDs.push(serverID);
|
148 | 48ce8b68 | Christodoulos Psaltis | serverNames.push($('#'+serverID+' span.name').text());
|
149 | 217b2431 | Dimitris Moraitis | });
|
150 | 42f67a2a | Dimitris Moraitis | confirm_action('shutdown', shutdown, serverIDs, serverNames);
|
151 | 217b2431 | Dimitris Moraitis | return false;
|
152 | d7c4ab32 | Dimitris Moraitis | });
|
153 | d7c4ab32 | Dimitris Moraitis | |
154 | eae0a59a | Dimitris Moraitis | function update_machines_view(data){
|
155 | eae0a59a | Dimitris Moraitis | /*
|
156 | 48ce8b68 | Christodoulos Psaltis | Go through the already displayed servers and remove those not in
|
157 | 48ce8b68 | Christodoulos Psaltis | the data or those marked as deleted.
|
158 | eae0a59a | Dimitris Moraitis | */
|
159 | 48ce8b68 | Christodoulos Psaltis | $('.machines tr td input').each(function(i,entry) {
|
160 | eae0a59a | Dimitris Moraitis | var deleted = true;
|
161 | eae0a59a | Dimitris Moraitis | $.each(data.servers, function(j,server) {
|
162 | 48ce8b68 | Christodoulos Psaltis | if (server.id == entry.id && ['BUILD', 'ACTIVE', 'STOPPED', 'ERROR'].indexOf(server.status) >= 0) {
|
163 | eae0a59a | Dimitris Moraitis | deleted = false;
|
164 | eae0a59a | Dimitris Moraitis | }
|
165 | eae0a59a | Dimitris Moraitis | });
|
166 | eae0a59a | Dimitris Moraitis | if (deleted) {
|
167 | 48ce8b68 | Christodoulos Psaltis | vmTable.fnDeleteRow(entry);
|
168 | eae0a59a | Dimitris Moraitis | }
|
169 | eae0a59a | Dimitris Moraitis | });
|
170 | eae0a59a | Dimitris Moraitis | /*
|
171 | eae0a59a | Dimitris Moraitis | Then go through the servers in the input data. Update existing entries, add
|
172 | eae0a59a | Dimitris Moraitis | new ones to the list
|
173 | eae0a59a | Dimitris Moraitis | */
|
174 | eae0a59a | Dimitris Moraitis | $.each(data.servers, function(i,server){
|
175 | eae0a59a | Dimitris Moraitis | // if the machine is deleted it should not be included in any list
|
176 | eae0a59a | Dimitris Moraitis | if (server.status == 'DELETED') {
|
177 | eae0a59a | Dimitris Moraitis | return;
|
178 | eae0a59a | Dimitris Moraitis | }
|
179 | eae0a59a | Dimitris Moraitis |
|
180 | 48ce8b68 | Christodoulos Psaltis | existing = $('#' + server.id).parent().parent();
|
181 | eae0a59a | Dimitris Moraitis |
|
182 | eae0a59a | Dimitris Moraitis | if (existing.length){ // simply update the values
|
183 | 48ce8b68 | Christodoulos Psaltis | // If the machine already exists in the DOM then simply update it
|
184 | 48ce8b68 | Christodoulos Psaltis | if (existing.find(".status").text() != STATUS_MESSAGES[server.status]) {
|
185 | 48ce8b68 | Christodoulos Psaltis | try {
|
186 | 48ce8b68 | Christodoulos Psaltis | console.info(existing.find("a.name span.name").text() + ' from '
|
187 | 48ce8b68 | Christodoulos Psaltis | + existing.find(".status").text() + ' to ' + STATUS_MESSAGES[server.status]);
|
188 | 48ce8b68 | Christodoulos Psaltis | } catch(err) {}
|
189 | 48ce8b68 | Christodoulos Psaltis | existing.find(".status").text(STATUS_MESSAGES[server.status]);
|
190 | 48ce8b68 | Christodoulos Psaltis | }
|
191 | 48ce8b68 | Christodoulos Psaltis | existing.find("a.name span.name").text(server.name);
|
192 | 48ce8b68 | Christodoulos Psaltis | existing.find("a.ip span.public").text(String(server.addresses.public.ip.addr).replace(',',' '));
|
193 | eae0a59a | Dimitris Moraitis | } else { // does not exist, we should create it
|
194 | 48ce8b68 | Christodoulos Psaltis | // check server status to select the appropriate OS icon
|
195 | b335768e | Markos Gogoulos | osTag = image_tags[server.imageRef]
|
196 | 48ce8b68 | Christodoulos Psaltis | var osIcon = osTag + ".png";
|
197 | 48ce8b68 | Christodoulos Psaltis | if (['ERROR', 'STOPPED'].indexOf(server.status) >= 0) {
|
198 | 48ce8b68 | Christodoulos Psaltis | osIcon = osTag + "-off.png";
|
199 | eae0a59a | Dimitris Moraitis | }
|
200 | 48ce8b68 | Christodoulos Psaltis | // add new row to the table
|
201 | 48ce8b68 | Christodoulos Psaltis | vmTable.fnAddData([
|
202 | 48ce8b68 | Christodoulos Psaltis | "<input class=" + server.status + " id=" + server.id + " type=checkbox>",
|
203 | 48ce8b68 | Christodoulos Psaltis | "<span class=imagetag>" + osTag + "</span><img class=list-logo src=static/os_logos/" + osIcon +
|
204 | 48ce8b68 | Christodoulos Psaltis | " title=" + osTag + " height=16 width=16>",
|
205 | 48ce8b68 | Christodoulos Psaltis | "<a class=name><span class=name>" + server.name + "</span></a>",
|
206 | 48ce8b68 | Christodoulos Psaltis | "<a class=ip><span class=public>"+ server.addresses.public.ip.addr + "</span></a>",
|
207 | 48ce8b68 | Christodoulos Psaltis | "group",
|
208 | 48ce8b68 | Christodoulos Psaltis | "<span class=status>" + STATUS_MESSAGES[server.status] + "</span>"
|
209 | 48ce8b68 | Christodoulos Psaltis | ]);
|
210 | eae0a59a | Dimitris Moraitis | }
|
211 | eae0a59a | Dimitris Moraitis | });
|
212 | 48ce8b68 | Christodoulos Psaltis | $("#spinner").hide();
|
213 | 48ce8b68 | Christodoulos Psaltis | // in case there are no data, leave the page empty
|
214 | eae0a59a | Dimitris Moraitis | if ($("div.list table.list-machines tbody").length > 0) {
|
215 | 48ce8b68 | Christodoulos Psaltis | $("div.list div.dataTables_filter").show();
|
216 | 48ce8b68 | Christodoulos Psaltis | $("div.list div.dataTables_filter input").show();
|
217 | eae0a59a | Dimitris Moraitis | $("div.list table.list-machines").show();
|
218 | eae0a59a | Dimitris Moraitis | $("div.list div.actions").show();
|
219 | eae0a59a | Dimitris Moraitis | }
|
220 | eae0a59a | Dimitris Moraitis | }
|
221 | eae0a59a | Dimitris Moraitis | |
222 | 48ce8b68 | Christodoulos Psaltis | var vmTable = $("div.list table.list-machines").dataTable({
|
223 | 48ce8b68 | Christodoulos Psaltis | "bInfo": false,
|
224 | 48ce8b68 | Christodoulos Psaltis | "bRetrieve": true,
|
225 | 48ce8b68 | Christodoulos Psaltis | "bPaginate": false,
|
226 | 48ce8b68 | Christodoulos Psaltis | "bAutoWidth": false,
|
227 | 48ce8b68 | Christodoulos Psaltis | "bSort": true,
|
228 | 48ce8b68 | Christodoulos Psaltis | "bStateSave": true,
|
229 | 48ce8b68 | Christodoulos Psaltis | "sScrollY": "270px",
|
230 | 48ce8b68 | Christodoulos Psaltis | "sScrollX": "515px",
|
231 | 48ce8b68 | Christodoulos Psaltis | "sScrollXInner": "500px",
|
232 | 48ce8b68 | Christodoulos Psaltis | "aoColumnDefs": [
|
233 | 48ce8b68 | Christodoulos Psaltis | { "bSortable": false, "aTargets": [ 0 ] }
|
234 | 48ce8b68 | Christodoulos Psaltis | ]
|
235 | 48ce8b68 | Christodoulos Psaltis | });
|
236 | 48ce8b68 | Christodoulos Psaltis | |
237 | 146b6003 | Dimitris Moraitis | |
238 | 146b6003 | Dimitris Moraitis | if (images.length == 0) {
|
239 | 146b6003 | Dimitris Moraitis | // populate image list
|
240 | 146b6003 | Dimitris Moraitis | update_images();
|
241 | 146b6003 | Dimitris Moraitis | }
|
242 | 146b6003 | Dimitris Moraitis | if (flavors.length == 0) {
|
243 | 146b6003 | Dimitris Moraitis | // configure flavors
|
244 | 146b6003 | Dimitris Moraitis | update_flavors();
|
245 | 146b6003 | Dimitris Moraitis | }
|
246 | 146b6003 | Dimitris Moraitis | update_vms(UPDATE_INTERVAL);
|
247 | 42f67a2a | Dimitris Moraitis | |
248 | 35b8688f | Christodoulos Psaltis | </script> |