Statistics
| Branch: | Tag: | Revision:

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>