Statistics
| Branch: | Tag: | Revision:

root / ui / static / synnefo.js @ f876dc2b

History | View | Annotate | Download (65.8 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 2ee4f989 Markos Gogoulos
    try {
1035 2ee4f989 Markos Gogoulos
        var serverIP = machine.addresses.values[0].values[0].addr;
1036 2ee4f989 Markos Gogoulos
    } catch(err) { var serverIP = 'undefined'; }
1037 f533f224 Vangelis Koukis
1038 b02144c8 Vangelis Koukis
    $.ajax({
1039 b02144c8 Vangelis Koukis
        url: API_URL + '/servers/' + serverID + '/action',
1040 b02144c8 Vangelis Koukis
        type: "POST",
1041 f533f224 Vangelis Koukis
        contentType: "application/json",
1042 b02144c8 Vangelis Koukis
        dataType: "json",
1043 b02144c8 Vangelis Koukis
        data: JSON.stringify(payload),
1044 b02144c8 Vangelis Koukis
        timeout: TIMEOUT,
1045 b02144c8 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
1046 aeed1f09 Mike Muzurakis
                    try {
1047 aeed1f09 Mike Muzurakis
                        display_failure(jqXHR.status, serverID, 'Console', jqXHR.responseText);
1048 aeed1f09 Mike Muzurakis
                    } catch(err) {
1049 b8110bae Mike Muzurakis
                        display_failure(0, serverID, 'Console', jqXHR.responseText);
1050 aeed1f09 Mike Muzurakis
                    }
1051 aeed1f09 Mike Muzurakis
                },
1052 b02144c8 Vangelis Koukis
        success: function(data, textStatus, jqXHR) {
1053 b02144c8 Vangelis Koukis
                    if ( jqXHR.status == '200') {
1054 f533f224 Vangelis Koukis
                        try {
1055 b02144c8 Vangelis Koukis
                            console.info('got_console ' + serverID);
1056 b02144c8 Vangelis Koukis
                        } catch(err) {}
1057 f533f224 Vangelis Koukis
                        // indicate that the action succeeded
1058 ddf929a7 Christodoulos Psaltis
                        // show_vnc_console(serverID, serverName, serverIP,
1059 ddf929a7 Christodoulos Psaltis
                        // data.console.host,data.console.port,data.console.password);
1060 ddf929a7 Christodoulos Psaltis
                        show_vnc_console(serverID, serverName, serverIP,
1061 ddf929a7 Christodoulos Psaltis
                                         data.console.host,data.console.port,data.console.password);
1062 f533f224 Vangelis Koukis
                        display_success(serverID);
1063 74175c17 Christodoulos Psaltis
                        // hide spinner
1064 74175c17 Christodoulos Psaltis
                        $('#' + serverID + ' .spinner').hide();
1065 f533f224 Vangelis Koukis
                        // continue with the rest of the servers
1066 74175c17 Christodoulos Psaltis
                        open_console(serverIDs);
1067 b02144c8 Vangelis Koukis
                    } else {
1068 b02144c8 Vangelis Koukis
                        ajax_error(jqXHR.status, serverID, 'Console', jqXHR.responseText);
1069 b02144c8 Vangelis Koukis
                    }
1070 b02144c8 Vangelis Koukis
                }
1071 b02144c8 Vangelis Koukis
    });
1072 b02144c8 Vangelis Koukis
    return false;
1073 b02144c8 Vangelis Koukis
}
1074 b02144c8 Vangelis Koukis
1075 fd70c1db Markos Gogoulos
// connect to machine action
1076 fd70c1db Markos Gogoulos
function machine_connect(serverIDs){
1077 fd70c1db Markos Gogoulos
    if (!serverIDs.length){
1078 fd70c1db Markos Gogoulos
        //ajax_success('DEFAULT');
1079 fd70c1db Markos Gogoulos
        return false;
1080 fd70c1db Markos Gogoulos
    }
1081 fd70c1db Markos Gogoulos
    var serverID = serverIDs.pop();
1082 fd70c1db Markos Gogoulos
1083 fd70c1db Markos Gogoulos
    var machine = get_machine(serverID);
1084 fd70c1db Markos Gogoulos
    var serverName = machine.name;
1085 2ee4f989 Markos Gogoulos
    try {
1086 2ee4f989 Markos Gogoulos
        var serverIP = machine.addresses.values[0].values[0].addr;
1087 2ee4f989 Markos Gogoulos
    } catch(err) { var serverIP = 'undefined'; }
1088 fd70c1db Markos Gogoulos
1089 afedad4d Markos Gogoulos
    try {
1090 afedad4d Markos Gogoulos
        var os = machine.metadata.values.OS;
1091 afedad4d Markos Gogoulos
    } catch(err) { var os = 'undefined'; }
1092 afedad4d Markos Gogoulos
1093 afedad4d Markos Gogoulos
    var params_url = '?ip_address=' + serverIP + '&os=' + os;
1094 fd70c1db Markos Gogoulos
1095 fd70c1db Markos Gogoulos
    window.open('machines/connect' + params_url);
1096 fd70c1db Markos Gogoulos
1097 fd70c1db Markos Gogoulos
    // Restore os icon in list view
1098 fd70c1db Markos Gogoulos
    osIcon = $('#'+serverID).parent().parent().find('.list-logo');
1099 fd70c1db Markos Gogoulos
    osIcon.attr('src',osIcon.attr('os'));
1100 fd70c1db Markos Gogoulos
1101 fd70c1db Markos Gogoulos
    return false;
1102 fd70c1db Markos Gogoulos
}
1103 fd70c1db Markos Gogoulos
1104 fd70c1db Markos Gogoulos
1105 f533f224 Vangelis Koukis
// rename server
1106 a70a9116 Mike Muzurakis
function rename(serverID, serverName){
1107 f533f224 Vangelis Koukis
    if (!serverID.length){
1108 f533f224 Vangelis Koukis
        //ajax_success('DEFAULT');
1109 f533f224 Vangelis Koukis
        return false;
1110 f533f224 Vangelis Koukis
    }
1111 0d4faeb8 Mike Muzurakis
    // ajax post rename call
1112 0d4faeb8 Mike Muzurakis
    var payload = {
1113 73715544 Christodoulos Psaltis
        "server": {"name": serverName}
1114 b02144c8 Vangelis Koukis
    };
1115 0d4faeb8 Mike Muzurakis
1116 0d4faeb8 Mike Muzurakis
    $.ajax({
1117 5b35631e Markos Gogoulos
        url: API_URL + '/servers/' + serverID,
1118 a70a9116 Mike Muzurakis
        type: "PUT",
1119 f533f224 Vangelis Koukis
        contentType: "application/json",
1120 0d4faeb8 Mike Muzurakis
        dataType: "json",
1121 0d4faeb8 Mike Muzurakis
        data: JSON.stringify(payload),
1122 0d4faeb8 Mike Muzurakis
        timeout: TIMEOUT,
1123 b02144c8 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
1124 aeed1f09 Mike Muzurakis
                    try {
1125 aeed1f09 Mike Muzurakis
                        display_failure(jqXHR.status, serverID, 'Rename', jqXHR.responseText);
1126 aeed1f09 Mike Muzurakis
                    } catch(err) {
1127 b8110bae Mike Muzurakis
                        display_failure(0, serverID, 'Rename', jqXHR.responseText);
1128 aeed1f09 Mike Muzurakis
                    }
1129 aeed1f09 Mike Muzurakis
                },
1130 0d4faeb8 Mike Muzurakis
        success: function(data, textStatus, jqXHR) {
1131 380c0520 Dimitris Moraitis
                    if ( jqXHR.status == '204' || jqXHR.status == '1223') {
1132 f533f224 Vangelis Koukis
                        try {
1133 0d4faeb8 Mike Muzurakis
                            console.info('renamed ' + serverID);
1134 0d4faeb8 Mike Muzurakis
                        } catch(err) {}
1135 f533f224 Vangelis Koukis
                        // indicate that the action succeeded
1136 f533f224 Vangelis Koukis
                        display_success(serverID);
1137 0d4faeb8 Mike Muzurakis
                    } else {
1138 0d4faeb8 Mike Muzurakis
                        ajax_error(jqXHR.status, serverID, 'Rename', jqXHR.responseText);
1139 0d4faeb8 Mike Muzurakis
                    }
1140 0d4faeb8 Mike Muzurakis
                }
1141 0d4faeb8 Mike Muzurakis
    });
1142 0d4faeb8 Mike Muzurakis
    return false;
1143 0d4faeb8 Mike Muzurakis
}
1144 0d4faeb8 Mike Muzurakis
1145 5186eb04 Christodoulos Psaltis
// get server metadata
1146 f533f224 Vangelis Koukis
function get_metadata(serverID, keys_only) {
1147 5186eb04 Christodoulos Psaltis
    $.ajax({
1148 5186eb04 Christodoulos Psaltis
        url: API_URL + '/servers/' + serverID + '/meta',
1149 d1e14e2c Mike Muzurakis
        cache: false,
1150 5186eb04 Christodoulos Psaltis
        type: "GET",
1151 5186eb04 Christodoulos Psaltis
        //async: false,
1152 5186eb04 Christodoulos Psaltis
        dataType: "json",
1153 5186eb04 Christodoulos Psaltis
        timeout: TIMEOUT,
1154 b02144c8 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
1155 5186eb04 Christodoulos Psaltis
            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, 'Get metadata', jqXHR.responseText);
1159 f533f224 Vangelis Koukis
            } catch (err) {
1160 f533f224 Vangelis Koukis
                ajax_error(err);
1161 f533f224 Vangelis Koukis
            }
1162 5186eb04 Christodoulos Psaltis
        },
1163 5186eb04 Christodoulos Psaltis
        success: function(data, textStatus, jqXHR) {
1164 1b3857ab Christodoulos Psaltis
            // to list the new results in the edit dialog
1165 f533f224 Vangelis Koukis
            if (keys_only) {
1166 f533f224 Vangelis Koukis
                list_metadata_keys(serverID, data.metadata.values);
1167 f533f224 Vangelis Koukis
            } else {
1168 f533f224 Vangelis Koukis
                list_metadata(data);
1169 f533f224 Vangelis Koukis
                list_metadata_keys(serverID, data.metadata.values);
1170 f533f224 Vangelis Koukis
            }
1171 f533f224 Vangelis Koukis
            //hide spinner
1172 f533f224 Vangelis Koukis
            $('#metadata-wizard .large-spinner').hide();
1173 5186eb04 Christodoulos Psaltis
        }
1174 5186eb04 Christodoulos Psaltis
    });
1175 5186eb04 Christodoulos Psaltis
    return false;
1176 5186eb04 Christodoulos Psaltis
}
1177 5186eb04 Christodoulos Psaltis
1178 1b3857ab Christodoulos Psaltis
// delete metadata key-value pair
1179 1b3857ab Christodoulos Psaltis
function delete_metadata(serverID, meta_key) {
1180 0943cc77 Markos Gogoulos
    $.ajax({
1181 0943cc77 Markos Gogoulos
        url: API_URL + '/servers/' + serverID + '/meta/' + meta_key,
1182 0943cc77 Markos Gogoulos
        type: "DELETE",
1183 0943cc77 Markos Gogoulos
        //async: false,
1184 0943cc77 Markos Gogoulos
        dataType: "json",
1185 0943cc77 Markos Gogoulos
        timeout: TIMEOUT,
1186 b02144c8 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
1187 0943cc77 Markos Gogoulos
            try {
1188 ddf929a7 Christodoulos Psaltis
                // close wizard and show error box
1189 ddf929a7 Christodoulos Psaltis
                $("a#metadata-scrollable").data('overlay').close();
1190 f533f224 Vangelis Koukis
                ajax_error(jqXHR.status, undefined, 'Delete metadata', jqXHR.responseText);
1191 f533f224 Vangelis Koukis
            } catch (err) {
1192 f533f224 Vangelis Koukis
                ajax_error(err);
1193 f533f224 Vangelis Koukis
            }
1194 0943cc77 Markos Gogoulos
        },
1195 0943cc77 Markos Gogoulos
        success: function(data, textStatus, jqXHR) {
1196 ddf929a7 Christodoulos Psaltis
                    // success: Do nothing, the UI is already updated
1197 0943cc77 Markos Gogoulos
        }
1198 0943cc77 Markos Gogoulos
    });
1199 0943cc77 Markos Gogoulos
    return false;
1200 0943cc77 Markos Gogoulos
}
1201 0943cc77 Markos Gogoulos
1202 1b3857ab Christodoulos Psaltis
// add metadata key-value pair
1203 f533f224 Vangelis Koukis
function update_metadata(serverID, meta_key, meta_value) {
1204 0c578a28 Markos Gogoulos
    var payload = {
1205 0c578a28 Markos Gogoulos
        "meta": {
1206 0c578a28 Markos Gogoulos
        }
1207 0c578a28 Markos Gogoulos
    };
1208 0c578a28 Markos Gogoulos
    payload["meta"][meta_key] = meta_value;
1209 0c578a28 Markos Gogoulos
1210 0c578a28 Markos Gogoulos
    $.ajax({
1211 0c578a28 Markos Gogoulos
        url: API_URL + '/servers/' + serverID + '/meta/' + meta_key,
1212 0c578a28 Markos Gogoulos
        type: "PUT",
1213 f533f224 Vangelis Koukis
        contentType: "application/json",
1214 f533f224 Vangelis Koukis
        dataType: "json",
1215 f533f224 Vangelis Koukis
        data: JSON.stringify(payload),
1216 f533f224 Vangelis Koukis
        timeout: TIMEOUT,
1217 f533f224 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
1218 f533f224 Vangelis Koukis
            try {
1219 ddf929a7 Christodoulos Psaltis
                // close wizard and show error box
1220 ddf929a7 Christodoulos Psaltis
                $("a#metadata-scrollable").data('overlay').close();
1221 f533f224 Vangelis Koukis
                ajax_error(jqXHR.status, undefined, 'add metadata', jqXHR.responseText);
1222 f533f224 Vangelis Koukis
            } catch (err) {
1223 f533f224 Vangelis Koukis
                ajax_error(err);
1224 f533f224 Vangelis Koukis
            }
1225 f533f224 Vangelis Koukis
        },
1226 f533f224 Vangelis Koukis
        success: function(data, textStatus, jqXHR) {
1227 f533f224 Vangelis Koukis
            // success: Update icons if meta key is OS
1228 f533f224 Vangelis Koukis
            if (meta_key == "OS") {
1229 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');
1230 7af53e78 Kostas Papadimitriou
                var machine = $("#machinesview-icon").find("div#" + serverID);
1231 7af53e78 Kostas Papadimitriou
                var os = os_icon_from_value(meta_value);
1232 7af53e78 Kostas Papadimitriou
                var state = $("#metadata-wizard div#on-off").text()
1233 7af53e78 Kostas Papadimitriou
                set_machine_os_image(machine, "icon", state, os);
1234 f533f224 Vangelis Koukis
            }
1235 f533f224 Vangelis Koukis
        }
1236 f533f224 Vangelis Koukis
    });
1237 f533f224 Vangelis Koukis
    return false;
1238 f533f224 Vangelis Koukis
}
1239 0506db29 Christodoulos Psaltis
1240 23ca3bc9 Christodoulos Psaltis
// get stats
1241 23ca3bc9 Christodoulos Psaltis
function get_server_stats(serverID) {
1242 23ca3bc9 Christodoulos Psaltis
    $.ajax({
1243 23ca3bc9 Christodoulos Psaltis
        url: API_URL + '/servers/' + serverID + '/stats',
1244 23ca3bc9 Christodoulos Psaltis
        cache: false,
1245 23ca3bc9 Christodoulos Psaltis
        type: "GET",
1246 23ca3bc9 Christodoulos Psaltis
        //async: false,
1247 23ca3bc9 Christodoulos Psaltis
        dataType: "json",
1248 23ca3bc9 Christodoulos Psaltis
        timeout: TIMEOUT,
1249 23ca3bc9 Christodoulos Psaltis
        error: function(jqXHR, textStatus, errorThrown) {
1250 bd80f212 Christodoulos Psaltis
                // report error as text inline
1251 bd80f212 Christodoulos Psaltis
                $('#' + serverID + ' img.busy').hide();
1252 bd80f212 Christodoulos Psaltis
                $('#' + serverID + ' div.stat-error').show();
1253 23ca3bc9 Christodoulos Psaltis
        },
1254 23ca3bc9 Christodoulos Psaltis
        success: function(data, textStatus, jqXHR) {
1255 23ca3bc9 Christodoulos Psaltis
            // in icon view
1256 23ca3bc9 Christodoulos Psaltis
            if ( $.cookie('view') == 0 ) {
1257 bd80f212 Christodoulos Psaltis
                $('#' + serverID + ' img.busy').removeClass('busy');
1258 23ca3bc9 Christodoulos Psaltis
                $('#' + serverID + ' img.cpu').attr("src", data.stats.cpuBar);
1259 23ca3bc9 Christodoulos Psaltis
                $('#' + serverID + ' img.net').attr("src", data.stats.netBar);
1260 23ca3bc9 Christodoulos Psaltis
            }
1261 23ca3bc9 Christodoulos Psaltis
            // in single view
1262 23ca3bc9 Christodoulos Psaltis
            else if ( $.cookie('view') == 2 ) {
1263 23ca3bc9 Christodoulos Psaltis
                $('#' + serverID + ' div.cpu-graph img.stats').attr("src", data.stats.cpuTimeSeries);
1264 23ca3bc9 Christodoulos Psaltis
                $('#' + serverID + ' div.net-graph img.stats').attr("src", data.stats.netTimeSeries);
1265 23ca3bc9 Christodoulos Psaltis
            }
1266 23ca3bc9 Christodoulos Psaltis
        }
1267 23ca3bc9 Christodoulos Psaltis
    });
1268 23ca3bc9 Christodoulos Psaltis
    return false;
1269 23ca3bc9 Christodoulos Psaltis
}
1270 f533f224 Vangelis Koukis
1271 f533f224 Vangelis Koukis
// create network
1272 f533f224 Vangelis Koukis
function create_network(networkName){
1273 f533f224 Vangelis Koukis
    // ajax post start call
1274 f533f224 Vangelis Koukis
    var payload = {
1275 f533f224 Vangelis Koukis
        "network": { "name": networkName }
1276 f533f224 Vangelis Koukis
    };
1277 f533f224 Vangelis Koukis
1278 f533f224 Vangelis Koukis
    $.ajax({
1279 f533f224 Vangelis Koukis
        url: API_URL + '/networks',
1280 f533f224 Vangelis Koukis
        type: "POST",
1281 f533f224 Vangelis Koukis
        contentType: "application/json",
1282 f533f224 Vangelis Koukis
        dataType: "json",
1283 f533f224 Vangelis Koukis
        data: JSON.stringify(payload),
1284 f533f224 Vangelis Koukis
        timeout: TIMEOUT,
1285 f533f224 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
1286 f533f224 Vangelis Koukis
            try {
1287 ddf929a7 Christodoulos Psaltis
                // close wizard and show error box
1288 ddf929a7 Christodoulos Psaltis
                $("a#networkscreate").overlay().close();
1289 f533f224 Vangelis Koukis
                ajax_error(jqXHR.status, undefined, 'Create network', jqXHR.responseText);
1290 f533f224 Vangelis Koukis
            } catch (err) {
1291 f533f224 Vangelis Koukis
                ajax_error(err);
1292 f533f224 Vangelis Koukis
            }
1293 f533f224 Vangelis Koukis
        },
1294 f533f224 Vangelis Koukis
        success: function(data, textStatus, jqXHR) {
1295 f533f224 Vangelis Koukis
            if ( jqXHR.status == '202') {
1296 f533f224 Vangelis Koukis
                try {
1297 f533f224 Vangelis Koukis
                    console.info('created network ' + networkName);
1298 f533f224 Vangelis Koukis
                } catch(err) {}
1299 a67bb993 Christodoulos Psaltis
                /*
1300 a67bb993 Christodoulos Psaltis
                On success of this call nothing happens.
1301 a67bb993 Christodoulos Psaltis
                When the UI gets the first update containing the created server,
1302 a67bb993 Christodoulos Psaltis
                the creation wizard is closed and the new network is inserted
1303 a67bb993 Christodoulos Psaltis
                to the DOM. This is done in update_networks_view()
1304 a67bb993 Christodoulos Psaltis
                */
1305 f533f224 Vangelis Koukis
            } else {
1306 ddf929a7 Christodoulos Psaltis
                // close wizard and show error box
1307 a67bb993 Christodoulos Psaltis
                $("a#networkscreate").overlay().close();
1308 f533f224 Vangelis Koukis
                ajax_error(jqXHR.status, undefined, 'Create network', jqXHR.responseText);
1309 f533f224 Vangelis Koukis
            }
1310 f533f224 Vangelis Koukis
        }
1311 f533f224 Vangelis Koukis
    });
1312 f533f224 Vangelis Koukis
    return false;
1313 f533f224 Vangelis Koukis
}
1314 f533f224 Vangelis Koukis
1315 f533f224 Vangelis Koukis
// rename network
1316 f533f224 Vangelis Koukis
function rename_network(networkID, networkName){
1317 f533f224 Vangelis Koukis
    if (!networkID.length){
1318 f533f224 Vangelis Koukis
        //ajax_success('DEFAULT');
1319 f533f224 Vangelis Koukis
        return false;
1320 f533f224 Vangelis Koukis
    }
1321 f533f224 Vangelis Koukis
    // prepare payload
1322 f533f224 Vangelis Koukis
    var payload = {
1323 f533f224 Vangelis Koukis
        "network": {"name": networkName}
1324 f533f224 Vangelis Koukis
    };
1325 f533f224 Vangelis Koukis
    // ajax call
1326 f533f224 Vangelis Koukis
    $.ajax({
1327 f533f224 Vangelis Koukis
        url: API_URL + '/networks/' + networkID,
1328 f533f224 Vangelis Koukis
        type: "PUT",
1329 f533f224 Vangelis Koukis
        contentType: "application/json",
1330 f533f224 Vangelis Koukis
        dataType: "json",
1331 f533f224 Vangelis Koukis
        data: JSON.stringify(payload),
1332 f533f224 Vangelis Koukis
        timeout: TIMEOUT,
1333 f533f224 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
1334 f533f224 Vangelis Koukis
            try {
1335 f533f224 Vangelis Koukis
                ajax_error(jqXHR.status, undefined, 'Rename network', jqXHR.responseText);
1336 f533f224 Vangelis Koukis
            } catch (err) {
1337 b8110bae Mike Muzurakis
                ajax_error(0, undefined, 'Rename network', jqXHR.responseText);
1338 f533f224 Vangelis Koukis
            }
1339 f533f224 Vangelis Koukis
        },
1340 f533f224 Vangelis Koukis
        success: function(data, textStatus, jqXHR) {
1341 f533f224 Vangelis Koukis
            if ( jqXHR.status == '204') {
1342 f533f224 Vangelis Koukis
                try {
1343 f533f224 Vangelis Koukis
                    console.info('renamed network' + networkID);
1344 f533f224 Vangelis Koukis
                } catch(err) {}
1345 f533f224 Vangelis Koukis
            } else {
1346 f533f224 Vangelis Koukis
                ajax_error(jqXHR.status, undefined, 'Rename network', jqXHR.responseText);
1347 f533f224 Vangelis Koukis
            }
1348 f533f224 Vangelis Koukis
        }
1349 f533f224 Vangelis Koukis
    });
1350 f533f224 Vangelis Koukis
    return false;
1351 f533f224 Vangelis Koukis
}
1352 f533f224 Vangelis Koukis
1353 f533f224 Vangelis Koukis
function delete_network(networkIDs){
1354 f533f224 Vangelis Koukis
    if (!networkIDs.length){
1355 f533f224 Vangelis Koukis
        //ajax_success('DEFAULT');
1356 f533f224 Vangelis Koukis
        return false;
1357 f533f224 Vangelis Koukis
    }
1358 f533f224 Vangelis Koukis
    // get a network
1359 f533f224 Vangelis Koukis
    var networkID = networkIDs.pop();
1360 f533f224 Vangelis Koukis
    // ajax post destroy call can have an empty request body
1361 f533f224 Vangelis Koukis
    var payload = {};
1362 f533f224 Vangelis Koukis
    // ajax call
1363 f533f224 Vangelis Koukis
    $.ajax({
1364 f533f224 Vangelis Koukis
        url: API_URL + '/networks/' + networkID,
1365 f533f224 Vangelis Koukis
        type: "DELETE",
1366 f533f224 Vangelis Koukis
        contentType: "application/json",
1367 f533f224 Vangelis Koukis
        dataType: "json",
1368 f533f224 Vangelis Koukis
        data: JSON.stringify(payload),
1369 f533f224 Vangelis Koukis
        timeout: TIMEOUT,
1370 f533f224 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
1371 f533f224 Vangelis Koukis
            try {
1372 2aab1d5e Christodoulos Psaltis
                display_net_failure(jqXHR.status, networkID, 'Delete', jqXHR.responseText);
1373 f533f224 Vangelis Koukis
            } catch (err) {
1374 2aab1d5e Christodoulos Psaltis
                display_net_failure(0, networkID, 'Delete', jqXHR.responseText);
1375 f533f224 Vangelis Koukis
            }
1376 f533f224 Vangelis Koukis
        },
1377 f533f224 Vangelis Koukis
        success: function(data, textStatus, jqXHR) {
1378 f533f224 Vangelis Koukis
            if ( jqXHR.status == '204') {
1379 f533f224 Vangelis Koukis
                try {
1380 f533f224 Vangelis Koukis
                    console.info('deleted network ' + networkID);
1381 f533f224 Vangelis Koukis
                } catch(err) {}
1382 f533f224 Vangelis Koukis
                // continue with the rest of the servers
1383 f533f224 Vangelis Koukis
                delete_network(networkIDs);
1384 f533f224 Vangelis Koukis
            } else {
1385 3a254f7c Christodoulos Psaltis
                try {
1386 2aab1d5e Christodoulos Psaltis
                    display_net_failure(jqXHR.status, networkID, 'Delete', jqXHR.responseText);
1387 3a254f7c Christodoulos Psaltis
                } catch (err) {
1388 2aab1d5e Christodoulos Psaltis
                    display_net_failure(0, networkID, 'Delete', jqXHR.responseText);
1389 3a254f7c Christodoulos Psaltis
                }
1390 f533f224 Vangelis Koukis
            }
1391 f533f224 Vangelis Koukis
        }
1392 f533f224 Vangelis Koukis
    });
1393 f533f224 Vangelis Koukis
    return false;
1394 f533f224 Vangelis Koukis
}
1395 f533f224 Vangelis Koukis
1396 f39b36a6 Christodoulos Psaltis
function add_server_to_network(networkID, serverIDs, serverNames, serverStates) {
1397 f533f224 Vangelis Koukis
    if (!serverIDs.length){
1398 be191315 Christodoulos Psaltis
        // close the overlay when all the calls are made
1399 be191315 Christodoulos Psaltis
        $("a#add-machines-overlay").overlay().close();
1400 f533f224 Vangelis Koukis
        return false;
1401 f533f224 Vangelis Koukis
    }
1402 f533f224 Vangelis Koukis
    // get a server
1403 f533f224 Vangelis Koukis
    var serverID = serverIDs.pop();
1404 82835e06 Christodoulos Psaltis
    var serverName = serverNames.pop();
1405 f39b36a6 Christodoulos Psaltis
    var serverState = serverStates.pop();
1406 f533f224 Vangelis Koukis
    // prepare payload
1407 f533f224 Vangelis Koukis
    var payload = {
1408 f533f224 Vangelis Koukis
            "add": { "serverRef": serverID }
1409 f533f224 Vangelis Koukis
        };
1410 f533f224 Vangelis Koukis
    // prepare ajax call
1411 f533f224 Vangelis Koukis
    $.ajax({
1412 f533f224 Vangelis Koukis
        url: API_URL + '/networks/' + networkID + '/action',
1413 f533f224 Vangelis Koukis
        type: "POST",
1414 f533f224 Vangelis Koukis
        contentType: "application/json",
1415 b02144c8 Vangelis Koukis
        dataType: "json",
1416 0c578a28 Markos Gogoulos
        data: JSON.stringify(payload),
1417 0c578a28 Markos Gogoulos
        timeout: TIMEOUT,
1418 b02144c8 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
1419 0c578a28 Markos Gogoulos
            try {
1420 ddf929a7 Christodoulos Psaltis
                // close wizard and show error box
1421 ddf929a7 Christodoulos Psaltis
                $("a#add-machines-overlay").data('overlay').close();
1422 f533f224 Vangelis Koukis
                ajax_error(jqXHR.status, undefined, 'Add server to network', jqXHR.responseText);
1423 f533f224 Vangelis Koukis
            } catch (err) {
1424 b8110bae Mike Muzurakis
                ajax_error(0, undefined, 'Add server to network', jqXHR.responseText);
1425 f533f224 Vangelis Koukis
            }
1426 0c578a28 Markos Gogoulos
        },
1427 0c578a28 Markos Gogoulos
        success: function(data, textStatus, jqXHR) {
1428 f533f224 Vangelis Koukis
            if ( jqXHR.status == '202') {
1429 f533f224 Vangelis Koukis
                try {
1430 f533f224 Vangelis Koukis
                    console.info('added server ' + serverID + ' to network ' + networkID);
1431 f533f224 Vangelis Koukis
                } catch(err) {}
1432 82835e06 Christodoulos Psaltis
                // toggle the reboot dialog
1433 f39b36a6 Christodoulos Psaltis
                display_reboot_dialog(networkID, serverID, serverName, serverState);
1434 f533f224 Vangelis Koukis
                // continue with the rest of the servers
1435 f39b36a6 Christodoulos Psaltis
                add_server_to_network(networkID, serverIDs, serverNames, serverStates);
1436 f533f224 Vangelis Koukis
            } else {
1437 ddf929a7 Christodoulos Psaltis
                // close wizard and show error box
1438 ddf929a7 Christodoulos Psaltis
                $("a#add-machines-overlay").data('overlay').close();
1439 f533f224 Vangelis Koukis
                ajax_error(jqXHR.status, undefined, 'Add server to network', jqXHR.responseText);
1440 f533f224 Vangelis Koukis
            }
1441 0c578a28 Markos Gogoulos
        }
1442 0c578a28 Markos Gogoulos
    });
1443 0c578a28 Markos Gogoulos
    return false;
1444 0c578a28 Markos Gogoulos
}
1445 0c578a28 Markos Gogoulos
1446 f39b36a6 Christodoulos Psaltis
function remove_server_from_network(networkIDs, serverIDs, serverNames, serverStates) {
1447 f533f224 Vangelis Koukis
    if (!networkIDs.length){
1448 f533f224 Vangelis Koukis
        //ajax_success('DEFAULT');
1449 f533f224 Vangelis Koukis
        return false;
1450 f533f224 Vangelis Koukis
    }
1451 f533f224 Vangelis Koukis
    // get a network and a server
1452 f533f224 Vangelis Koukis
    var networkID = networkIDs.pop();
1453 f533f224 Vangelis Koukis
    var serverID = serverIDs.pop();
1454 82835e06 Christodoulos Psaltis
    var serverName = serverNames.pop();
1455 f39b36a6 Christodoulos Psaltis
    var serverState = serverStates.pop();
1456 f533f224 Vangelis Koukis
    // prepare payload
1457 f533f224 Vangelis Koukis
    var payload = {
1458 f533f224 Vangelis Koukis
            "remove": { "serverRef": serverID }
1459 f533f224 Vangelis Koukis
        };
1460 f533f224 Vangelis Koukis
    // prepare ajax call
1461 f533f224 Vangelis Koukis
    $.ajax({
1462 f533f224 Vangelis Koukis
        url: API_URL + '/networks/' + networkID + '/action',
1463 f533f224 Vangelis Koukis
        type: "POST",
1464 f533f224 Vangelis Koukis
        contentType: "application/json",
1465 f533f224 Vangelis Koukis
        dataType: "json",
1466 f533f224 Vangelis Koukis
        data: JSON.stringify(payload),
1467 f533f224 Vangelis Koukis
        timeout: TIMEOUT,
1468 f533f224 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
1469 f533f224 Vangelis Koukis
            try {
1470 f533f224 Vangelis Koukis
                ajax_error(jqXHR.status, undefined, 'Remove server form network', jqXHR.responseText);
1471 f533f224 Vangelis Koukis
            } catch (err) {
1472 b8110bae Mike Muzurakis
                ajax_error(0, undefined, 'Remove server form network', jqXHR.responseText);
1473 f533f224 Vangelis Koukis
            }
1474 f533f224 Vangelis Koukis
        },
1475 f533f224 Vangelis Koukis
        success: function(data, textStatus, jqXHR) {
1476 f533f224 Vangelis Koukis
            if ( jqXHR.status == '202') {
1477 f533f224 Vangelis Koukis
                try {
1478 f533f224 Vangelis Koukis
                    console.info('deleted server ' + serverID + ' from network ' + networkID);
1479 f533f224 Vangelis Koukis
                } catch(err) {}
1480 82835e06 Christodoulos Psaltis
                // toggle the reboot dialog
1481 f39b36a6 Christodoulos Psaltis
                display_reboot_dialog(networkID, serverID, serverName, serverState);
1482 f533f224 Vangelis Koukis
                // continue with the rest of the servers
1483 f39b36a6 Christodoulos Psaltis
                remove_server_form_network(networkIDs, serverIDs, serverNames, serverStates);
1484 f533f224 Vangelis Koukis
            } else {
1485 f533f224 Vangelis Koukis
                ajax_error(jqXHR.status, undefined, 'Remove server form network', jqXHR.responseText);
1486 f533f224 Vangelis Koukis
            }
1487 f533f224 Vangelis Koukis
        }
1488 f533f224 Vangelis Koukis
    });
1489 f533f224 Vangelis Koukis
    return false;
1490 f533f224 Vangelis Koukis
}
1491 0c578a28 Markos Gogoulos
1492 6423ba92 Christodoulos Psaltis
function set_firewall(networkID, serverID, profile) {
1493 6423ba92 Christodoulos Psaltis
    if (!networkID.length || !serverID.length || !profile.length){
1494 6423ba92 Christodoulos Psaltis
        return false;
1495 6423ba92 Christodoulos Psaltis
    }
1496 6423ba92 Christodoulos Psaltis
    // prepare payload
1497 6423ba92 Christodoulos Psaltis
    var payload = {
1498 6423ba92 Christodoulos Psaltis
            "firewallProfile": { "profile": profile }
1499 6423ba92 Christodoulos Psaltis
        };
1500 6423ba92 Christodoulos Psaltis
    // prepare ajax call
1501 6423ba92 Christodoulos Psaltis
    $.ajax({
1502 6423ba92 Christodoulos Psaltis
        url: API_URL + '/servers/' + serverID + '/action',
1503 6423ba92 Christodoulos Psaltis
        type: "POST",
1504 6423ba92 Christodoulos Psaltis
        contentType: "application/json",
1505 6423ba92 Christodoulos Psaltis
        dataType: "json",
1506 6423ba92 Christodoulos Psaltis
        data: JSON.stringify(payload),
1507 6423ba92 Christodoulos Psaltis
        timeout: TIMEOUT,
1508 6423ba92 Christodoulos Psaltis
        error: function(jqXHR, textStatus, errorThrown) {
1509 6423ba92 Christodoulos Psaltis
            try {
1510 6423ba92 Christodoulos Psaltis
                ajax_error(jqXHR.status, undefined, 'Set firewall profile', jqXHR.responseText);
1511 6423ba92 Christodoulos Psaltis
            } catch (err) {
1512 6423ba92 Christodoulos Psaltis
                ajax_error(0, undefined, 'Set firewall profile', jqXHR.responseText);
1513 6423ba92 Christodoulos Psaltis
            }
1514 6423ba92 Christodoulos Psaltis
        },
1515 6423ba92 Christodoulos Psaltis
        success: function(data, textStatus, jqXHR) {
1516 6423ba92 Christodoulos Psaltis
            if ( jqXHR.status == '202') {
1517 6423ba92 Christodoulos Psaltis
                try {
1518 6423ba92 Christodoulos Psaltis
                    console.info('for server ' + serverID + ' set firewall profile to ' + profile);
1519 6423ba92 Christodoulos Psaltis
                } catch(err) {}
1520 372f6c81 Mike Muzurakis
                //remove progress gif and toggle the content
1521 d6872a51 Christodoulos Psaltis
                $('div#net-' + networkID + '-server-' + serverID + ' button.firewall-apply').html(VARIOUS["APPLY"]);
1522 d6872a51 Christodoulos Psaltis
                $('div#net-' + networkID + '-server-' + serverID + ' button.firewall-apply').attr("disabled", false);
1523 d6872a51 Christodoulos Psaltis
                $('div#net-' + networkID + '-server-' + serverID + ' div.firewall-header').click();
1524 6423ba92 Christodoulos Psaltis
                // toggle the reboot dialog
1525 d6872a51 Christodoulos Psaltis
                var serverName = $('div#net-' + networkID + '-server-' + serverID + ' div.machine-name-div span.name').text();
1526 d6872a51 Christodoulos Psaltis
                var serverState = $('div#net-' + networkID + '-server-' + serverID + ' img.logo').attr('src').split('-')[1];
1527 372f6c81 Mike Muzurakis
                serverState = serverState.split('.')[0];
1528 372f6c81 Mike Muzurakis
                display_reboot_dialog(networkID, serverID, serverName, serverState);
1529 6423ba92 Christodoulos Psaltis
            } else {
1530 6423ba92 Christodoulos Psaltis
                ajax_error(jqXHR.status, undefined, 'Set firewall profile', jqXHR.responseText);
1531 6423ba92 Christodoulos Psaltis
            }
1532 6423ba92 Christodoulos Psaltis
        }
1533 6423ba92 Christodoulos Psaltis
    });
1534 6423ba92 Christodoulos Psaltis
    return false;
1535 6423ba92 Christodoulos Psaltis
}
1536 6423ba92 Christodoulos Psaltis
1537 6902f72e clopy
// show the welcome screen
1538 6902f72e clopy
function showWelcome() {
1539 f5ebca32 Mike Muzurakis
    $("#view-select").fadeOut("fast");
1540 f5ebca32 Mike Muzurakis
    $("#emptymachineslist").fadeIn("fast");
1541 f0215d6b Mike Muzurakis
    $("#machinesview").hide();
1542 6902f72e clopy
}
1543 6902f72e clopy
1544 6902f72e clopy
// hide the welcome screen
1545 6902f72e clopy
function hideWelcome() {
1546 6902f72e clopy
    $("#emptymachineslist").fadeOut("fast");
1547 6902f72e clopy
    $("#view-select").fadeIn("fast");
1548 ce4f9227 Mike Muzurakis
    $("div#view-select").show();
1549 f0215d6b Mike Muzurakis
    $("#machinesview").show();
1550 f533f224 Vangelis Koukis
}
1551 f533f224 Vangelis Koukis
1552 f533f224 Vangelis Koukis
function log_server_status_change(server_entry, new_status) {
1553 f533f224 Vangelis Koukis
    // firebug console logging
1554 f533f224 Vangelis Koukis
    try {
1555 09828cb5 Mike Muzurakis
        if ($("#machinesview-single").length > 0) {
1556 09828cb5 Mike Muzurakis
            console.info(server_entry.find("div.machine-details div.name").text() +
1557 09828cb5 Mike Muzurakis
                        ' from ' + server_entry.find(".state-label").text() +
1558 09828cb5 Mike Muzurakis
                        ' to ' + STATUSES[new_status]);
1559 09828cb5 Mike Muzurakis
        } else {
1560 09828cb5 Mike Muzurakis
            console.info(server_entry.find("div.name span.name").text() +
1561 09828cb5 Mike Muzurakis
                        ' from ' + server_entry.find(".status").text() +
1562 09828cb5 Mike Muzurakis
                        ' to ' + STATUSES[new_status]);
1563 09828cb5 Mike Muzurakis
        }
1564 f533f224 Vangelis Koukis
    } catch(err) {}
1565 f533f224 Vangelis Koukis
}
1566 f533f224 Vangelis Koukis
1567 f533f224 Vangelis Koukis
function get_flavor_params(flavorRef) {
1568 f533f224 Vangelis Koukis
    var cpus, ram, disk;
1569 f533f224 Vangelis Koukis
    if ( flavors.length > 0 ) {
1570 f533f224 Vangelis Koukis
        var current_flavor = '';
1571 f533f224 Vangelis Koukis
        for (i=0; i<flavors.length; i++) {
1572 f533f224 Vangelis Koukis
            if (flavors[i]['id'] == flavorRef) {
1573 f533f224 Vangelis Koukis
                current_flavor = flavors[i];
1574 f533f224 Vangelis Koukis
            }
1575 f533f224 Vangelis Koukis
        }
1576 f533f224 Vangelis Koukis
        cpus = current_flavor['cpu'];
1577 f533f224 Vangelis Koukis
        ram = current_flavor['ram'];
1578 f533f224 Vangelis Koukis
        disk = current_flavor['disk'];
1579 f533f224 Vangelis Koukis
    } else {
1580 f533f224 Vangelis Koukis
        cpus = 'undefined';
1581 f533f224 Vangelis Koukis
        ram = 'undefined';
1582 f533f224 Vangelis Koukis
        disk = 'undefined';
1583 f533f224 Vangelis Koukis
    }
1584 f533f224 Vangelis Koukis
    return {'cpus': cpus, 'ram': ram, 'disk': disk};
1585 f533f224 Vangelis Koukis
}
1586 f533f224 Vangelis Koukis
1587 f533f224 Vangelis Koukis
function get_image_params(imageRef) {
1588 f533f224 Vangelis Koukis
    var image_name, image_size;
1589 f533f224 Vangelis Koukis
    if ( images.length > 0 ) {
1590 f533f224 Vangelis Koukis
        var current_image = '';
1591 f533f224 Vangelis Koukis
        for (i=0; i<images.length; i++) {
1592 f533f224 Vangelis Koukis
            if (images[i]['id'] == imageRef) {
1593 f533f224 Vangelis Koukis
                current_image = images[i];
1594 f533f224 Vangelis Koukis
            }
1595 f533f224 Vangelis Koukis
        }
1596 7ffea202 Dimitris Moraitis
        try {
1597 7ffea202 Dimitris Moraitis
            image_name = current_image['name'];
1598 7ffea202 Dimitris Moraitis
        } catch(err) { image_name = 'undefined'; }
1599 7ffea202 Dimitris Moraitis
        try{
1600 7ffea202 Dimitris Moraitis
            image_size = current_image['metadata']['values']['size'];
1601 7ffea202 Dimitris Moraitis
        } catch(err) { image_size = 'undefined'; }
1602 f533f224 Vangelis Koukis
    } else {
1603 f533f224 Vangelis Koukis
        image_name = 'undefined';
1604 f533f224 Vangelis Koukis
        image_size = 'undefined';
1605 f533f224 Vangelis Koukis
    }
1606 f533f224 Vangelis Koukis
    return {'name': image_name,'size': image_size};
1607 f533f224 Vangelis Koukis
}
1608 f533f224 Vangelis Koukis
1609 f533f224 Vangelis Koukis
function get_public_ips(server) {
1610 f533f224 Vangelis Koukis
    var ip4, ip6;
1611 f533f224 Vangelis Koukis
    try {
1612 f533f224 Vangelis Koukis
        if (server.addresses.values) {
1613 f533f224 Vangelis Koukis
            $.each (server.addresses.values, function(i, value) {
1614 f533f224 Vangelis Koukis
                if (value.id == 'public') {
1615 f533f224 Vangelis Koukis
                    try {
1616 f533f224 Vangelis Koukis
                        $.each (value.values, function(i, ip) {
1617 f533f224 Vangelis Koukis
                            if (ip.version == '4') {
1618 f533f224 Vangelis Koukis
                                ip4 = ip.addr;
1619 f533f224 Vangelis Koukis
                            } else if (ip.version == '6') {
1620 f533f224 Vangelis Koukis
                                ip6 = ip.addr;
1621 f533f224 Vangelis Koukis
                            } else {
1622 f533f224 Vangelis Koukis
                                ip4 = 'undefined';
1623 f533f224 Vangelis Koukis
                                ip6 = 'undefined';
1624 f533f224 Vangelis Koukis
                            }
1625 f533f224 Vangelis Koukis
                        });
1626 f533f224 Vangelis Koukis
                    } catch (err){
1627 f533f224 Vangelis Koukis
                        try{console.info('Server ' + server.id + ' has invalid ips')}catch(err){};
1628 f533f224 Vangelis Koukis
                        ip4 = 'undefined';
1629 f533f224 Vangelis Koukis
                        ip6 = 'undefined';
1630 f533f224 Vangelis Koukis
                    }
1631 f533f224 Vangelis Koukis
                }
1632 f533f224 Vangelis Koukis
            });
1633 f533f224 Vangelis Koukis
        }
1634 f533f224 Vangelis Koukis
    } catch (err) {
1635 f533f224 Vangelis Koukis
        try{console.info('Server ' + server.id + ' has no network addresses')}catch(err){};
1636 f533f224 Vangelis Koukis
        ip4 = 'undefined';
1637 f533f224 Vangelis Koukis
        ip6 = 'undefined';
1638 f533f224 Vangelis Koukis
    }
1639 f533f224 Vangelis Koukis
    return {'ip4': ip4, 'ip6': ip6};
1640 6902f72e clopy
}
1641 6902f72e clopy
1642 f533f224 Vangelis Koukis
function get_private_ips(server) {
1643 f533f224 Vangelis Koukis
1644 f533f224 Vangelis Koukis
}
1645 716c3ead Dimitris Moraitis
1646 716c3ead Dimitris Moraitis
function close_all_overlays() {
1647 716c3ead Dimitris Moraitis
        try {
1648 716c3ead Dimitris Moraitis
                $("a#networkscreate").overlay().close();
1649 716c3ead Dimitris Moraitis
        } catch(err) {}
1650 716c3ead Dimitris Moraitis
        try {
1651 716c3ead Dimitris Moraitis
                $('a#create').overlay().close();
1652 716c3ead Dimitris Moraitis
        } catch(err) {}
1653 716c3ead Dimitris Moraitis
        try {
1654 716c3ead Dimitris Moraitis
                $("a#add-machines-overlay").overlay().close();
1655 716c3ead Dimitris Moraitis
        } catch(err) {}
1656 716c3ead Dimitris Moraitis
        try {
1657 716c3ead Dimitris Moraitis
                $("a#metadata-scrollable").overlay().close();
1658 82835e06 Christodoulos Psaltis
        } catch(err) {}
1659 d1e14e2c Mike Muzurakis
}
1660 a583aa29 Kostas Papadimitriou
1661 af6fc929 Kostas Papadimitriou
// logout
1662 af6fc929 Kostas Papadimitriou
function user_session_logout() {
1663 af6fc929 Kostas Papadimitriou
    $.cookie("X-Auth-Token", null);
1664 af6fc929 Kostas Papadimitriou
    location.reload();
1665 af6fc929 Kostas Papadimitriou
}
1666 af6fc929 Kostas Papadimitriou
1667 a583aa29 Kostas Papadimitriou
// action indicators
1668 a583aa29 Kostas Papadimitriou
function init_action_indicator_handlers(machines_view)
1669 a583aa29 Kostas Papadimitriou
{
1670 70eab221 Kostas Papadimitriou
    // init once for each view
1671 70eab221 Kostas Papadimitriou
    if (window.ACTION_ICON_HANDLERS == undefined)
1672 70eab221 Kostas Papadimitriou
    {
1673 70eab221 Kostas Papadimitriou
        window.ACTION_ICON_HANDLERS = {};
1674 70eab221 Kostas Papadimitriou
    }
1675 70eab221 Kostas Papadimitriou
1676 70eab221 Kostas Papadimitriou
    if (machines_view in window.ACTION_ICON_HANDLERS)
1677 70eab221 Kostas Papadimitriou
    {
1678 70eab221 Kostas Papadimitriou
        return;
1679 70eab221 Kostas Papadimitriou
    }
1680 70eab221 Kostas Papadimitriou
    window.ACTION_ICON_HANDLERS[machines_view] = 1;
1681 23ca3bc9 Christodoulos Psaltis
1682 a583aa29 Kostas Papadimitriou
    if (machines_view == "list")
1683 23ca3bc9 Christodoulos Psaltis
    {
1684 a583aa29 Kostas Papadimitriou
        // totally different logic for list view
1685 a583aa29 Kostas Papadimitriou
        init_action_indicator_list_handlers();
1686 a583aa29 Kostas Papadimitriou
        return;
1687 a583aa29 Kostas Papadimitriou
    }
1688 23ca3bc9 Christodoulos Psaltis
1689 cce434fc Kostas Papadimitriou
    function update_action_icon_indicators(force)
1690 23ca3bc9 Christodoulos Psaltis
    {
1691 cce434fc Kostas Papadimitriou
        function show(el, action) {
1692 cce434fc Kostas Papadimitriou
            $(".action-indicator", $(el)).attr("class", "action-indicator " + action);
1693 cce434fc Kostas Papadimitriou
            $(".action-indicator", $(el)).show();
1694 cce434fc Kostas Papadimitriou
        }
1695 cce434fc Kostas Papadimitriou
1696 23ca3bc9 Christodoulos Psaltis
        function hide(el) {
1697 cce434fc Kostas Papadimitriou
            $(".action-indicator", $(el)).hide();
1698 cce434fc Kostas Papadimitriou
        }
1699 23ca3bc9 Christodoulos Psaltis
1700 cce434fc Kostas Papadimitriou
        function get_pending_actions(el) {
1701 cce434fc Kostas Papadimitriou
            return $(".confirm_single:visible", $(el));
1702 cce434fc Kostas Papadimitriou
        }
1703 23ca3bc9 Christodoulos Psaltis
1704 cce434fc Kostas Papadimitriou
        function other_indicators(el) {
1705 cce434fc Kostas Papadimitriou
           return $("img.wave:visible, img.spinner:visible", $(el))
1706 cce434fc Kostas Papadimitriou
        }
1707 23ca3bc9 Christodoulos Psaltis
1708 cce434fc Kostas Papadimitriou
        $("div.machine:visible, div.single-container").each(function(index, el){
1709 cce434fc Kostas Papadimitriou
            var el = $(el);
1710 cce434fc Kostas Papadimitriou
            var pending = get_pending_actions(el);
1711 cce434fc Kostas Papadimitriou
            var other = other_indicators(el);
1712 cce434fc Kostas Papadimitriou
            var action = undefined;
1713 cce434fc Kostas Papadimitriou
            var force_action = force;
1714 cce434fc Kostas Papadimitriou
            var visible = $(el).css("display") == "block";
1715 cce434fc Kostas Papadimitriou
1716 cce434fc Kostas Papadimitriou
            if (force_action !==undefined && force_action.el !== el[0]) {
1717 cce434fc Kostas Papadimitriou
                // force action for other vm
1718 cce434fc Kostas Papadimitriou
                // skipping force action
1719 cce434fc Kostas Papadimitriou
                force_action = undefined;
1720 cce434fc Kostas Papadimitriou
            }
1721 23ca3bc9 Christodoulos Psaltis
1722 cce434fc Kostas Papadimitriou
            if (force_action !==undefined && force_action.el === el[0]) {
1723 cce434fc Kostas Papadimitriou
                action = force_action.action;
1724 cce434fc Kostas Papadimitriou
            }
1725 cce434fc Kostas Papadimitriou
1726 cce434fc Kostas Papadimitriou
            if (other.length >= 1) {
1727 cce434fc Kostas Papadimitriou
                return;
1728 cce434fc Kostas Papadimitriou
            }
1729 cce434fc Kostas Papadimitriou
1730 23ca3bc9 Christodoulos Psaltis
            if (pending.length >= 1 && force_action === undefined) {
1731 cce434fc Kostas Papadimitriou
                action = $(pending.parent()).attr("class").replace("action-container","");
1732 cce434fc Kostas Papadimitriou
            }
1733 23ca3bc9 Christodoulos Psaltis
1734 cce434fc Kostas Papadimitriou
            if (action in {'console':''}) {
1735 cce434fc Kostas Papadimitriou
                return;
1736 cce434fc Kostas Papadimitriou
            }
1737 23ca3bc9 Christodoulos Psaltis
1738 cce434fc Kostas Papadimitriou
            if (action !== undefined) {
1739 cce434fc Kostas Papadimitriou
                show(el, action);
1740 cce434fc Kostas Papadimitriou
            } else {
1741 23ca3bc9 Christodoulos Psaltis
                try {
1742 cce434fc Kostas Papadimitriou
                    if (el.attr('id') == pending_actions[0][1])
1743 cce434fc Kostas Papadimitriou
                    {
1744 23ca3bc9 Christodoulos Psaltis
                        return;
1745 cce434fc Kostas Papadimitriou
                    }
1746 cce434fc Kostas Papadimitriou
                } catch (err) {
1747 cce434fc Kostas Papadimitriou
                }
1748 cce434fc Kostas Papadimitriou
                hide(el);
1749 cce434fc Kostas Papadimitriou
            }
1750 cce434fc Kostas Papadimitriou
1751 cce434fc Kostas Papadimitriou
        });
1752 a583aa29 Kostas Papadimitriou
    }
1753 a583aa29 Kostas Papadimitriou
1754 a583aa29 Kostas Papadimitriou
    // action indicators
1755 cce434fc Kostas Papadimitriou
    $(".action-container").live('mouseover', function(evn) {
1756 cce434fc Kostas Papadimitriou
        force_action = {'el': $(evn.currentTarget).parent().parent()[0], 'action':$(evn.currentTarget).attr("class").replace("action-container","")};
1757 70eab221 Kostas Papadimitriou
        // single view case
1758 cce434fc Kostas Papadimitriou
        if ($(force_action.el).attr("class") == "upper")
1759 a583aa29 Kostas Papadimitriou
        {
1760 cce434fc Kostas Papadimitriou
            force_action.el = $(evn.currentTarget).parent().parent().parent()[0]
1761 cce434fc Kostas Papadimitriou
        };
1762 cce434fc Kostas Papadimitriou
        update_action_icon_indicators(force_action);
1763 a583aa29 Kostas Papadimitriou
    });
1764 a583aa29 Kostas Papadimitriou
1765 70eab221 Kostas Papadimitriou
    $("img.spinner, img.wave").live('hide', function(){
1766 70eab221 Kostas Papadimitriou
        update_action_icon_indicators();
1767 70eab221 Kostas Papadimitriou
    });
1768 cce434fc Kostas Papadimitriou
    // register events where icons should get updated
1769 cce434fc Kostas Papadimitriou
1770 a583aa29 Kostas Papadimitriou
    // hide action indicator image on mouse out, spinner appear, wave appear
1771 a583aa29 Kostas Papadimitriou
    $(".action-container").live("mouseout", function(evn){
1772 cce434fc Kostas Papadimitriou
        update_action_icon_indicators();
1773 cce434fc Kostas Papadimitriou
    });
1774 a583aa29 Kostas Papadimitriou
1775 cce434fc Kostas Papadimitriou
    $(".confirm_single").live("click", function(evn){
1776 cce434fc Kostas Papadimitriou
        update_action_icon_indicators();
1777 a583aa29 Kostas Papadimitriou
    });
1778 a583aa29 Kostas Papadimitriou
1779 a583aa29 Kostas Papadimitriou
    $("img.spinner, img.wave").live('show', function(){
1780 a583aa29 Kostas Papadimitriou
        $("div.action-indicator").hide();
1781 a583aa29 Kostas Papadimitriou
    });
1782 cce434fc Kostas Papadimitriou
1783 cce434fc Kostas Papadimitriou
    $(".confirm_single button.no").live('click', function(evn){
1784 cce434fc Kostas Papadimitriou
        $("div.action-indicator", $(evn.currentTarget).parent().parent()).hide();
1785 cce434fc Kostas Papadimitriou
    });
1786 cce434fc Kostas Papadimitriou
1787 cce434fc Kostas Papadimitriou
    $(".confirm_multiple button.no").click(function(){
1788 cce434fc Kostas Papadimitriou
        $("div.action-indicator").hide();
1789 cce434fc Kostas Papadimitriou
    });
1790 cce434fc Kostas Papadimitriou
1791 cce434fc Kostas Papadimitriou
    $(".confirm_multiple button.yes").click(function(){
1792 cce434fc Kostas Papadimitriou
        $("div.action-indicator").hide();
1793 cce434fc Kostas Papadimitriou
    });
1794 a583aa29 Kostas Papadimitriou
}
1795 a583aa29 Kostas Papadimitriou
1796 a583aa29 Kostas Papadimitriou
function init_action_indicator_list_handlers()
1797 23ca3bc9 Christodoulos Psaltis
{
1798 a583aa29 Kostas Papadimitriou
    var skip_actions = { 'console':'','connect':'','details':'' };
1799 a583aa29 Kostas Papadimitriou
1800 a583aa29 Kostas Papadimitriou
    var has_pending_confirmation = function()
1801 a583aa29 Kostas Papadimitriou
    {
1802 a583aa29 Kostas Papadimitriou
        return $(".confirm_multiple:visible").length >= 1
1803 a583aa29 Kostas Papadimitriou
    }
1804 23ca3bc9 Christodoulos Psaltis
1805 a583aa29 Kostas Papadimitriou
    function update_action_indicator_icons(force_action, skip_pending)
1806 23ca3bc9 Christodoulos Psaltis
    {
1807 a583aa29 Kostas Papadimitriou
        // pending action based on the element class
1808 a583aa29 Kostas Papadimitriou
        var pending_action = $(".selected", $(".actions"))[0];
1809 a583aa29 Kostas Papadimitriou
        var selected = get_list_view_selected_machine_rows();
1810 a583aa29 Kostas Papadimitriou
1811 a583aa29 Kostas Papadimitriou
        // reset previous state
1812 a583aa29 Kostas Papadimitriou
        list_view_hide_action_indicators();
1813 23ca3bc9 Christodoulos Psaltis
1814 a583aa29 Kostas Papadimitriou
        if (pending_action == undefined && !force_action)
1815 a583aa29 Kostas Papadimitriou
        {
1816 a583aa29 Kostas Papadimitriou
            // no action selected
1817 a583aa29 Kostas Papadimitriou
            return;
1818 a583aa29 Kostas Papadimitriou
        }
1819 23ca3bc9 Christodoulos Psaltis
1820 a583aa29 Kostas Papadimitriou
        if (force_action != undefined)
1821 a583aa29 Kostas Papadimitriou
        {
1822 a583aa29 Kostas Papadimitriou
            // user forced action choice
1823 a583aa29 Kostas Papadimitriou
            var action_class = force_action;
1824 a583aa29 Kostas Papadimitriou
        } else {
1825 a583aa29 Kostas Papadimitriou
            // retrieve action name (reboot, stop, etc..)
1826 a583aa29 Kostas Papadimitriou
            var action_class = $(pending_action).attr("id").replace("action-","");
1827 a583aa29 Kostas Papadimitriou
        }
1828 a583aa29 Kostas Papadimitriou
1829 a583aa29 Kostas Papadimitriou
        selected.each(function(index, el) {
1830 a583aa29 Kostas Papadimitriou
            if (has_pending_confirmation() && skip_pending)
1831 a583aa29 Kostas Papadimitriou
            {
1832 a583aa29 Kostas Papadimitriou
                return;
1833 a583aa29 Kostas Papadimitriou
            }
1834 a583aa29 Kostas Papadimitriou
            var el = $(el);
1835 a583aa29 Kostas Papadimitriou
            var logo = $("img.list-logo", el);
1836 a583aa29 Kostas Papadimitriou
            $(".action-indicator", el).remove();
1837 a583aa29 Kostas Papadimitriou
            var cls = "action-indicator " + action_class;
1838 a583aa29 Kostas Papadimitriou
            // add icon div
1839 a583aa29 Kostas Papadimitriou
            logo.after('<div class="' + cls + '"></div>');
1840 a583aa29 Kostas Papadimitriou
            // hide os logo
1841 a583aa29 Kostas Papadimitriou
            $("img.list-logo", el).hide();
1842 a583aa29 Kostas Papadimitriou
        });
1843 23ca3bc9 Christodoulos Psaltis
    }
1844 23ca3bc9 Christodoulos Psaltis
1845 a583aa29 Kostas Papadimitriou
    // on mouseover we force the images to the hovered action
1846 a583aa29 Kostas Papadimitriou
    $(".actions a").live("mouseover", function(evn) {
1847 a583aa29 Kostas Papadimitriou
        var el = $(evn.currentTarget);
1848 a583aa29 Kostas Papadimitriou
        if (!el.hasClass("enabled"))
1849 23ca3bc9 Christodoulos Psaltis
        {
1850 a583aa29 Kostas Papadimitriou
            return;
1851 a583aa29 Kostas Papadimitriou
        }
1852 a583aa29 Kostas Papadimitriou
        var action_class = el.attr("id").replace("action-","");
1853 a583aa29 Kostas Papadimitriou
        if (action_class in skip_actions)
1854 a583aa29 Kostas Papadimitriou
        {
1855 a583aa29 Kostas Papadimitriou
            return;
1856 a583aa29 Kostas Papadimitriou
        }
1857 a583aa29 Kostas Papadimitriou
        update_action_indicator_icons(action_class, false);
1858 a583aa29 Kostas Papadimitriou
    });
1859 23ca3bc9 Christodoulos Psaltis
1860 cce434fc Kostas Papadimitriou
1861 cce434fc Kostas Papadimitriou
    // register events where icons should get updated
1862 b35cda16 Kostas Papadimitriou
    $(".actions a.enabled").live("click", function(evn) {
1863 b35cda16 Kostas Papadimitriou
        // clear previous selections
1864 b35cda16 Kostas Papadimitriou
        $("a.selected").removeClass("selected");
1865 b35cda16 Kostas Papadimitriou
1866 a583aa29 Kostas Papadimitriou
        var el = $(evn.currentTarget);
1867 a583aa29 Kostas Papadimitriou
        el.addClass("selected");
1868 a583aa29 Kostas Papadimitriou
        update_action_indicator_icons(undefined, false);
1869 a583aa29 Kostas Papadimitriou
    });
1870 a583aa29 Kostas Papadimitriou
1871 a583aa29 Kostas Papadimitriou
    $(".actions a").live("mouseout", function(evn) {
1872 a583aa29 Kostas Papadimitriou
        update_action_indicator_icons(undefined, false);
1873 a583aa29 Kostas Papadimitriou
    });
1874 23ca3bc9 Christodoulos Psaltis
1875 a583aa29 Kostas Papadimitriou
    $(".confirm_multiple button.no").click(function(){
1876 a583aa29 Kostas Papadimitriou
        list_view_hide_action_indicators();
1877 a583aa29 Kostas Papadimitriou
    });
1878 a583aa29 Kostas Papadimitriou
1879 a583aa29 Kostas Papadimitriou
    $(".confirm_multiple button.yes").click(function(){
1880 a583aa29 Kostas Papadimitriou
        list_view_hide_action_indicators();
1881 a583aa29 Kostas Papadimitriou
    });
1882 23ca3bc9 Christodoulos Psaltis
1883 a583aa29 Kostas Papadimitriou
    $("input[type=checkbox]").live('change', function(){
1884 a583aa29 Kostas Papadimitriou
        // pending_actions will become empty on every checkbox click/change
1885 a583aa29 Kostas Papadimitriou
        // line 154 machines_list.html
1886 a583aa29 Kostas Papadimitriou
        pending_actions = [];
1887 a583aa29 Kostas Papadimitriou
        if (pending_actions.length == 0)
1888 a583aa29 Kostas Papadimitriou
        {
1889 a583aa29 Kostas Papadimitriou
            $(".confirm_multiple").hide();
1890 23ca3bc9 Christodoulos Psaltis
            $("a.selected").each(function(index, el){$(el).removeClass("selected")});
1891 a583aa29 Kostas Papadimitriou
        }
1892 a583aa29 Kostas Papadimitriou
        update_action_indicator_icons(undefined, false);
1893 a583aa29 Kostas Papadimitriou
    });
1894 23ca3bc9 Christodoulos Psaltis
1895 a583aa29 Kostas Papadimitriou
}
1896 a583aa29 Kostas Papadimitriou
1897 a583aa29 Kostas Papadimitriou
function list_view_hide_action_indicators()
1898 a583aa29 Kostas Papadimitriou
{
1899 a583aa29 Kostas Papadimitriou
    $("tr td .action-indicator").remove();
1900 a583aa29 Kostas Papadimitriou
    $("tr td img.list-logo").show();
1901 a583aa29 Kostas Papadimitriou
}
1902 a583aa29 Kostas Papadimitriou
1903 a583aa29 Kostas Papadimitriou
function get_list_view_selected_machine_rows()
1904 23ca3bc9 Christodoulos Psaltis
{
1905 a583aa29 Kostas Papadimitriou
    var table = $("table.list-machines");
1906 a583aa29 Kostas Papadimitriou
    var rows = $("tr:has(input[type=checkbox]:checked)",table);
1907 a583aa29 Kostas Papadimitriou
    return rows;
1908 a583aa29 Kostas Papadimitriou
}
1909 7af53e78 Kostas Papadimitriou
1910 7af53e78 Kostas Papadimitriou
// machines images utils
1911 7af53e78 Kostas Papadimitriou
function set_machine_os_image(machine, machines_view, state, os, skip_reset_states, remove_state) {
1912 7af53e78 Kostas Papadimitriou
    var views_map = {'single': '.single-image', 'icon': '.logo'};
1913 7af53e78 Kostas Papadimitriou
    var states_map = {'on': 'state1', 'off': 'state3', 'hover': 'state4', 'click': 'state2'}
1914 7af53e78 Kostas Papadimitriou
    var sizes_map = {'single': 'large', 'icon': 'medium'}
1915 7af53e78 Kostas Papadimitriou
1916 7af53e78 Kostas Papadimitriou
    var size = sizes_map[machines_view];
1917 7af53e78 Kostas Papadimitriou
    var img_selector = views_map[machines_view];
1918 7af53e78 Kostas Papadimitriou
    var cls = states_map[state];
1919 40e77a49 Kostas Papadimitriou
1920 40e77a49 Kostas Papadimitriou
    if (os === "unknown") { os = "okeanos" } ;
1921 7af53e78 Kostas Papadimitriou
    var new_img = 'url("./static/icons/machines/' + size + '/' + os + '-sprite.png")';
1922 7af53e78 Kostas Papadimitriou
1923 7af53e78 Kostas Papadimitriou
    var el = $(img_selector, machine);
1924 7af53e78 Kostas Papadimitriou
    var current_img = el.css("backgroundImage");
1925 7af53e78 Kostas Papadimitriou
    if (os == undefined){
1926 7af53e78 Kostas Papadimitriou
        new_img = current_img;
1927 7af53e78 Kostas Papadimitriou
    }
1928 7af53e78 Kostas Papadimitriou
1929 7af53e78 Kostas Papadimitriou
    // os changed
1930 7af53e78 Kostas Papadimitriou
    el.css("backgroundImage", new_img);
1931 7af53e78 Kostas Papadimitriou
1932 7af53e78 Kostas Papadimitriou
    // reset current state
1933 7af53e78 Kostas Papadimitriou
    if (skip_reset_states === undefined)
1934 7af53e78 Kostas Papadimitriou
    {
1935 7af53e78 Kostas Papadimitriou
        el.removeClass("single-image-state1");
1936 7af53e78 Kostas Papadimitriou
        el.removeClass("single-image-state2");
1937 7af53e78 Kostas Papadimitriou
        el.removeClass("single-image-state3");
1938 7af53e78 Kostas Papadimitriou
    }
1939 7af53e78 Kostas Papadimitriou
1940 7af53e78 Kostas Papadimitriou
    if (remove_state !== undefined)
1941 7af53e78 Kostas Papadimitriou
    {
1942 7af53e78 Kostas Papadimitriou
        remove_state = "single-image-" + states_map[remove_state];
1943 7af53e78 Kostas Papadimitriou
        el.removeClass(remove_state);
1944 7af53e78 Kostas Papadimitriou
        return;
1945 7af53e78 Kostas Papadimitriou
    }
1946 7af53e78 Kostas Papadimitriou
    
1947 7af53e78 Kostas Papadimitriou
    // set proper state
1948 7af53e78 Kostas Papadimitriou
    el.addClass("single-image-" + cls);
1949 7af53e78 Kostas Papadimitriou
}