Statistics
| Branch: | Tag: | Revision:

root / ui / static / synnefo.js @ ca5125bd

History | View | Annotate | Download (63.4 kB)

1 a5bc3755 Vangelis Koukis
//
2 a5bc3755 Vangelis Koukis
// Copyright 2011 GRNET S.A. All rights reserved.
3 72872ba2 Christodoulos Psaltis
//
4 a5bc3755 Vangelis Koukis
// Redistribution and use in source and binary forms, with or
5 a5bc3755 Vangelis Koukis
// without modification, are permitted provided that the following
6 a5bc3755 Vangelis Koukis
// conditions are met:
7 72872ba2 Christodoulos Psaltis
//
8 a5bc3755 Vangelis Koukis
//   1. Redistributions of source code must retain the above
9 a5bc3755 Vangelis Koukis
//      copyright notice, this list of conditions and the following
10 a5bc3755 Vangelis Koukis
//      disclaimer.
11 72872ba2 Christodoulos Psaltis
//
12 a5bc3755 Vangelis Koukis
//   2. Redistributions in binary form must reproduce the above
13 a5bc3755 Vangelis Koukis
//      copyright notice, this list of conditions and the following
14 a5bc3755 Vangelis Koukis
//      disclaimer in the documentation and/or other materials
15 a5bc3755 Vangelis Koukis
//      provided with the distribution.
16 72872ba2 Christodoulos Psaltis
//
17 a5bc3755 Vangelis Koukis
// THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
18 a5bc3755 Vangelis Koukis
// OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19 a5bc3755 Vangelis Koukis
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
20 a5bc3755 Vangelis Koukis
// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
21 a5bc3755 Vangelis Koukis
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22 a5bc3755 Vangelis Koukis
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23 a5bc3755 Vangelis Koukis
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
24 a5bc3755 Vangelis Koukis
// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
25 a5bc3755 Vangelis Koukis
// AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26 a5bc3755 Vangelis Koukis
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
27 a5bc3755 Vangelis Koukis
// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28 a5bc3755 Vangelis Koukis
// POSSIBILITY OF SUCH DAMAGE.
29 72872ba2 Christodoulos Psaltis
//
30 a5bc3755 Vangelis Koukis
// The views and conclusions contained in the software and
31 a5bc3755 Vangelis Koukis
// documentation are those of the authors and should not be
32 a5bc3755 Vangelis Koukis
// interpreted as representing official policies, either expressed
33 a5bc3755 Vangelis Koukis
// or implied, of GRNET S.A.
34 a5bc3755 Vangelis Koukis
//
35 22afb635 Vangelis Koukis
var API_URL = "/api/v1.1";
36 f533f224 Vangelis Koukis
var changes_since = 0, deferred = 0, update_request = false, load_request = false, pending_actions = [];
37 f533f224 Vangelis Koukis
var flavors = [], images = [], servers = [], disks = [], cpus = [], ram = [];
38 f533f224 Vangelis Koukis
var networks = [], networks_changes_since = 0;
39 f533f224 Vangelis Koukis
40 146b6003 Dimitris Moraitis
41 f533f224 Vangelis Koukis
//FIXME: authentication
42 be066a83 Markos Gogoulos
//if cookie with value X-Auth-Token exists, set the value on the headers.
43 d994d118 Markos Gogoulos
    $.ajaxSetup({
44 8b17cf6e Markos Gogoulos
        'beforeSend': function(xhr) {
45 89b6b240 Georgios Gousios
            //if ($.cookie("X-Auth-Token") != null) {
46 be066a83 Markos Gogoulos
              xhr.setRequestHeader("X-Auth-Token", $.cookie("X-Auth-Token"));
47 89b6b240 Georgios Gousios
            //} else {
48 89b6b240 Georgios Gousios
            //    $.cookie("X-Auth-Token", "46e427d657b20defe352804f0eb6f8a2"); // set X-Auth-Token cookie
49 89b6b240 Georgios Gousios
            //}
50 8b17cf6e Markos Gogoulos
        }
51 d994d118 Markos Gogoulos
    });
52 d994d118 Markos Gogoulos
53 a583aa29 Kostas Papadimitriou
54 70eab221 Kostas Papadimitriou
// jquery show/hide events
55 a583aa29 Kostas Papadimitriou
var _oldshow = $.fn.show;
56 a583aa29 Kostas Papadimitriou
$.fn.show = function(speed, callback) {
57 a583aa29 Kostas Papadimitriou
    $(this).trigger('show');
58 a583aa29 Kostas Papadimitriou
    return _oldshow.apply(this,arguments);
59 a583aa29 Kostas Papadimitriou
}
60 70eab221 Kostas Papadimitriou
var _oldhide = $.fn.hide;
61 70eab221 Kostas Papadimitriou
$.fn.hide = function(speed, callback) {
62 70eab221 Kostas Papadimitriou
    $(this).trigger('hide');
63 70eab221 Kostas Papadimitriou
    return _oldhide.apply(this,arguments);
64 70eab221 Kostas Papadimitriou
}
65 a583aa29 Kostas Papadimitriou
66 c5a032c4 Markos Gogoulos
function ISODateString(d){
67 b02144c8 Vangelis Koukis
    //return a date in an ISO 8601 format using UTC.
68 c5a032c4 Markos Gogoulos
    //do not include time zone info (Z) at the end
69 b02144c8 Vangelis Koukis
    //taken from the Mozilla Developer Center
70 267403ca Dimitris Moraitis
    function pad(n){ return n<10 ? '0'+n : n }
71 267403ca Dimitris Moraitis
    return  d.getUTCFullYear()+ '-' +
72 f533f224 Vangelis Koukis
            pad(d.getUTCMonth()+1) + '-' +
73 f533f224 Vangelis Koukis
            pad(d.getUTCDate()) + 'T' +
74 f533f224 Vangelis Koukis
            pad(d.getUTCHours()) + ':' +
75 f533f224 Vangelis Koukis
            pad(d.getUTCMinutes()) + ':' +
76 f533f224 Vangelis Koukis
            pad(d.getUTCSeconds()) +'Z'
77 038383b1 Dimitris Moraitis
}
78 038383b1 Dimitris Moraitis
79 f533f224 Vangelis Koukis
function parse_error(responseText, errorCode){
80 f533f224 Vangelis Koukis
    var errors = [];
81 f533f224 Vangelis Koukis
    try {
82 f533f224 Vangelis Koukis
        responseObj = JSON.parse(responseText);
83 f533f224 Vangelis Koukis
    }
84 f533f224 Vangelis Koukis
    catch(err) {
85 f533f224 Vangelis Koukis
        errors[0] = {'code': errorCode};
86 f533f224 Vangelis Koukis
        return errors;
87 f533f224 Vangelis Koukis
    }
88 f533f224 Vangelis Koukis
    for (var err in responseObj){
89 f533f224 Vangelis Koukis
        errors[errors.length] = responseObj[err];
90 f533f224 Vangelis Koukis
    }
91 f533f224 Vangelis Koukis
    return errors;
92 267403ca Dimitris Moraitis
}
93 c5a032c4 Markos Gogoulos
94 41cad45d Dimitris Moraitis
// indexOf prototype for IE
95 41cad45d Dimitris Moraitis
if (!Array.prototype.indexOf) {
96 41cad45d Dimitris Moraitis
  Array.prototype.indexOf = function(elt /*, from*/) {
97 41cad45d Dimitris Moraitis
    var len = this.length;
98 41cad45d Dimitris Moraitis
    var from = Number(arguments[1]) || 0;
99 41cad45d Dimitris Moraitis
    from = (from < 0)
100 41cad45d Dimitris Moraitis
         ? Math.ceil(from)
101 41cad45d Dimitris Moraitis
         : Math.floor(from);
102 41cad45d Dimitris Moraitis
    if (from < 0)
103 41cad45d Dimitris Moraitis
      from += len;
104 41cad45d Dimitris Moraitis
105 41cad45d Dimitris Moraitis
    for (; from < len; from++) {
106 41cad45d Dimitris Moraitis
      if (from in this &&
107 41cad45d Dimitris Moraitis
          this[from] === elt)
108 41cad45d Dimitris Moraitis
        return from;
109 41cad45d Dimitris Moraitis
    }
110 41cad45d Dimitris Moraitis
    return -1;
111 41cad45d Dimitris Moraitis
  };
112 41cad45d Dimitris Moraitis
}
113 41cad45d Dimitris Moraitis
114 380c0520 Dimitris Moraitis
// trim prototype for IE
115 380c0520 Dimitris Moraitis
if(typeof String.prototype.trim !== 'function') {
116 380c0520 Dimitris Moraitis
    String.prototype.trim = function() {
117 82835e06 Christodoulos Psaltis
        return this.replace(/^\s+|\s+$/g, '');
118 380c0520 Dimitris Moraitis
    }
119 380c0520 Dimitris Moraitis
}
120 380c0520 Dimitris Moraitis
121 a70fb308 Christodoulos Psaltis
function update_confirmations() {
122 dcf153ce Christodoulos Psaltis
    // hide all confirm boxes to begin with
123 f533f224 Vangelis Koukis
    $('#machines-pane div.confirm_single').hide();
124 f533f224 Vangelis Koukis
    $('#machines-pane div.confirm_multiple').hide();
125 a70fb308 Christodoulos Psaltis
    var action_type = [];
126 9b2ab29a Christodoulos Psaltis
    // standard view or single view
127 9b2ab29a Christodoulos Psaltis
    if ($.cookie("view") == '0' || $.cookie("view") == '2') {
128 9044c6eb Christodoulos Psaltis
        for (var i=0; i<pending_actions.length; i++) {
129 dcf153ce Christodoulos Psaltis
            // show single confirms
130 a70fb308 Christodoulos Psaltis
            if (pending_actions[i][0] == reboot) {
131 9044c6eb Christodoulos Psaltis
                action_type = "reboot";
132 a70fb308 Christodoulos Psaltis
            } else if (pending_actions[i][0] == shutdown) {
133 9044c6eb Christodoulos Psaltis
                action_type = "shutdown";
134 a70fb308 Christodoulos Psaltis
            } else if (pending_actions[i][0] == start) {
135 9044c6eb Christodoulos Psaltis
                action_type = "start";
136 9044c6eb Christodoulos Psaltis
            } else if (pending_actions[i][0] == open_console) {
137 9044c6eb Christodoulos Psaltis
                action_type = "console";
138 a70fb308 Christodoulos Psaltis
            } else {
139 9044c6eb Christodoulos Psaltis
                action_type = "destroy";
140 a70fb308 Christodoulos Psaltis
            }
141 9b2ab29a Christodoulos Psaltis
            $("#machines-pane #" + pending_actions[i][1] +
142 9b2ab29a Christodoulos Psaltis
            " div.action-container." + action_type + " div.confirm_single").show();
143 dc3e66b9 Mike Muzurakis
        }
144 f533f224 Vangelis Koukis
    }
145 f533f224 Vangelis Koukis
    // if more than one pending action show multiple confirm box
146 f533f224 Vangelis Koukis
    if (pending_actions.length>1 || $.cookie("view") == '1' && pending_actions.length == 1){
147 f533f224 Vangelis Koukis
        $('#machines-pane div.confirm_multiple span.actionLen').text(pending_actions.length);
148 f533f224 Vangelis Koukis
        $('#machines-pane div.confirm_multiple').show();
149 f533f224 Vangelis Koukis
    }
150 f533f224 Vangelis Koukis
}
151 dcf153ce Christodoulos Psaltis
152 f533f224 Vangelis Koukis
function update_network_confirmations(){
153 f533f224 Vangelis Koukis
    // hide all confirm boxes to begin with
154 f533f224 Vangelis Koukis
    $('#networks-pane div.confirm_multiple').hide();
155 f533f224 Vangelis Koukis
156 f533f224 Vangelis Koukis
    for (var i=0;i<pending_actions.length;i++){
157 f533f224 Vangelis Koukis
        // show single confirms depending on the action
158 f533f224 Vangelis Koukis
        if (pending_actions[i][0] == delete_network) {
159 f533f224 Vangelis Koukis
            $("#networks-pane div.network#net-"+pending_actions[i][1]).children('.confirm_single').show();
160 f533f224 Vangelis Koukis
        } else if (pending_actions[i][0] == remove_server_from_network) {
161 f533f224 Vangelis Koukis
            $("#networks-pane div.network #net-"+pending_actions[i][1]+"-server-"+pending_actions[i][2]).children('.confirm_single').show();
162 f533f224 Vangelis Koukis
        } // else {}
163 f533f224 Vangelis Koukis
    }
164 f533f224 Vangelis Koukis
165 f533f224 Vangelis Koukis
    // if more than one pending action show multiple confirm box
166 f533f224 Vangelis Koukis
    if (pending_actions.length > 1){
167 f533f224 Vangelis Koukis
        $('#networks-pane div.confirm_multiple span.actionLen').text(pending_actions.length);
168 f533f224 Vangelis Koukis
        $('#networks-pane div.confirm_multiple').show();
169 f533f224 Vangelis Koukis
    }
170 3d286f84 Dimitris Moraitis
}
171 3d286f84 Dimitris Moraitis
172 42f67a2a Dimitris Moraitis
function list_view() {
173 f533f224 Vangelis Koukis
    changes_since = 0; // to reload full list
174 f533f224 Vangelis Koukis
    pending_actions = []; // clear pending actions
175 f533f224 Vangelis Koukis
    update_confirmations();
176 f533f224 Vangelis Koukis
    clearTimeout(deferred);    // clear old deferred calls
177 f533f224 Vangelis Koukis
    try {
178 f533f224 Vangelis Koukis
        update_request.abort(); // cancel pending ajax updates
179 f533f224 Vangelis Koukis
        load_request.abort();
180 f533f224 Vangelis Koukis
    }catch(err){}
181 f533f224 Vangelis Koukis
    $.cookie("view", '1'); // set list cookie
182 f533f224 Vangelis Koukis
    uri = $("a#list").attr("href");
183 267403ca Dimitris Moraitis
    load_request = $.ajax({
184 267403ca Dimitris Moraitis
        url: uri,
185 267403ca Dimitris Moraitis
        type: "GET",
186 267403ca Dimitris Moraitis
        timeout: TIMEOUT,
187 267403ca Dimitris Moraitis
        dataType: "html",
188 f533f224 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
189 f533f224 Vangelis Koukis
            return false;
190 f533f224 Vangelis Koukis
        },
191 267403ca Dimitris Moraitis
        success: function(data, textStatus, jqXHR) {
192 f533f224 Vangelis Koukis
            $("a#list")[0].className += ' activelink';
193 f533f224 Vangelis Koukis
            $("a#standard")[0].className = '';
194 f533f224 Vangelis Koukis
            $("a#single")[0].className = '';
195 f533f224 Vangelis Koukis
            $("div#machinesview").html(data);
196 f533f224 Vangelis Koukis
        }
197 f533f224 Vangelis Koukis
    });
198 f533f224 Vangelis Koukis
    return false;
199 f533f224 Vangelis Koukis
}
200 b02144c8 Vangelis Koukis
201 f533f224 Vangelis Koukis
function single_view() {
202 f533f224 Vangelis Koukis
    changes_since = 0; // to reload full list
203 f533f224 Vangelis Koukis
    pending_actions = []; // clear pending actions
204 f533f224 Vangelis Koukis
    update_confirmations();
205 f533f224 Vangelis Koukis
    clearTimeout(deferred);    // clear old deferred calls
206 f533f224 Vangelis Koukis
    try {
207 f533f224 Vangelis Koukis
        update_request.abort(); // cancel pending ajax updates
208 f533f224 Vangelis Koukis
        load_request.abort();
209 f533f224 Vangelis Koukis
    }catch(err){}
210 f533f224 Vangelis Koukis
    $.cookie("view", '2'); // set list cookie
211 f533f224 Vangelis Koukis
    uri = $("a#single").attr("href");
212 f533f224 Vangelis Koukis
    load_request = $.ajax({
213 f533f224 Vangelis Koukis
        url: uri,
214 f533f224 Vangelis Koukis
        type: "GET",
215 f533f224 Vangelis Koukis
        timeout: TIMEOUT,
216 f533f224 Vangelis Koukis
        dataType: "html",
217 f533f224 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
218 f533f224 Vangelis Koukis
            return false;
219 f533f224 Vangelis Koukis
        },
220 f533f224 Vangelis Koukis
        success: function(data, textStatus, jqXHR) {
221 f533f224 Vangelis Koukis
            $("a#single")[0].className += ' activelink';
222 f533f224 Vangelis Koukis
            $("a#standard")[0].className = '';
223 f533f224 Vangelis Koukis
            $("a#list")[0].className = '';
224 f533f224 Vangelis Koukis
            $("div#machinesview").html(data);
225 f533f224 Vangelis Koukis
        }
226 f533f224 Vangelis Koukis
    });
227 42f67a2a Dimitris Moraitis
    return false;
228 42f67a2a Dimitris Moraitis
}
229 42f67a2a Dimitris Moraitis
230 42f67a2a Dimitris Moraitis
function standard_view() {
231 f533f224 Vangelis Koukis
    changes_since = 0; // to reload full list
232 f533f224 Vangelis Koukis
    pending_actions = []; // clear pending actions
233 f533f224 Vangelis Koukis
    update_confirmations();
234 f533f224 Vangelis Koukis
    clearTimeout(deferred);    // clear old deferred calls
235 f533f224 Vangelis Koukis
    try {
236 f533f224 Vangelis Koukis
        update_request.abort() // cancel pending ajax updates
237 f533f224 Vangelis Koukis
        load_request.abort();
238 f533f224 Vangelis Koukis
    }catch(err){}
239 f533f224 Vangelis Koukis
    $.cookie("view", '0');
240 267403ca Dimitris Moraitis
    uri = $("a#standard").attr("href");
241 267403ca Dimitris Moraitis
    load_request = $.ajax({
242 267403ca Dimitris Moraitis
        url: uri,
243 267403ca Dimitris Moraitis
        type: "GET",
244 267403ca Dimitris Moraitis
        timeout: TIMEOUT,
245 267403ca Dimitris Moraitis
        dataType: "html",
246 f533f224 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
247 f533f224 Vangelis Koukis
            return false;
248 f533f224 Vangelis Koukis
        },
249 267403ca Dimitris Moraitis
        success: function(data, textStatus, jqXHR) {
250 f533f224 Vangelis Koukis
            $("a#standard")[0].className += ' activelink';
251 f533f224 Vangelis Koukis
            $("a#list")[0].className = '';
252 f533f224 Vangelis Koukis
            $("a#single")[0].className = '';
253 f533f224 Vangelis Koukis
            $("div#machinesview").html(data);
254 f533f224 Vangelis Koukis
        }
255 f533f224 Vangelis Koukis
    });
256 42f67a2a Dimitris Moraitis
    return false;
257 42f67a2a Dimitris Moraitis
}
258 42f67a2a Dimitris Moraitis
259 42f67a2a Dimitris Moraitis
function choose_view() {
260 f533f224 Vangelis Koukis
    if ($.cookie("view")=='1') {
261 42f67a2a Dimitris Moraitis
        list_view();
262 f533f224 Vangelis Koukis
    } else if ($.cookie("view")=='2'){
263 f533f224 Vangelis Koukis
        single_view();
264 42f67a2a Dimitris Moraitis
    } else {
265 42f67a2a Dimitris Moraitis
        standard_view();
266 42f67a2a Dimitris Moraitis
    }
267 42f67a2a Dimitris Moraitis
}
268 42f67a2a Dimitris Moraitis
269 e4f32f27 Mike Muzurakis
// return value from metadata key "OS", if it exists
270 e4f32f27 Mike Muzurakis
function os_icon(metadata) {
271 e4f32f27 Mike Muzurakis
    if (!metadata) {
272 e4f32f27 Mike Muzurakis
        return 'unknown';
273 e4f32f27 Mike Muzurakis
    }
274 e4f32f27 Mike Muzurakis
    if (metadata.values.OS == undefined || metadata.values.OS == '') {
275 e4f32f27 Mike Muzurakis
        return 'unknown';
276 e4f32f27 Mike Muzurakis
    } else {
277 e4f32f27 Mike Muzurakis
        if (os_icons.indexOf(metadata.values.OS) == -1) {
278 e4f32f27 Mike Muzurakis
            return 'unknown';
279 e4f32f27 Mike Muzurakis
        } else {
280 e4f32f27 Mike Muzurakis
            return metadata.values.OS;
281 e4f32f27 Mike Muzurakis
        }
282 e4f32f27 Mike Muzurakis
    }
283 e4f32f27 Mike Muzurakis
}
284 e4f32f27 Mike Muzurakis
285 e4f32f27 Mike Muzurakis
function os_icon_from_value(metadata) {
286 e4f32f27 Mike Muzurakis
    if (!metadata) {
287 e4f32f27 Mike Muzurakis
        return 'unknown';
288 e4f32f27 Mike Muzurakis
    }
289 e4f32f27 Mike Muzurakis
if (metadata == undefined || metadata == '') {
290 e4f32f27 Mike Muzurakis
        return 'unknown';
291 e4f32f27 Mike Muzurakis
    } else {
292 e4f32f27 Mike Muzurakis
        if (os_icons.indexOf(metadata) == -1) {
293 e4f32f27 Mike Muzurakis
            return 'unknown';
294 e4f32f27 Mike Muzurakis
        } else {
295 e4f32f27 Mike Muzurakis
            return metadata;
296 e4f32f27 Mike Muzurakis
        }
297 e4f32f27 Mike Muzurakis
    }
298 e4f32f27 Mike Muzurakis
}
299 e4f32f27 Mike Muzurakis
300 f533f224 Vangelis Koukis
// get and show a list of running and terminated machines
301 f533f224 Vangelis Koukis
function update_vms(interval) {
302 f533f224 Vangelis Koukis
    try{ console.info('updating machines'); } catch(err){}
303 f533f224 Vangelis Koukis
    var uri= API_URL + '/servers/detail';
304 b02144c8 Vangelis Koukis
305 f533f224 Vangelis Koukis
    if (changes_since != 0)
306 f533f224 Vangelis Koukis
        uri+='?changes-since='+changes_since
307 b02144c8 Vangelis Koukis
308 f533f224 Vangelis Koukis
    update_request = $.ajax({
309 f533f224 Vangelis Koukis
        cache: false,
310 f533f224 Vangelis Koukis
        url: uri,
311 f533f224 Vangelis Koukis
        type: "GET",
312 f533f224 Vangelis Koukis
        timeout: TIMEOUT,
313 f533f224 Vangelis Koukis
        dataType: "json",
314 f533f224 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
315 f533f224 Vangelis Koukis
            // don't forget to try again later
316 f533f224 Vangelis Koukis
            if (interval) {
317 f533f224 Vangelis Koukis
                clearTimeout(deferred);    // clear old deferred calls
318 f533f224 Vangelis Koukis
                deferred = setTimeout(function() {update_vms(interval);},interval,interval);
319 f533f224 Vangelis Koukis
            }
320 f533f224 Vangelis Koukis
            // as for now, just show an error message
321 f533f224 Vangelis Koukis
            try { console.info('update_vms errback:' + jqXHR.status ) } catch(err) {}
322 aeed1f09 Mike Muzurakis
            try {
323 aeed1f09 Mike Muzurakis
                ajax_error(jqXHR.status, undefined, 'Update VMs', jqXHR.responseText);
324 aeed1f09 Mike Muzurakis
            } catch(err) {
325 b8110bae Mike Muzurakis
                ajax_error(0, undefined, 'Update VMs', jqXHR.responseText);
326 aeed1f09 Mike Muzurakis
            }
327 f533f224 Vangelis Koukis
            return false;
328 f533f224 Vangelis Koukis
            },
329 f533f224 Vangelis Koukis
        success: function(data, textStatus, jqXHR) {
330 f533f224 Vangelis Koukis
            // create changes_since string if necessary
331 f533f224 Vangelis Koukis
            if (jqXHR.getResponseHeader('Date') != null){
332 f533f224 Vangelis Koukis
                changes_since_date = new Date(jqXHR.getResponseHeader('Date'));
333 f533f224 Vangelis Koukis
                changes_since = ISODateString(changes_since_date);
334 f533f224 Vangelis Koukis
            }
335 b02144c8 Vangelis Koukis
336 f533f224 Vangelis Koukis
            if (interval) {
337 f533f224 Vangelis Koukis
                clearTimeout(deferred);    // clear old deferred calls
338 f533f224 Vangelis Koukis
                deferred = setTimeout(function() {update_vms(interval);},interval,interval);
339 f533f224 Vangelis Koukis
            }
340 42f67a2a Dimitris Moraitis
341 f533f224 Vangelis Koukis
            if (jqXHR.status == 200 || jqXHR.status == 203) {
342 f533f224 Vangelis Koukis
                try {
343 f533f224 Vangelis Koukis
                    servers = data.servers.values;
344 882ceb8f Dimitris Moraitis
                    jQuery.parseJSON(data);
345 882ceb8f Dimitris Moraitis
                    update_machines_view(data);
346 9b2ab29a Christodoulos Psaltis
                } catch(err) { ajax_error('400', undefined, 'Update VMs', jqXHR.responseText);}
347 f533f224 Vangelis Koukis
            } else if (jqXHR.status != 304){
348 f533f224 Vangelis Koukis
                try { console.info('update_vms callback:' + jqXHR.status ) } catch(err) {}
349 f533f224 Vangelis Koukis
                /*
350 f533f224 Vangelis Koukis
                FIXME:  Here it should return the error, however Opera does not support 304.
351 f533f224 Vangelis Koukis
                        Instead 304 it returns 0. To dealt with this we treat 0 as an
352 f533f224 Vangelis Koukis
                        304, which should be corrected (Bug #317).
353 f533f224 Vangelis Koukis
                */
354 f533f224 Vangelis Koukis
                //ajax_error(jqXHR.status, undefined, 'Update VMs', jqXHR.responseText);
355 f533f224 Vangelis Koukis
            }
356 f533f224 Vangelis Koukis
            return false;
357 f533f224 Vangelis Koukis
        }
358 42f67a2a Dimitris Moraitis
    });
359 f533f224 Vangelis Koukis
    return false;
360 f533f224 Vangelis Koukis
}
361 f533f224 Vangelis Koukis
362 f533f224 Vangelis Koukis
// get a list of running and terminated machines, used in network view
363 f533f224 Vangelis Koukis
function update_networks(interval) {
364 f533f224 Vangelis Koukis
    try{ console.info('updating networks'); } catch(err){}
365 f533f224 Vangelis Koukis
    var uri= API_URL + '/servers/detail';
366 f533f224 Vangelis Koukis
367 f533f224 Vangelis Koukis
    if (changes_since != 0)
368 f533f224 Vangelis Koukis
        uri+='?changes-since='+changes_since
369 f533f224 Vangelis Koukis
370 f533f224 Vangelis Koukis
    update_request = $.ajax({
371 f533f224 Vangelis Koukis
        cache: false,
372 f533f224 Vangelis Koukis
        url: uri,
373 f533f224 Vangelis Koukis
        type: "GET",
374 f533f224 Vangelis Koukis
        timeout: TIMEOUT,
375 f533f224 Vangelis Koukis
        dataType: "json",
376 f533f224 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
377 f533f224 Vangelis Koukis
            // don't forget to try again later
378 f533f224 Vangelis Koukis
            if (interval) {
379 f533f224 Vangelis Koukis
                clearTimeout(deferred);    // clear old deferred calls
380 f533f224 Vangelis Koukis
                deferred = setTimeout(function() {update_networks(interval);},interval,interval);
381 f533f224 Vangelis Koukis
            }
382 f533f224 Vangelis Koukis
            // as for now, just show an error message
383 f533f224 Vangelis Koukis
            try { console.info('update_networks errback:' + jqXHR.status ) } catch(err) {}
384 aeed1f09 Mike Muzurakis
            try {
385 aeed1f09 Mike Muzurakis
                ajax_error(jqXHR.status, undefined, 'Update networks', jqXHR.responseText);
386 aeed1f09 Mike Muzurakis
            } catch(err) {
387 b8110bae Mike Muzurakis
                ajax_error(0, undefined, 'Update networks', jqXHR.responseText);
388 aeed1f09 Mike Muzurakis
            }
389 f533f224 Vangelis Koukis
            return false;
390 f533f224 Vangelis Koukis
            },
391 f533f224 Vangelis Koukis
        success: function(data, textStatus, jqXHR) {
392 f533f224 Vangelis Koukis
            // create changes_since string if necessary
393 f533f224 Vangelis Koukis
            if (jqXHR.getResponseHeader('Date') != null){
394 f533f224 Vangelis Koukis
                changes_since_date = new Date(jqXHR.getResponseHeader('Date'));
395 f533f224 Vangelis Koukis
                changes_since = ISODateString(changes_since_date);
396 f533f224 Vangelis Koukis
            }
397 f533f224 Vangelis Koukis
398 f533f224 Vangelis Koukis
            if (interval) {
399 f533f224 Vangelis Koukis
                clearTimeout(deferred);    // clear old deferred calls
400 f533f224 Vangelis Koukis
                deferred = setTimeout(function() {update_networks(interval);},interval,interval);
401 f533f224 Vangelis Koukis
            }
402 f533f224 Vangelis Koukis
403 f533f224 Vangelis Koukis
            if (jqXHR.status == 200 || jqXHR.status == 203) {
404 f533f224 Vangelis Koukis
                try {
405 f533f224 Vangelis Koukis
                    servers = data.servers.values;
406 882ceb8f Dimitris Moraitis
                    jQuery.parseJSON(data);
407 882ceb8f Dimitris Moraitis
                    update_network_names(data);
408 f533f224 Vangelis Koukis
                } catch(err) { ajax_error('400', undefined, 'Update networks', jqXHR.responseText);}
409 f533f224 Vangelis Koukis
            } else if (jqXHR.status == 304) {
410 f533f224 Vangelis Koukis
                update_network_names();
411 f533f224 Vangelis Koukis
            }
412 f533f224 Vangelis Koukis
            else {
413 f533f224 Vangelis Koukis
                try { console.info('update_networks callback:' + jqXHR.status ) } catch(err) {}
414 f533f224 Vangelis Koukis
                /*
415 f533f224 Vangelis Koukis
                FIXME:  Here it should return the error, however Opera does not support 304.
416 f533f224 Vangelis Koukis
                        Instead 304 it returns 0. To dealt with this we treat 0 as an
417 f533f224 Vangelis Koukis
                        304, which should be corrected (Bug #317).
418 f533f224 Vangelis Koukis
                */
419 f533f224 Vangelis Koukis
                //ajax_error(jqXHR.status, undefined, 'Update networks', jqXHR.responseText);
420 f533f224 Vangelis Koukis
                update_network_names();
421 f533f224 Vangelis Koukis
            }
422 f533f224 Vangelis Koukis
            return false;
423 42f67a2a Dimitris Moraitis
        }
424 42f67a2a Dimitris Moraitis
    });
425 42f67a2a Dimitris Moraitis
    return false;
426 42f67a2a Dimitris Moraitis
}
427 42f67a2a Dimitris Moraitis
428 f533f224 Vangelis Koukis
// get and show a list of public and private networks
429 f533f224 Vangelis Koukis
function update_network_names(servers_data) {
430 f533f224 Vangelis Koukis
    try{ console.info('updating network names'); } catch(err){}
431 f533f224 Vangelis Koukis
    var uri= API_URL + '/networks/detail';
432 f533f224 Vangelis Koukis
433 f533f224 Vangelis Koukis
    if (networks_changes_since != 0)
434 f533f224 Vangelis Koukis
        //FIXME: Comment out the following, until metadata do not 304 when changed
435 f533f224 Vangelis Koukis
        uri+='?changes-since=' + networks_changes_since
436 ce4f9227 Mike Muzurakis
437 1c7978ce Dimitris Moraitis
    update_request = $.ajax({
438 c8bde382 Mike Muzurakis
        cache: false,
439 1a49199e Dimitris Moraitis
        url: uri,
440 42f67a2a Dimitris Moraitis
        type: "GET",
441 42f67a2a Dimitris Moraitis
        timeout: TIMEOUT,
442 42f67a2a Dimitris Moraitis
        dataType: "json",
443 146b6003 Dimitris Moraitis
        error: function(jqXHR, textStatus, errorThrown) {
444 f533f224 Vangelis Koukis
            // as for now, just show an error message
445 f533f224 Vangelis Koukis
            try {
446 f533f224 Vangelis Koukis
                console.info('update_network names errback:' + jqXHR.status )
447 f533f224 Vangelis Koukis
            } catch(err) {}
448 aeed1f09 Mike Muzurakis
            try {
449 aeed1f09 Mike Muzurakis
                ajax_error(jqXHR.status, undefined, 'Update network names', jqXHR.responseText);
450 aeed1f09 Mike Muzurakis
            } catch(err) {
451 b8110bae Mike Muzurakis
                ajax_error(0, undefined, 'Update network names', jqXHR.responseText);
452 aeed1f09 Mike Muzurakis
            }
453 f533f224 Vangelis Koukis
            return false;
454 f533f224 Vangelis Koukis
            },
455 1a49199e Dimitris Moraitis
        success: function(data, textStatus, jqXHR) {
456 e6561111 Mike Muzurakis
            // create changes_since string if necessary
457 e6561111 Mike Muzurakis
            if (jqXHR.getResponseHeader('Date') != null){
458 f533f224 Vangelis Koukis
                changes_since_date = new Date(jqXHR.getResponseHeader('Date'));
459 f533f224 Vangelis Koukis
                networks_changes_since = ISODateString(changes_since_date);
460 f533f224 Vangelis Koukis
            }
461 f533f224 Vangelis Koukis
462 f533f224 Vangelis Koukis
            if (jqXHR.status == 200 || jqXHR.status == 203) {
463 f533f224 Vangelis Koukis
                try {
464 f533f224 Vangelis Koukis
                    networks = data.networks.values;
465 882ceb8f Dimitris Moraitis
                    jQuery.parseJSON(data);
466 882ceb8f Dimitris Moraitis
                    update_networks_view(servers_data, data);
467 f533f224 Vangelis Koukis
                } catch(err) {
468 f533f224 Vangelis Koukis
                    ajax_error('400', undefined, 'Update network names', jqXHR.responseText);
469 f533f224 Vangelis Koukis
                }
470 f533f224 Vangelis Koukis
            } else if (jqXHR.status == 304) {
471 f533f224 Vangelis Koukis
                update_networks_view(servers_data);
472 f533f224 Vangelis Koukis
            } else if (jqXHR.status != 304){
473 f533f224 Vangelis Koukis
                try { console.info('update_network_names callback:' + jqXHR.status ) } catch(err) {}
474 f533f224 Vangelis Koukis
                /*
475 f533f224 Vangelis Koukis
                FIXME:  Here it should return the error, however Opera does not support 304.
476 f533f224 Vangelis Koukis
                        Instead 304 it returns 0. To dealt with this we treat 0 as an
477 f533f224 Vangelis Koukis
                        304, which should be corrected (Bug #317).
478 f533f224 Vangelis Koukis
                */
479 f533f224 Vangelis Koukis
                //ajax_error(jqXHR.status, undefined, 'Update network names', jqXHR.responseText);
480 f533f224 Vangelis Koukis
                update_networks_view(servers_data);
481 f533f224 Vangelis Koukis
            }
482 f533f224 Vangelis Koukis
            return false;
483 42f67a2a Dimitris Moraitis
        }
484 42f67a2a Dimitris Moraitis
    });
485 42f67a2a Dimitris Moraitis
    return false;
486 42f67a2a Dimitris Moraitis
}
487 42f67a2a Dimitris Moraitis
488 146b6003 Dimitris Moraitis
// get and show a list of available standard and custom images
489 b02144c8 Vangelis Koukis
function update_images() {
490 42f67a2a Dimitris Moraitis
    $.ajax({
491 73c2c75b Markos Gogoulos
        url: API_URL + '/images/detail',
492 42f67a2a Dimitris Moraitis
        type: "GET",
493 42f67a2a Dimitris Moraitis
        //async: false,
494 42f67a2a Dimitris Moraitis
        dataType: "json",
495 42f67a2a Dimitris Moraitis
        timeout: TIMEOUT,
496 b02144c8 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
497 aeed1f09 Mike Muzurakis
                    try {
498 aeed1f09 Mike Muzurakis
                        ajax_error(jqXHR.status, undefined, 'Update Images', jqXHR.responseText);
499 aeed1f09 Mike Muzurakis
                    } catch(err) {
500 b8110bae Mike Muzurakis
                        ajax_error(0, undefined, 'Update Images', jqXHR.responseText);
501 aeed1f09 Mike Muzurakis
                    }
502 aeed1f09 Mike Muzurakis
                },
503 42f67a2a Dimitris Moraitis
        success: function(data, textStatus, jqXHR) {
504 146b6003 Dimitris Moraitis
            try {
505 f533f224 Vangelis Koukis
                images = data.images.values;
506 ddf929a7 Christodoulos Psaltis
                jQuery.parseJSON(data);
507 f533f224 Vangelis Koukis
                update_wizard_images();
508 f533f224 Vangelis Koukis
            } catch(err){
509 f533f224 Vangelis Koukis
                ajax_error("NO_IMAGES");
510 f533f224 Vangelis Koukis
            }
511 42f67a2a Dimitris Moraitis
        }
512 42f67a2a Dimitris Moraitis
    });
513 42f67a2a Dimitris Moraitis
    return false;
514 42f67a2a Dimitris Moraitis
}
515 42f67a2a Dimitris Moraitis
516 d134b632 Dimitris Moraitis
function update_wizard_images() {
517 f533f224 Vangelis Koukis
    if ($("ul#standard-images li").toArray().length + $("ul#custom-images li").toArray().length == 0) {
518 f533f224 Vangelis Koukis
        $.each(images, function(i,image){
519 f533f224 Vangelis Koukis
            var img = $('#image-template').clone().attr("id","img-"+image.id).fadeIn("slow");
520 f533f224 Vangelis Koukis
            img.find("label").attr('for',"img-radio-" + image.id);
521 f533f224 Vangelis Koukis
            img.find(".image-title").text(image.name);
522 73c2c75b Markos Gogoulos
            if (image.metadata) {
523 73c2c75b Markos Gogoulos
                if (image.metadata.values.description != undefined) {
524 73c2c75b Markos Gogoulos
                    img.find(".description").text(image.metadata.values.description);
525 73c2c75b Markos Gogoulos
                }
526 73c2c75b Markos Gogoulos
                if (image.metadata.values.size != undefined) {
527 f533f224 Vangelis Koukis
                    img.find("#size").text(image.metadata.values.size);
528 73c2c75b Markos Gogoulos
                }
529 73c2c75b Markos Gogoulos
            }
530 f533f224 Vangelis Koukis
            img.find("input.radio").attr('id',"img-radio-" + image.id);
531 f533f224 Vangelis Koukis
            if (i==0) img.find("input.radio").attr("checked","checked");
532 a64e74f0 Markos Gogoulos
            var image_logo = os_icon(image.metadata);
533 f533f224 Vangelis Koukis
            img.find("img.image-logo").attr('src','static/icons/os/'+image_logo+'.png');
534 73c2c75b Markos Gogoulos
            if (image.metadata) {
535 73c2c75b Markos Gogoulos
                if (image.metadata.values.serverId != undefined) {
536 73c2c75b Markos Gogoulos
                    img.appendTo("ul#custom-images");
537 73c2c75b Markos Gogoulos
                } else {
538 73c2c75b Markos Gogoulos
                    img.appendTo("ul#standard-images");
539 73c2c75b Markos Gogoulos
                }
540 73c2c75b Markos Gogoulos
            } else {
541 73c2c75b Markos Gogoulos
                img.appendTo("ul#standard-images");
542 73c2c75b Markos Gogoulos
            }
543 f533f224 Vangelis Koukis
        });
544 f533f224 Vangelis Koukis
    }
545 d134b632 Dimitris Moraitis
}
546 d134b632 Dimitris Moraitis
547 d134b632 Dimitris Moraitis
function update_wizard_flavors(){
548 f533f224 Vangelis Koukis
    // sliders for selecting VM flavor
549 f533f224 Vangelis Koukis
    $("#cpu:range").rangeinput({min:0,
550 f533f224 Vangelis Koukis
                               value:0,
551 f533f224 Vangelis Koukis
                               step:1,
552 f533f224 Vangelis Koukis
                               progress: true,
553 f533f224 Vangelis Koukis
                               max:cpus.length-1});
554 f533f224 Vangelis Koukis
555 f533f224 Vangelis Koukis
    $("#storage:range").rangeinput({min:0,
556 f533f224 Vangelis Koukis
                               value:0,
557 f533f224 Vangelis Koukis
                               step:1,
558 f533f224 Vangelis Koukis
                               progress: true,
559 f533f224 Vangelis Koukis
                               max:disks.length-1});
560 f533f224 Vangelis Koukis
561 f533f224 Vangelis Koukis
    $("#ram:range").rangeinput({min:0,
562 f533f224 Vangelis Koukis
                               value:0,
563 f533f224 Vangelis Koukis
                               step:1,
564 f533f224 Vangelis Koukis
                               progress: true,
565 f533f224 Vangelis Koukis
                               max:ram.length-1});
566 f533f224 Vangelis Koukis
    $("#small").click();
567 f533f224 Vangelis Koukis
568 f533f224 Vangelis Koukis
    // update the indicators when sliding
569 f533f224 Vangelis Koukis
    $("#cpu:range").data().rangeinput.onSlide(function(event,value){
570 f533f224 Vangelis Koukis
        $("#cpu-indicator")[0].value = cpus[Number(value)];
571 afa2ebd2 Mike Muzurakis
        $("#cpu-indicator").addClass('selectedrange');
572 f533f224 Vangelis Koukis
    });
573 f533f224 Vangelis Koukis
    $("#cpu:range").data().rangeinput.change(function(event,value){
574 f533f224 Vangelis Koukis
        $("#cpu-indicator")[0].value = cpus[Number(value)];
575 f533f224 Vangelis Koukis
        $("#custom").click();
576 f533f224 Vangelis Koukis
        $("#cpu-indicator").removeClass('selectedrange');
577 f533f224 Vangelis Koukis
    });
578 f533f224 Vangelis Koukis
    $("#ram:range").data().rangeinput.onSlide(function(event,value){
579 f533f224 Vangelis Koukis
        $("#ram-indicator")[0].value = ram[Number(value)];
580 afa2ebd2 Mike Muzurakis
        $("#ram-indicator").addClass('selectedrange');
581 f533f224 Vangelis Koukis
    });
582 f533f224 Vangelis Koukis
    $("#ram:range").data().rangeinput.change(function(event,value){
583 f533f224 Vangelis Koukis
        $("#ram-indicator")[0].value = ram[Number(value)];
584 f533f224 Vangelis Koukis
        $("#custom").click();
585 f533f224 Vangelis Koukis
        $("#ram-indicator").removeClass('selectedrange');
586 f533f224 Vangelis Koukis
    });
587 f533f224 Vangelis Koukis
    $("#storage:range").data().rangeinput.onSlide(function(event,value){
588 f533f224 Vangelis Koukis
        $("#storage-indicator")[0].value = disks[Number(value)];
589 afa2ebd2 Mike Muzurakis
        $("#storage-indicator").addClass('selectedrange');
590 f533f224 Vangelis Koukis
    });
591 f533f224 Vangelis Koukis
    $("#storage:range").data().rangeinput.change(function(event,value){
592 f533f224 Vangelis Koukis
        $("#storage-indicator")[0].value = disks[Number(value)];
593 f533f224 Vangelis Koukis
        $("#custom").click();
594 f533f224 Vangelis Koukis
        $("#storage-indicator").removeClass('selectedrange');
595 f533f224 Vangelis Koukis
    });
596 d134b632 Dimitris Moraitis
}
597 d134b632 Dimitris Moraitis
598 42f67a2a Dimitris Moraitis
Array.prototype.unique = function () {
599 f533f224 Vangelis Koukis
    var r = new Array();
600 f533f224 Vangelis Koukis
    o:for(var i = 0, n = this.length; i < n; i++)
601 f533f224 Vangelis Koukis
    {
602 f533f224 Vangelis Koukis
        for(var x = 0, y = r.length; x < y; x++)
603 f533f224 Vangelis Koukis
        {
604 f533f224 Vangelis Koukis
            if(r[x]==this[i])
605 f533f224 Vangelis Koukis
            {
606 f533f224 Vangelis Koukis
                continue o;
607 f533f224 Vangelis Koukis
            }
608 f533f224 Vangelis Koukis
        }
609 f533f224 Vangelis Koukis
        r[r.length] = this[i];
610 f533f224 Vangelis Koukis
    }
611 f533f224 Vangelis Koukis
    return r;
612 42f67a2a Dimitris Moraitis
}
613 42f67a2a Dimitris Moraitis
614 42f67a2a Dimitris Moraitis
// get and configure flavor selection
615 b02144c8 Vangelis Koukis
function update_flavors() {
616 42f67a2a Dimitris Moraitis
    $.ajax({
617 f1641e4d Markos Gogoulos
        url: API_URL + '/flavors/detail',
618 42f67a2a Dimitris Moraitis
        type: "GET",
619 42f67a2a Dimitris Moraitis
        //async: false,
620 42f67a2a Dimitris Moraitis
        dataType: "json",
621 42f67a2a Dimitris Moraitis
        timeout: TIMEOUT,
622 b02144c8 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
623 146b6003 Dimitris Moraitis
            try {
624 f533f224 Vangelis Koukis
                ajax_error(jqXHR.status, undefined, 'Update Flavors', jqXHR.responseText);
625 f533f224 Vangelis Koukis
            } catch (err) {
626 f533f224 Vangelis Koukis
                ajax_error(err);
627 f533f224 Vangelis Koukis
            }
628 66307c9e Christodoulos Psaltis
            // start updating vm list
629 66307c9e Christodoulos Psaltis
            update_vms(UPDATE_INTERVAL);
630 42f67a2a Dimitris Moraitis
        },
631 42f67a2a Dimitris Moraitis
        success: function(data, textStatus, jqXHR) {
632 9b2ab29a Christodoulos Psaltis
633 882ceb8f Dimitris Moraitis
            try {
634 882ceb8f Dimitris Moraitis
                flavors = data.flavors.values;
635 882ceb8f Dimitris Moraitis
                jQuery.parseJSON(data);
636 882ceb8f Dimitris Moraitis
                $.each(flavors, function(i, flavor) {
637 882ceb8f Dimitris Moraitis
                    cpus[i] = flavor['cpu'];
638 882ceb8f Dimitris Moraitis
                    disks[i] = flavor['disk'];
639 882ceb8f Dimitris Moraitis
                    ram[i] = flavor['ram'];
640 882ceb8f Dimitris Moraitis
                });
641 882ceb8f Dimitris Moraitis
                cpus = cpus.unique();
642 882ceb8f Dimitris Moraitis
                disks = disks.unique();
643 882ceb8f Dimitris Moraitis
                ram = ram.unique();
644 882ceb8f Dimitris Moraitis
                update_wizard_flavors();
645 882ceb8f Dimitris Moraitis
            } catch(err){
646 882ceb8f Dimitris Moraitis
                ajax_error("NO_FLAVORS");
647 882ceb8f Dimitris Moraitis
            }
648 66307c9e Christodoulos Psaltis
            // start updating vm list
649 66307c9e Christodoulos Psaltis
            update_vms(UPDATE_INTERVAL);
650 42f67a2a Dimitris Moraitis
        }
651 42f67a2a Dimitris Moraitis
    });
652 42f67a2a Dimitris Moraitis
    return false;
653 42f67a2a Dimitris Moraitis
}
654 1a49199e Dimitris Moraitis
655 b335768e Markos Gogoulos
// return flavorRef from cpu, disk, ram values
656 42f67a2a Dimitris Moraitis
function identify_flavor(cpu, disk, ram){
657 42f67a2a Dimitris Moraitis
    for (i=0;i<flavors.length;i++){
658 42f67a2a Dimitris Moraitis
        if (flavors[i]['cpu'] == cpu && flavors[i]['disk']==disk && flavors[i]['ram']==ram) {
659 42f67a2a Dimitris Moraitis
            return flavors[i]['id']
660 42f67a2a Dimitris Moraitis
        }
661 42f67a2a Dimitris Moraitis
    }
662 42f67a2a Dimitris Moraitis
    return 0;
663 42f67a2a Dimitris Moraitis
}
664 42f67a2a Dimitris Moraitis
665 45ab204d Markos Gogoulos
// return image entry from imageRef
666 45ab204d Markos Gogoulos
function get_image(imageRef) {
667 45ab204d Markos Gogoulos
    for (i=0;i<images.length;i++){
668 45ab204d Markos Gogoulos
        if (images[i]['id'] == imageRef) {
669 45ab204d Markos Gogoulos
            return images[i];
670 45ab204d Markos Gogoulos
        }
671 45ab204d Markos Gogoulos
    }
672 45ab204d Markos Gogoulos
    return 0;
673 45ab204d Markos Gogoulos
}
674 45ab204d Markos Gogoulos
675 f533f224 Vangelis Koukis
// return machine entry from serverID
676 f533f224 Vangelis Koukis
function get_machine(serverID) {
677 f533f224 Vangelis Koukis
    for (i=0;i<servers.length;i++){
678 f533f224 Vangelis Koukis
        if (servers[i]['id'] == serverID) {
679 f533f224 Vangelis Koukis
            return servers[i];
680 f533f224 Vangelis Koukis
        }
681 f533f224 Vangelis Koukis
    }
682 f533f224 Vangelis Koukis
    return 0;
683 f533f224 Vangelis Koukis
}
684 f533f224 Vangelis Koukis
685 f533f224 Vangelis Koukis
// update the actions in icon view, per server
686 f533f224 Vangelis Koukis
function update_iconview_actions(serverID, server_status) {
687 dc3e66b9 Mike Muzurakis
    if ($.cookie("view")=='2') {
688 dc3e66b9 Mike Muzurakis
        // remove .disable from all actions to begin with
689 6a738cca Christodoulos Psaltis
        $('#machinesview-single #' + serverID + ' div.single-action').show();
690 dc3e66b9 Mike Muzurakis
        // decide which actions should be disabled
691 dc3e66b9 Mike Muzurakis
        for (current_action in actions) {
692 dc3e66b9 Mike Muzurakis
            if (actions[current_action].indexOf(server_status) == -1 ) {
693 6a738cca Christodoulos Psaltis
                $('#machinesview-single #' + serverID + ' div.action-' + current_action).hide();
694 dc3e66b9 Mike Muzurakis
            }
695 dc3e66b9 Mike Muzurakis
        }
696 dc3e66b9 Mike Muzurakis
    } else {
697 dc3e66b9 Mike Muzurakis
        // remove .disable from all actions to begin with
698 19697f4f Mike Muzurakis
        $('#machinesview-icon.standard #' + serverID + ' div.actions').find('a').removeClass('disabled');
699 dc3e66b9 Mike Muzurakis
        // decide which actions should be disabled
700 dc3e66b9 Mike Muzurakis
        for (current_action in actions) {
701 dc3e66b9 Mike Muzurakis
            if (actions[current_action].indexOf(server_status) == -1 ) {
702 dc3e66b9 Mike Muzurakis
                $('#machinesview-icon.standard #' + serverID + ' a.action-' + current_action).addClass('disabled');
703 dc3e66b9 Mike Muzurakis
            }
704 f533f224 Vangelis Koukis
        }
705 f533f224 Vangelis Koukis
    }
706 f533f224 Vangelis Koukis
}
707 f533f224 Vangelis Koukis
708 dcf153ce Christodoulos Psaltis
// update the actions in list view
709 f533f224 Vangelis Koukis
function update_listview_actions() {
710 f533f224 Vangelis Koukis
    var states = [];
711 f533f224 Vangelis Koukis
    var on = [];
712 f533f224 Vangelis Koukis
    var checked = $("table.list-machines tbody input[type='checkbox']:checked");
713 f533f224 Vangelis Koukis
    // disable all actions to begin with
714 f533f224 Vangelis Koukis
    $('#machinesview .list div.actions').children().removeClass('enabled');
715 f533f224 Vangelis Koukis
716 f533f224 Vangelis Koukis
    // are there multiple machines selected?
717 f533f224 Vangelis Koukis
    if (checked.length>1)
718 f533f224 Vangelis Koukis
        states[0] = 'multiple';
719 f533f224 Vangelis Koukis
720 f533f224 Vangelis Koukis
    // check the states of selected machines
721 f533f224 Vangelis Koukis
    checked.each(function(i,checkbox) {
722 f533f224 Vangelis Koukis
        states[states.length] = checkbox.className;
723 f533f224 Vangelis Koukis
        var ip = $("#" + checkbox.id.replace('input-','') + ".ip span.public").text();
724 f533f224 Vangelis Koukis
        if (ip.replace('undefined','').length)
725 f533f224 Vangelis Koukis
            states[states.length] = 'network';
726 f533f224 Vangelis Koukis
    });
727 f533f224 Vangelis Koukis
728 f533f224 Vangelis Koukis
    // decide which actions should be enabled
729 f533f224 Vangelis Koukis
    for (a in actions) {
730 f533f224 Vangelis Koukis
        var enabled = false;
731 f533f224 Vangelis Koukis
        for (var s =0; s<states.length; s++) {
732 f533f224 Vangelis Koukis
            if (actions[a].indexOf(states[s]) != -1 ) {
733 f533f224 Vangelis Koukis
                enabled = true;
734 f533f224 Vangelis Koukis
            } else {
735 f533f224 Vangelis Koukis
                enabled = false;
736 f533f224 Vangelis Koukis
                break;
737 f533f224 Vangelis Koukis
            }
738 f533f224 Vangelis Koukis
        }
739 f533f224 Vangelis Koukis
        if (enabled)
740 f533f224 Vangelis Koukis
            on[on.length]=a;
741 f533f224 Vangelis Koukis
    }
742 f533f224 Vangelis Koukis
    // enable those actions
743 f533f224 Vangelis Koukis
    for (action in on) {
744 f533f224 Vangelis Koukis
        $("#action-" + on[action]).addClass('enabled');
745 f533f224 Vangelis Koukis
    }
746 e32c2a5d Dimitris Moraitis
}
747 146b6003 Dimitris Moraitis
748 0971fa71 Markos Gogoulos
//create server action
749 0971fa71 Markos Gogoulos
function create_vm(machineName, imageRef, flavorRef){
750 45ab204d Markos Gogoulos
    var image_logo = os_icon(get_image(imageRef).metadata);
751 f533f224 Vangelis Koukis
    var uri = API_URL + '/servers';
752 0971fa71 Markos Gogoulos
    var payload = {
753 0971fa71 Markos Gogoulos
        "server": {
754 0971fa71 Markos Gogoulos
            "name": machineName,
755 0971fa71 Markos Gogoulos
            "imageRef": imageRef,
756 0971fa71 Markos Gogoulos
            "flavorRef" : flavorRef,
757 0971fa71 Markos Gogoulos
            "metadata" : {
758 45ab204d Markos Gogoulos
                "OS" : image_logo
759 038383b1 Dimitris Moraitis
            }
760 0971fa71 Markos Gogoulos
        }
761 0971fa71 Markos Gogoulos
    };
762 0971fa71 Markos Gogoulos
763 0971fa71 Markos Gogoulos
    $.ajax({
764 7e45ddef Dimitris Moraitis
    url: uri,
765 0971fa71 Markos Gogoulos
    type: "POST",
766 f533f224 Vangelis Koukis
    contentType: "application/json",
767 b02144c8 Vangelis Koukis
    dataType: "json",
768 0971fa71 Markos Gogoulos
    data: JSON.stringify(payload),
769 0971fa71 Markos Gogoulos
    timeout: TIMEOUT,
770 b02144c8 Vangelis Koukis
    error: function(jqXHR, textStatus, errorThrown) {
771 ddf929a7 Christodoulos Psaltis
                // close wizard and show error box
772 ddf929a7 Christodoulos Psaltis
                $('#machines-pane a#create').data('overlay').close();
773 aeed1f09 Mike Muzurakis
                    try {
774 cbb7a325 Christodoulos Psaltis
                        ajax_error(jqXHR.status, undefined, 'Create VM', jqXHR.responseText);
775 aeed1f09 Mike Muzurakis
                    } catch(err) {
776 cbb7a325 Christodoulos Psaltis
                        ajax_error(0, undefined, 'Create VM', jqXHR.responseText);
777 aeed1f09 Mike Muzurakis
                    }
778 0971fa71 Markos Gogoulos
           },
779 0971fa71 Markos Gogoulos
    success: function(data, textStatus, jqXHR) {
780 0971fa71 Markos Gogoulos
                if ( jqXHR.status == '202') {
781 b02144c8 Vangelis Koukis
                    ajax_success("CREATE_VM_SUCCESS", data.server.adminPass);
782 0971fa71 Markos Gogoulos
                } else {
783 ddf929a7 Christodoulos Psaltis
                    // close wizard and show error box
784 ddf929a7 Christodoulos Psaltis
                    $('#machines-pane a#create').data('overlay').close();
785 038383b1 Dimitris Moraitis
                    ajax_error(jqXHR.status, undefined, 'Create VM', jqXHR.responseText);
786 0971fa71 Markos Gogoulos
                }
787 0971fa71 Markos Gogoulos
            }
788 0971fa71 Markos Gogoulos
    });
789 0971fa71 Markos Gogoulos
}
790 0971fa71 Markos Gogoulos
791 42f67a2a Dimitris Moraitis
// reboot action
792 42f67a2a Dimitris Moraitis
function reboot(serverIDs){
793 f533f224 Vangelis Koukis
    if (!serverIDs.length){
794 f533f224 Vangelis Koukis
        //ajax_success('DEFAULT');
795 f533f224 Vangelis Koukis
        return false;
796 f533f224 Vangelis Koukis
    }
797 42f67a2a Dimitris Moraitis
    // ajax post reboot call
798 42f67a2a Dimitris Moraitis
    var payload = {
799 42f67a2a Dimitris Moraitis
        "reboot": {"type" : "HARD"}
800 42f67a2a Dimitris Moraitis
    };
801 f533f224 Vangelis Koukis
802 a1a31201 Dimitris Moraitis
    var serverID = serverIDs.pop();
803 f533f224 Vangelis Koukis
804 f533f224 Vangelis Koukis
    $.ajax({
805 f533f224 Vangelis Koukis
        url: API_URL + '/servers/' + serverID + '/action',
806 f533f224 Vangelis Koukis
        type: "POST",
807 f533f224 Vangelis Koukis
        contentType: "application/json",
808 f533f224 Vangelis Koukis
        dataType: "json",
809 f533f224 Vangelis Koukis
        data: JSON.stringify(payload),
810 f533f224 Vangelis Koukis
        timeout: TIMEOUT,
811 f533f224 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
812 3a254f7c Christodoulos Psaltis
                    // in machine views
813 3a254f7c Christodoulos Psaltis
                    if ( $.cookie("pane") == 0) {
814 3a254f7c Christodoulos Psaltis
                        try {
815 3a254f7c Christodoulos Psaltis
                            display_failure(jqXHR.status, serverID, 'Reboot', jqXHR.responseText);
816 3a254f7c Christodoulos Psaltis
                        } catch (err) {
817 3a254f7c Christodoulos Psaltis
                            display_failure(0, serverID, 'Reboot', jqXHR.responseText);
818 3a254f7c Christodoulos Psaltis
                        }
819 3a254f7c Christodoulos Psaltis
                    }
820 3a254f7c Christodoulos Psaltis
                    // in network view
821 3a254f7c Christodoulos Psaltis
                    else {
822 3a254f7c Christodoulos Psaltis
                        try {
823 3a254f7c Christodoulos Psaltis
                            display_reboot_failure(jqXHR.status, serverID, jqXHR.responseText);
824 3a254f7c Christodoulos Psaltis
                        } catch (err) {
825 3a254f7c Christodoulos Psaltis
                            display_reboot_failure(0, serverID, jqXHR.responseText);
826 3a254f7c Christodoulos Psaltis
                        }
827 aeed1f09 Mike Muzurakis
                    }
828 f533f224 Vangelis Koukis
                },
829 f533f224 Vangelis Koukis
        success: function(data, textStatus, jqXHR) {
830 f533f224 Vangelis Koukis
                    if ( jqXHR.status == '202') {
831 583932c4 Christodoulos Psaltis
                        try {
832 583932c4 Christodoulos Psaltis
                            console.info('rebooted ' + serverID);
833 a1a31201 Dimitris Moraitis
                        } catch(err) {}
834 f533f224 Vangelis Koukis
                        // indicate that the action succeeded
835 3a254f7c Christodoulos Psaltis
                        // in machine views
836 3a254f7c Christodoulos Psaltis
                        if ( $.cookie("pane") == 0) {
837 3a254f7c Christodoulos Psaltis
                            display_success(serverID);
838 3a254f7c Christodoulos Psaltis
                        }
839 3a254f7c Christodoulos Psaltis
                        // in network view
840 3a254f7c Christodoulos Psaltis
                        else {
841 3a254f7c Christodoulos Psaltis
                            display_reboot_success(serverID);
842 3a254f7c Christodoulos Psaltis
                        }
843 f533f224 Vangelis Koukis
                        // continue with the rest of the servers
844 f533f224 Vangelis Koukis
                        reboot(serverIDs);
845 f533f224 Vangelis Koukis
                    } else {
846 f533f224 Vangelis Koukis
                        ajax_error(jqXHR.status, serverID, 'Reboot', jqXHR.responseText);
847 f533f224 Vangelis Koukis
                    }
848 f533f224 Vangelis Koukis
                }
849 42f67a2a Dimitris Moraitis
    });
850 42f67a2a Dimitris Moraitis
    return false;
851 42f67a2a Dimitris Moraitis
}
852 42f67a2a Dimitris Moraitis
853 42f67a2a Dimitris Moraitis
// shutdown action
854 42f67a2a Dimitris Moraitis
function shutdown(serverIDs) {
855 f533f224 Vangelis Koukis
    if (!serverIDs.length){
856 f533f224 Vangelis Koukis
        //ajax_success('DEFAULT');
857 f533f224 Vangelis Koukis
        return false;
858 f533f224 Vangelis Koukis
    }
859 42f67a2a Dimitris Moraitis
    // ajax post shutdown call
860 42f67a2a Dimitris Moraitis
    var payload = {
861 9bc2dbfa Vangelis Koukis
        "shutdown": {}
862 b02144c8 Vangelis Koukis
    };
863 42f67a2a Dimitris Moraitis
864 f533f224 Vangelis Koukis
    var serverID = serverIDs.pop();
865 f533f224 Vangelis Koukis
866 42f67a2a Dimitris Moraitis
    $.ajax({
867 f533f224 Vangelis Koukis
        url: API_URL + '/servers/' + serverID + '/action',
868 f533f224 Vangelis Koukis
        type: "POST",
869 f533f224 Vangelis Koukis
        contentType: "application/json",
870 f533f224 Vangelis Koukis
        dataType: "json",
871 42f67a2a Dimitris Moraitis
        data: JSON.stringify(payload),
872 42f67a2a Dimitris Moraitis
        timeout: TIMEOUT,
873 b02144c8 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
874 aeed1f09 Mike Muzurakis
                    try {
875 aeed1f09 Mike Muzurakis
                        display_failure(jqXHR.status, serverID, 'Shutdown', jqXHR.responseText);
876 aeed1f09 Mike Muzurakis
                    } catch(err) {
877 b8110bae Mike Muzurakis
                        display_failure(0, serverID, 'Shutdown', jqXHR.responseText);
878 aeed1f09 Mike Muzurakis
                    }
879 aeed1f09 Mike Muzurakis
                },
880 42f67a2a Dimitris Moraitis
        success: function(data, textStatus, jqXHR) {
881 42f67a2a Dimitris Moraitis
                    if ( jqXHR.status == '202') {
882 f533f224 Vangelis Koukis
                        try {
883 583932c4 Christodoulos Psaltis
                            console.info('suspended ' + serverID);
884 a1a31201 Dimitris Moraitis
                        } catch(err) {}
885 f533f224 Vangelis Koukis
                        // indicate that the action succeeded
886 f533f224 Vangelis Koukis
                        display_success(serverID);
887 f533f224 Vangelis Koukis
                        // continue with the rest of the servers
888 42f67a2a Dimitris Moraitis
                        shutdown(serverIDs);
889 42f67a2a Dimitris Moraitis
                    } else {
890 038383b1 Dimitris Moraitis
                        ajax_error(jqXHR.status, serverID, 'Shutdown', jqXHR.responseText);
891 748139ba Christodoulos Psaltis
                    }
892 b02144c8 Vangelis Koukis
                }
893 42f67a2a Dimitris Moraitis
    });
894 b02144c8 Vangelis Koukis
    return false;
895 42f67a2a Dimitris Moraitis
}
896 42f67a2a Dimitris Moraitis
897 42f67a2a Dimitris Moraitis
// destroy action
898 42f67a2a Dimitris Moraitis
function destroy(serverIDs) {
899 f533f224 Vangelis Koukis
    if (!serverIDs.length){
900 f533f224 Vangelis Koukis
        //ajax_success('DEFAULT');
901 f533f224 Vangelis Koukis
        return false;
902 f533f224 Vangelis Koukis
    }
903 f15025bc Christodoulos Psaltis
    // ajax post destroy call can have an empty request body
904 b02144c8 Vangelis Koukis
    var payload = {};
905 42f67a2a Dimitris Moraitis
906 f533f224 Vangelis Koukis
    var serverID = serverIDs.pop();
907 f533f224 Vangelis Koukis
908 42f67a2a Dimitris Moraitis
    $.ajax({
909 f533f224 Vangelis Koukis
        url: API_URL + '/servers/' + serverID,
910 f533f224 Vangelis Koukis
        type: "DELETE",
911 f533f224 Vangelis Koukis
        contentType: "application/json",
912 f533f224 Vangelis Koukis
        dataType: "json",
913 42f67a2a Dimitris Moraitis
        data: JSON.stringify(payload),
914 42f67a2a Dimitris Moraitis
        timeout: TIMEOUT,
915 b02144c8 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
916 aeed1f09 Mike Muzurakis
                    try {
917 aeed1f09 Mike Muzurakis
                        display_failure(jqXHR.status, serverID, 'Destroy', jqXHR.responseText);
918 aeed1f09 Mike Muzurakis
                    } catch(err) {
919 b8110bae Mike Muzurakis
                        display_failure(0, serverID, 'Destroy', jqXHR.responseText);
920 aeed1f09 Mike Muzurakis
                    }
921 aeed1f09 Mike Muzurakis
                },
922 42f67a2a Dimitris Moraitis
        success: function(data, textStatus, jqXHR) {
923 2d5cea9b Markos Gogoulos
                    if ( jqXHR.status == '204') {
924 f533f224 Vangelis Koukis
                        try {
925 f15025bc Christodoulos Psaltis
                            console.info('destroyed ' + serverID);
926 a1a31201 Dimitris Moraitis
                        } catch (err) {}
927 f533f224 Vangelis Koukis
                        // indicate that the action succeeded
928 f533f224 Vangelis Koukis
                        display_success(serverID);
929 f533f224 Vangelis Koukis
                        // continue with the rest of the servers
930 38b1f387 Christodoulos Psaltis
                        destroy(serverIDs);
931 42f67a2a Dimitris Moraitis
                    } else {
932 038383b1 Dimitris Moraitis
                        ajax_error(jqXHR.status, serverID, 'Destroy', jqXHR.responseText);
933 748139ba Christodoulos Psaltis
                    }
934 b02144c8 Vangelis Koukis
                }
935 42f67a2a Dimitris Moraitis
    });
936 b02144c8 Vangelis Koukis
    return false;
937 42f67a2a Dimitris Moraitis
}
938 42f67a2a Dimitris Moraitis
939 42f67a2a Dimitris Moraitis
// start action
940 42f67a2a Dimitris Moraitis
function start(serverIDs){
941 f533f224 Vangelis Koukis
    if (!serverIDs.length){
942 f533f224 Vangelis Koukis
        //ajax_success('DEFAULT');
943 f533f224 Vangelis Koukis
        return false;
944 f533f224 Vangelis Koukis
    }
945 42f67a2a Dimitris Moraitis
    // ajax post start call
946 42f67a2a Dimitris Moraitis
    var payload = {
947 623d7244 Vangelis Koukis
        "start": {}
948 b02144c8 Vangelis Koukis
    };
949 42f67a2a Dimitris Moraitis
950 f533f224 Vangelis Koukis
    var serverID = serverIDs.pop();
951 f533f224 Vangelis Koukis
952 42f67a2a Dimitris Moraitis
    $.ajax({
953 0971fa71 Markos Gogoulos
        url: API_URL + '/servers/' + serverID + '/action',
954 42f67a2a Dimitris Moraitis
        type: "POST",
955 f533f224 Vangelis Koukis
        contentType: "application/json",
956 42f67a2a Dimitris Moraitis
        dataType: "json",
957 42f67a2a Dimitris Moraitis
        data: JSON.stringify(payload),
958 42f67a2a Dimitris Moraitis
        timeout: TIMEOUT,
959 b02144c8 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
960 aeed1f09 Mike Muzurakis
                    try {
961 aeed1f09 Mike Muzurakis
                        display_failure(jqXHR.status, serverID, 'Start', jqXHR.responseText);
962 aeed1f09 Mike Muzurakis
                    } catch(err) {
963 b8110bae Mike Muzurakis
                        display_failure(0, serverID, 'Start', jqXHR.responseText);
964 aeed1f09 Mike Muzurakis
                    }
965 aeed1f09 Mike Muzurakis
                },
966 42f67a2a Dimitris Moraitis
        success: function(data, textStatus, jqXHR) {
967 42f67a2a Dimitris Moraitis
                    if ( jqXHR.status == '202') {
968 f533f224 Vangelis Koukis
                        try {
969 583932c4 Christodoulos Psaltis
                            console.info('started ' + serverID);
970 a1a31201 Dimitris Moraitis
                        } catch(err) {}
971 f533f224 Vangelis Koukis
                        // indicate that the action succeeded
972 f533f224 Vangelis Koukis
                        display_success(serverID);
973 f533f224 Vangelis Koukis
                        // continue with the rest of the servers
974 42f67a2a Dimitris Moraitis
                        start(serverIDs);
975 42f67a2a Dimitris Moraitis
                    } else {
976 038383b1 Dimitris Moraitis
                        ajax_error(jqXHR.status, serverID, 'Start', jqXHR.responseText);
977 748139ba Christodoulos Psaltis
                    }
978 748139ba Christodoulos Psaltis
                }
979 42f67a2a Dimitris Moraitis
    });
980 42f67a2a Dimitris Moraitis
    return false;
981 42f67a2a Dimitris Moraitis
}
982 6902f72e clopy
983 b02144c8 Vangelis Koukis
// Show VNC console
984 b02144c8 Vangelis Koukis
function vnc_attachment(host, port, password) {
985 b02144c8 Vangelis Koukis
    // FIXME: Must be made into parameters, in settings.py
986 b02144c8 Vangelis Koukis
    //vnc = open("", "displayWindow",
987 b02144c8 Vangelis Koukis
    //    "status=yes,toolbar=yes,menubar=yes");
988 b02144c8 Vangelis Koukis
    vd = document.open("application/x-vnc");
989 b02144c8 Vangelis Koukis
990 b02144c8 Vangelis Koukis
    vd.writeln("[connection]");
991 b02144c8 Vangelis Koukis
    vd.writeln("host=" + host);
992 b02144c8 Vangelis Koukis
    vd.writeln("port=" + port);
993 b02144c8 Vangelis Koukis
    vd.writeln("password=" + password);
994 b02144c8 Vangelis Koukis
995 b02144c8 Vangelis Koukis
    vd.close();
996 b02144c8 Vangelis Koukis
}
997 b02144c8 Vangelis Koukis
998 b02144c8 Vangelis Koukis
// Show VNC console
999 f533f224 Vangelis Koukis
function show_vnc_console(serverID, serverName, serverIP, host, port, password) {
1000 f533f224 Vangelis Koukis
    var params_url = '?machine=' + serverName + '&host_ip=' + serverIP + '&host=' + host + '&port=' + port + '&password=' + password;
1001 f533f224 Vangelis Koukis
    var params_window = 'scrollbars=no,' +
1002 f533f224 Vangelis Koukis
                        'menubar=no,' +
1003 f533f224 Vangelis Koukis
                        'toolbar=no,' +
1004 f533f224 Vangelis Koukis
                        'status=no,' +
1005 f533f224 Vangelis Koukis
                        'top=0,' +
1006 f533f224 Vangelis Koukis
                        'left=0,' +
1007 f533f224 Vangelis Koukis
                        'height=' + screen.height + ',' +
1008 f533f224 Vangelis Koukis
                        'width=' + screen.width + ',' +
1009 f533f224 Vangelis Koukis
                        'fullscreen=yes';
1010 f533f224 Vangelis Koukis
1011 7e51c3db Markos Gogoulos
    window.open('machines/console' + params_url, 'formresult' + serverID, params_window);
1012 f533f224 Vangelis Koukis
1013 f533f224 Vangelis Koukis
    // Restore os icon in list view
1014 f533f224 Vangelis Koukis
    osIcon = $('#'+serverID).parent().parent().find('.list-logo');
1015 f533f224 Vangelis Koukis
    osIcon.attr('src',osIcon.attr('os'));
1016 9c901aec Markos Gogoulos
    return false;
1017 b02144c8 Vangelis Koukis
}
1018 b02144c8 Vangelis Koukis
1019 b02144c8 Vangelis Koukis
// console action
1020 fb3eec11 Christodoulos Psaltis
function open_console(serverIDs){
1021 f533f224 Vangelis Koukis
    if (!serverIDs.length){
1022 f533f224 Vangelis Koukis
        //ajax_success('DEFAULT');
1023 f533f224 Vangelis Koukis
        return false;
1024 f533f224 Vangelis Koukis
    }
1025 b02144c8 Vangelis Koukis
    // ajax post start call
1026 b02144c8 Vangelis Koukis
    var payload = {
1027 b02144c8 Vangelis Koukis
        "console": {"type": "vnc"}
1028 b02144c8 Vangelis Koukis
    };
1029 b02144c8 Vangelis Koukis
1030 f533f224 Vangelis Koukis
    var serverID = serverIDs.pop();
1031 f533f224 Vangelis Koukis
1032 f533f224 Vangelis Koukis
    var machine = get_machine(serverID);
1033 f533f224 Vangelis Koukis
    var serverName = machine.name;
1034 f533f224 Vangelis Koukis
    var serverIP = machine.addresses.values[0].values[0].addr;
1035 f533f224 Vangelis Koukis
1036 b02144c8 Vangelis Koukis
    $.ajax({
1037 b02144c8 Vangelis Koukis
        url: API_URL + '/servers/' + serverID + '/action',
1038 b02144c8 Vangelis Koukis
        type: "POST",
1039 f533f224 Vangelis Koukis
        contentType: "application/json",
1040 b02144c8 Vangelis Koukis
        dataType: "json",
1041 b02144c8 Vangelis Koukis
        data: JSON.stringify(payload),
1042 b02144c8 Vangelis Koukis
        timeout: TIMEOUT,
1043 b02144c8 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
1044 aeed1f09 Mike Muzurakis
                    try {
1045 aeed1f09 Mike Muzurakis
                        display_failure(jqXHR.status, serverID, 'Console', jqXHR.responseText);
1046 aeed1f09 Mike Muzurakis
                    } catch(err) {
1047 b8110bae Mike Muzurakis
                        display_failure(0, serverID, 'Console', jqXHR.responseText);
1048 aeed1f09 Mike Muzurakis
                    }
1049 aeed1f09 Mike Muzurakis
                },
1050 b02144c8 Vangelis Koukis
        success: function(data, textStatus, jqXHR) {
1051 b02144c8 Vangelis Koukis
                    if ( jqXHR.status == '200') {
1052 f533f224 Vangelis Koukis
                        try {
1053 b02144c8 Vangelis Koukis
                            console.info('got_console ' + serverID);
1054 b02144c8 Vangelis Koukis
                        } catch(err) {}
1055 f533f224 Vangelis Koukis
                        // indicate that the action succeeded
1056 ddf929a7 Christodoulos Psaltis
                        // show_vnc_console(serverID, serverName, serverIP,
1057 ddf929a7 Christodoulos Psaltis
                        // data.console.host,data.console.port,data.console.password);
1058 ddf929a7 Christodoulos Psaltis
                        show_vnc_console(serverID, serverName, serverIP,
1059 ddf929a7 Christodoulos Psaltis
                                         data.console.host,data.console.port,data.console.password);
1060 f533f224 Vangelis Koukis
                        display_success(serverID);
1061 74175c17 Christodoulos Psaltis
                        // hide spinner
1062 74175c17 Christodoulos Psaltis
                        $('#' + serverID + ' .spinner').hide();
1063 f533f224 Vangelis Koukis
                        // continue with the rest of the servers
1064 74175c17 Christodoulos Psaltis
                        open_console(serverIDs);
1065 b02144c8 Vangelis Koukis
                    } else {
1066 b02144c8 Vangelis Koukis
                        ajax_error(jqXHR.status, serverID, 'Console', jqXHR.responseText);
1067 b02144c8 Vangelis Koukis
                    }
1068 b02144c8 Vangelis Koukis
                }
1069 b02144c8 Vangelis Koukis
    });
1070 b02144c8 Vangelis Koukis
    return false;
1071 b02144c8 Vangelis Koukis
}
1072 b02144c8 Vangelis Koukis
1073 f533f224 Vangelis Koukis
// rename server
1074 a70a9116 Mike Muzurakis
function rename(serverID, serverName){
1075 f533f224 Vangelis Koukis
    if (!serverID.length){
1076 f533f224 Vangelis Koukis
        //ajax_success('DEFAULT');
1077 f533f224 Vangelis Koukis
        return false;
1078 f533f224 Vangelis Koukis
    }
1079 0d4faeb8 Mike Muzurakis
    // ajax post rename call
1080 0d4faeb8 Mike Muzurakis
    var payload = {
1081 73715544 Christodoulos Psaltis
        "server": {"name": serverName}
1082 b02144c8 Vangelis Koukis
    };
1083 0d4faeb8 Mike Muzurakis
1084 0d4faeb8 Mike Muzurakis
    $.ajax({
1085 5b35631e Markos Gogoulos
        url: API_URL + '/servers/' + serverID,
1086 a70a9116 Mike Muzurakis
        type: "PUT",
1087 f533f224 Vangelis Koukis
        contentType: "application/json",
1088 0d4faeb8 Mike Muzurakis
        dataType: "json",
1089 0d4faeb8 Mike Muzurakis
        data: JSON.stringify(payload),
1090 0d4faeb8 Mike Muzurakis
        timeout: TIMEOUT,
1091 b02144c8 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
1092 aeed1f09 Mike Muzurakis
                    try {
1093 aeed1f09 Mike Muzurakis
                        display_failure(jqXHR.status, serverID, 'Rename', jqXHR.responseText);
1094 aeed1f09 Mike Muzurakis
                    } catch(err) {
1095 b8110bae Mike Muzurakis
                        display_failure(0, serverID, 'Rename', jqXHR.responseText);
1096 aeed1f09 Mike Muzurakis
                    }
1097 aeed1f09 Mike Muzurakis
                },
1098 0d4faeb8 Mike Muzurakis
        success: function(data, textStatus, jqXHR) {
1099 380c0520 Dimitris Moraitis
                    if ( jqXHR.status == '204' || jqXHR.status == '1223') {
1100 f533f224 Vangelis Koukis
                        try {
1101 0d4faeb8 Mike Muzurakis
                            console.info('renamed ' + serverID);
1102 0d4faeb8 Mike Muzurakis
                        } catch(err) {}
1103 f533f224 Vangelis Koukis
                        // indicate that the action succeeded
1104 f533f224 Vangelis Koukis
                        display_success(serverID);
1105 0d4faeb8 Mike Muzurakis
                    } else {
1106 0d4faeb8 Mike Muzurakis
                        ajax_error(jqXHR.status, serverID, 'Rename', jqXHR.responseText);
1107 0d4faeb8 Mike Muzurakis
                    }
1108 0d4faeb8 Mike Muzurakis
                }
1109 0d4faeb8 Mike Muzurakis
    });
1110 0d4faeb8 Mike Muzurakis
    return false;
1111 0d4faeb8 Mike Muzurakis
}
1112 0d4faeb8 Mike Muzurakis
1113 5186eb04 Christodoulos Psaltis
// get server metadata
1114 f533f224 Vangelis Koukis
function get_metadata(serverID, keys_only) {
1115 5186eb04 Christodoulos Psaltis
    $.ajax({
1116 5186eb04 Christodoulos Psaltis
        url: API_URL + '/servers/' + serverID + '/meta',
1117 d1e14e2c Mike Muzurakis
        cache: false,
1118 5186eb04 Christodoulos Psaltis
        type: "GET",
1119 5186eb04 Christodoulos Psaltis
        //async: false,
1120 5186eb04 Christodoulos Psaltis
        dataType: "json",
1121 5186eb04 Christodoulos Psaltis
        timeout: TIMEOUT,
1122 b02144c8 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
1123 5186eb04 Christodoulos Psaltis
            try {
1124 ddf929a7 Christodoulos Psaltis
                // close wizard and show error box
1125 ddf929a7 Christodoulos Psaltis
                $("a#metadata-scrollable").data('overlay').close();
1126 f533f224 Vangelis Koukis
                ajax_error(jqXHR.status, undefined, 'Get metadata', jqXHR.responseText);
1127 f533f224 Vangelis Koukis
            } catch (err) {
1128 f533f224 Vangelis Koukis
                ajax_error(err);
1129 f533f224 Vangelis Koukis
            }
1130 5186eb04 Christodoulos Psaltis
        },
1131 5186eb04 Christodoulos Psaltis
        success: function(data, textStatus, jqXHR) {
1132 1b3857ab Christodoulos Psaltis
            // to list the new results in the edit dialog
1133 f533f224 Vangelis Koukis
            if (keys_only) {
1134 f533f224 Vangelis Koukis
                list_metadata_keys(serverID, data.metadata.values);
1135 f533f224 Vangelis Koukis
            } else {
1136 f533f224 Vangelis Koukis
                list_metadata(data);
1137 f533f224 Vangelis Koukis
                list_metadata_keys(serverID, data.metadata.values);
1138 f533f224 Vangelis Koukis
            }
1139 f533f224 Vangelis Koukis
            //hide spinner
1140 f533f224 Vangelis Koukis
            $('#metadata-wizard .large-spinner').hide();
1141 5186eb04 Christodoulos Psaltis
        }
1142 5186eb04 Christodoulos Psaltis
    });
1143 5186eb04 Christodoulos Psaltis
    return false;
1144 5186eb04 Christodoulos Psaltis
}
1145 5186eb04 Christodoulos Psaltis
1146 1b3857ab Christodoulos Psaltis
// delete metadata key-value pair
1147 1b3857ab Christodoulos Psaltis
function delete_metadata(serverID, meta_key) {
1148 0943cc77 Markos Gogoulos
    $.ajax({
1149 0943cc77 Markos Gogoulos
        url: API_URL + '/servers/' + serverID + '/meta/' + meta_key,
1150 0943cc77 Markos Gogoulos
        type: "DELETE",
1151 0943cc77 Markos Gogoulos
        //async: false,
1152 0943cc77 Markos Gogoulos
        dataType: "json",
1153 0943cc77 Markos Gogoulos
        timeout: TIMEOUT,
1154 b02144c8 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
1155 0943cc77 Markos Gogoulos
            try {
1156 ddf929a7 Christodoulos Psaltis
                // close wizard and show error box
1157 ddf929a7 Christodoulos Psaltis
                $("a#metadata-scrollable").data('overlay').close();
1158 f533f224 Vangelis Koukis
                ajax_error(jqXHR.status, undefined, 'Delete metadata', jqXHR.responseText);
1159 f533f224 Vangelis Koukis
            } catch (err) {
1160 f533f224 Vangelis Koukis
                ajax_error(err);
1161 f533f224 Vangelis Koukis
            }
1162 0943cc77 Markos Gogoulos
        },
1163 0943cc77 Markos Gogoulos
        success: function(data, textStatus, jqXHR) {
1164 ddf929a7 Christodoulos Psaltis
                    // success: Do nothing, the UI is already updated
1165 0943cc77 Markos Gogoulos
        }
1166 0943cc77 Markos Gogoulos
    });
1167 0943cc77 Markos Gogoulos
    return false;
1168 0943cc77 Markos Gogoulos
}
1169 0943cc77 Markos Gogoulos
1170 1b3857ab Christodoulos Psaltis
// add metadata key-value pair
1171 f533f224 Vangelis Koukis
function update_metadata(serverID, meta_key, meta_value) {
1172 0c578a28 Markos Gogoulos
    var payload = {
1173 0c578a28 Markos Gogoulos
        "meta": {
1174 0c578a28 Markos Gogoulos
        }
1175 0c578a28 Markos Gogoulos
    };
1176 0c578a28 Markos Gogoulos
    payload["meta"][meta_key] = meta_value;
1177 0c578a28 Markos Gogoulos
1178 0c578a28 Markos Gogoulos
    $.ajax({
1179 0c578a28 Markos Gogoulos
        url: API_URL + '/servers/' + serverID + '/meta/' + meta_key,
1180 0c578a28 Markos Gogoulos
        type: "PUT",
1181 f533f224 Vangelis Koukis
        contentType: "application/json",
1182 f533f224 Vangelis Koukis
        dataType: "json",
1183 f533f224 Vangelis Koukis
        data: JSON.stringify(payload),
1184 f533f224 Vangelis Koukis
        timeout: TIMEOUT,
1185 f533f224 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
1186 f533f224 Vangelis Koukis
            try {
1187 ddf929a7 Christodoulos Psaltis
                // close wizard and show error box
1188 ddf929a7 Christodoulos Psaltis
                $("a#metadata-scrollable").data('overlay').close();
1189 f533f224 Vangelis Koukis
                ajax_error(jqXHR.status, undefined, 'add metadata', jqXHR.responseText);
1190 f533f224 Vangelis Koukis
            } catch (err) {
1191 f533f224 Vangelis Koukis
                ajax_error(err);
1192 f533f224 Vangelis Koukis
            }
1193 f533f224 Vangelis Koukis
        },
1194 f533f224 Vangelis Koukis
        success: function(data, textStatus, jqXHR) {
1195 f533f224 Vangelis Koukis
            // success: Update icons if meta key is OS
1196 f533f224 Vangelis Koukis
            if (meta_key == "OS") {
1197 f533f224 Vangelis Koukis
                $("#metadata-wizard .machine-icon").attr("src","static/icons/machines/small/" + os_icon_from_value(meta_value) + '-' + $("#metadata-wizard div#on-off").text() + '.png');
1198 f533f224 Vangelis Koukis
                $("#machinesview-icon").find("div#" + serverID).find("img.logo").attr("src", "static/icons/machines/medium/" + os_icon_from_value(meta_value) + '-' + $("#metadata-wizard div#on-off").text() + '.png');
1199 f533f224 Vangelis Koukis
            }
1200 f533f224 Vangelis Koukis
        }
1201 f533f224 Vangelis Koukis
    });
1202 f533f224 Vangelis Koukis
    return false;
1203 f533f224 Vangelis Koukis
}
1204 f533f224 Vangelis Koukis
1205 f533f224 Vangelis Koukis
// create network
1206 f533f224 Vangelis Koukis
function create_network(networkName){
1207 f533f224 Vangelis Koukis
    // ajax post start call
1208 f533f224 Vangelis Koukis
    var payload = {
1209 f533f224 Vangelis Koukis
        "network": { "name": networkName }
1210 f533f224 Vangelis Koukis
    };
1211 f533f224 Vangelis Koukis
1212 f533f224 Vangelis Koukis
    $.ajax({
1213 f533f224 Vangelis Koukis
        url: API_URL + '/networks',
1214 f533f224 Vangelis Koukis
        type: "POST",
1215 f533f224 Vangelis Koukis
        contentType: "application/json",
1216 f533f224 Vangelis Koukis
        dataType: "json",
1217 f533f224 Vangelis Koukis
        data: JSON.stringify(payload),
1218 f533f224 Vangelis Koukis
        timeout: TIMEOUT,
1219 f533f224 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
1220 f533f224 Vangelis Koukis
            try {
1221 ddf929a7 Christodoulos Psaltis
                // close wizard and show error box
1222 ddf929a7 Christodoulos Psaltis
                $("a#networkscreate").overlay().close();
1223 f533f224 Vangelis Koukis
                ajax_error(jqXHR.status, undefined, 'Create network', jqXHR.responseText);
1224 f533f224 Vangelis Koukis
            } catch (err) {
1225 f533f224 Vangelis Koukis
                ajax_error(err);
1226 f533f224 Vangelis Koukis
            }
1227 f533f224 Vangelis Koukis
        },
1228 f533f224 Vangelis Koukis
        success: function(data, textStatus, jqXHR) {
1229 f533f224 Vangelis Koukis
            if ( jqXHR.status == '202') {
1230 f533f224 Vangelis Koukis
                try {
1231 f533f224 Vangelis Koukis
                    console.info('created network ' + networkName);
1232 f533f224 Vangelis Koukis
                } catch(err) {}
1233 a67bb993 Christodoulos Psaltis
                /*
1234 a67bb993 Christodoulos Psaltis
                On success of this call nothing happens.
1235 a67bb993 Christodoulos Psaltis
                When the UI gets the first update containing the created server,
1236 a67bb993 Christodoulos Psaltis
                the creation wizard is closed and the new network is inserted
1237 a67bb993 Christodoulos Psaltis
                to the DOM. This is done in update_networks_view()
1238 a67bb993 Christodoulos Psaltis
                */
1239 f533f224 Vangelis Koukis
            } else {
1240 ddf929a7 Christodoulos Psaltis
                // close wizard and show error box
1241 a67bb993 Christodoulos Psaltis
                $("a#networkscreate").overlay().close();
1242 f533f224 Vangelis Koukis
                ajax_error(jqXHR.status, undefined, 'Create network', jqXHR.responseText);
1243 f533f224 Vangelis Koukis
            }
1244 f533f224 Vangelis Koukis
        }
1245 f533f224 Vangelis Koukis
    });
1246 f533f224 Vangelis Koukis
    return false;
1247 f533f224 Vangelis Koukis
}
1248 f533f224 Vangelis Koukis
1249 f533f224 Vangelis Koukis
// rename network
1250 f533f224 Vangelis Koukis
function rename_network(networkID, networkName){
1251 f533f224 Vangelis Koukis
    if (!networkID.length){
1252 f533f224 Vangelis Koukis
        //ajax_success('DEFAULT');
1253 f533f224 Vangelis Koukis
        return false;
1254 f533f224 Vangelis Koukis
    }
1255 f533f224 Vangelis Koukis
    // prepare payload
1256 f533f224 Vangelis Koukis
    var payload = {
1257 f533f224 Vangelis Koukis
        "network": {"name": networkName}
1258 f533f224 Vangelis Koukis
    };
1259 f533f224 Vangelis Koukis
    // ajax call
1260 f533f224 Vangelis Koukis
    $.ajax({
1261 f533f224 Vangelis Koukis
        url: API_URL + '/networks/' + networkID,
1262 f533f224 Vangelis Koukis
        type: "PUT",
1263 f533f224 Vangelis Koukis
        contentType: "application/json",
1264 f533f224 Vangelis Koukis
        dataType: "json",
1265 f533f224 Vangelis Koukis
        data: JSON.stringify(payload),
1266 f533f224 Vangelis Koukis
        timeout: TIMEOUT,
1267 f533f224 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
1268 f533f224 Vangelis Koukis
            try {
1269 f533f224 Vangelis Koukis
                ajax_error(jqXHR.status, undefined, 'Rename network', jqXHR.responseText);
1270 f533f224 Vangelis Koukis
            } catch (err) {
1271 b8110bae Mike Muzurakis
                ajax_error(0, undefined, 'Rename network', jqXHR.responseText);
1272 f533f224 Vangelis Koukis
            }
1273 f533f224 Vangelis Koukis
        },
1274 f533f224 Vangelis Koukis
        success: function(data, textStatus, jqXHR) {
1275 f533f224 Vangelis Koukis
            if ( jqXHR.status == '204') {
1276 f533f224 Vangelis Koukis
                try {
1277 f533f224 Vangelis Koukis
                    console.info('renamed network' + networkID);
1278 f533f224 Vangelis Koukis
                } catch(err) {}
1279 f533f224 Vangelis Koukis
            } else {
1280 f533f224 Vangelis Koukis
                ajax_error(jqXHR.status, undefined, 'Rename network', jqXHR.responseText);
1281 f533f224 Vangelis Koukis
            }
1282 f533f224 Vangelis Koukis
        }
1283 f533f224 Vangelis Koukis
    });
1284 f533f224 Vangelis Koukis
    return false;
1285 f533f224 Vangelis Koukis
}
1286 f533f224 Vangelis Koukis
1287 f533f224 Vangelis Koukis
function delete_network(networkIDs){
1288 f533f224 Vangelis Koukis
    if (!networkIDs.length){
1289 f533f224 Vangelis Koukis
        //ajax_success('DEFAULT');
1290 f533f224 Vangelis Koukis
        return false;
1291 f533f224 Vangelis Koukis
    }
1292 f533f224 Vangelis Koukis
    // get a network
1293 f533f224 Vangelis Koukis
    var networkID = networkIDs.pop();
1294 f533f224 Vangelis Koukis
    // ajax post destroy call can have an empty request body
1295 f533f224 Vangelis Koukis
    var payload = {};
1296 f533f224 Vangelis Koukis
    // ajax call
1297 f533f224 Vangelis Koukis
    $.ajax({
1298 f533f224 Vangelis Koukis
        url: API_URL + '/networks/' + networkID,
1299 f533f224 Vangelis Koukis
        type: "DELETE",
1300 f533f224 Vangelis Koukis
        contentType: "application/json",
1301 f533f224 Vangelis Koukis
        dataType: "json",
1302 f533f224 Vangelis Koukis
        data: JSON.stringify(payload),
1303 f533f224 Vangelis Koukis
        timeout: TIMEOUT,
1304 f533f224 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
1305 f533f224 Vangelis Koukis
            try {
1306 2aab1d5e Christodoulos Psaltis
                display_net_failure(jqXHR.status, networkID, 'Delete', jqXHR.responseText);
1307 f533f224 Vangelis Koukis
            } catch (err) {
1308 2aab1d5e Christodoulos Psaltis
                display_net_failure(0, networkID, 'Delete', jqXHR.responseText);
1309 f533f224 Vangelis Koukis
            }
1310 f533f224 Vangelis Koukis
        },
1311 f533f224 Vangelis Koukis
        success: function(data, textStatus, jqXHR) {
1312 f533f224 Vangelis Koukis
            if ( jqXHR.status == '204') {
1313 f533f224 Vangelis Koukis
                try {
1314 f533f224 Vangelis Koukis
                    console.info('deleted network ' + networkID);
1315 f533f224 Vangelis Koukis
                } catch(err) {}
1316 f533f224 Vangelis Koukis
                // continue with the rest of the servers
1317 f533f224 Vangelis Koukis
                delete_network(networkIDs);
1318 f533f224 Vangelis Koukis
            } else {
1319 3a254f7c Christodoulos Psaltis
                try {
1320 2aab1d5e Christodoulos Psaltis
                    display_net_failure(jqXHR.status, networkID, 'Delete', jqXHR.responseText);
1321 3a254f7c Christodoulos Psaltis
                } catch (err) {
1322 2aab1d5e Christodoulos Psaltis
                    display_net_failure(0, networkID, 'Delete', jqXHR.responseText);
1323 3a254f7c Christodoulos Psaltis
                }
1324 f533f224 Vangelis Koukis
            }
1325 f533f224 Vangelis Koukis
        }
1326 f533f224 Vangelis Koukis
    });
1327 f533f224 Vangelis Koukis
    return false;
1328 f533f224 Vangelis Koukis
}
1329 f533f224 Vangelis Koukis
1330 f39b36a6 Christodoulos Psaltis
function add_server_to_network(networkID, serverIDs, serverNames, serverStates) {
1331 f533f224 Vangelis Koukis
    if (!serverIDs.length){
1332 be191315 Christodoulos Psaltis
        // close the overlay when all the calls are made
1333 be191315 Christodoulos Psaltis
        $("a#add-machines-overlay").overlay().close();
1334 f533f224 Vangelis Koukis
        return false;
1335 f533f224 Vangelis Koukis
    }
1336 f533f224 Vangelis Koukis
    // get a server
1337 f533f224 Vangelis Koukis
    var serverID = serverIDs.pop();
1338 82835e06 Christodoulos Psaltis
    var serverName = serverNames.pop();
1339 f39b36a6 Christodoulos Psaltis
    var serverState = serverStates.pop();
1340 f533f224 Vangelis Koukis
    // prepare payload
1341 f533f224 Vangelis Koukis
    var payload = {
1342 f533f224 Vangelis Koukis
            "add": { "serverRef": serverID }
1343 f533f224 Vangelis Koukis
        };
1344 f533f224 Vangelis Koukis
    // prepare ajax call
1345 f533f224 Vangelis Koukis
    $.ajax({
1346 f533f224 Vangelis Koukis
        url: API_URL + '/networks/' + networkID + '/action',
1347 f533f224 Vangelis Koukis
        type: "POST",
1348 f533f224 Vangelis Koukis
        contentType: "application/json",
1349 b02144c8 Vangelis Koukis
        dataType: "json",
1350 0c578a28 Markos Gogoulos
        data: JSON.stringify(payload),
1351 0c578a28 Markos Gogoulos
        timeout: TIMEOUT,
1352 b02144c8 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
1353 0c578a28 Markos Gogoulos
            try {
1354 ddf929a7 Christodoulos Psaltis
                // close wizard and show error box
1355 ddf929a7 Christodoulos Psaltis
                $("a#add-machines-overlay").data('overlay').close();
1356 f533f224 Vangelis Koukis
                ajax_error(jqXHR.status, undefined, 'Add server to network', jqXHR.responseText);
1357 f533f224 Vangelis Koukis
            } catch (err) {
1358 b8110bae Mike Muzurakis
                ajax_error(0, undefined, 'Add server to network', jqXHR.responseText);
1359 f533f224 Vangelis Koukis
            }
1360 0c578a28 Markos Gogoulos
        },
1361 0c578a28 Markos Gogoulos
        success: function(data, textStatus, jqXHR) {
1362 f533f224 Vangelis Koukis
            if ( jqXHR.status == '202') {
1363 f533f224 Vangelis Koukis
                try {
1364 f533f224 Vangelis Koukis
                    console.info('added server ' + serverID + ' to network ' + networkID);
1365 f533f224 Vangelis Koukis
                } catch(err) {}
1366 82835e06 Christodoulos Psaltis
                // toggle the reboot dialog
1367 f39b36a6 Christodoulos Psaltis
                display_reboot_dialog(networkID, serverID, serverName, serverState);
1368 f533f224 Vangelis Koukis
                // continue with the rest of the servers
1369 f39b36a6 Christodoulos Psaltis
                add_server_to_network(networkID, serverIDs, serverNames, serverStates);
1370 f533f224 Vangelis Koukis
            } else {
1371 ddf929a7 Christodoulos Psaltis
                // close wizard and show error box
1372 ddf929a7 Christodoulos Psaltis
                $("a#add-machines-overlay").data('overlay').close();
1373 f533f224 Vangelis Koukis
                ajax_error(jqXHR.status, undefined, 'Add server to network', jqXHR.responseText);
1374 f533f224 Vangelis Koukis
            }
1375 0c578a28 Markos Gogoulos
        }
1376 0c578a28 Markos Gogoulos
    });
1377 0c578a28 Markos Gogoulos
    return false;
1378 0c578a28 Markos Gogoulos
}
1379 0c578a28 Markos Gogoulos
1380 f39b36a6 Christodoulos Psaltis
function remove_server_from_network(networkIDs, serverIDs, serverNames, serverStates) {
1381 f533f224 Vangelis Koukis
    if (!networkIDs.length){
1382 f533f224 Vangelis Koukis
        //ajax_success('DEFAULT');
1383 f533f224 Vangelis Koukis
        return false;
1384 f533f224 Vangelis Koukis
    }
1385 f533f224 Vangelis Koukis
    // get a network and a server
1386 f533f224 Vangelis Koukis
    var networkID = networkIDs.pop();
1387 f533f224 Vangelis Koukis
    var serverID = serverIDs.pop();
1388 82835e06 Christodoulos Psaltis
    var serverName = serverNames.pop();
1389 f39b36a6 Christodoulos Psaltis
    var serverState = serverStates.pop();
1390 f533f224 Vangelis Koukis
    // prepare payload
1391 f533f224 Vangelis Koukis
    var payload = {
1392 f533f224 Vangelis Koukis
            "remove": { "serverRef": serverID }
1393 f533f224 Vangelis Koukis
        };
1394 f533f224 Vangelis Koukis
    // prepare ajax call
1395 f533f224 Vangelis Koukis
    $.ajax({
1396 f533f224 Vangelis Koukis
        url: API_URL + '/networks/' + networkID + '/action',
1397 f533f224 Vangelis Koukis
        type: "POST",
1398 f533f224 Vangelis Koukis
        contentType: "application/json",
1399 f533f224 Vangelis Koukis
        dataType: "json",
1400 f533f224 Vangelis Koukis
        data: JSON.stringify(payload),
1401 f533f224 Vangelis Koukis
        timeout: TIMEOUT,
1402 f533f224 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
1403 f533f224 Vangelis Koukis
            try {
1404 f533f224 Vangelis Koukis
                ajax_error(jqXHR.status, undefined, 'Remove server form network', jqXHR.responseText);
1405 f533f224 Vangelis Koukis
            } catch (err) {
1406 b8110bae Mike Muzurakis
                ajax_error(0, undefined, 'Remove server form network', jqXHR.responseText);
1407 f533f224 Vangelis Koukis
            }
1408 f533f224 Vangelis Koukis
        },
1409 f533f224 Vangelis Koukis
        success: function(data, textStatus, jqXHR) {
1410 f533f224 Vangelis Koukis
            if ( jqXHR.status == '202') {
1411 f533f224 Vangelis Koukis
                try {
1412 f533f224 Vangelis Koukis
                    console.info('deleted server ' + serverID + ' from network ' + networkID);
1413 f533f224 Vangelis Koukis
                } catch(err) {}
1414 82835e06 Christodoulos Psaltis
                // toggle the reboot dialog
1415 f39b36a6 Christodoulos Psaltis
                display_reboot_dialog(networkID, serverID, serverName, serverState);
1416 f533f224 Vangelis Koukis
                // continue with the rest of the servers
1417 f39b36a6 Christodoulos Psaltis
                remove_server_form_network(networkIDs, serverIDs, serverNames, serverStates);
1418 f533f224 Vangelis Koukis
            } else {
1419 f533f224 Vangelis Koukis
                ajax_error(jqXHR.status, undefined, 'Remove server form network', jqXHR.responseText);
1420 f533f224 Vangelis Koukis
            }
1421 f533f224 Vangelis Koukis
        }
1422 f533f224 Vangelis Koukis
    });
1423 f533f224 Vangelis Koukis
    return false;
1424 f533f224 Vangelis Koukis
}
1425 0c578a28 Markos Gogoulos
1426 6423ba92 Christodoulos Psaltis
function set_firewall(networkID, serverID, profile) {
1427 6423ba92 Christodoulos Psaltis
    if (!networkID.length || !serverID.length || !profile.length){
1428 6423ba92 Christodoulos Psaltis
        return false;
1429 6423ba92 Christodoulos Psaltis
    }
1430 6423ba92 Christodoulos Psaltis
    // prepare payload
1431 6423ba92 Christodoulos Psaltis
    var payload = {
1432 6423ba92 Christodoulos Psaltis
            "firewallProfile": { "profile": profile }
1433 6423ba92 Christodoulos Psaltis
        };
1434 6423ba92 Christodoulos Psaltis
    // prepare ajax call
1435 6423ba92 Christodoulos Psaltis
    $.ajax({
1436 6423ba92 Christodoulos Psaltis
        url: API_URL + '/servers/' + serverID + '/action',
1437 6423ba92 Christodoulos Psaltis
        type: "POST",
1438 6423ba92 Christodoulos Psaltis
        contentType: "application/json",
1439 6423ba92 Christodoulos Psaltis
        dataType: "json",
1440 6423ba92 Christodoulos Psaltis
        data: JSON.stringify(payload),
1441 6423ba92 Christodoulos Psaltis
        timeout: TIMEOUT,
1442 6423ba92 Christodoulos Psaltis
        error: function(jqXHR, textStatus, errorThrown) {
1443 6423ba92 Christodoulos Psaltis
            try {
1444 6423ba92 Christodoulos Psaltis
                ajax_error(jqXHR.status, undefined, 'Set firewall profile', jqXHR.responseText);
1445 6423ba92 Christodoulos Psaltis
            } catch (err) {
1446 6423ba92 Christodoulos Psaltis
                ajax_error(0, undefined, 'Set firewall profile', jqXHR.responseText);
1447 6423ba92 Christodoulos Psaltis
            }
1448 6423ba92 Christodoulos Psaltis
        },
1449 6423ba92 Christodoulos Psaltis
        success: function(data, textStatus, jqXHR) {
1450 6423ba92 Christodoulos Psaltis
            if ( jqXHR.status == '202') {
1451 6423ba92 Christodoulos Psaltis
                try {
1452 6423ba92 Christodoulos Psaltis
                    console.info('for server ' + serverID + ' set firewall profile to ' + profile);
1453 6423ba92 Christodoulos Psaltis
                } catch(err) {}
1454 372f6c81 Mike Muzurakis
                //remove progress gif and toggle the content
1455 d6872a51 Christodoulos Psaltis
                $('div#net-' + networkID + '-server-' + serverID + ' button.firewall-apply').html(VARIOUS["APPLY"]);
1456 d6872a51 Christodoulos Psaltis
                $('div#net-' + networkID + '-server-' + serverID + ' button.firewall-apply').attr("disabled", false);
1457 d6872a51 Christodoulos Psaltis
                $('div#net-' + networkID + '-server-' + serverID + ' div.firewall-header').click();
1458 d6872a51 Christodoulos Psaltis
                // change on/off
1459 d6872a51 Christodoulos Psaltis
                $('div#net-' + networkID + '-server-' + serverID + ' .firewall-label span').removeClass();
1460 d6872a51 Christodoulos Psaltis
                if ( profile == 'DISABLED' ) {
1461 d6872a51 Christodoulos Psaltis
                    $('div#net-' + networkID + '-server-' + serverID + ' .firewall-label span').addClass('firewall-off');
1462 d6872a51 Christodoulos Psaltis
                    $('div#net-' + networkID + '-server-' + serverID + ' .firewall-label span').html(VARIOUS["OFF"]);
1463 d6872a51 Christodoulos Psaltis
                }
1464 d6872a51 Christodoulos Psaltis
                else {
1465 d6872a51 Christodoulos Psaltis
                    $('div#net-' + networkID + '-server-' + serverID + ' .firewall-label span').addClass('firewall-on');
1466 d6872a51 Christodoulos Psaltis
                    $('div#net-' + networkID + '-server-' + serverID + ' .firewall-label span').html(VARIOUS["ON"]);
1467 d6872a51 Christodoulos Psaltis
                }
1468 6423ba92 Christodoulos Psaltis
                // toggle the reboot dialog
1469 d6872a51 Christodoulos Psaltis
                var serverName = $('div#net-' + networkID + '-server-' + serverID + ' div.machine-name-div span.name').text();
1470 d6872a51 Christodoulos Psaltis
                var serverState = $('div#net-' + networkID + '-server-' + serverID + ' img.logo').attr('src').split('-')[1];
1471 372f6c81 Mike Muzurakis
                serverState = serverState.split('.')[0];
1472 372f6c81 Mike Muzurakis
                display_reboot_dialog(networkID, serverID, serverName, serverState);
1473 6423ba92 Christodoulos Psaltis
            } else {
1474 6423ba92 Christodoulos Psaltis
                ajax_error(jqXHR.status, undefined, 'Set firewall profile', jqXHR.responseText);
1475 6423ba92 Christodoulos Psaltis
            }
1476 6423ba92 Christodoulos Psaltis
        }
1477 6423ba92 Christodoulos Psaltis
    });
1478 6423ba92 Christodoulos Psaltis
    return false;
1479 6423ba92 Christodoulos Psaltis
}
1480 6423ba92 Christodoulos Psaltis
1481 6902f72e clopy
// show the welcome screen
1482 6902f72e clopy
function showWelcome() {
1483 f5ebca32 Mike Muzurakis
    $("#view-select").fadeOut("fast");
1484 f5ebca32 Mike Muzurakis
    $("#emptymachineslist").fadeIn("fast");
1485 f0215d6b Mike Muzurakis
    $("#machinesview").hide();
1486 6902f72e clopy
}
1487 6902f72e clopy
1488 6902f72e clopy
// hide the welcome screen
1489 6902f72e clopy
function hideWelcome() {
1490 6902f72e clopy
    $("#emptymachineslist").fadeOut("fast");
1491 6902f72e clopy
    $("#view-select").fadeIn("fast");
1492 ce4f9227 Mike Muzurakis
    $("div#view-select").show();
1493 f0215d6b Mike Muzurakis
    $("#machinesview").show();
1494 f533f224 Vangelis Koukis
}
1495 f533f224 Vangelis Koukis
1496 f533f224 Vangelis Koukis
function log_server_status_change(server_entry, new_status) {
1497 f533f224 Vangelis Koukis
    // firebug console logging
1498 f533f224 Vangelis Koukis
    try {
1499 09828cb5 Mike Muzurakis
        if ($("#machinesview-single").length > 0) {
1500 09828cb5 Mike Muzurakis
            console.info(server_entry.find("div.machine-details div.name").text() +
1501 09828cb5 Mike Muzurakis
                        ' from ' + server_entry.find(".state-label").text() +
1502 09828cb5 Mike Muzurakis
                        ' to ' + STATUSES[new_status]);
1503 09828cb5 Mike Muzurakis
        } else {
1504 09828cb5 Mike Muzurakis
            console.info(server_entry.find("div.name span.name").text() +
1505 09828cb5 Mike Muzurakis
                        ' from ' + server_entry.find(".status").text() +
1506 09828cb5 Mike Muzurakis
                        ' to ' + STATUSES[new_status]);
1507 09828cb5 Mike Muzurakis
        }
1508 f533f224 Vangelis Koukis
    } catch(err) {}
1509 f533f224 Vangelis Koukis
}
1510 f533f224 Vangelis Koukis
1511 f533f224 Vangelis Koukis
function get_flavor_params(flavorRef) {
1512 f533f224 Vangelis Koukis
    var cpus, ram, disk;
1513 f533f224 Vangelis Koukis
    if ( flavors.length > 0 ) {
1514 f533f224 Vangelis Koukis
        var current_flavor = '';
1515 f533f224 Vangelis Koukis
        for (i=0; i<flavors.length; i++) {
1516 f533f224 Vangelis Koukis
            if (flavors[i]['id'] == flavorRef) {
1517 f533f224 Vangelis Koukis
                current_flavor = flavors[i];
1518 f533f224 Vangelis Koukis
            }
1519 f533f224 Vangelis Koukis
        }
1520 f533f224 Vangelis Koukis
        cpus = current_flavor['cpu'];
1521 f533f224 Vangelis Koukis
        ram = current_flavor['ram'];
1522 f533f224 Vangelis Koukis
        disk = current_flavor['disk'];
1523 f533f224 Vangelis Koukis
    } else {
1524 f533f224 Vangelis Koukis
        cpus = 'undefined';
1525 f533f224 Vangelis Koukis
        ram = 'undefined';
1526 f533f224 Vangelis Koukis
        disk = 'undefined';
1527 f533f224 Vangelis Koukis
    }
1528 f533f224 Vangelis Koukis
    return {'cpus': cpus, 'ram': ram, 'disk': disk};
1529 f533f224 Vangelis Koukis
}
1530 f533f224 Vangelis Koukis
1531 f533f224 Vangelis Koukis
function get_image_params(imageRef) {
1532 f533f224 Vangelis Koukis
    var image_name, image_size;
1533 f533f224 Vangelis Koukis
    if ( images.length > 0 ) {
1534 f533f224 Vangelis Koukis
        var current_image = '';
1535 f533f224 Vangelis Koukis
        for (i=0; i<images.length; i++) {
1536 f533f224 Vangelis Koukis
            if (images[i]['id'] == imageRef) {
1537 f533f224 Vangelis Koukis
                current_image = images[i];
1538 f533f224 Vangelis Koukis
            }
1539 f533f224 Vangelis Koukis
        }
1540 7ffea202 Dimitris Moraitis
        try {
1541 7ffea202 Dimitris Moraitis
            image_name = current_image['name'];
1542 7ffea202 Dimitris Moraitis
        } catch(err) { image_name = 'undefined'; }
1543 7ffea202 Dimitris Moraitis
        try{
1544 7ffea202 Dimitris Moraitis
            image_size = current_image['metadata']['values']['size'];
1545 7ffea202 Dimitris Moraitis
        } catch(err) { image_size = 'undefined'; }
1546 f533f224 Vangelis Koukis
    } else {
1547 f533f224 Vangelis Koukis
        image_name = 'undefined';
1548 f533f224 Vangelis Koukis
        image_size = 'undefined';
1549 f533f224 Vangelis Koukis
    }
1550 f533f224 Vangelis Koukis
    return {'name': image_name,'size': image_size};
1551 f533f224 Vangelis Koukis
}
1552 f533f224 Vangelis Koukis
1553 f533f224 Vangelis Koukis
function get_public_ips(server) {
1554 f533f224 Vangelis Koukis
    var ip4, ip6;
1555 f533f224 Vangelis Koukis
    try {
1556 f533f224 Vangelis Koukis
        if (server.addresses.values) {
1557 f533f224 Vangelis Koukis
            $.each (server.addresses.values, function(i, value) {
1558 f533f224 Vangelis Koukis
                if (value.id == 'public') {
1559 f533f224 Vangelis Koukis
                    try {
1560 f533f224 Vangelis Koukis
                        $.each (value.values, function(i, ip) {
1561 f533f224 Vangelis Koukis
                            if (ip.version == '4') {
1562 f533f224 Vangelis Koukis
                                ip4 = ip.addr;
1563 f533f224 Vangelis Koukis
                            } else if (ip.version == '6') {
1564 f533f224 Vangelis Koukis
                                ip6 = ip.addr;
1565 f533f224 Vangelis Koukis
                            } else {
1566 f533f224 Vangelis Koukis
                                ip4 = 'undefined';
1567 f533f224 Vangelis Koukis
                                ip6 = 'undefined';
1568 f533f224 Vangelis Koukis
                            }
1569 f533f224 Vangelis Koukis
                        });
1570 f533f224 Vangelis Koukis
                    } catch (err){
1571 f533f224 Vangelis Koukis
                        try{console.info('Server ' + server.id + ' has invalid ips')}catch(err){};
1572 f533f224 Vangelis Koukis
                        ip4 = 'undefined';
1573 f533f224 Vangelis Koukis
                        ip6 = 'undefined';
1574 f533f224 Vangelis Koukis
                    }
1575 f533f224 Vangelis Koukis
                }
1576 f533f224 Vangelis Koukis
            });
1577 f533f224 Vangelis Koukis
        }
1578 f533f224 Vangelis Koukis
    } catch (err) {
1579 f533f224 Vangelis Koukis
        try{console.info('Server ' + server.id + ' has no network addresses')}catch(err){};
1580 f533f224 Vangelis Koukis
        ip4 = 'undefined';
1581 f533f224 Vangelis Koukis
        ip6 = 'undefined';
1582 f533f224 Vangelis Koukis
    }
1583 f533f224 Vangelis Koukis
    return {'ip4': ip4, 'ip6': ip6};
1584 6902f72e clopy
}
1585 6902f72e clopy
1586 f533f224 Vangelis Koukis
function get_private_ips(server) {
1587 f533f224 Vangelis Koukis
1588 f533f224 Vangelis Koukis
}
1589 716c3ead Dimitris Moraitis
1590 716c3ead Dimitris Moraitis
function close_all_overlays() {
1591 716c3ead Dimitris Moraitis
        try {
1592 716c3ead Dimitris Moraitis
                $("a#networkscreate").overlay().close();
1593 716c3ead Dimitris Moraitis
        } catch(err) {}
1594 716c3ead Dimitris Moraitis
        try {
1595 716c3ead Dimitris Moraitis
                $('a#create').overlay().close();
1596 716c3ead Dimitris Moraitis
        } catch(err) {}
1597 716c3ead Dimitris Moraitis
        try {
1598 716c3ead Dimitris Moraitis
                $("a#add-machines-overlay").overlay().close();
1599 716c3ead Dimitris Moraitis
        } catch(err) {}
1600 716c3ead Dimitris Moraitis
        try {
1601 716c3ead Dimitris Moraitis
                $("a#metadata-scrollable").overlay().close();
1602 82835e06 Christodoulos Psaltis
        } catch(err) {}
1603 d1e14e2c Mike Muzurakis
}
1604 a583aa29 Kostas Papadimitriou
1605 af6fc929 Kostas Papadimitriou
// logout
1606 af6fc929 Kostas Papadimitriou
function user_session_logout() {
1607 af6fc929 Kostas Papadimitriou
    $.cookie("X-Auth-Token", null);
1608 af6fc929 Kostas Papadimitriou
    location.reload();
1609 af6fc929 Kostas Papadimitriou
}
1610 af6fc929 Kostas Papadimitriou
1611 a583aa29 Kostas Papadimitriou
// action indicators
1612 a583aa29 Kostas Papadimitriou
function init_action_indicator_handlers(machines_view)
1613 a583aa29 Kostas Papadimitriou
{
1614 70eab221 Kostas Papadimitriou
    // init once for each view
1615 70eab221 Kostas Papadimitriou
    if (window.ACTION_ICON_HANDLERS == undefined)
1616 70eab221 Kostas Papadimitriou
    {
1617 70eab221 Kostas Papadimitriou
        window.ACTION_ICON_HANDLERS = {};
1618 70eab221 Kostas Papadimitriou
    }
1619 70eab221 Kostas Papadimitriou
1620 70eab221 Kostas Papadimitriou
    if (machines_view in window.ACTION_ICON_HANDLERS)
1621 70eab221 Kostas Papadimitriou
    {
1622 70eab221 Kostas Papadimitriou
        return;
1623 70eab221 Kostas Papadimitriou
    }
1624 70eab221 Kostas Papadimitriou
    window.ACTION_ICON_HANDLERS[machines_view] = 1;
1625 70eab221 Kostas Papadimitriou
    
1626 a583aa29 Kostas Papadimitriou
    if (machines_view == "list")
1627 a583aa29 Kostas Papadimitriou
    {   
1628 a583aa29 Kostas Papadimitriou
        // totally different logic for list view
1629 a583aa29 Kostas Papadimitriou
        init_action_indicator_list_handlers();
1630 a583aa29 Kostas Papadimitriou
        return;
1631 a583aa29 Kostas Papadimitriou
    }
1632 a583aa29 Kostas Papadimitriou
    
1633 cce434fc Kostas Papadimitriou
    function update_action_icon_indicators(force)
1634 cce434fc Kostas Papadimitriou
    {   
1635 cce434fc Kostas Papadimitriou
        function show(el, action) {
1636 cce434fc Kostas Papadimitriou
            $(".action-indicator", $(el)).attr("class", "action-indicator " + action);
1637 cce434fc Kostas Papadimitriou
            $(".action-indicator", $(el)).show();
1638 cce434fc Kostas Papadimitriou
        }
1639 cce434fc Kostas Papadimitriou
1640 cce434fc Kostas Papadimitriou
        function hide(el) {   
1641 cce434fc Kostas Papadimitriou
            $(".action-indicator", $(el)).hide();
1642 cce434fc Kostas Papadimitriou
        }
1643 cce434fc Kostas Papadimitriou
        
1644 cce434fc Kostas Papadimitriou
        function get_pending_actions(el) {
1645 cce434fc Kostas Papadimitriou
            return $(".confirm_single:visible", $(el));
1646 cce434fc Kostas Papadimitriou
        }
1647 cce434fc Kostas Papadimitriou
        
1648 cce434fc Kostas Papadimitriou
        function other_indicators(el) {
1649 cce434fc Kostas Papadimitriou
           return $("img.wave:visible, img.spinner:visible", $(el))
1650 cce434fc Kostas Papadimitriou
        }
1651 cce434fc Kostas Papadimitriou
        
1652 cce434fc Kostas Papadimitriou
        $("div.machine:visible, div.single-container").each(function(index, el){
1653 cce434fc Kostas Papadimitriou
            var el = $(el);
1654 cce434fc Kostas Papadimitriou
            var pending = get_pending_actions(el);
1655 cce434fc Kostas Papadimitriou
            var other = other_indicators(el);
1656 cce434fc Kostas Papadimitriou
            var action = undefined;
1657 cce434fc Kostas Papadimitriou
            var force_action = force;
1658 cce434fc Kostas Papadimitriou
            var visible = $(el).css("display") == "block";
1659 cce434fc Kostas Papadimitriou
1660 cce434fc Kostas Papadimitriou
            if (force_action !==undefined && force_action.el !== el[0]) {
1661 cce434fc Kostas Papadimitriou
                // force action for other vm
1662 cce434fc Kostas Papadimitriou
                // skipping force action
1663 cce434fc Kostas Papadimitriou
                force_action = undefined;
1664 cce434fc Kostas Papadimitriou
            }
1665 cce434fc Kostas Papadimitriou
             
1666 cce434fc Kostas Papadimitriou
            if (force_action !==undefined && force_action.el === el[0]) {
1667 cce434fc Kostas Papadimitriou
                action = force_action.action;
1668 cce434fc Kostas Papadimitriou
            }
1669 cce434fc Kostas Papadimitriou
1670 cce434fc Kostas Papadimitriou
            if (other.length >= 1) {
1671 cce434fc Kostas Papadimitriou
                return;
1672 cce434fc Kostas Papadimitriou
            }
1673 cce434fc Kostas Papadimitriou
1674 cce434fc Kostas Papadimitriou
            if (pending.length >= 1 && force_action === undefined) {      
1675 cce434fc Kostas Papadimitriou
                action = $(pending.parent()).attr("class").replace("action-container","");
1676 cce434fc Kostas Papadimitriou
            }
1677 cce434fc Kostas Papadimitriou
            
1678 cce434fc Kostas Papadimitriou
            if (action in {'console':''}) {
1679 cce434fc Kostas Papadimitriou
                return;
1680 cce434fc Kostas Papadimitriou
            }
1681 cce434fc Kostas Papadimitriou
            
1682 cce434fc Kostas Papadimitriou
            if (action !== undefined) {
1683 cce434fc Kostas Papadimitriou
                show(el, action);
1684 cce434fc Kostas Papadimitriou
            } else {
1685 cce434fc Kostas Papadimitriou
                try {   
1686 cce434fc Kostas Papadimitriou
                    if (el.attr('id') == pending_actions[0][1])
1687 cce434fc Kostas Papadimitriou
                    {
1688 cce434fc Kostas Papadimitriou
                        return;   
1689 cce434fc Kostas Papadimitriou
                    }
1690 cce434fc Kostas Papadimitriou
                } catch (err) {
1691 cce434fc Kostas Papadimitriou
                }
1692 cce434fc Kostas Papadimitriou
                hide(el);
1693 cce434fc Kostas Papadimitriou
            }
1694 cce434fc Kostas Papadimitriou
1695 cce434fc Kostas Papadimitriou
        });
1696 a583aa29 Kostas Papadimitriou
    }
1697 a583aa29 Kostas Papadimitriou
1698 a583aa29 Kostas Papadimitriou
    // action indicators
1699 cce434fc Kostas Papadimitriou
    $(".action-container").live('mouseover', function(evn) {
1700 cce434fc Kostas Papadimitriou
        force_action = {'el': $(evn.currentTarget).parent().parent()[0], 'action':$(evn.currentTarget).attr("class").replace("action-container","")};
1701 70eab221 Kostas Papadimitriou
        // single view case
1702 cce434fc Kostas Papadimitriou
        if ($(force_action.el).attr("class") == "upper")
1703 a583aa29 Kostas Papadimitriou
        {
1704 cce434fc Kostas Papadimitriou
            force_action.el = $(evn.currentTarget).parent().parent().parent()[0]
1705 cce434fc Kostas Papadimitriou
        };
1706 cce434fc Kostas Papadimitriou
        update_action_icon_indicators(force_action);
1707 a583aa29 Kostas Papadimitriou
    });
1708 a583aa29 Kostas Papadimitriou
1709 70eab221 Kostas Papadimitriou
    $("img.spinner, img.wave").live('hide', function(){
1710 70eab221 Kostas Papadimitriou
        update_action_icon_indicators();
1711 70eab221 Kostas Papadimitriou
    });
1712 cce434fc Kostas Papadimitriou
    // register events where icons should get updated
1713 cce434fc Kostas Papadimitriou
1714 a583aa29 Kostas Papadimitriou
    // hide action indicator image on mouse out, spinner appear, wave appear
1715 a583aa29 Kostas Papadimitriou
    $(".action-container").live("mouseout", function(evn){
1716 cce434fc Kostas Papadimitriou
        update_action_icon_indicators();
1717 cce434fc Kostas Papadimitriou
    });
1718 a583aa29 Kostas Papadimitriou
1719 cce434fc Kostas Papadimitriou
    $(".confirm_single").live("click", function(evn){
1720 cce434fc Kostas Papadimitriou
        update_action_icon_indicators();
1721 a583aa29 Kostas Papadimitriou
    });
1722 a583aa29 Kostas Papadimitriou
1723 a583aa29 Kostas Papadimitriou
    $("img.spinner, img.wave").live('show', function(){
1724 a583aa29 Kostas Papadimitriou
        $("div.action-indicator").hide();
1725 a583aa29 Kostas Papadimitriou
    });
1726 cce434fc Kostas Papadimitriou
1727 cce434fc Kostas Papadimitriou
    $(".confirm_single button.no").live('click', function(evn){
1728 cce434fc Kostas Papadimitriou
        $("div.action-indicator", $(evn.currentTarget).parent().parent()).hide();
1729 cce434fc Kostas Papadimitriou
    });
1730 cce434fc Kostas Papadimitriou
1731 cce434fc Kostas Papadimitriou
    $(".confirm_multiple button.no").click(function(){
1732 cce434fc Kostas Papadimitriou
        $("div.action-indicator").hide();
1733 cce434fc Kostas Papadimitriou
    });
1734 cce434fc Kostas Papadimitriou
1735 cce434fc Kostas Papadimitriou
    $(".confirm_multiple button.yes").click(function(){
1736 cce434fc Kostas Papadimitriou
        $("div.action-indicator").hide();
1737 cce434fc Kostas Papadimitriou
    });
1738 a583aa29 Kostas Papadimitriou
}
1739 a583aa29 Kostas Papadimitriou
1740 a583aa29 Kostas Papadimitriou
function init_action_indicator_list_handlers()
1741 a583aa29 Kostas Papadimitriou
{   
1742 a583aa29 Kostas Papadimitriou
    var skip_actions = { 'console':'','connect':'','details':'' };
1743 a583aa29 Kostas Papadimitriou
1744 a583aa29 Kostas Papadimitriou
    var has_pending_confirmation = function()
1745 a583aa29 Kostas Papadimitriou
    {
1746 a583aa29 Kostas Papadimitriou
        return $(".confirm_multiple:visible").length >= 1
1747 a583aa29 Kostas Papadimitriou
    }
1748 a583aa29 Kostas Papadimitriou
    
1749 a583aa29 Kostas Papadimitriou
    function update_action_indicator_icons(force_action, skip_pending)
1750 a583aa29 Kostas Papadimitriou
    {   
1751 a583aa29 Kostas Papadimitriou
        // pending action based on the element class
1752 a583aa29 Kostas Papadimitriou
        var pending_action = $(".selected", $(".actions"))[0];
1753 a583aa29 Kostas Papadimitriou
        var selected = get_list_view_selected_machine_rows();
1754 a583aa29 Kostas Papadimitriou
1755 a583aa29 Kostas Papadimitriou
        // reset previous state
1756 a583aa29 Kostas Papadimitriou
        list_view_hide_action_indicators();
1757 a583aa29 Kostas Papadimitriou
        
1758 a583aa29 Kostas Papadimitriou
        if (pending_action == undefined && !force_action)
1759 a583aa29 Kostas Papadimitriou
        {
1760 a583aa29 Kostas Papadimitriou
            // no action selected
1761 a583aa29 Kostas Papadimitriou
            return;
1762 a583aa29 Kostas Papadimitriou
        }
1763 a583aa29 Kostas Papadimitriou
        
1764 a583aa29 Kostas Papadimitriou
        if (force_action != undefined)
1765 a583aa29 Kostas Papadimitriou
        {
1766 a583aa29 Kostas Papadimitriou
            // user forced action choice
1767 a583aa29 Kostas Papadimitriou
            var action_class = force_action;
1768 a583aa29 Kostas Papadimitriou
        } else {
1769 a583aa29 Kostas Papadimitriou
            // retrieve action name (reboot, stop, etc..)
1770 a583aa29 Kostas Papadimitriou
            var action_class = $(pending_action).attr("id").replace("action-","");
1771 a583aa29 Kostas Papadimitriou
        }
1772 a583aa29 Kostas Papadimitriou
1773 a583aa29 Kostas Papadimitriou
        selected.each(function(index, el) {
1774 a583aa29 Kostas Papadimitriou
            if (has_pending_confirmation() && skip_pending)
1775 a583aa29 Kostas Papadimitriou
            {
1776 a583aa29 Kostas Papadimitriou
                return;
1777 a583aa29 Kostas Papadimitriou
            }
1778 a583aa29 Kostas Papadimitriou
            var el = $(el);
1779 a583aa29 Kostas Papadimitriou
            var logo = $("img.list-logo", el);
1780 a583aa29 Kostas Papadimitriou
            $(".action-indicator", el).remove();
1781 a583aa29 Kostas Papadimitriou
            var cls = "action-indicator " + action_class;
1782 a583aa29 Kostas Papadimitriou
            // add icon div
1783 a583aa29 Kostas Papadimitriou
            logo.after('<div class="' + cls + '"></div>');
1784 a583aa29 Kostas Papadimitriou
            // hide os logo
1785 a583aa29 Kostas Papadimitriou
            $("img.list-logo", el).hide();
1786 a583aa29 Kostas Papadimitriou
        });
1787 a583aa29 Kostas Papadimitriou
    }  
1788 a583aa29 Kostas Papadimitriou
    
1789 a583aa29 Kostas Papadimitriou
    // on mouseover we force the images to the hovered action
1790 a583aa29 Kostas Papadimitriou
    $(".actions a").live("mouseover", function(evn) {
1791 a583aa29 Kostas Papadimitriou
        var el = $(evn.currentTarget);
1792 a583aa29 Kostas Papadimitriou
        if (!el.hasClass("enabled"))
1793 a583aa29 Kostas Papadimitriou
        {   
1794 a583aa29 Kostas Papadimitriou
            return;
1795 a583aa29 Kostas Papadimitriou
        }
1796 a583aa29 Kostas Papadimitriou
        var action_class = el.attr("id").replace("action-","");
1797 a583aa29 Kostas Papadimitriou
        if (action_class in skip_actions)
1798 a583aa29 Kostas Papadimitriou
        {
1799 a583aa29 Kostas Papadimitriou
            return;
1800 a583aa29 Kostas Papadimitriou
        }
1801 a583aa29 Kostas Papadimitriou
        update_action_indicator_icons(action_class, false);
1802 a583aa29 Kostas Papadimitriou
    });
1803 a583aa29 Kostas Papadimitriou
    
1804 cce434fc Kostas Papadimitriou
1805 cce434fc Kostas Papadimitriou
    // register events where icons should get updated
1806 b35cda16 Kostas Papadimitriou
    $(".actions a.enabled").live("click", function(evn) {
1807 b35cda16 Kostas Papadimitriou
        // clear previous selections
1808 b35cda16 Kostas Papadimitriou
        $("a.selected").removeClass("selected");
1809 b35cda16 Kostas Papadimitriou
1810 a583aa29 Kostas Papadimitriou
        var el = $(evn.currentTarget);
1811 a583aa29 Kostas Papadimitriou
        el.addClass("selected");
1812 a583aa29 Kostas Papadimitriou
        update_action_indicator_icons(undefined, false);
1813 a583aa29 Kostas Papadimitriou
    });
1814 a583aa29 Kostas Papadimitriou
1815 a583aa29 Kostas Papadimitriou
    $(".actions a").live("mouseout", function(evn) {
1816 a583aa29 Kostas Papadimitriou
        update_action_indicator_icons(undefined, false);
1817 a583aa29 Kostas Papadimitriou
    });
1818 a583aa29 Kostas Papadimitriou
    
1819 a583aa29 Kostas Papadimitriou
    $(".confirm_multiple button.no").click(function(){
1820 a583aa29 Kostas Papadimitriou
        list_view_hide_action_indicators();
1821 a583aa29 Kostas Papadimitriou
    });
1822 a583aa29 Kostas Papadimitriou
1823 a583aa29 Kostas Papadimitriou
    $(".confirm_multiple button.yes").click(function(){
1824 a583aa29 Kostas Papadimitriou
        list_view_hide_action_indicators();
1825 a583aa29 Kostas Papadimitriou
    });
1826 a583aa29 Kostas Papadimitriou
    
1827 a583aa29 Kostas Papadimitriou
    $("input[type=checkbox]").live('change', function(){
1828 a583aa29 Kostas Papadimitriou
        // pending_actions will become empty on every checkbox click/change
1829 a583aa29 Kostas Papadimitriou
        // line 154 machines_list.html
1830 a583aa29 Kostas Papadimitriou
        pending_actions = [];
1831 a583aa29 Kostas Papadimitriou
        if (pending_actions.length == 0)
1832 a583aa29 Kostas Papadimitriou
        {
1833 a583aa29 Kostas Papadimitriou
            $(".confirm_multiple").hide();
1834 a583aa29 Kostas Papadimitriou
            $("a.selected").each(function(index, el){$(el).removeClass("selected")});        
1835 a583aa29 Kostas Papadimitriou
        }
1836 a583aa29 Kostas Papadimitriou
        update_action_indicator_icons(undefined, false);
1837 a583aa29 Kostas Papadimitriou
    });
1838 a583aa29 Kostas Papadimitriou
    
1839 a583aa29 Kostas Papadimitriou
}
1840 a583aa29 Kostas Papadimitriou
1841 a583aa29 Kostas Papadimitriou
function list_view_hide_action_indicators()
1842 a583aa29 Kostas Papadimitriou
{
1843 a583aa29 Kostas Papadimitriou
    $("tr td .action-indicator").remove();
1844 a583aa29 Kostas Papadimitriou
    $("tr td img.list-logo").show();
1845 a583aa29 Kostas Papadimitriou
}
1846 a583aa29 Kostas Papadimitriou
1847 a583aa29 Kostas Papadimitriou
function get_list_view_selected_machine_rows()
1848 a583aa29 Kostas Papadimitriou
{   
1849 a583aa29 Kostas Papadimitriou
    var table = $("table.list-machines");
1850 a583aa29 Kostas Papadimitriou
    var rows = $("tr:has(input[type=checkbox]:checked)",table);
1851 a583aa29 Kostas Papadimitriou
    return rows;
1852 a583aa29 Kostas Papadimitriou
}