Statistics
| Branch: | Tag: | Revision:

root / ui / static / synnefo.js @ f2141829

History | View | Annotate | Download (73.6 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 9eefb3a2 Kostas Papadimitriou
var error_timeout = 20000;
42 9eefb3a2 Kostas Papadimitriou
$.ajaxSetup({
43 9eefb3a2 Kostas Papadimitriou
    'beforeSend': function(xhr) {
44 9eefb3a2 Kostas Papadimitriou
          xhr.setRequestHeader("X-Auth-Token", $.cookie("X-Auth-Token"));
45 9eefb3a2 Kostas Papadimitriou
    },
46 9eefb3a2 Kostas Papadimitriou
47 9eefb3a2 Kostas Papadimitriou
    // catch uncaught error requests
48 9eefb3a2 Kostas Papadimitriou
    // stop interaction and show only for the 5xx errors
49 9eefb3a2 Kostas Papadimitriou
    // refresh the page after 20secs
50 9eefb3a2 Kostas Papadimitriou
    error: function(jqXHR, textStatus, errorThrown) {
51 9eefb3a2 Kostas Papadimitriou
        // stop interaction for important (aka 500) error codes only
52 9eefb3a2 Kostas Papadimitriou
        if (jqXHR.status >= 500 && jqXHR.status < 600)
53 9eefb3a2 Kostas Papadimitriou
        {
54 9eefb3a2 Kostas Papadimitriou
            try {
55 9eefb3a2 Kostas Papadimitriou
                ajax_error(jqXHR.status, undefined, 'Unknown', jqXHR.responseText);
56 9eefb3a2 Kostas Papadimitriou
            } catch(err) {
57 9eefb3a2 Kostas Papadimitriou
                ajax_error(0, undefined, 'Unknown', jqXHR.responseText);
58 9eefb3a2 Kostas Papadimitriou
            }
59 8b17cf6e Markos Gogoulos
        }
60 9eefb3a2 Kostas Papadimitriou
61 9eefb3a2 Kostas Papadimitriou
        // refresh after 10 seconds
62 9eefb3a2 Kostas Papadimitriou
        window.setTimeout("window.location.reload()", window.error_timeout);
63 9eefb3a2 Kostas Papadimitriou
    }
64 9eefb3a2 Kostas Papadimitriou
});
65 d994d118 Markos Gogoulos
66 a583aa29 Kostas Papadimitriou
67 70eab221 Kostas Papadimitriou
// jquery show/hide events
68 a583aa29 Kostas Papadimitriou
var _oldshow = $.fn.show;
69 a583aa29 Kostas Papadimitriou
$.fn.show = function(speed, callback) {
70 a583aa29 Kostas Papadimitriou
    $(this).trigger('show');
71 a583aa29 Kostas Papadimitriou
    return _oldshow.apply(this,arguments);
72 a583aa29 Kostas Papadimitriou
}
73 70eab221 Kostas Papadimitriou
var _oldhide = $.fn.hide;
74 70eab221 Kostas Papadimitriou
$.fn.hide = function(speed, callback) {
75 70eab221 Kostas Papadimitriou
    $(this).trigger('hide');
76 70eab221 Kostas Papadimitriou
    return _oldhide.apply(this,arguments);
77 70eab221 Kostas Papadimitriou
}
78 a583aa29 Kostas Papadimitriou
79 c5a032c4 Markos Gogoulos
function ISODateString(d){
80 b02144c8 Vangelis Koukis
    //return a date in an ISO 8601 format using UTC.
81 c5a032c4 Markos Gogoulos
    //do not include time zone info (Z) at the end
82 b02144c8 Vangelis Koukis
    //taken from the Mozilla Developer Center
83 267403ca Dimitris Moraitis
    function pad(n){ return n<10 ? '0'+n : n }
84 267403ca Dimitris Moraitis
    return  d.getUTCFullYear()+ '-' +
85 f533f224 Vangelis Koukis
            pad(d.getUTCMonth()+1) + '-' +
86 f533f224 Vangelis Koukis
            pad(d.getUTCDate()) + 'T' +
87 f533f224 Vangelis Koukis
            pad(d.getUTCHours()) + ':' +
88 f533f224 Vangelis Koukis
            pad(d.getUTCMinutes()) + ':' +
89 f533f224 Vangelis Koukis
            pad(d.getUTCSeconds()) +'Z'
90 038383b1 Dimitris Moraitis
}
91 038383b1 Dimitris Moraitis
92 f533f224 Vangelis Koukis
function parse_error(responseText, errorCode){
93 f533f224 Vangelis Koukis
    var errors = [];
94 f533f224 Vangelis Koukis
    try {
95 f533f224 Vangelis Koukis
        responseObj = JSON.parse(responseText);
96 f533f224 Vangelis Koukis
    }
97 f533f224 Vangelis Koukis
    catch(err) {
98 f533f224 Vangelis Koukis
        errors[0] = {'code': errorCode};
99 f533f224 Vangelis Koukis
        return errors;
100 f533f224 Vangelis Koukis
    }
101 f533f224 Vangelis Koukis
    for (var err in responseObj){
102 f533f224 Vangelis Koukis
        errors[errors.length] = responseObj[err];
103 f533f224 Vangelis Koukis
    }
104 f533f224 Vangelis Koukis
    return errors;
105 267403ca Dimitris Moraitis
}
106 c5a032c4 Markos Gogoulos
107 41cad45d Dimitris Moraitis
// indexOf prototype for IE
108 41cad45d Dimitris Moraitis
if (!Array.prototype.indexOf) {
109 41cad45d Dimitris Moraitis
  Array.prototype.indexOf = function(elt /*, from*/) {
110 41cad45d Dimitris Moraitis
    var len = this.length;
111 41cad45d Dimitris Moraitis
    var from = Number(arguments[1]) || 0;
112 41cad45d Dimitris Moraitis
    from = (from < 0)
113 41cad45d Dimitris Moraitis
         ? Math.ceil(from)
114 41cad45d Dimitris Moraitis
         : Math.floor(from);
115 41cad45d Dimitris Moraitis
    if (from < 0)
116 41cad45d Dimitris Moraitis
      from += len;
117 41cad45d Dimitris Moraitis
118 41cad45d Dimitris Moraitis
    for (; from < len; from++) {
119 41cad45d Dimitris Moraitis
      if (from in this &&
120 41cad45d Dimitris Moraitis
          this[from] === elt)
121 41cad45d Dimitris Moraitis
        return from;
122 41cad45d Dimitris Moraitis
    }
123 41cad45d Dimitris Moraitis
    return -1;
124 41cad45d Dimitris Moraitis
  };
125 41cad45d Dimitris Moraitis
}
126 41cad45d Dimitris Moraitis
127 380c0520 Dimitris Moraitis
// trim prototype for IE
128 380c0520 Dimitris Moraitis
if(typeof String.prototype.trim !== 'function') {
129 380c0520 Dimitris Moraitis
    String.prototype.trim = function() {
130 82835e06 Christodoulos Psaltis
        return this.replace(/^\s+|\s+$/g, '');
131 380c0520 Dimitris Moraitis
    }
132 380c0520 Dimitris Moraitis
}
133 380c0520 Dimitris Moraitis
134 a70fb308 Christodoulos Psaltis
function update_confirmations() {
135 dcf153ce Christodoulos Psaltis
    // hide all confirm boxes to begin with
136 f533f224 Vangelis Koukis
    $('#machines-pane div.confirm_single').hide();
137 f533f224 Vangelis Koukis
    $('#machines-pane div.confirm_multiple').hide();
138 a70fb308 Christodoulos Psaltis
    var action_type = [];
139 9b2ab29a Christodoulos Psaltis
    // standard view or single view
140 9b2ab29a Christodoulos Psaltis
    if ($.cookie("view") == '0' || $.cookie("view") == '2') {
141 9044c6eb Christodoulos Psaltis
        for (var i=0; i<pending_actions.length; i++) {
142 dcf153ce Christodoulos Psaltis
            // show single confirms
143 a70fb308 Christodoulos Psaltis
            if (pending_actions[i][0] == reboot) {
144 9044c6eb Christodoulos Psaltis
                action_type = "reboot";
145 a70fb308 Christodoulos Psaltis
            } else if (pending_actions[i][0] == shutdown) {
146 9044c6eb Christodoulos Psaltis
                action_type = "shutdown";
147 a70fb308 Christodoulos Psaltis
            } else if (pending_actions[i][0] == start) {
148 9044c6eb Christodoulos Psaltis
                action_type = "start";
149 9044c6eb Christodoulos Psaltis
            } else if (pending_actions[i][0] == open_console) {
150 9044c6eb Christodoulos Psaltis
                action_type = "console";
151 a70fb308 Christodoulos Psaltis
            } else {
152 9044c6eb Christodoulos Psaltis
                action_type = "destroy";
153 a70fb308 Christodoulos Psaltis
            }
154 9b2ab29a Christodoulos Psaltis
            $("#machines-pane #" + pending_actions[i][1] +
155 9b2ab29a Christodoulos Psaltis
            " div.action-container." + action_type + " div.confirm_single").show();
156 dc3e66b9 Mike Muzurakis
        }
157 f533f224 Vangelis Koukis
    }
158 f533f224 Vangelis Koukis
    // if more than one pending action show multiple confirm box
159 f533f224 Vangelis Koukis
    if (pending_actions.length>1 || $.cookie("view") == '1' && pending_actions.length == 1){
160 f533f224 Vangelis Koukis
        $('#machines-pane div.confirm_multiple span.actionLen').text(pending_actions.length);
161 f533f224 Vangelis Koukis
        $('#machines-pane div.confirm_multiple').show();
162 f533f224 Vangelis Koukis
    }
163 f533f224 Vangelis Koukis
}
164 dcf153ce Christodoulos Psaltis
165 f533f224 Vangelis Koukis
function update_network_confirmations(){
166 f533f224 Vangelis Koukis
    // hide all confirm boxes to begin with
167 f533f224 Vangelis Koukis
    $('#networks-pane div.confirm_multiple').hide();
168 f533f224 Vangelis Koukis
169 f533f224 Vangelis Koukis
    for (var i=0;i<pending_actions.length;i++){
170 f533f224 Vangelis Koukis
        // show single confirms depending on the action
171 f533f224 Vangelis Koukis
        if (pending_actions[i][0] == delete_network) {
172 f533f224 Vangelis Koukis
            $("#networks-pane div.network#net-"+pending_actions[i][1]).children('.confirm_single').show();
173 f533f224 Vangelis Koukis
        } else if (pending_actions[i][0] == remove_server_from_network) {
174 f533f224 Vangelis Koukis
            $("#networks-pane div.network #net-"+pending_actions[i][1]+"-server-"+pending_actions[i][2]).children('.confirm_single').show();
175 f533f224 Vangelis Koukis
        } // else {}
176 f533f224 Vangelis Koukis
    }
177 f533f224 Vangelis Koukis
178 f533f224 Vangelis Koukis
    // if more than one pending action show multiple confirm box
179 f533f224 Vangelis Koukis
    if (pending_actions.length > 1){
180 f533f224 Vangelis Koukis
        $('#networks-pane div.confirm_multiple span.actionLen').text(pending_actions.length);
181 f533f224 Vangelis Koukis
        $('#networks-pane div.confirm_multiple').show();
182 f533f224 Vangelis Koukis
    }
183 3d286f84 Dimitris Moraitis
}
184 3d286f84 Dimitris Moraitis
185 42f67a2a Dimitris Moraitis
function list_view() {
186 f533f224 Vangelis Koukis
    changes_since = 0; // to reload full list
187 f533f224 Vangelis Koukis
    pending_actions = []; // clear pending actions
188 f533f224 Vangelis Koukis
    update_confirmations();
189 f533f224 Vangelis Koukis
    clearTimeout(deferred);    // clear old deferred calls
190 f533f224 Vangelis Koukis
    try {
191 f533f224 Vangelis Koukis
        update_request.abort(); // cancel pending ajax updates
192 f533f224 Vangelis Koukis
        load_request.abort();
193 f533f224 Vangelis Koukis
    }catch(err){}
194 f533f224 Vangelis Koukis
    $.cookie("view", '1'); // set list cookie
195 f533f224 Vangelis Koukis
    uri = $("a#list").attr("href");
196 267403ca Dimitris Moraitis
    load_request = $.ajax({
197 267403ca Dimitris Moraitis
        url: uri,
198 267403ca Dimitris Moraitis
        type: "GET",
199 267403ca Dimitris Moraitis
        timeout: TIMEOUT,
200 267403ca Dimitris Moraitis
        dataType: "html",
201 f533f224 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
202 f533f224 Vangelis Koukis
            return false;
203 f533f224 Vangelis Koukis
        },
204 267403ca Dimitris Moraitis
        success: function(data, textStatus, jqXHR) {
205 f533f224 Vangelis Koukis
            $("a#list")[0].className += ' activelink';
206 f533f224 Vangelis Koukis
            $("a#standard")[0].className = '';
207 f533f224 Vangelis Koukis
            $("a#single")[0].className = '';
208 f533f224 Vangelis Koukis
            $("div#machinesview").html(data);
209 f533f224 Vangelis Koukis
        }
210 f533f224 Vangelis Koukis
    });
211 f533f224 Vangelis Koukis
    return false;
212 f533f224 Vangelis Koukis
}
213 b02144c8 Vangelis Koukis
214 f533f224 Vangelis Koukis
function single_view() {
215 f533f224 Vangelis Koukis
    changes_since = 0; // to reload full list
216 f533f224 Vangelis Koukis
    pending_actions = []; // clear pending actions
217 f533f224 Vangelis Koukis
    update_confirmations();
218 f533f224 Vangelis Koukis
    clearTimeout(deferred);    // clear old deferred calls
219 f533f224 Vangelis Koukis
    try {
220 f533f224 Vangelis Koukis
        update_request.abort(); // cancel pending ajax updates
221 f533f224 Vangelis Koukis
        load_request.abort();
222 f533f224 Vangelis Koukis
    }catch(err){}
223 f533f224 Vangelis Koukis
    $.cookie("view", '2'); // set list cookie
224 f533f224 Vangelis Koukis
    uri = $("a#single").attr("href");
225 f533f224 Vangelis Koukis
    load_request = $.ajax({
226 f533f224 Vangelis Koukis
        url: uri,
227 f533f224 Vangelis Koukis
        type: "GET",
228 f533f224 Vangelis Koukis
        timeout: TIMEOUT,
229 f533f224 Vangelis Koukis
        dataType: "html",
230 f533f224 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
231 f533f224 Vangelis Koukis
            return false;
232 f533f224 Vangelis Koukis
        },
233 f533f224 Vangelis Koukis
        success: function(data, textStatus, jqXHR) {
234 f533f224 Vangelis Koukis
            $("a#single")[0].className += ' activelink';
235 f533f224 Vangelis Koukis
            $("a#standard")[0].className = '';
236 f533f224 Vangelis Koukis
            $("a#list")[0].className = '';
237 f533f224 Vangelis Koukis
            $("div#machinesview").html(data);
238 f533f224 Vangelis Koukis
        }
239 f533f224 Vangelis Koukis
    });
240 42f67a2a Dimitris Moraitis
    return false;
241 42f67a2a Dimitris Moraitis
}
242 42f67a2a Dimitris Moraitis
243 42f67a2a Dimitris Moraitis
function standard_view() {
244 f533f224 Vangelis Koukis
    changes_since = 0; // to reload full list
245 f533f224 Vangelis Koukis
    pending_actions = []; // clear pending actions
246 f533f224 Vangelis Koukis
    update_confirmations();
247 f533f224 Vangelis Koukis
    clearTimeout(deferred);    // clear old deferred calls
248 f533f224 Vangelis Koukis
    try {
249 f533f224 Vangelis Koukis
        update_request.abort() // cancel pending ajax updates
250 f533f224 Vangelis Koukis
        load_request.abort();
251 f533f224 Vangelis Koukis
    }catch(err){}
252 f533f224 Vangelis Koukis
    $.cookie("view", '0');
253 267403ca Dimitris Moraitis
    uri = $("a#standard").attr("href");
254 267403ca Dimitris Moraitis
    load_request = $.ajax({
255 267403ca Dimitris Moraitis
        url: uri,
256 267403ca Dimitris Moraitis
        type: "GET",
257 267403ca Dimitris Moraitis
        timeout: TIMEOUT,
258 267403ca Dimitris Moraitis
        dataType: "html",
259 f533f224 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
260 f533f224 Vangelis Koukis
            return false;
261 f533f224 Vangelis Koukis
        },
262 267403ca Dimitris Moraitis
        success: function(data, textStatus, jqXHR) {
263 f533f224 Vangelis Koukis
            $("a#standard")[0].className += ' activelink';
264 f533f224 Vangelis Koukis
            $("a#list")[0].className = '';
265 f533f224 Vangelis Koukis
            $("a#single")[0].className = '';
266 f533f224 Vangelis Koukis
            $("div#machinesview").html(data);
267 f533f224 Vangelis Koukis
        }
268 f533f224 Vangelis Koukis
    });
269 42f67a2a Dimitris Moraitis
    return false;
270 42f67a2a Dimitris Moraitis
}
271 42f67a2a Dimitris Moraitis
272 42f67a2a Dimitris Moraitis
function choose_view() {
273 f533f224 Vangelis Koukis
    if ($.cookie("view")=='1') {
274 42f67a2a Dimitris Moraitis
        list_view();
275 f533f224 Vangelis Koukis
    } else if ($.cookie("view")=='2'){
276 f533f224 Vangelis Koukis
        single_view();
277 42f67a2a Dimitris Moraitis
    } else {
278 42f67a2a Dimitris Moraitis
        standard_view();
279 42f67a2a Dimitris Moraitis
    }
280 42f67a2a Dimitris Moraitis
}
281 42f67a2a Dimitris Moraitis
282 e4f32f27 Mike Muzurakis
// return value from metadata key "OS", if it exists
283 e4f32f27 Mike Muzurakis
function os_icon(metadata) {
284 e4f32f27 Mike Muzurakis
    if (!metadata) {
285 552c32d8 Kostas Papadimitriou
        return 'okeanos';
286 e4f32f27 Mike Muzurakis
    }
287 e4f32f27 Mike Muzurakis
    if (metadata.values.OS == undefined || metadata.values.OS == '') {
288 552c32d8 Kostas Papadimitriou
        return 'okeanos';
289 e4f32f27 Mike Muzurakis
    } else {
290 e4f32f27 Mike Muzurakis
        if (os_icons.indexOf(metadata.values.OS) == -1) {
291 552c32d8 Kostas Papadimitriou
            return 'okeanos';
292 e4f32f27 Mike Muzurakis
        } else {
293 e4f32f27 Mike Muzurakis
            return metadata.values.OS;
294 e4f32f27 Mike Muzurakis
        }
295 e4f32f27 Mike Muzurakis
    }
296 e4f32f27 Mike Muzurakis
}
297 e4f32f27 Mike Muzurakis
298 e4f32f27 Mike Muzurakis
function os_icon_from_value(metadata) {
299 e4f32f27 Mike Muzurakis
    if (!metadata) {
300 552c32d8 Kostas Papadimitriou
        return 'okeanos';
301 e4f32f27 Mike Muzurakis
    }
302 e4f32f27 Mike Muzurakis
if (metadata == undefined || metadata == '') {
303 552c32d8 Kostas Papadimitriou
        return 'okeanos';
304 e4f32f27 Mike Muzurakis
    } else {
305 e4f32f27 Mike Muzurakis
        if (os_icons.indexOf(metadata) == -1) {
306 552c32d8 Kostas Papadimitriou
            return 'okeanos';
307 e4f32f27 Mike Muzurakis
        } else {
308 e4f32f27 Mike Muzurakis
            return metadata;
309 e4f32f27 Mike Muzurakis
        }
310 e4f32f27 Mike Muzurakis
    }
311 e4f32f27 Mike Muzurakis
}
312 e4f32f27 Mike Muzurakis
313 f533f224 Vangelis Koukis
// get and show a list of running and terminated machines
314 f533f224 Vangelis Koukis
function update_vms(interval) {
315 f533f224 Vangelis Koukis
    try{ console.info('updating machines'); } catch(err){}
316 f533f224 Vangelis Koukis
    var uri= API_URL + '/servers/detail';
317 b02144c8 Vangelis Koukis
318 f533f224 Vangelis Koukis
    if (changes_since != 0)
319 f533f224 Vangelis Koukis
        uri+='?changes-since='+changes_since
320 b02144c8 Vangelis Koukis
321 f533f224 Vangelis Koukis
    update_request = $.ajax({
322 f533f224 Vangelis Koukis
        cache: false,
323 f533f224 Vangelis Koukis
        url: uri,
324 f533f224 Vangelis Koukis
        type: "GET",
325 f533f224 Vangelis Koukis
        timeout: TIMEOUT,
326 f533f224 Vangelis Koukis
        dataType: "json",
327 f533f224 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
328 f533f224 Vangelis Koukis
            // don't forget to try again later
329 f533f224 Vangelis Koukis
            if (interval) {
330 f533f224 Vangelis Koukis
                clearTimeout(deferred);    // clear old deferred calls
331 f533f224 Vangelis Koukis
                deferred = setTimeout(function() {update_vms(interval);},interval,interval);
332 f533f224 Vangelis Koukis
            }
333 f533f224 Vangelis Koukis
            // as for now, just show an error message
334 f533f224 Vangelis Koukis
            try { console.info('update_vms errback:' + jqXHR.status ) } catch(err) {}
335 aeed1f09 Mike Muzurakis
            try {
336 aeed1f09 Mike Muzurakis
                ajax_error(jqXHR.status, undefined, 'Update VMs', jqXHR.responseText);
337 aeed1f09 Mike Muzurakis
            } catch(err) {
338 b8110bae Mike Muzurakis
                ajax_error(0, undefined, 'Update VMs', jqXHR.responseText);
339 aeed1f09 Mike Muzurakis
            }
340 f533f224 Vangelis Koukis
            return false;
341 f533f224 Vangelis Koukis
            },
342 f533f224 Vangelis Koukis
        success: function(data, textStatus, jqXHR) {
343 f533f224 Vangelis Koukis
            // create changes_since string if necessary
344 f533f224 Vangelis Koukis
            if (jqXHR.getResponseHeader('Date') != null){
345 f533f224 Vangelis Koukis
                changes_since_date = new Date(jqXHR.getResponseHeader('Date'));
346 f533f224 Vangelis Koukis
                changes_since = ISODateString(changes_since_date);
347 f533f224 Vangelis Koukis
            }
348 b02144c8 Vangelis Koukis
349 f533f224 Vangelis Koukis
            if (interval) {
350 f533f224 Vangelis Koukis
                clearTimeout(deferred);    // clear old deferred calls
351 f533f224 Vangelis Koukis
                deferred = setTimeout(function() {update_vms(interval);},interval,interval);
352 f533f224 Vangelis Koukis
            }
353 42f67a2a Dimitris Moraitis
354 f533f224 Vangelis Koukis
            if (jqXHR.status == 200 || jqXHR.status == 203) {
355 f533f224 Vangelis Koukis
                try {
356 7acbe201 Kostas Papadimitriou
                    //servers = data.servers.values;
357 7acbe201 Kostas Papadimitriou
                    update_servers_data(data.servers.values, data);
358 882ceb8f Dimitris Moraitis
                    jQuery.parseJSON(data);
359 882ceb8f Dimitris Moraitis
                    update_machines_view(data);
360 9b2ab29a Christodoulos Psaltis
                } catch(err) { ajax_error('400', undefined, 'Update VMs', jqXHR.responseText);}
361 f533f224 Vangelis Koukis
            } else if (jqXHR.status != 304){
362 f533f224 Vangelis Koukis
                try { console.info('update_vms callback:' + jqXHR.status ) } catch(err) {}
363 f533f224 Vangelis Koukis
                /*
364 f533f224 Vangelis Koukis
                FIXME:  Here it should return the error, however Opera does not support 304.
365 f533f224 Vangelis Koukis
                        Instead 304 it returns 0. To dealt with this we treat 0 as an
366 f533f224 Vangelis Koukis
                        304, which should be corrected (Bug #317).
367 f533f224 Vangelis Koukis
                */
368 f533f224 Vangelis Koukis
                //ajax_error(jqXHR.status, undefined, 'Update VMs', jqXHR.responseText);
369 f533f224 Vangelis Koukis
            }
370 f533f224 Vangelis Koukis
            return false;
371 f533f224 Vangelis Koukis
        }
372 42f67a2a Dimitris Moraitis
    });
373 f533f224 Vangelis Koukis
    return false;
374 f533f224 Vangelis Koukis
}
375 f533f224 Vangelis Koukis
376 7acbe201 Kostas Papadimitriou
function update_servers_data(servers_update, data) {
377 7acbe201 Kostas Papadimitriou
    $(window).trigger("vm:update", servers_update, data);
378 7acbe201 Kostas Papadimitriou
379 7acbe201 Kostas Papadimitriou
    // first call
380 7acbe201 Kostas Papadimitriou
    if (!window.servers || window.servers.length == 0) {
381 7acbe201 Kostas Papadimitriou
        window.servers = servers_update;
382 7acbe201 Kostas Papadimitriou
        return;
383 7acbe201 Kostas Papadimitriou
    }
384 7acbe201 Kostas Papadimitriou
    
385 7acbe201 Kostas Papadimitriou
    // server exists helper
386 7acbe201 Kostas Papadimitriou
    server_exists = function(server) {
387 7acbe201 Kostas Papadimitriou
        var id = server.id;
388 7acbe201 Kostas Papadimitriou
        var found = false;
389 7acbe201 Kostas Papadimitriou
        var index = 0;
390 7acbe201 Kostas Papadimitriou
        $.each(servers, function(i, s) {
391 7acbe201 Kostas Papadimitriou
            if (s.id == id) { found = true, index = i };
392 7acbe201 Kostas Papadimitriou
        });
393 7acbe201 Kostas Papadimitriou
        if (found)
394 7acbe201 Kostas Papadimitriou
            return [found, index];
395 7acbe201 Kostas Papadimitriou
396 7acbe201 Kostas Papadimitriou
        return false;
397 7acbe201 Kostas Papadimitriou
    }
398 7acbe201 Kostas Papadimitriou
399 7acbe201 Kostas Papadimitriou
    // merge object properties
400 7acbe201 Kostas Papadimitriou
    merge = function() {
401 7acbe201 Kostas Papadimitriou
        var initial = arguments[0];
402 d6eb963b Kostas Papadimitriou
        var status_changed = undefined;
403 7acbe201 Kostas Papadimitriou
        $.each(arguments, function(index, el) {
404 7acbe201 Kostas Papadimitriou
            $.each(el, function(key,v) {
405 7acbe201 Kostas Papadimitriou
                // new attribute added
406 d6eb963b Kostas Papadimitriou
                var previous_value = initial[key];
407 d6eb963b Kostas Papadimitriou
408 7acbe201 Kostas Papadimitriou
                if (initial[key] == undefined) {
409 7acbe201 Kostas Papadimitriou
                    $(window).trigger("vm:attr:add", initial, key, v);
410 7acbe201 Kostas Papadimitriou
                } else {
411 7acbe201 Kostas Papadimitriou
                    // value changed
412 7acbe201 Kostas Papadimitriou
                    if (initial[key] != v) {
413 d6eb963b Kostas Papadimitriou
                        if (key == "status") {
414 d6eb963b Kostas Papadimitriou
                            status_changed = {'old': previous_value, 'new': v}; 
415 d6eb963b Kostas Papadimitriou
                        }
416 7acbe201 Kostas Papadimitriou
                        $(window).trigger("vm:attr:change", {'initial': initial, 'attr': key, 'newvalue': v});
417 7acbe201 Kostas Papadimitriou
                    }
418 7acbe201 Kostas Papadimitriou
                }
419 7acbe201 Kostas Papadimitriou
                initial[key] = v;
420 7acbe201 Kostas Papadimitriou
            });
421 7acbe201 Kostas Papadimitriou
        });
422 d6eb963b Kostas Papadimitriou
        if (status_changed !== undefined) {
423 d6eb963b Kostas Papadimitriou
            $(window).trigger('vm:status:change', {'vm': initial, 'old': status_changed['old'], 'new': status_changed['new']});
424 d6eb963b Kostas Papadimitriou
        }
425 7acbe201 Kostas Papadimitriou
        return initial;
426 7acbe201 Kostas Papadimitriou
    }
427 7acbe201 Kostas Papadimitriou
    
428 7acbe201 Kostas Papadimitriou
    // server removed
429 7acbe201 Kostas Papadimitriou
    var remove = [];
430 7acbe201 Kostas Papadimitriou
    $.each(servers_update, function(index, server) {
431 7acbe201 Kostas Papadimitriou
        if (server.status == "DELETED") {
432 7acbe201 Kostas Papadimitriou
            remove.push(server.id);
433 7acbe201 Kostas Papadimitriou
        }
434 7acbe201 Kostas Papadimitriou
    });
435 7acbe201 Kostas Papadimitriou
    
436 7acbe201 Kostas Papadimitriou
    // check server, if exists merge it with new values else add it
437 7acbe201 Kostas Papadimitriou
    $.each(servers_update, function(index, server) {
438 7acbe201 Kostas Papadimitriou
        var exists = server_exists(server);
439 7acbe201 Kostas Papadimitriou
        if (exists !== false) {
440 d6eb963b Kostas Papadimitriou
            try {
441 d6eb963b Kostas Papadimitriou
                servers[exists[1]] = merge(servers[exists[1]], server);
442 d6eb963b Kostas Papadimitriou
            } catch (err) {
443 d6eb963b Kostas Papadimitriou
            }
444 7acbe201 Kostas Papadimitriou
        } else {
445 7acbe201 Kostas Papadimitriou
            servers.push(server);
446 7acbe201 Kostas Papadimitriou
            $(window).trigger("vm:add", server);
447 7acbe201 Kostas Papadimitriou
        }
448 7acbe201 Kostas Papadimitriou
        if (remove.indexOf(server.id) > -1) {
449 7acbe201 Kostas Papadimitriou
            var remove_exists = server_exists(server);
450 7acbe201 Kostas Papadimitriou
            servers.splice(remove_exists[1], 1);
451 7acbe201 Kostas Papadimitriou
            $(window).trigger("vm:remove", server);
452 7acbe201 Kostas Papadimitriou
        }
453 7acbe201 Kostas Papadimitriou
    });
454 7acbe201 Kostas Papadimitriou
}
455 7acbe201 Kostas Papadimitriou
456 f533f224 Vangelis Koukis
// get a list of running and terminated machines, used in network view
457 f533f224 Vangelis Koukis
function update_networks(interval) {
458 f533f224 Vangelis Koukis
    try{ console.info('updating networks'); } catch(err){}
459 f533f224 Vangelis Koukis
    var uri= API_URL + '/servers/detail';
460 f533f224 Vangelis Koukis
461 f533f224 Vangelis Koukis
    if (changes_since != 0)
462 f533f224 Vangelis Koukis
        uri+='?changes-since='+changes_since
463 f533f224 Vangelis Koukis
464 f533f224 Vangelis Koukis
    update_request = $.ajax({
465 f533f224 Vangelis Koukis
        cache: false,
466 f533f224 Vangelis Koukis
        url: uri,
467 f533f224 Vangelis Koukis
        type: "GET",
468 f533f224 Vangelis Koukis
        timeout: TIMEOUT,
469 f533f224 Vangelis Koukis
        dataType: "json",
470 f533f224 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
471 f533f224 Vangelis Koukis
            // don't forget to try again later
472 f533f224 Vangelis Koukis
            if (interval) {
473 f533f224 Vangelis Koukis
                clearTimeout(deferred);    // clear old deferred calls
474 f533f224 Vangelis Koukis
                deferred = setTimeout(function() {update_networks(interval);},interval,interval);
475 f533f224 Vangelis Koukis
            }
476 f533f224 Vangelis Koukis
            // as for now, just show an error message
477 f533f224 Vangelis Koukis
            try { console.info('update_networks errback:' + jqXHR.status ) } catch(err) {}
478 aeed1f09 Mike Muzurakis
            try {
479 aeed1f09 Mike Muzurakis
                ajax_error(jqXHR.status, undefined, 'Update networks', jqXHR.responseText);
480 aeed1f09 Mike Muzurakis
            } catch(err) {
481 b8110bae Mike Muzurakis
                ajax_error(0, undefined, 'Update networks', jqXHR.responseText);
482 aeed1f09 Mike Muzurakis
            }
483 f533f224 Vangelis Koukis
            return false;
484 f533f224 Vangelis Koukis
            },
485 f533f224 Vangelis Koukis
        success: function(data, textStatus, jqXHR) {
486 f533f224 Vangelis Koukis
            // create changes_since string if necessary
487 f533f224 Vangelis Koukis
            if (jqXHR.getResponseHeader('Date') != null){
488 f533f224 Vangelis Koukis
                changes_since_date = new Date(jqXHR.getResponseHeader('Date'));
489 f533f224 Vangelis Koukis
                changes_since = ISODateString(changes_since_date);
490 f533f224 Vangelis Koukis
            }
491 f533f224 Vangelis Koukis
492 f533f224 Vangelis Koukis
            if (interval) {
493 f533f224 Vangelis Koukis
                clearTimeout(deferred);    // clear old deferred calls
494 f533f224 Vangelis Koukis
                deferred = setTimeout(function() {update_networks(interval);},interval,interval);
495 f533f224 Vangelis Koukis
            }
496 f533f224 Vangelis Koukis
497 f533f224 Vangelis Koukis
            if (jqXHR.status == 200 || jqXHR.status == 203) {
498 f533f224 Vangelis Koukis
                try {
499 7acbe201 Kostas Papadimitriou
                    //servers = data.servers.values;
500 7acbe201 Kostas Papadimitriou
                    update_servers_data(data.servers.values, data);
501 882ceb8f Dimitris Moraitis
                    jQuery.parseJSON(data);
502 882ceb8f Dimitris Moraitis
                    update_network_names(data);
503 f533f224 Vangelis Koukis
                } catch(err) { ajax_error('400', undefined, 'Update networks', jqXHR.responseText);}
504 f533f224 Vangelis Koukis
            } else if (jqXHR.status == 304) {
505 f533f224 Vangelis Koukis
                update_network_names();
506 f533f224 Vangelis Koukis
            }
507 f533f224 Vangelis Koukis
            else {
508 f533f224 Vangelis Koukis
                try { console.info('update_networks callback:' + jqXHR.status ) } catch(err) {}
509 f533f224 Vangelis Koukis
                /*
510 f533f224 Vangelis Koukis
                FIXME:  Here it should return the error, however Opera does not support 304.
511 f533f224 Vangelis Koukis
                        Instead 304 it returns 0. To dealt with this we treat 0 as an
512 f533f224 Vangelis Koukis
                        304, which should be corrected (Bug #317).
513 f533f224 Vangelis Koukis
                */
514 f533f224 Vangelis Koukis
                //ajax_error(jqXHR.status, undefined, 'Update networks', jqXHR.responseText);
515 f533f224 Vangelis Koukis
                update_network_names();
516 f533f224 Vangelis Koukis
            }
517 f533f224 Vangelis Koukis
            return false;
518 42f67a2a Dimitris Moraitis
        }
519 42f67a2a Dimitris Moraitis
    });
520 42f67a2a Dimitris Moraitis
    return false;
521 42f67a2a Dimitris Moraitis
}
522 42f67a2a Dimitris Moraitis
523 f533f224 Vangelis Koukis
// get and show a list of public and private networks
524 f533f224 Vangelis Koukis
function update_network_names(servers_data) {
525 f533f224 Vangelis Koukis
    try{ console.info('updating network names'); } catch(err){}
526 f533f224 Vangelis Koukis
    var uri= API_URL + '/networks/detail';
527 f533f224 Vangelis Koukis
528 f533f224 Vangelis Koukis
    if (networks_changes_since != 0)
529 f533f224 Vangelis Koukis
        //FIXME: Comment out the following, until metadata do not 304 when changed
530 f533f224 Vangelis Koukis
        uri+='?changes-since=' + networks_changes_since
531 ce4f9227 Mike Muzurakis
532 1c7978ce Dimitris Moraitis
    update_request = $.ajax({
533 c8bde382 Mike Muzurakis
        cache: false,
534 1a49199e Dimitris Moraitis
        url: uri,
535 42f67a2a Dimitris Moraitis
        type: "GET",
536 42f67a2a Dimitris Moraitis
        timeout: TIMEOUT,
537 42f67a2a Dimitris Moraitis
        dataType: "json",
538 146b6003 Dimitris Moraitis
        error: function(jqXHR, textStatus, errorThrown) {
539 f533f224 Vangelis Koukis
            // as for now, just show an error message
540 f533f224 Vangelis Koukis
            try {
541 f533f224 Vangelis Koukis
                console.info('update_network names errback:' + jqXHR.status )
542 f533f224 Vangelis Koukis
            } catch(err) {}
543 aeed1f09 Mike Muzurakis
            try {
544 aeed1f09 Mike Muzurakis
                ajax_error(jqXHR.status, undefined, 'Update network names', jqXHR.responseText);
545 aeed1f09 Mike Muzurakis
            } catch(err) {
546 b8110bae Mike Muzurakis
                ajax_error(0, undefined, 'Update network names', jqXHR.responseText);
547 aeed1f09 Mike Muzurakis
            }
548 f533f224 Vangelis Koukis
            return false;
549 f533f224 Vangelis Koukis
            },
550 1a49199e Dimitris Moraitis
        success: function(data, textStatus, jqXHR) {
551 e6561111 Mike Muzurakis
            // create changes_since string if necessary
552 e6561111 Mike Muzurakis
            if (jqXHR.getResponseHeader('Date') != null){
553 f533f224 Vangelis Koukis
                changes_since_date = new Date(jqXHR.getResponseHeader('Date'));
554 f533f224 Vangelis Koukis
                networks_changes_since = ISODateString(changes_since_date);
555 f533f224 Vangelis Koukis
            }
556 f533f224 Vangelis Koukis
557 f533f224 Vangelis Koukis
            if (jqXHR.status == 200 || jqXHR.status == 203) {
558 f533f224 Vangelis Koukis
                try {
559 f533f224 Vangelis Koukis
                    networks = data.networks.values;
560 882ceb8f Dimitris Moraitis
                    jQuery.parseJSON(data);
561 882ceb8f Dimitris Moraitis
                    update_networks_view(servers_data, data);
562 f533f224 Vangelis Koukis
                } catch(err) {
563 f533f224 Vangelis Koukis
                    ajax_error('400', undefined, 'Update network names', jqXHR.responseText);
564 f533f224 Vangelis Koukis
                }
565 f533f224 Vangelis Koukis
            } else if (jqXHR.status == 304) {
566 f533f224 Vangelis Koukis
                update_networks_view(servers_data);
567 f533f224 Vangelis Koukis
            } else if (jqXHR.status != 304){
568 f533f224 Vangelis Koukis
                try { console.info('update_network_names callback:' + jqXHR.status ) } catch(err) {}
569 f533f224 Vangelis Koukis
                /*
570 f533f224 Vangelis Koukis
                FIXME:  Here it should return the error, however Opera does not support 304.
571 f533f224 Vangelis Koukis
                        Instead 304 it returns 0. To dealt with this we treat 0 as an
572 f533f224 Vangelis Koukis
                        304, which should be corrected (Bug #317).
573 f533f224 Vangelis Koukis
                */
574 f533f224 Vangelis Koukis
                //ajax_error(jqXHR.status, undefined, 'Update network names', jqXHR.responseText);
575 f533f224 Vangelis Koukis
                update_networks_view(servers_data);
576 f533f224 Vangelis Koukis
            }
577 f533f224 Vangelis Koukis
            return false;
578 42f67a2a Dimitris Moraitis
        }
579 42f67a2a Dimitris Moraitis
    });
580 42f67a2a Dimitris Moraitis
    return false;
581 42f67a2a Dimitris Moraitis
}
582 42f67a2a Dimitris Moraitis
583 146b6003 Dimitris Moraitis
// get and show a list of available standard and custom images
584 b02144c8 Vangelis Koukis
function update_images() {
585 42f67a2a Dimitris Moraitis
    $.ajax({
586 73c2c75b Markos Gogoulos
        url: API_URL + '/images/detail',
587 42f67a2a Dimitris Moraitis
        type: "GET",
588 42f67a2a Dimitris Moraitis
        //async: false,
589 42f67a2a Dimitris Moraitis
        dataType: "json",
590 42f67a2a Dimitris Moraitis
        timeout: TIMEOUT,
591 b02144c8 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
592 aeed1f09 Mike Muzurakis
                    try {
593 aeed1f09 Mike Muzurakis
                        ajax_error(jqXHR.status, undefined, 'Update Images', jqXHR.responseText);
594 aeed1f09 Mike Muzurakis
                    } catch(err) {
595 b8110bae Mike Muzurakis
                        ajax_error(0, undefined, 'Update Images', jqXHR.responseText);
596 aeed1f09 Mike Muzurakis
                    }
597 aeed1f09 Mike Muzurakis
                },
598 42f67a2a Dimitris Moraitis
        success: function(data, textStatus, jqXHR) {
599 146b6003 Dimitris Moraitis
            try {
600 f533f224 Vangelis Koukis
                images = data.images.values;
601 ddf929a7 Christodoulos Psaltis
                jQuery.parseJSON(data);
602 f533f224 Vangelis Koukis
                update_wizard_images();
603 f533f224 Vangelis Koukis
            } catch(err){
604 f533f224 Vangelis Koukis
                ajax_error("NO_IMAGES");
605 f533f224 Vangelis Koukis
            }
606 42f67a2a Dimitris Moraitis
        }
607 42f67a2a Dimitris Moraitis
    });
608 42f67a2a Dimitris Moraitis
    return false;
609 42f67a2a Dimitris Moraitis
}
610 42f67a2a Dimitris Moraitis
611 d134b632 Dimitris Moraitis
function update_wizard_images() {
612 f533f224 Vangelis Koukis
    if ($("ul#standard-images li").toArray().length + $("ul#custom-images li").toArray().length == 0) {
613 f533f224 Vangelis Koukis
        $.each(images, function(i,image){
614 f533f224 Vangelis Koukis
            var img = $('#image-template').clone().attr("id","img-"+image.id).fadeIn("slow");
615 f533f224 Vangelis Koukis
            img.find("label").attr('for',"img-radio-" + image.id);
616 f533f224 Vangelis Koukis
            img.find(".image-title").text(image.name);
617 73c2c75b Markos Gogoulos
            if (image.metadata) {
618 73c2c75b Markos Gogoulos
                if (image.metadata.values.description != undefined) {
619 73c2c75b Markos Gogoulos
                    img.find(".description").text(image.metadata.values.description);
620 73c2c75b Markos Gogoulos
                }
621 73c2c75b Markos Gogoulos
                if (image.metadata.values.size != undefined) {
622 f533f224 Vangelis Koukis
                    img.find("#size").text(image.metadata.values.size);
623 73c2c75b Markos Gogoulos
                }
624 73c2c75b Markos Gogoulos
            }
625 f533f224 Vangelis Koukis
            img.find("input.radio").attr('id',"img-radio-" + image.id);
626 f533f224 Vangelis Koukis
            if (i==0) img.find("input.radio").attr("checked","checked");
627 a64e74f0 Markos Gogoulos
            var image_logo = os_icon(image.metadata);
628 f533f224 Vangelis Koukis
            img.find("img.image-logo").attr('src','static/icons/os/'+image_logo+'.png');
629 73c2c75b Markos Gogoulos
            if (image.metadata) {
630 73c2c75b Markos Gogoulos
                if (image.metadata.values.serverId != undefined) {
631 73c2c75b Markos Gogoulos
                    img.appendTo("ul#custom-images");
632 73c2c75b Markos Gogoulos
                } else {
633 73c2c75b Markos Gogoulos
                    img.appendTo("ul#standard-images");
634 73c2c75b Markos Gogoulos
                }
635 73c2c75b Markos Gogoulos
            } else {
636 73c2c75b Markos Gogoulos
                img.appendTo("ul#standard-images");
637 73c2c75b Markos Gogoulos
            }
638 f533f224 Vangelis Koukis
        });
639 f533f224 Vangelis Koukis
    }
640 d134b632 Dimitris Moraitis
}
641 d134b632 Dimitris Moraitis
642 d134b632 Dimitris Moraitis
function update_wizard_flavors(){
643 f533f224 Vangelis Koukis
    // sliders for selecting VM flavor
644 f533f224 Vangelis Koukis
    $("#cpu:range").rangeinput({min:0,
645 f533f224 Vangelis Koukis
                               value:0,
646 f533f224 Vangelis Koukis
                               step:1,
647 f533f224 Vangelis Koukis
                               progress: true,
648 f533f224 Vangelis Koukis
                               max:cpus.length-1});
649 f533f224 Vangelis Koukis
650 f533f224 Vangelis Koukis
    $("#storage:range").rangeinput({min:0,
651 f533f224 Vangelis Koukis
                               value:0,
652 f533f224 Vangelis Koukis
                               step:1,
653 f533f224 Vangelis Koukis
                               progress: true,
654 f533f224 Vangelis Koukis
                               max:disks.length-1});
655 f533f224 Vangelis Koukis
656 f533f224 Vangelis Koukis
    $("#ram:range").rangeinput({min:0,
657 f533f224 Vangelis Koukis
                               value:0,
658 f533f224 Vangelis Koukis
                               step:1,
659 f533f224 Vangelis Koukis
                               progress: true,
660 f533f224 Vangelis Koukis
                               max:ram.length-1});
661 f533f224 Vangelis Koukis
    $("#small").click();
662 f533f224 Vangelis Koukis
663 f533f224 Vangelis Koukis
    // update the indicators when sliding
664 f533f224 Vangelis Koukis
    $("#cpu:range").data().rangeinput.onSlide(function(event,value){
665 f533f224 Vangelis Koukis
        $("#cpu-indicator")[0].value = cpus[Number(value)];
666 afa2ebd2 Mike Muzurakis
        $("#cpu-indicator").addClass('selectedrange');
667 f533f224 Vangelis Koukis
    });
668 f533f224 Vangelis Koukis
    $("#cpu:range").data().rangeinput.change(function(event,value){
669 f533f224 Vangelis Koukis
        $("#cpu-indicator")[0].value = cpus[Number(value)];
670 f533f224 Vangelis Koukis
        $("#custom").click();
671 f533f224 Vangelis Koukis
        $("#cpu-indicator").removeClass('selectedrange');
672 f533f224 Vangelis Koukis
    });
673 f533f224 Vangelis Koukis
    $("#ram:range").data().rangeinput.onSlide(function(event,value){
674 f533f224 Vangelis Koukis
        $("#ram-indicator")[0].value = ram[Number(value)];
675 afa2ebd2 Mike Muzurakis
        $("#ram-indicator").addClass('selectedrange');
676 f533f224 Vangelis Koukis
    });
677 f533f224 Vangelis Koukis
    $("#ram:range").data().rangeinput.change(function(event,value){
678 f533f224 Vangelis Koukis
        $("#ram-indicator")[0].value = ram[Number(value)];
679 f533f224 Vangelis Koukis
        $("#custom").click();
680 f533f224 Vangelis Koukis
        $("#ram-indicator").removeClass('selectedrange');
681 f533f224 Vangelis Koukis
    });
682 f533f224 Vangelis Koukis
    $("#storage:range").data().rangeinput.onSlide(function(event,value){
683 f533f224 Vangelis Koukis
        $("#storage-indicator")[0].value = disks[Number(value)];
684 afa2ebd2 Mike Muzurakis
        $("#storage-indicator").addClass('selectedrange');
685 f533f224 Vangelis Koukis
    });
686 f533f224 Vangelis Koukis
    $("#storage:range").data().rangeinput.change(function(event,value){
687 f533f224 Vangelis Koukis
        $("#storage-indicator")[0].value = disks[Number(value)];
688 f533f224 Vangelis Koukis
        $("#custom").click();
689 f533f224 Vangelis Koukis
        $("#storage-indicator").removeClass('selectedrange');
690 f533f224 Vangelis Koukis
    });
691 d134b632 Dimitris Moraitis
}
692 d134b632 Dimitris Moraitis
693 42f67a2a Dimitris Moraitis
Array.prototype.unique = function () {
694 f533f224 Vangelis Koukis
    var r = new Array();
695 f533f224 Vangelis Koukis
    o:for(var i = 0, n = this.length; i < n; i++)
696 f533f224 Vangelis Koukis
    {
697 f533f224 Vangelis Koukis
        for(var x = 0, y = r.length; x < y; x++)
698 f533f224 Vangelis Koukis
        {
699 f533f224 Vangelis Koukis
            if(r[x]==this[i])
700 f533f224 Vangelis Koukis
            {
701 f533f224 Vangelis Koukis
                continue o;
702 f533f224 Vangelis Koukis
            }
703 f533f224 Vangelis Koukis
        }
704 f533f224 Vangelis Koukis
        r[r.length] = this[i];
705 f533f224 Vangelis Koukis
    }
706 f533f224 Vangelis Koukis
    return r;
707 42f67a2a Dimitris Moraitis
}
708 42f67a2a Dimitris Moraitis
709 42f67a2a Dimitris Moraitis
// get and configure flavor selection
710 b02144c8 Vangelis Koukis
function update_flavors() {
711 42f67a2a Dimitris Moraitis
    $.ajax({
712 f1641e4d Markos Gogoulos
        url: API_URL + '/flavors/detail',
713 42f67a2a Dimitris Moraitis
        type: "GET",
714 42f67a2a Dimitris Moraitis
        //async: false,
715 42f67a2a Dimitris Moraitis
        dataType: "json",
716 42f67a2a Dimitris Moraitis
        timeout: TIMEOUT,
717 b02144c8 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
718 146b6003 Dimitris Moraitis
            try {
719 f533f224 Vangelis Koukis
                ajax_error(jqXHR.status, undefined, 'Update Flavors', jqXHR.responseText);
720 f533f224 Vangelis Koukis
            } catch (err) {
721 f533f224 Vangelis Koukis
                ajax_error(err);
722 f533f224 Vangelis Koukis
            }
723 66307c9e Christodoulos Psaltis
            // start updating vm list
724 66307c9e Christodoulos Psaltis
            update_vms(UPDATE_INTERVAL);
725 42f67a2a Dimitris Moraitis
        },
726 42f67a2a Dimitris Moraitis
        success: function(data, textStatus, jqXHR) {
727 9b2ab29a Christodoulos Psaltis
728 882ceb8f Dimitris Moraitis
            try {
729 882ceb8f Dimitris Moraitis
                flavors = data.flavors.values;
730 882ceb8f Dimitris Moraitis
                jQuery.parseJSON(data);
731 882ceb8f Dimitris Moraitis
                $.each(flavors, function(i, flavor) {
732 882ceb8f Dimitris Moraitis
                    cpus[i] = flavor['cpu'];
733 882ceb8f Dimitris Moraitis
                    disks[i] = flavor['disk'];
734 882ceb8f Dimitris Moraitis
                    ram[i] = flavor['ram'];
735 882ceb8f Dimitris Moraitis
                });
736 882ceb8f Dimitris Moraitis
                cpus = cpus.unique();
737 882ceb8f Dimitris Moraitis
                disks = disks.unique();
738 882ceb8f Dimitris Moraitis
                ram = ram.unique();
739 882ceb8f Dimitris Moraitis
                update_wizard_flavors();
740 882ceb8f Dimitris Moraitis
            } catch(err){
741 882ceb8f Dimitris Moraitis
                ajax_error("NO_FLAVORS");
742 882ceb8f Dimitris Moraitis
            }
743 66307c9e Christodoulos Psaltis
            // start updating vm list
744 66307c9e Christodoulos Psaltis
            update_vms(UPDATE_INTERVAL);
745 42f67a2a Dimitris Moraitis
        }
746 42f67a2a Dimitris Moraitis
    });
747 42f67a2a Dimitris Moraitis
    return false;
748 42f67a2a Dimitris Moraitis
}
749 1a49199e Dimitris Moraitis
750 b335768e Markos Gogoulos
// return flavorRef from cpu, disk, ram values
751 42f67a2a Dimitris Moraitis
function identify_flavor(cpu, disk, ram){
752 42f67a2a Dimitris Moraitis
    for (i=0;i<flavors.length;i++){
753 42f67a2a Dimitris Moraitis
        if (flavors[i]['cpu'] == cpu && flavors[i]['disk']==disk && flavors[i]['ram']==ram) {
754 42f67a2a Dimitris Moraitis
            return flavors[i]['id']
755 42f67a2a Dimitris Moraitis
        }
756 42f67a2a Dimitris Moraitis
    }
757 42f67a2a Dimitris Moraitis
    return 0;
758 42f67a2a Dimitris Moraitis
}
759 42f67a2a Dimitris Moraitis
760 45ab204d Markos Gogoulos
// return image entry from imageRef
761 45ab204d Markos Gogoulos
function get_image(imageRef) {
762 45ab204d Markos Gogoulos
    for (i=0;i<images.length;i++){
763 45ab204d Markos Gogoulos
        if (images[i]['id'] == imageRef) {
764 45ab204d Markos Gogoulos
            return images[i];
765 45ab204d Markos Gogoulos
        }
766 45ab204d Markos Gogoulos
    }
767 45ab204d Markos Gogoulos
    return 0;
768 45ab204d Markos Gogoulos
}
769 45ab204d Markos Gogoulos
770 f533f224 Vangelis Koukis
// return machine entry from serverID
771 f533f224 Vangelis Koukis
function get_machine(serverID) {
772 f533f224 Vangelis Koukis
    for (i=0;i<servers.length;i++){
773 f533f224 Vangelis Koukis
        if (servers[i]['id'] == serverID) {
774 f533f224 Vangelis Koukis
            return servers[i];
775 f533f224 Vangelis Koukis
        }
776 f533f224 Vangelis Koukis
    }
777 f533f224 Vangelis Koukis
    return 0;
778 f533f224 Vangelis Koukis
}
779 f533f224 Vangelis Koukis
780 f533f224 Vangelis Koukis
// update the actions in icon view, per server
781 f533f224 Vangelis Koukis
function update_iconview_actions(serverID, server_status) {
782 dc3e66b9 Mike Muzurakis
    if ($.cookie("view")=='2') {
783 dc3e66b9 Mike Muzurakis
        // remove .disable from all actions to begin with
784 6a738cca Christodoulos Psaltis
        $('#machinesview-single #' + serverID + ' div.single-action').show();
785 dc3e66b9 Mike Muzurakis
        // decide which actions should be disabled
786 dc3e66b9 Mike Muzurakis
        for (current_action in actions) {
787 dc3e66b9 Mike Muzurakis
            if (actions[current_action].indexOf(server_status) == -1 ) {
788 6a738cca Christodoulos Psaltis
                $('#machinesview-single #' + serverID + ' div.action-' + current_action).hide();
789 dc3e66b9 Mike Muzurakis
            }
790 dc3e66b9 Mike Muzurakis
        }
791 dc3e66b9 Mike Muzurakis
    } else {
792 dc3e66b9 Mike Muzurakis
        // remove .disable from all actions to begin with
793 19697f4f Mike Muzurakis
        $('#machinesview-icon.standard #' + serverID + ' div.actions').find('a').removeClass('disabled');
794 dc3e66b9 Mike Muzurakis
        // decide which actions should be disabled
795 dc3e66b9 Mike Muzurakis
        for (current_action in actions) {
796 dc3e66b9 Mike Muzurakis
            if (actions[current_action].indexOf(server_status) == -1 ) {
797 dc3e66b9 Mike Muzurakis
                $('#machinesview-icon.standard #' + serverID + ' a.action-' + current_action).addClass('disabled');
798 dc3e66b9 Mike Muzurakis
            }
799 f533f224 Vangelis Koukis
        }
800 f533f224 Vangelis Koukis
    }
801 f533f224 Vangelis Koukis
}
802 f533f224 Vangelis Koukis
803 dcf153ce Christodoulos Psaltis
// update the actions in list view
804 f533f224 Vangelis Koukis
function update_listview_actions() {
805 f533f224 Vangelis Koukis
    var states = [];
806 f533f224 Vangelis Koukis
    var on = [];
807 f533f224 Vangelis Koukis
    var checked = $("table.list-machines tbody input[type='checkbox']:checked");
808 f533f224 Vangelis Koukis
    // disable all actions to begin with
809 f533f224 Vangelis Koukis
    $('#machinesview .list div.actions').children().removeClass('enabled');
810 f533f224 Vangelis Koukis
811 f533f224 Vangelis Koukis
    // are there multiple machines selected?
812 f533f224 Vangelis Koukis
    if (checked.length>1)
813 f533f224 Vangelis Koukis
        states[0] = 'multiple';
814 f533f224 Vangelis Koukis
815 f533f224 Vangelis Koukis
    // check the states of selected machines
816 f533f224 Vangelis Koukis
    checked.each(function(i,checkbox) {
817 f533f224 Vangelis Koukis
        states[states.length] = checkbox.className;
818 f533f224 Vangelis Koukis
        var ip = $("#" + checkbox.id.replace('input-','') + ".ip span.public").text();
819 f533f224 Vangelis Koukis
        if (ip.replace('undefined','').length)
820 f533f224 Vangelis Koukis
            states[states.length] = 'network';
821 f533f224 Vangelis Koukis
    });
822 f533f224 Vangelis Koukis
823 f533f224 Vangelis Koukis
    // decide which actions should be enabled
824 f533f224 Vangelis Koukis
    for (a in actions) {
825 f533f224 Vangelis Koukis
        var enabled = false;
826 f533f224 Vangelis Koukis
        for (var s =0; s<states.length; s++) {
827 f533f224 Vangelis Koukis
            if (actions[a].indexOf(states[s]) != -1 ) {
828 f533f224 Vangelis Koukis
                enabled = true;
829 f533f224 Vangelis Koukis
            } else {
830 f533f224 Vangelis Koukis
                enabled = false;
831 f533f224 Vangelis Koukis
                break;
832 f533f224 Vangelis Koukis
            }
833 f533f224 Vangelis Koukis
        }
834 f533f224 Vangelis Koukis
        if (enabled)
835 f533f224 Vangelis Koukis
            on[on.length]=a;
836 f533f224 Vangelis Koukis
    }
837 f533f224 Vangelis Koukis
    // enable those actions
838 f533f224 Vangelis Koukis
    for (action in on) {
839 f533f224 Vangelis Koukis
        $("#action-" + on[action]).addClass('enabled');
840 f533f224 Vangelis Koukis
    }
841 e32c2a5d Dimitris Moraitis
}
842 146b6003 Dimitris Moraitis
843 0971fa71 Markos Gogoulos
//create server action
844 0971fa71 Markos Gogoulos
function create_vm(machineName, imageRef, flavorRef){
845 45ab204d Markos Gogoulos
    var image_logo = os_icon(get_image(imageRef).metadata);
846 f533f224 Vangelis Koukis
    var uri = API_URL + '/servers';
847 0971fa71 Markos Gogoulos
    var payload = {
848 0971fa71 Markos Gogoulos
        "server": {
849 0971fa71 Markos Gogoulos
            "name": machineName,
850 0971fa71 Markos Gogoulos
            "imageRef": imageRef,
851 0971fa71 Markos Gogoulos
            "flavorRef" : flavorRef,
852 0971fa71 Markos Gogoulos
            "metadata" : {
853 45ab204d Markos Gogoulos
                "OS" : image_logo
854 038383b1 Dimitris Moraitis
            }
855 0971fa71 Markos Gogoulos
        }
856 0971fa71 Markos Gogoulos
    };
857 0971fa71 Markos Gogoulos
858 0971fa71 Markos Gogoulos
    $.ajax({
859 7e45ddef Dimitris Moraitis
    url: uri,
860 0971fa71 Markos Gogoulos
    type: "POST",
861 f533f224 Vangelis Koukis
    contentType: "application/json",
862 b02144c8 Vangelis Koukis
    dataType: "json",
863 0971fa71 Markos Gogoulos
    data: JSON.stringify(payload),
864 0971fa71 Markos Gogoulos
    timeout: TIMEOUT,
865 b02144c8 Vangelis Koukis
    error: function(jqXHR, textStatus, errorThrown) {
866 ddf929a7 Christodoulos Psaltis
                // close wizard and show error box
867 ddf929a7 Christodoulos Psaltis
                $('#machines-pane a#create').data('overlay').close();
868 aeed1f09 Mike Muzurakis
                    try {
869 cbb7a325 Christodoulos Psaltis
                        ajax_error(jqXHR.status, undefined, 'Create VM', jqXHR.responseText);
870 aeed1f09 Mike Muzurakis
                    } catch(err) {
871 cbb7a325 Christodoulos Psaltis
                        ajax_error(0, undefined, 'Create VM', jqXHR.responseText);
872 aeed1f09 Mike Muzurakis
                    }
873 0971fa71 Markos Gogoulos
           },
874 0971fa71 Markos Gogoulos
    success: function(data, textStatus, jqXHR) {
875 0971fa71 Markos Gogoulos
                if ( jqXHR.status == '202') {
876 b02144c8 Vangelis Koukis
                    ajax_success("CREATE_VM_SUCCESS", data.server.adminPass);
877 0971fa71 Markos Gogoulos
                } else {
878 ddf929a7 Christodoulos Psaltis
                    // close wizard and show error box
879 ddf929a7 Christodoulos Psaltis
                    $('#machines-pane a#create').data('overlay').close();
880 038383b1 Dimitris Moraitis
                    ajax_error(jqXHR.status, undefined, 'Create VM', jqXHR.responseText);
881 0971fa71 Markos Gogoulos
                }
882 0971fa71 Markos Gogoulos
            }
883 0971fa71 Markos Gogoulos
    });
884 0971fa71 Markos Gogoulos
}
885 0971fa71 Markos Gogoulos
886 42f67a2a Dimitris Moraitis
// reboot action
887 42f67a2a Dimitris Moraitis
function reboot(serverIDs){
888 f533f224 Vangelis Koukis
    if (!serverIDs.length){
889 f533f224 Vangelis Koukis
        //ajax_success('DEFAULT');
890 f533f224 Vangelis Koukis
        return false;
891 f533f224 Vangelis Koukis
    }
892 42f67a2a Dimitris Moraitis
    // ajax post reboot call
893 42f67a2a Dimitris Moraitis
    var payload = {
894 42f67a2a Dimitris Moraitis
        "reboot": {"type" : "HARD"}
895 42f67a2a Dimitris Moraitis
    };
896 f533f224 Vangelis Koukis
897 a1a31201 Dimitris Moraitis
    var serverID = serverIDs.pop();
898 f533f224 Vangelis Koukis
899 f533f224 Vangelis Koukis
    $.ajax({
900 f533f224 Vangelis Koukis
        url: API_URL + '/servers/' + serverID + '/action',
901 f533f224 Vangelis Koukis
        type: "POST",
902 f533f224 Vangelis Koukis
        contentType: "application/json",
903 f533f224 Vangelis Koukis
        dataType: "json",
904 f533f224 Vangelis Koukis
        data: JSON.stringify(payload),
905 f533f224 Vangelis Koukis
        timeout: TIMEOUT,
906 f533f224 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
907 3a254f7c Christodoulos Psaltis
                    // in machine views
908 3a254f7c Christodoulos Psaltis
                    if ( $.cookie("pane") == 0) {
909 3a254f7c Christodoulos Psaltis
                        try {
910 3a254f7c Christodoulos Psaltis
                            display_failure(jqXHR.status, serverID, 'Reboot', jqXHR.responseText);
911 3a254f7c Christodoulos Psaltis
                        } catch (err) {
912 3a254f7c Christodoulos Psaltis
                            display_failure(0, serverID, 'Reboot', jqXHR.responseText);
913 3a254f7c Christodoulos Psaltis
                        }
914 3a254f7c Christodoulos Psaltis
                    }
915 3a254f7c Christodoulos Psaltis
                    // in network view
916 3a254f7c Christodoulos Psaltis
                    else {
917 3a254f7c Christodoulos Psaltis
                        try {
918 3a254f7c Christodoulos Psaltis
                            display_reboot_failure(jqXHR.status, serverID, jqXHR.responseText);
919 3a254f7c Christodoulos Psaltis
                        } catch (err) {
920 3a254f7c Christodoulos Psaltis
                            display_reboot_failure(0, serverID, jqXHR.responseText);
921 3a254f7c Christodoulos Psaltis
                        }
922 aeed1f09 Mike Muzurakis
                    }
923 f533f224 Vangelis Koukis
                },
924 f533f224 Vangelis Koukis
        success: function(data, textStatus, jqXHR) {
925 f533f224 Vangelis Koukis
                    if ( jqXHR.status == '202') {
926 583932c4 Christodoulos Psaltis
                        try {
927 583932c4 Christodoulos Psaltis
                            console.info('rebooted ' + serverID);
928 a1a31201 Dimitris Moraitis
                        } catch(err) {}
929 f533f224 Vangelis Koukis
                        // indicate that the action succeeded
930 3a254f7c Christodoulos Psaltis
                        // in machine views
931 3a254f7c Christodoulos Psaltis
                        if ( $.cookie("pane") == 0) {
932 3a254f7c Christodoulos Psaltis
                            display_success(serverID);
933 3a254f7c Christodoulos Psaltis
                        }
934 3a254f7c Christodoulos Psaltis
                        // in network view
935 3a254f7c Christodoulos Psaltis
                        else {
936 3a254f7c Christodoulos Psaltis
                            display_reboot_success(serverID);
937 3a254f7c Christodoulos Psaltis
                        }
938 f533f224 Vangelis Koukis
                        // continue with the rest of the servers
939 f533f224 Vangelis Koukis
                        reboot(serverIDs);
940 f533f224 Vangelis Koukis
                    } else {
941 f533f224 Vangelis Koukis
                        ajax_error(jqXHR.status, serverID, 'Reboot', jqXHR.responseText);
942 f533f224 Vangelis Koukis
                    }
943 f533f224 Vangelis Koukis
                }
944 42f67a2a Dimitris Moraitis
    });
945 42f67a2a Dimitris Moraitis
    return false;
946 42f67a2a Dimitris Moraitis
}
947 42f67a2a Dimitris Moraitis
948 42f67a2a Dimitris Moraitis
// shutdown action
949 42f67a2a Dimitris Moraitis
function shutdown(serverIDs) {
950 f533f224 Vangelis Koukis
    if (!serverIDs.length){
951 f533f224 Vangelis Koukis
        //ajax_success('DEFAULT');
952 f533f224 Vangelis Koukis
        return false;
953 f533f224 Vangelis Koukis
    }
954 42f67a2a Dimitris Moraitis
    // ajax post shutdown call
955 42f67a2a Dimitris Moraitis
    var payload = {
956 9bc2dbfa Vangelis Koukis
        "shutdown": {}
957 b02144c8 Vangelis Koukis
    };
958 42f67a2a Dimitris Moraitis
959 f533f224 Vangelis Koukis
    var serverID = serverIDs.pop();
960 f533f224 Vangelis Koukis
961 42f67a2a Dimitris Moraitis
    $.ajax({
962 f533f224 Vangelis Koukis
        url: API_URL + '/servers/' + serverID + '/action',
963 f533f224 Vangelis Koukis
        type: "POST",
964 f533f224 Vangelis Koukis
        contentType: "application/json",
965 f533f224 Vangelis Koukis
        dataType: "json",
966 42f67a2a Dimitris Moraitis
        data: JSON.stringify(payload),
967 42f67a2a Dimitris Moraitis
        timeout: TIMEOUT,
968 b02144c8 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
969 aeed1f09 Mike Muzurakis
                    try {
970 aeed1f09 Mike Muzurakis
                        display_failure(jqXHR.status, serverID, 'Shutdown', jqXHR.responseText);
971 aeed1f09 Mike Muzurakis
                    } catch(err) {
972 b8110bae Mike Muzurakis
                        display_failure(0, serverID, 'Shutdown', jqXHR.responseText);
973 aeed1f09 Mike Muzurakis
                    }
974 aeed1f09 Mike Muzurakis
                },
975 42f67a2a Dimitris Moraitis
        success: function(data, textStatus, jqXHR) {
976 42f67a2a Dimitris Moraitis
                    if ( jqXHR.status == '202') {
977 f533f224 Vangelis Koukis
                        try {
978 583932c4 Christodoulos Psaltis
                            console.info('suspended ' + serverID);
979 a1a31201 Dimitris Moraitis
                        } catch(err) {}
980 f533f224 Vangelis Koukis
                        // indicate that the action succeeded
981 f533f224 Vangelis Koukis
                        display_success(serverID);
982 f533f224 Vangelis Koukis
                        // continue with the rest of the servers
983 42f67a2a Dimitris Moraitis
                        shutdown(serverIDs);
984 42f67a2a Dimitris Moraitis
                    } else {
985 038383b1 Dimitris Moraitis
                        ajax_error(jqXHR.status, serverID, 'Shutdown', jqXHR.responseText);
986 748139ba Christodoulos Psaltis
                    }
987 b02144c8 Vangelis Koukis
                }
988 42f67a2a Dimitris Moraitis
    });
989 b02144c8 Vangelis Koukis
    return false;
990 42f67a2a Dimitris Moraitis
}
991 42f67a2a Dimitris Moraitis
992 42f67a2a Dimitris Moraitis
// destroy action
993 42f67a2a Dimitris Moraitis
function destroy(serverIDs) {
994 f533f224 Vangelis Koukis
    if (!serverIDs.length){
995 f533f224 Vangelis Koukis
        //ajax_success('DEFAULT');
996 f533f224 Vangelis Koukis
        return false;
997 f533f224 Vangelis Koukis
    }
998 f15025bc Christodoulos Psaltis
    // ajax post destroy call can have an empty request body
999 b02144c8 Vangelis Koukis
    var payload = {};
1000 42f67a2a Dimitris Moraitis
1001 f533f224 Vangelis Koukis
    var serverID = serverIDs.pop();
1002 f533f224 Vangelis Koukis
1003 42f67a2a Dimitris Moraitis
    $.ajax({
1004 f533f224 Vangelis Koukis
        url: API_URL + '/servers/' + serverID,
1005 f533f224 Vangelis Koukis
        type: "DELETE",
1006 f533f224 Vangelis Koukis
        contentType: "application/json",
1007 f533f224 Vangelis Koukis
        dataType: "json",
1008 42f67a2a Dimitris Moraitis
        data: JSON.stringify(payload),
1009 42f67a2a Dimitris Moraitis
        timeout: TIMEOUT,
1010 b02144c8 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
1011 aeed1f09 Mike Muzurakis
                    try {
1012 aeed1f09 Mike Muzurakis
                        display_failure(jqXHR.status, serverID, 'Destroy', jqXHR.responseText);
1013 aeed1f09 Mike Muzurakis
                    } catch(err) {
1014 b8110bae Mike Muzurakis
                        display_failure(0, serverID, 'Destroy', jqXHR.responseText);
1015 aeed1f09 Mike Muzurakis
                    }
1016 aeed1f09 Mike Muzurakis
                },
1017 42f67a2a Dimitris Moraitis
        success: function(data, textStatus, jqXHR) {
1018 2d5cea9b Markos Gogoulos
                    if ( jqXHR.status == '204') {
1019 f533f224 Vangelis Koukis
                        try {
1020 f15025bc Christodoulos Psaltis
                            console.info('destroyed ' + serverID);
1021 a1a31201 Dimitris Moraitis
                        } catch (err) {}
1022 f533f224 Vangelis Koukis
                        // indicate that the action succeeded
1023 f533f224 Vangelis Koukis
                        display_success(serverID);
1024 f533f224 Vangelis Koukis
                        // continue with the rest of the servers
1025 38b1f387 Christodoulos Psaltis
                        destroy(serverIDs);
1026 42f67a2a Dimitris Moraitis
                    } else {
1027 038383b1 Dimitris Moraitis
                        ajax_error(jqXHR.status, serverID, 'Destroy', jqXHR.responseText);
1028 748139ba Christodoulos Psaltis
                    }
1029 b02144c8 Vangelis Koukis
                }
1030 42f67a2a Dimitris Moraitis
    });
1031 b02144c8 Vangelis Koukis
    return false;
1032 42f67a2a Dimitris Moraitis
}
1033 42f67a2a Dimitris Moraitis
1034 42f67a2a Dimitris Moraitis
// start action
1035 42f67a2a Dimitris Moraitis
function start(serverIDs){
1036 f533f224 Vangelis Koukis
    if (!serverIDs.length){
1037 f533f224 Vangelis Koukis
        //ajax_success('DEFAULT');
1038 f533f224 Vangelis Koukis
        return false;
1039 f533f224 Vangelis Koukis
    }
1040 42f67a2a Dimitris Moraitis
    // ajax post start call
1041 42f67a2a Dimitris Moraitis
    var payload = {
1042 623d7244 Vangelis Koukis
        "start": {}
1043 b02144c8 Vangelis Koukis
    };
1044 42f67a2a Dimitris Moraitis
1045 f533f224 Vangelis Koukis
    var serverID = serverIDs.pop();
1046 f533f224 Vangelis Koukis
1047 42f67a2a Dimitris Moraitis
    $.ajax({
1048 0971fa71 Markos Gogoulos
        url: API_URL + '/servers/' + serverID + '/action',
1049 42f67a2a Dimitris Moraitis
        type: "POST",
1050 f533f224 Vangelis Koukis
        contentType: "application/json",
1051 42f67a2a Dimitris Moraitis
        dataType: "json",
1052 42f67a2a Dimitris Moraitis
        data: JSON.stringify(payload),
1053 42f67a2a Dimitris Moraitis
        timeout: TIMEOUT,
1054 b02144c8 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
1055 aeed1f09 Mike Muzurakis
                    try {
1056 aeed1f09 Mike Muzurakis
                        display_failure(jqXHR.status, serverID, 'Start', jqXHR.responseText);
1057 aeed1f09 Mike Muzurakis
                    } catch(err) {
1058 b8110bae Mike Muzurakis
                        display_failure(0, serverID, 'Start', jqXHR.responseText);
1059 aeed1f09 Mike Muzurakis
                    }
1060 aeed1f09 Mike Muzurakis
                },
1061 42f67a2a Dimitris Moraitis
        success: function(data, textStatus, jqXHR) {
1062 42f67a2a Dimitris Moraitis
                    if ( jqXHR.status == '202') {
1063 f533f224 Vangelis Koukis
                        try {
1064 583932c4 Christodoulos Psaltis
                            console.info('started ' + serverID);
1065 a1a31201 Dimitris Moraitis
                        } catch(err) {}
1066 f533f224 Vangelis Koukis
                        // indicate that the action succeeded
1067 f533f224 Vangelis Koukis
                        display_success(serverID);
1068 f533f224 Vangelis Koukis
                        // continue with the rest of the servers
1069 42f67a2a Dimitris Moraitis
                        start(serverIDs);
1070 42f67a2a Dimitris Moraitis
                    } else {
1071 038383b1 Dimitris Moraitis
                        ajax_error(jqXHR.status, serverID, 'Start', jqXHR.responseText);
1072 748139ba Christodoulos Psaltis
                    }
1073 748139ba Christodoulos Psaltis
                }
1074 42f67a2a Dimitris Moraitis
    });
1075 42f67a2a Dimitris Moraitis
    return false;
1076 42f67a2a Dimitris Moraitis
}
1077 6902f72e clopy
1078 b02144c8 Vangelis Koukis
// Show VNC console
1079 b02144c8 Vangelis Koukis
function vnc_attachment(host, port, password) {
1080 b02144c8 Vangelis Koukis
    // FIXME: Must be made into parameters, in settings.py
1081 b02144c8 Vangelis Koukis
    //vnc = open("", "displayWindow",
1082 b02144c8 Vangelis Koukis
    //    "status=yes,toolbar=yes,menubar=yes");
1083 b02144c8 Vangelis Koukis
    vd = document.open("application/x-vnc");
1084 b02144c8 Vangelis Koukis
1085 b02144c8 Vangelis Koukis
    vd.writeln("[connection]");
1086 b02144c8 Vangelis Koukis
    vd.writeln("host=" + host);
1087 b02144c8 Vangelis Koukis
    vd.writeln("port=" + port);
1088 b02144c8 Vangelis Koukis
    vd.writeln("password=" + password);
1089 b02144c8 Vangelis Koukis
1090 b02144c8 Vangelis Koukis
    vd.close();
1091 b02144c8 Vangelis Koukis
}
1092 b02144c8 Vangelis Koukis
1093 b02144c8 Vangelis Koukis
// Show VNC console
1094 f533f224 Vangelis Koukis
function show_vnc_console(serverID, serverName, serverIP, host, port, password) {
1095 f533f224 Vangelis Koukis
    var params_url = '?machine=' + serverName + '&host_ip=' + serverIP + '&host=' + host + '&port=' + port + '&password=' + password;
1096 f533f224 Vangelis Koukis
    var params_window = 'scrollbars=no,' +
1097 f533f224 Vangelis Koukis
                        'menubar=no,' +
1098 f533f224 Vangelis Koukis
                        'toolbar=no,' +
1099 f533f224 Vangelis Koukis
                        'status=no,' +
1100 f533f224 Vangelis Koukis
                        'top=0,' +
1101 f533f224 Vangelis Koukis
                        'left=0,' +
1102 f533f224 Vangelis Koukis
                        'height=' + screen.height + ',' +
1103 f533f224 Vangelis Koukis
                        'width=' + screen.width + ',' +
1104 f533f224 Vangelis Koukis
                        'fullscreen=yes';
1105 f533f224 Vangelis Koukis
1106 7e51c3db Markos Gogoulos
    window.open('machines/console' + params_url, 'formresult' + serverID, params_window);
1107 f533f224 Vangelis Koukis
1108 f533f224 Vangelis Koukis
    // Restore os icon in list view
1109 f533f224 Vangelis Koukis
    osIcon = $('#'+serverID).parent().parent().find('.list-logo');
1110 f533f224 Vangelis Koukis
    osIcon.attr('src',osIcon.attr('os'));
1111 9c901aec Markos Gogoulos
    return false;
1112 b02144c8 Vangelis Koukis
}
1113 b02144c8 Vangelis Koukis
1114 b02144c8 Vangelis Koukis
// console action
1115 fb3eec11 Christodoulos Psaltis
function open_console(serverIDs){
1116 f533f224 Vangelis Koukis
    if (!serverIDs.length){
1117 f533f224 Vangelis Koukis
        //ajax_success('DEFAULT');
1118 f533f224 Vangelis Koukis
        return false;
1119 f533f224 Vangelis Koukis
    }
1120 b02144c8 Vangelis Koukis
    // ajax post start call
1121 b02144c8 Vangelis Koukis
    var payload = {
1122 b02144c8 Vangelis Koukis
        "console": {"type": "vnc"}
1123 b02144c8 Vangelis Koukis
    };
1124 b02144c8 Vangelis Koukis
1125 f533f224 Vangelis Koukis
    var serverID = serverIDs.pop();
1126 f533f224 Vangelis Koukis
1127 f533f224 Vangelis Koukis
    var machine = get_machine(serverID);
1128 f533f224 Vangelis Koukis
    var serverName = machine.name;
1129 2ee4f989 Markos Gogoulos
    try {
1130 2ee4f989 Markos Gogoulos
        var serverIP = machine.addresses.values[0].values[0].addr;
1131 2ee4f989 Markos Gogoulos
    } catch(err) { var serverIP = 'undefined'; }
1132 f533f224 Vangelis Koukis
1133 b02144c8 Vangelis Koukis
    $.ajax({
1134 b02144c8 Vangelis Koukis
        url: API_URL + '/servers/' + serverID + '/action',
1135 b02144c8 Vangelis Koukis
        type: "POST",
1136 f533f224 Vangelis Koukis
        contentType: "application/json",
1137 b02144c8 Vangelis Koukis
        dataType: "json",
1138 b02144c8 Vangelis Koukis
        data: JSON.stringify(payload),
1139 b02144c8 Vangelis Koukis
        timeout: TIMEOUT,
1140 b02144c8 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
1141 aeed1f09 Mike Muzurakis
                    try {
1142 aeed1f09 Mike Muzurakis
                        display_failure(jqXHR.status, serverID, 'Console', jqXHR.responseText);
1143 aeed1f09 Mike Muzurakis
                    } catch(err) {
1144 b8110bae Mike Muzurakis
                        display_failure(0, serverID, 'Console', jqXHR.responseText);
1145 aeed1f09 Mike Muzurakis
                    }
1146 aeed1f09 Mike Muzurakis
                },
1147 b02144c8 Vangelis Koukis
        success: function(data, textStatus, jqXHR) {
1148 b02144c8 Vangelis Koukis
                    if ( jqXHR.status == '200') {
1149 f533f224 Vangelis Koukis
                        try {
1150 b02144c8 Vangelis Koukis
                            console.info('got_console ' + serverID);
1151 b02144c8 Vangelis Koukis
                        } catch(err) {}
1152 f533f224 Vangelis Koukis
                        // indicate that the action succeeded
1153 ddf929a7 Christodoulos Psaltis
                        // show_vnc_console(serverID, serverName, serverIP,
1154 ddf929a7 Christodoulos Psaltis
                        // data.console.host,data.console.port,data.console.password);
1155 ddf929a7 Christodoulos Psaltis
                        show_vnc_console(serverID, serverName, serverIP,
1156 ddf929a7 Christodoulos Psaltis
                                         data.console.host,data.console.port,data.console.password);
1157 f533f224 Vangelis Koukis
                        display_success(serverID);
1158 74175c17 Christodoulos Psaltis
                        // hide spinner
1159 74175c17 Christodoulos Psaltis
                        $('#' + serverID + ' .spinner').hide();
1160 f533f224 Vangelis Koukis
                        // continue with the rest of the servers
1161 74175c17 Christodoulos Psaltis
                        open_console(serverIDs);
1162 b02144c8 Vangelis Koukis
                    } else {
1163 b02144c8 Vangelis Koukis
                        ajax_error(jqXHR.status, serverID, 'Console', jqXHR.responseText);
1164 b02144c8 Vangelis Koukis
                    }
1165 b02144c8 Vangelis Koukis
                }
1166 b02144c8 Vangelis Koukis
    });
1167 b02144c8 Vangelis Koukis
    return false;
1168 b02144c8 Vangelis Koukis
}
1169 b02144c8 Vangelis Koukis
1170 29772683 Kostas Papadimitriou
function vm_has_address(vmId) {
1171 29772683 Kostas Papadimitriou
    var vm = get_machine(vmId);
1172 29772683 Kostas Papadimitriou
1173 29772683 Kostas Papadimitriou
    if (!vm) return false;
1174 29772683 Kostas Papadimitriou
1175 29772683 Kostas Papadimitriou
    try {
1176 29772683 Kostas Papadimitriou
        var ip = vm.addresses.values[0].values[0].addr;
1177 29772683 Kostas Papadimitriou
    } catch (err) {
1178 29772683 Kostas Papadimitriou
        return false;
1179 29772683 Kostas Papadimitriou
    }
1180 29772683 Kostas Papadimitriou
    return ip;
1181 29772683 Kostas Papadimitriou
}
1182 29772683 Kostas Papadimitriou
1183 fd70c1db Markos Gogoulos
// connect to machine action
1184 fd70c1db Markos Gogoulos
function machine_connect(serverIDs){
1185 fd70c1db Markos Gogoulos
    if (!serverIDs.length){
1186 fd70c1db Markos Gogoulos
        //ajax_success('DEFAULT');
1187 fd70c1db Markos Gogoulos
        return false;
1188 fd70c1db Markos Gogoulos
    }
1189 6f4c1371 Kostas Papadimitriou
1190 fd70c1db Markos Gogoulos
    var serverID = serverIDs.pop();
1191 fd70c1db Markos Gogoulos
    var machine = get_machine(serverID);
1192 fd70c1db Markos Gogoulos
    var serverName = machine.name;
1193 6f4c1371 Kostas Papadimitriou
    
1194 2ee4f989 Markos Gogoulos
    try {
1195 2ee4f989 Markos Gogoulos
        var serverIP = machine.addresses.values[0].values[0].addr;
1196 2ee4f989 Markos Gogoulos
    } catch(err) { var serverIP = 'undefined'; }
1197 fd70c1db Markos Gogoulos
1198 afedad4d Markos Gogoulos
    try {
1199 afedad4d Markos Gogoulos
        var os = machine.metadata.values.OS;
1200 afedad4d Markos Gogoulos
    } catch(err) { var os = 'undefined'; }
1201 afedad4d Markos Gogoulos
1202 6f4c1371 Kostas Papadimitriou
    var params_url = '?ip_address=' + serverIP + '&os=' + os + "&host_os=" + $.client.os;
1203 29772683 Kostas Papadimitriou
    
1204 6f4c1371 Kostas Papadimitriou
    if ($.client.os == "Windows" && os == "windows") {
1205 6f4c1371 Kostas Papadimitriou
        window.open('machines/connect' + params_url + "&rdp=1");
1206 6f4c1371 Kostas Papadimitriou
        return;
1207 6f4c1371 Kostas Papadimitriou
    }
1208 6f4c1371 Kostas Papadimitriou
1209 b687587e Kostas Papadimitriou
    try {
1210 b687587e Kostas Papadimitriou
        msg_box({title:'Connect to ' + serverName,content:'loading...',extra:'',
1211 b687587e Kostas Papadimitriou
        'ajax':'machines/connect' + params_url,
1212 b687587e Kostas Papadimitriou
        parse_data:function(data){
1213 b687587e Kostas Papadimitriou
            data.title = false;
1214 b687587e Kostas Papadimitriou
            data.content = data.info;
1215 b687587e Kostas Papadimitriou
            data.extra = "<a href='"+data.link.url+"'>"+data.link.title+"</a>";
1216 b687587e Kostas Papadimitriou
            return data;
1217 b687587e Kostas Papadimitriou
        }
1218 b687587e Kostas Papadimitriou
        });
1219 b687587e Kostas Papadimitriou
    } catch (error) {
1220 6f4c1371 Kostas Papadimitriou
        window.open('machines/connect' + params_url);
1221 b687587e Kostas Papadimitriou
    }
1222 29772683 Kostas Papadimitriou
1223 fd70c1db Markos Gogoulos
1224 fd70c1db Markos Gogoulos
    // Restore os icon in list view
1225 fd70c1db Markos Gogoulos
    osIcon = $('#'+serverID).parent().parent().find('.list-logo');
1226 fd70c1db Markos Gogoulos
    osIcon.attr('src',osIcon.attr('os'));
1227 fd70c1db Markos Gogoulos
1228 fd70c1db Markos Gogoulos
    return false;
1229 fd70c1db Markos Gogoulos
}
1230 fd70c1db Markos Gogoulos
1231 fd70c1db Markos Gogoulos
1232 f533f224 Vangelis Koukis
// rename server
1233 a70a9116 Mike Muzurakis
function rename(serverID, serverName){
1234 f533f224 Vangelis Koukis
    if (!serverID.length){
1235 f533f224 Vangelis Koukis
        //ajax_success('DEFAULT');
1236 f533f224 Vangelis Koukis
        return false;
1237 f533f224 Vangelis Koukis
    }
1238 0d4faeb8 Mike Muzurakis
    // ajax post rename call
1239 0d4faeb8 Mike Muzurakis
    var payload = {
1240 73715544 Christodoulos Psaltis
        "server": {"name": serverName}
1241 b02144c8 Vangelis Koukis
    };
1242 0d4faeb8 Mike Muzurakis
1243 0d4faeb8 Mike Muzurakis
    $.ajax({
1244 5b35631e Markos Gogoulos
        url: API_URL + '/servers/' + serverID,
1245 a70a9116 Mike Muzurakis
        type: "PUT",
1246 f533f224 Vangelis Koukis
        contentType: "application/json",
1247 0d4faeb8 Mike Muzurakis
        dataType: "json",
1248 0d4faeb8 Mike Muzurakis
        data: JSON.stringify(payload),
1249 0d4faeb8 Mike Muzurakis
        timeout: TIMEOUT,
1250 b02144c8 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
1251 aeed1f09 Mike Muzurakis
                    try {
1252 aeed1f09 Mike Muzurakis
                        display_failure(jqXHR.status, serverID, 'Rename', jqXHR.responseText);
1253 aeed1f09 Mike Muzurakis
                    } catch(err) {
1254 b8110bae Mike Muzurakis
                        display_failure(0, serverID, 'Rename', jqXHR.responseText);
1255 aeed1f09 Mike Muzurakis
                    }
1256 aeed1f09 Mike Muzurakis
                },
1257 0d4faeb8 Mike Muzurakis
        success: function(data, textStatus, jqXHR) {
1258 380c0520 Dimitris Moraitis
                    if ( jqXHR.status == '204' || jqXHR.status == '1223') {
1259 f533f224 Vangelis Koukis
                        try {
1260 0d4faeb8 Mike Muzurakis
                            console.info('renamed ' + serverID);
1261 0d4faeb8 Mike Muzurakis
                        } catch(err) {}
1262 f533f224 Vangelis Koukis
                        // indicate that the action succeeded
1263 f533f224 Vangelis Koukis
                        display_success(serverID);
1264 0d4faeb8 Mike Muzurakis
                    } else {
1265 0d4faeb8 Mike Muzurakis
                        ajax_error(jqXHR.status, serverID, 'Rename', jqXHR.responseText);
1266 0d4faeb8 Mike Muzurakis
                    }
1267 0d4faeb8 Mike Muzurakis
                }
1268 0d4faeb8 Mike Muzurakis
    });
1269 0d4faeb8 Mike Muzurakis
    return false;
1270 0d4faeb8 Mike Muzurakis
}
1271 0d4faeb8 Mike Muzurakis
1272 5186eb04 Christodoulos Psaltis
// get server metadata
1273 f533f224 Vangelis Koukis
function get_metadata(serverID, keys_only) {
1274 5186eb04 Christodoulos Psaltis
    $.ajax({
1275 5186eb04 Christodoulos Psaltis
        url: API_URL + '/servers/' + serverID + '/meta',
1276 d1e14e2c Mike Muzurakis
        cache: false,
1277 5186eb04 Christodoulos Psaltis
        type: "GET",
1278 5186eb04 Christodoulos Psaltis
        //async: false,
1279 5186eb04 Christodoulos Psaltis
        dataType: "json",
1280 5186eb04 Christodoulos Psaltis
        timeout: TIMEOUT,
1281 b02144c8 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
1282 5186eb04 Christodoulos Psaltis
            try {
1283 ddf929a7 Christodoulos Psaltis
                // close wizard and show error box
1284 ddf929a7 Christodoulos Psaltis
                $("a#metadata-scrollable").data('overlay').close();
1285 f533f224 Vangelis Koukis
                ajax_error(jqXHR.status, undefined, 'Get metadata', jqXHR.responseText);
1286 f533f224 Vangelis Koukis
            } catch (err) {
1287 f533f224 Vangelis Koukis
                ajax_error(err);
1288 f533f224 Vangelis Koukis
            }
1289 5186eb04 Christodoulos Psaltis
        },
1290 5186eb04 Christodoulos Psaltis
        success: function(data, textStatus, jqXHR) {
1291 1b3857ab Christodoulos Psaltis
            // to list the new results in the edit dialog
1292 f533f224 Vangelis Koukis
            if (keys_only) {
1293 f533f224 Vangelis Koukis
                list_metadata_keys(serverID, data.metadata.values);
1294 f533f224 Vangelis Koukis
            } else {
1295 f533f224 Vangelis Koukis
                list_metadata(data);
1296 f533f224 Vangelis Koukis
                list_metadata_keys(serverID, data.metadata.values);
1297 f533f224 Vangelis Koukis
            }
1298 f533f224 Vangelis Koukis
            //hide spinner
1299 f533f224 Vangelis Koukis
            $('#metadata-wizard .large-spinner').hide();
1300 5186eb04 Christodoulos Psaltis
        }
1301 5186eb04 Christodoulos Psaltis
    });
1302 5186eb04 Christodoulos Psaltis
    return false;
1303 5186eb04 Christodoulos Psaltis
}
1304 5186eb04 Christodoulos Psaltis
1305 1b3857ab Christodoulos Psaltis
// delete metadata key-value pair
1306 1b3857ab Christodoulos Psaltis
function delete_metadata(serverID, meta_key) {
1307 0943cc77 Markos Gogoulos
    $.ajax({
1308 0943cc77 Markos Gogoulos
        url: API_URL + '/servers/' + serverID + '/meta/' + meta_key,
1309 0943cc77 Markos Gogoulos
        type: "DELETE",
1310 0943cc77 Markos Gogoulos
        //async: false,
1311 0943cc77 Markos Gogoulos
        dataType: "json",
1312 0943cc77 Markos Gogoulos
        timeout: TIMEOUT,
1313 b02144c8 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
1314 0943cc77 Markos Gogoulos
            try {
1315 ddf929a7 Christodoulos Psaltis
                // close wizard and show error box
1316 ddf929a7 Christodoulos Psaltis
                $("a#metadata-scrollable").data('overlay').close();
1317 f533f224 Vangelis Koukis
                ajax_error(jqXHR.status, undefined, 'Delete metadata', jqXHR.responseText);
1318 f533f224 Vangelis Koukis
            } catch (err) {
1319 f533f224 Vangelis Koukis
                ajax_error(err);
1320 f533f224 Vangelis Koukis
            }
1321 0943cc77 Markos Gogoulos
        },
1322 0943cc77 Markos Gogoulos
        success: function(data, textStatus, jqXHR) {
1323 ddf929a7 Christodoulos Psaltis
                    // success: Do nothing, the UI is already updated
1324 0943cc77 Markos Gogoulos
        }
1325 0943cc77 Markos Gogoulos
    });
1326 0943cc77 Markos Gogoulos
    return false;
1327 0943cc77 Markos Gogoulos
}
1328 0943cc77 Markos Gogoulos
1329 1b3857ab Christodoulos Psaltis
// add metadata key-value pair
1330 f533f224 Vangelis Koukis
function update_metadata(serverID, meta_key, meta_value) {
1331 0c578a28 Markos Gogoulos
    var payload = {
1332 0c578a28 Markos Gogoulos
        "meta": {
1333 0c578a28 Markos Gogoulos
        }
1334 0c578a28 Markos Gogoulos
    };
1335 0c578a28 Markos Gogoulos
    payload["meta"][meta_key] = meta_value;
1336 0c578a28 Markos Gogoulos
1337 0c578a28 Markos Gogoulos
    $.ajax({
1338 0c578a28 Markos Gogoulos
        url: API_URL + '/servers/' + serverID + '/meta/' + meta_key,
1339 0c578a28 Markos Gogoulos
        type: "PUT",
1340 f533f224 Vangelis Koukis
        contentType: "application/json",
1341 f533f224 Vangelis Koukis
        dataType: "json",
1342 f533f224 Vangelis Koukis
        data: JSON.stringify(payload),
1343 f533f224 Vangelis Koukis
        timeout: TIMEOUT,
1344 f533f224 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
1345 f533f224 Vangelis Koukis
            try {
1346 ddf929a7 Christodoulos Psaltis
                // close wizard and show error box
1347 ddf929a7 Christodoulos Psaltis
                $("a#metadata-scrollable").data('overlay').close();
1348 f533f224 Vangelis Koukis
                ajax_error(jqXHR.status, undefined, 'add metadata', jqXHR.responseText);
1349 f533f224 Vangelis Koukis
            } catch (err) {
1350 f533f224 Vangelis Koukis
                ajax_error(err);
1351 f533f224 Vangelis Koukis
            }
1352 f533f224 Vangelis Koukis
        },
1353 f533f224 Vangelis Koukis
        success: function(data, textStatus, jqXHR) {
1354 f533f224 Vangelis Koukis
            // success: Update icons if meta key is OS
1355 f533f224 Vangelis Koukis
            if (meta_key == "OS") {
1356 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');
1357 260d6bb3 Kostas Papadimitriou
                var machine_icon = $("#machinesview-icon").find("div#" + serverID);
1358 260d6bb3 Kostas Papadimitriou
                var machine_single = $("#machinesview-single").find("div#" + serverID);
1359 260d6bb3 Kostas Papadimitriou
1360 7af53e78 Kostas Papadimitriou
                var os = os_icon_from_value(meta_value);
1361 7af53e78 Kostas Papadimitriou
                var state = $("#metadata-wizard div#on-off").text()
1362 260d6bb3 Kostas Papadimitriou
                var state_single = $(".state", machine_single).hasClass("terminated-state") ? "off" : "on";
1363 260d6bb3 Kostas Papadimitriou
                set_machine_os_image(machine_icon, "icon", state, os);
1364 260d6bb3 Kostas Papadimitriou
                set_machine_os_image(machine_single, "single", state_single, os);
1365 f533f224 Vangelis Koukis
            }
1366 f533f224 Vangelis Koukis
        }
1367 f533f224 Vangelis Koukis
    });
1368 f533f224 Vangelis Koukis
    return false;
1369 f533f224 Vangelis Koukis
}
1370 0506db29 Christodoulos Psaltis
1371 23ca3bc9 Christodoulos Psaltis
// get stats
1372 23ca3bc9 Christodoulos Psaltis
function get_server_stats(serverID) {
1373 23ca3bc9 Christodoulos Psaltis
    $.ajax({
1374 23ca3bc9 Christodoulos Psaltis
        url: API_URL + '/servers/' + serverID + '/stats',
1375 23ca3bc9 Christodoulos Psaltis
        cache: false,
1376 23ca3bc9 Christodoulos Psaltis
        type: "GET",
1377 23ca3bc9 Christodoulos Psaltis
        //async: false,
1378 23ca3bc9 Christodoulos Psaltis
        dataType: "json",
1379 23ca3bc9 Christodoulos Psaltis
        timeout: TIMEOUT,
1380 23ca3bc9 Christodoulos Psaltis
        error: function(jqXHR, textStatus, errorThrown) {
1381 bd80f212 Christodoulos Psaltis
                // report error as text inline
1382 bd80f212 Christodoulos Psaltis
                $('#' + serverID + ' img.busy').hide();
1383 bd80f212 Christodoulos Psaltis
                $('#' + serverID + ' div.stat-error').show();
1384 23ca3bc9 Christodoulos Psaltis
        },
1385 23ca3bc9 Christodoulos Psaltis
        success: function(data, textStatus, jqXHR) {
1386 23ca3bc9 Christodoulos Psaltis
            // in icon view
1387 23ca3bc9 Christodoulos Psaltis
            if ( $.cookie('view') == 0 ) {
1388 bd80f212 Christodoulos Psaltis
                $('#' + serverID + ' img.busy').removeClass('busy');
1389 23ca3bc9 Christodoulos Psaltis
                $('#' + serverID + ' img.cpu').attr("src", data.stats.cpuBar);
1390 23ca3bc9 Christodoulos Psaltis
                $('#' + serverID + ' img.net').attr("src", data.stats.netBar);
1391 23ca3bc9 Christodoulos Psaltis
            }
1392 23ca3bc9 Christodoulos Psaltis
            // in single view
1393 23ca3bc9 Christodoulos Psaltis
            else if ( $.cookie('view') == 2 ) {
1394 23ca3bc9 Christodoulos Psaltis
                $('#' + serverID + ' div.cpu-graph img.stats').attr("src", data.stats.cpuTimeSeries);
1395 37564bb5 Mike Muzurakis
                $('#' + serverID + ' div.network-graph img.stats').attr("src", data.stats.netTimeSeries);
1396 23ca3bc9 Christodoulos Psaltis
            }
1397 23ca3bc9 Christodoulos Psaltis
        }
1398 23ca3bc9 Christodoulos Psaltis
    });
1399 23ca3bc9 Christodoulos Psaltis
    return false;
1400 23ca3bc9 Christodoulos Psaltis
}
1401 f533f224 Vangelis Koukis
1402 f533f224 Vangelis Koukis
// create network
1403 f533f224 Vangelis Koukis
function create_network(networkName){
1404 f533f224 Vangelis Koukis
    // ajax post start call
1405 f533f224 Vangelis Koukis
    var payload = {
1406 f533f224 Vangelis Koukis
        "network": { "name": networkName }
1407 f533f224 Vangelis Koukis
    };
1408 f533f224 Vangelis Koukis
1409 f533f224 Vangelis Koukis
    $.ajax({
1410 f533f224 Vangelis Koukis
        url: API_URL + '/networks',
1411 f533f224 Vangelis Koukis
        type: "POST",
1412 f533f224 Vangelis Koukis
        contentType: "application/json",
1413 f533f224 Vangelis Koukis
        dataType: "json",
1414 f533f224 Vangelis Koukis
        data: JSON.stringify(payload),
1415 f533f224 Vangelis Koukis
        timeout: TIMEOUT,
1416 f533f224 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
1417 f533f224 Vangelis Koukis
            try {
1418 ddf929a7 Christodoulos Psaltis
                // close wizard and show error box
1419 ddf929a7 Christodoulos Psaltis
                $("a#networkscreate").overlay().close();
1420 f533f224 Vangelis Koukis
                ajax_error(jqXHR.status, undefined, 'Create network', jqXHR.responseText);
1421 f533f224 Vangelis Koukis
            } catch (err) {
1422 f533f224 Vangelis Koukis
                ajax_error(err);
1423 f533f224 Vangelis Koukis
            }
1424 f533f224 Vangelis Koukis
        },
1425 f533f224 Vangelis Koukis
        success: function(data, textStatus, jqXHR) {
1426 f533f224 Vangelis Koukis
            if ( jqXHR.status == '202') {
1427 f533f224 Vangelis Koukis
                try {
1428 f533f224 Vangelis Koukis
                    console.info('created network ' + networkName);
1429 f533f224 Vangelis Koukis
                } catch(err) {}
1430 a67bb993 Christodoulos Psaltis
                /*
1431 a67bb993 Christodoulos Psaltis
                On success of this call nothing happens.
1432 a67bb993 Christodoulos Psaltis
                When the UI gets the first update containing the created server,
1433 a67bb993 Christodoulos Psaltis
                the creation wizard is closed and the new network is inserted
1434 a67bb993 Christodoulos Psaltis
                to the DOM. This is done in update_networks_view()
1435 a67bb993 Christodoulos Psaltis
                */
1436 f533f224 Vangelis Koukis
            } else {
1437 ddf929a7 Christodoulos Psaltis
                // close wizard and show error box
1438 a67bb993 Christodoulos Psaltis
                $("a#networkscreate").overlay().close();
1439 f533f224 Vangelis Koukis
                ajax_error(jqXHR.status, undefined, 'Create network', jqXHR.responseText);
1440 f533f224 Vangelis Koukis
            }
1441 f533f224 Vangelis Koukis
        }
1442 f533f224 Vangelis Koukis
    });
1443 f533f224 Vangelis Koukis
    return false;
1444 f533f224 Vangelis Koukis
}
1445 f533f224 Vangelis Koukis
1446 f533f224 Vangelis Koukis
// rename network
1447 f533f224 Vangelis Koukis
function rename_network(networkID, networkName){
1448 f533f224 Vangelis Koukis
    if (!networkID.length){
1449 f533f224 Vangelis Koukis
        //ajax_success('DEFAULT');
1450 f533f224 Vangelis Koukis
        return false;
1451 f533f224 Vangelis Koukis
    }
1452 f533f224 Vangelis Koukis
    // prepare payload
1453 f533f224 Vangelis Koukis
    var payload = {
1454 f533f224 Vangelis Koukis
        "network": {"name": networkName}
1455 f533f224 Vangelis Koukis
    };
1456 f533f224 Vangelis Koukis
    // ajax call
1457 f533f224 Vangelis Koukis
    $.ajax({
1458 f533f224 Vangelis Koukis
        url: API_URL + '/networks/' + networkID,
1459 f533f224 Vangelis Koukis
        type: "PUT",
1460 f533f224 Vangelis Koukis
        contentType: "application/json",
1461 f533f224 Vangelis Koukis
        dataType: "json",
1462 f533f224 Vangelis Koukis
        data: JSON.stringify(payload),
1463 f533f224 Vangelis Koukis
        timeout: TIMEOUT,
1464 f533f224 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
1465 f533f224 Vangelis Koukis
            try {
1466 f533f224 Vangelis Koukis
                ajax_error(jqXHR.status, undefined, 'Rename network', jqXHR.responseText);
1467 f533f224 Vangelis Koukis
            } catch (err) {
1468 b8110bae Mike Muzurakis
                ajax_error(0, undefined, 'Rename network', jqXHR.responseText);
1469 f533f224 Vangelis Koukis
            }
1470 f533f224 Vangelis Koukis
        },
1471 f533f224 Vangelis Koukis
        success: function(data, textStatus, jqXHR) {
1472 f533f224 Vangelis Koukis
            if ( jqXHR.status == '204') {
1473 f533f224 Vangelis Koukis
                try {
1474 f533f224 Vangelis Koukis
                    console.info('renamed network' + networkID);
1475 f533f224 Vangelis Koukis
                } catch(err) {}
1476 f533f224 Vangelis Koukis
            } else {
1477 f533f224 Vangelis Koukis
                ajax_error(jqXHR.status, undefined, 'Rename network', jqXHR.responseText);
1478 f533f224 Vangelis Koukis
            }
1479 f533f224 Vangelis Koukis
        }
1480 f533f224 Vangelis Koukis
    });
1481 f533f224 Vangelis Koukis
    return false;
1482 f533f224 Vangelis Koukis
}
1483 f533f224 Vangelis Koukis
1484 f533f224 Vangelis Koukis
function delete_network(networkIDs){
1485 f533f224 Vangelis Koukis
    if (!networkIDs.length){
1486 f533f224 Vangelis Koukis
        //ajax_success('DEFAULT');
1487 f533f224 Vangelis Koukis
        return false;
1488 f533f224 Vangelis Koukis
    }
1489 f533f224 Vangelis Koukis
    // get a network
1490 f533f224 Vangelis Koukis
    var networkID = networkIDs.pop();
1491 f533f224 Vangelis Koukis
    // ajax post destroy call can have an empty request body
1492 f533f224 Vangelis Koukis
    var payload = {};
1493 f533f224 Vangelis Koukis
    // ajax call
1494 f533f224 Vangelis Koukis
    $.ajax({
1495 f533f224 Vangelis Koukis
        url: API_URL + '/networks/' + networkID,
1496 f533f224 Vangelis Koukis
        type: "DELETE",
1497 f533f224 Vangelis Koukis
        contentType: "application/json",
1498 f533f224 Vangelis Koukis
        dataType: "json",
1499 f533f224 Vangelis Koukis
        data: JSON.stringify(payload),
1500 f533f224 Vangelis Koukis
        timeout: TIMEOUT,
1501 f533f224 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
1502 f533f224 Vangelis Koukis
            try {
1503 2aab1d5e Christodoulos Psaltis
                display_net_failure(jqXHR.status, networkID, 'Delete', jqXHR.responseText);
1504 f533f224 Vangelis Koukis
            } catch (err) {
1505 2aab1d5e Christodoulos Psaltis
                display_net_failure(0, networkID, 'Delete', jqXHR.responseText);
1506 f533f224 Vangelis Koukis
            }
1507 f533f224 Vangelis Koukis
        },
1508 f533f224 Vangelis Koukis
        success: function(data, textStatus, jqXHR) {
1509 f533f224 Vangelis Koukis
            if ( jqXHR.status == '204') {
1510 f533f224 Vangelis Koukis
                try {
1511 f533f224 Vangelis Koukis
                    console.info('deleted network ' + networkID);
1512 f533f224 Vangelis Koukis
                } catch(err) {}
1513 f533f224 Vangelis Koukis
                // continue with the rest of the servers
1514 f533f224 Vangelis Koukis
                delete_network(networkIDs);
1515 f533f224 Vangelis Koukis
            } else {
1516 3a254f7c Christodoulos Psaltis
                try {
1517 2aab1d5e Christodoulos Psaltis
                    display_net_failure(jqXHR.status, networkID, 'Delete', jqXHR.responseText);
1518 3a254f7c Christodoulos Psaltis
                } catch (err) {
1519 2aab1d5e Christodoulos Psaltis
                    display_net_failure(0, networkID, 'Delete', jqXHR.responseText);
1520 3a254f7c Christodoulos Psaltis
                }
1521 f533f224 Vangelis Koukis
            }
1522 f533f224 Vangelis Koukis
        }
1523 f533f224 Vangelis Koukis
    });
1524 f533f224 Vangelis Koukis
    return false;
1525 f533f224 Vangelis Koukis
}
1526 f533f224 Vangelis Koukis
1527 f39b36a6 Christodoulos Psaltis
function add_server_to_network(networkID, serverIDs, serverNames, serverStates) {
1528 f533f224 Vangelis Koukis
    if (!serverIDs.length){
1529 be191315 Christodoulos Psaltis
        // close the overlay when all the calls are made
1530 be191315 Christodoulos Psaltis
        $("a#add-machines-overlay").overlay().close();
1531 f533f224 Vangelis Koukis
        return false;
1532 f533f224 Vangelis Koukis
    }
1533 f533f224 Vangelis Koukis
    // get a server
1534 f533f224 Vangelis Koukis
    var serverID = serverIDs.pop();
1535 82835e06 Christodoulos Psaltis
    var serverName = serverNames.pop();
1536 f39b36a6 Christodoulos Psaltis
    var serverState = serverStates.pop();
1537 f533f224 Vangelis Koukis
    // prepare payload
1538 f533f224 Vangelis Koukis
    var payload = {
1539 f533f224 Vangelis Koukis
            "add": { "serverRef": serverID }
1540 f533f224 Vangelis Koukis
        };
1541 f533f224 Vangelis Koukis
    // prepare ajax call
1542 f533f224 Vangelis Koukis
    $.ajax({
1543 f533f224 Vangelis Koukis
        url: API_URL + '/networks/' + networkID + '/action',
1544 f533f224 Vangelis Koukis
        type: "POST",
1545 f533f224 Vangelis Koukis
        contentType: "application/json",
1546 b02144c8 Vangelis Koukis
        dataType: "json",
1547 0c578a28 Markos Gogoulos
        data: JSON.stringify(payload),
1548 0c578a28 Markos Gogoulos
        timeout: TIMEOUT,
1549 b02144c8 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
1550 0c578a28 Markos Gogoulos
            try {
1551 ddf929a7 Christodoulos Psaltis
                // close wizard and show error box
1552 ddf929a7 Christodoulos Psaltis
                $("a#add-machines-overlay").data('overlay').close();
1553 f533f224 Vangelis Koukis
                ajax_error(jqXHR.status, undefined, 'Add server to network', jqXHR.responseText);
1554 f533f224 Vangelis Koukis
            } catch (err) {
1555 b8110bae Mike Muzurakis
                ajax_error(0, undefined, 'Add server to network', jqXHR.responseText);
1556 f533f224 Vangelis Koukis
            }
1557 0c578a28 Markos Gogoulos
        },
1558 0c578a28 Markos Gogoulos
        success: function(data, textStatus, jqXHR) {
1559 f533f224 Vangelis Koukis
            if ( jqXHR.status == '202') {
1560 f533f224 Vangelis Koukis
                try {
1561 f533f224 Vangelis Koukis
                    console.info('added server ' + serverID + ' to network ' + networkID);
1562 f533f224 Vangelis Koukis
                } catch(err) {}
1563 82835e06 Christodoulos Psaltis
                // toggle the reboot dialog
1564 f39b36a6 Christodoulos Psaltis
                display_reboot_dialog(networkID, serverID, serverName, serverState);
1565 f533f224 Vangelis Koukis
                // continue with the rest of the servers
1566 f39b36a6 Christodoulos Psaltis
                add_server_to_network(networkID, serverIDs, serverNames, serverStates);
1567 f533f224 Vangelis Koukis
            } else {
1568 ddf929a7 Christodoulos Psaltis
                // close wizard and show error box
1569 ddf929a7 Christodoulos Psaltis
                $("a#add-machines-overlay").data('overlay').close();
1570 f533f224 Vangelis Koukis
                ajax_error(jqXHR.status, undefined, 'Add server to network', jqXHR.responseText);
1571 f533f224 Vangelis Koukis
            }
1572 0c578a28 Markos Gogoulos
        }
1573 0c578a28 Markos Gogoulos
    });
1574 0c578a28 Markos Gogoulos
    return false;
1575 0c578a28 Markos Gogoulos
}
1576 0c578a28 Markos Gogoulos
1577 f39b36a6 Christodoulos Psaltis
function remove_server_from_network(networkIDs, serverIDs, serverNames, serverStates) {
1578 f533f224 Vangelis Koukis
    if (!networkIDs.length){
1579 f533f224 Vangelis Koukis
        //ajax_success('DEFAULT');
1580 f533f224 Vangelis Koukis
        return false;
1581 f533f224 Vangelis Koukis
    }
1582 f533f224 Vangelis Koukis
    // get a network and a server
1583 f533f224 Vangelis Koukis
    var networkID = networkIDs.pop();
1584 f533f224 Vangelis Koukis
    var serverID = serverIDs.pop();
1585 82835e06 Christodoulos Psaltis
    var serverName = serverNames.pop();
1586 f39b36a6 Christodoulos Psaltis
    var serverState = serverStates.pop();
1587 f533f224 Vangelis Koukis
    // prepare payload
1588 f533f224 Vangelis Koukis
    var payload = {
1589 f533f224 Vangelis Koukis
            "remove": { "serverRef": serverID }
1590 f533f224 Vangelis Koukis
        };
1591 f533f224 Vangelis Koukis
    // prepare ajax call
1592 f533f224 Vangelis Koukis
    $.ajax({
1593 f533f224 Vangelis Koukis
        url: API_URL + '/networks/' + networkID + '/action',
1594 f533f224 Vangelis Koukis
        type: "POST",
1595 f533f224 Vangelis Koukis
        contentType: "application/json",
1596 f533f224 Vangelis Koukis
        dataType: "json",
1597 f533f224 Vangelis Koukis
        data: JSON.stringify(payload),
1598 f533f224 Vangelis Koukis
        timeout: TIMEOUT,
1599 f533f224 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
1600 f533f224 Vangelis Koukis
            try {
1601 f533f224 Vangelis Koukis
                ajax_error(jqXHR.status, undefined, 'Remove server form network', jqXHR.responseText);
1602 f533f224 Vangelis Koukis
            } catch (err) {
1603 b8110bae Mike Muzurakis
                ajax_error(0, undefined, 'Remove server form network', jqXHR.responseText);
1604 f533f224 Vangelis Koukis
            }
1605 f533f224 Vangelis Koukis
        },
1606 f533f224 Vangelis Koukis
        success: function(data, textStatus, jqXHR) {
1607 f533f224 Vangelis Koukis
            if ( jqXHR.status == '202') {
1608 f533f224 Vangelis Koukis
                try {
1609 f533f224 Vangelis Koukis
                    console.info('deleted server ' + serverID + ' from network ' + networkID);
1610 f533f224 Vangelis Koukis
                } catch(err) {}
1611 82835e06 Christodoulos Psaltis
                // toggle the reboot dialog
1612 f39b36a6 Christodoulos Psaltis
                display_reboot_dialog(networkID, serverID, serverName, serverState);
1613 f533f224 Vangelis Koukis
                // continue with the rest of the servers
1614 f39b36a6 Christodoulos Psaltis
                remove_server_form_network(networkIDs, serverIDs, serverNames, serverStates);
1615 f533f224 Vangelis Koukis
            } else {
1616 f533f224 Vangelis Koukis
                ajax_error(jqXHR.status, undefined, 'Remove server form network', jqXHR.responseText);
1617 f533f224 Vangelis Koukis
            }
1618 f533f224 Vangelis Koukis
        }
1619 f533f224 Vangelis Koukis
    });
1620 f533f224 Vangelis Koukis
    return false;
1621 f533f224 Vangelis Koukis
}
1622 0c578a28 Markos Gogoulos
1623 6423ba92 Christodoulos Psaltis
function set_firewall(networkID, serverID, profile) {
1624 6423ba92 Christodoulos Psaltis
    if (!networkID.length || !serverID.length || !profile.length){
1625 6423ba92 Christodoulos Psaltis
        return false;
1626 6423ba92 Christodoulos Psaltis
    }
1627 6423ba92 Christodoulos Psaltis
    // prepare payload
1628 6423ba92 Christodoulos Psaltis
    var payload = {
1629 6423ba92 Christodoulos Psaltis
            "firewallProfile": { "profile": profile }
1630 6423ba92 Christodoulos Psaltis
        };
1631 6423ba92 Christodoulos Psaltis
    // prepare ajax call
1632 6423ba92 Christodoulos Psaltis
    $.ajax({
1633 6423ba92 Christodoulos Psaltis
        url: API_URL + '/servers/' + serverID + '/action',
1634 6423ba92 Christodoulos Psaltis
        type: "POST",
1635 6423ba92 Christodoulos Psaltis
        contentType: "application/json",
1636 6423ba92 Christodoulos Psaltis
        dataType: "json",
1637 6423ba92 Christodoulos Psaltis
        data: JSON.stringify(payload),
1638 6423ba92 Christodoulos Psaltis
        timeout: TIMEOUT,
1639 6423ba92 Christodoulos Psaltis
        error: function(jqXHR, textStatus, errorThrown) {
1640 6423ba92 Christodoulos Psaltis
            try {
1641 6423ba92 Christodoulos Psaltis
                ajax_error(jqXHR.status, undefined, 'Set firewall profile', jqXHR.responseText);
1642 6423ba92 Christodoulos Psaltis
            } catch (err) {
1643 6423ba92 Christodoulos Psaltis
                ajax_error(0, undefined, 'Set firewall profile', jqXHR.responseText);
1644 6423ba92 Christodoulos Psaltis
            }
1645 6423ba92 Christodoulos Psaltis
        },
1646 6423ba92 Christodoulos Psaltis
        success: function(data, textStatus, jqXHR) {
1647 6423ba92 Christodoulos Psaltis
            if ( jqXHR.status == '202') {
1648 6423ba92 Christodoulos Psaltis
                try {
1649 6423ba92 Christodoulos Psaltis
                    console.info('for server ' + serverID + ' set firewall profile to ' + profile);
1650 6423ba92 Christodoulos Psaltis
                } catch(err) {}
1651 372f6c81 Mike Muzurakis
                //remove progress gif and toggle the content
1652 d6872a51 Christodoulos Psaltis
                $('div#net-' + networkID + '-server-' + serverID + ' button.firewall-apply').html(VARIOUS["APPLY"]);
1653 d6872a51 Christodoulos Psaltis
                $('div#net-' + networkID + '-server-' + serverID + ' button.firewall-apply').attr("disabled", false);
1654 d6872a51 Christodoulos Psaltis
                $('div#net-' + networkID + '-server-' + serverID + ' div.firewall-header').click();
1655 6423ba92 Christodoulos Psaltis
                // toggle the reboot dialog
1656 d6872a51 Christodoulos Psaltis
                var serverName = $('div#net-' + networkID + '-server-' + serverID + ' div.machine-name-div span.name').text();
1657 d6872a51 Christodoulos Psaltis
                var serverState = $('div#net-' + networkID + '-server-' + serverID + ' img.logo').attr('src').split('-')[1];
1658 372f6c81 Mike Muzurakis
                serverState = serverState.split('.')[0];
1659 372f6c81 Mike Muzurakis
                display_reboot_dialog(networkID, serverID, serverName, serverState);
1660 6423ba92 Christodoulos Psaltis
            } else {
1661 6423ba92 Christodoulos Psaltis
                ajax_error(jqXHR.status, undefined, 'Set firewall profile', jqXHR.responseText);
1662 6423ba92 Christodoulos Psaltis
            }
1663 6423ba92 Christodoulos Psaltis
        }
1664 6423ba92 Christodoulos Psaltis
    });
1665 6423ba92 Christodoulos Psaltis
    return false;
1666 6423ba92 Christodoulos Psaltis
}
1667 6423ba92 Christodoulos Psaltis
1668 6902f72e clopy
// show the welcome screen
1669 6902f72e clopy
function showWelcome() {
1670 f5ebca32 Mike Muzurakis
    $("#view-select").fadeOut("fast");
1671 f5ebca32 Mike Muzurakis
    $("#emptymachineslist").fadeIn("fast");
1672 f0215d6b Mike Muzurakis
    $("#machinesview").hide();
1673 6902f72e clopy
}
1674 6902f72e clopy
1675 6902f72e clopy
// hide the welcome screen
1676 6902f72e clopy
function hideWelcome() {
1677 6902f72e clopy
    $("#emptymachineslist").fadeOut("fast");
1678 6902f72e clopy
    $("#view-select").fadeIn("fast");
1679 ce4f9227 Mike Muzurakis
    $("div#view-select").show();
1680 f0215d6b Mike Muzurakis
    $("#machinesview").show();
1681 f533f224 Vangelis Koukis
}
1682 f533f224 Vangelis Koukis
1683 f533f224 Vangelis Koukis
function log_server_status_change(server_entry, new_status) {
1684 f533f224 Vangelis Koukis
    // firebug console logging
1685 f533f224 Vangelis Koukis
    try {
1686 09828cb5 Mike Muzurakis
        if ($("#machinesview-single").length > 0) {
1687 09828cb5 Mike Muzurakis
            console.info(server_entry.find("div.machine-details div.name").text() +
1688 09828cb5 Mike Muzurakis
                        ' from ' + server_entry.find(".state-label").text() +
1689 09828cb5 Mike Muzurakis
                        ' to ' + STATUSES[new_status]);
1690 09828cb5 Mike Muzurakis
        } else {
1691 09828cb5 Mike Muzurakis
            console.info(server_entry.find("div.name span.name").text() +
1692 09828cb5 Mike Muzurakis
                        ' from ' + server_entry.find(".status").text() +
1693 09828cb5 Mike Muzurakis
                        ' to ' + STATUSES[new_status]);
1694 09828cb5 Mike Muzurakis
        }
1695 f533f224 Vangelis Koukis
    } catch(err) {}
1696 f533f224 Vangelis Koukis
}
1697 f533f224 Vangelis Koukis
1698 f533f224 Vangelis Koukis
function get_flavor_params(flavorRef) {
1699 f533f224 Vangelis Koukis
    var cpus, ram, disk;
1700 f533f224 Vangelis Koukis
    if ( flavors.length > 0 ) {
1701 f533f224 Vangelis Koukis
        var current_flavor = '';
1702 f533f224 Vangelis Koukis
        for (i=0; i<flavors.length; i++) {
1703 f533f224 Vangelis Koukis
            if (flavors[i]['id'] == flavorRef) {
1704 f533f224 Vangelis Koukis
                current_flavor = flavors[i];
1705 f533f224 Vangelis Koukis
            }
1706 f533f224 Vangelis Koukis
        }
1707 f533f224 Vangelis Koukis
        cpus = current_flavor['cpu'];
1708 f533f224 Vangelis Koukis
        ram = current_flavor['ram'];
1709 f533f224 Vangelis Koukis
        disk = current_flavor['disk'];
1710 f533f224 Vangelis Koukis
    } else {
1711 f533f224 Vangelis Koukis
        cpus = 'undefined';
1712 f533f224 Vangelis Koukis
        ram = 'undefined';
1713 f533f224 Vangelis Koukis
        disk = 'undefined';
1714 f533f224 Vangelis Koukis
    }
1715 f533f224 Vangelis Koukis
    return {'cpus': cpus, 'ram': ram, 'disk': disk};
1716 f533f224 Vangelis Koukis
}
1717 f533f224 Vangelis Koukis
1718 f533f224 Vangelis Koukis
function get_image_params(imageRef) {
1719 f533f224 Vangelis Koukis
    var image_name, image_size;
1720 f533f224 Vangelis Koukis
    if ( images.length > 0 ) {
1721 f533f224 Vangelis Koukis
        var current_image = '';
1722 f533f224 Vangelis Koukis
        for (i=0; i<images.length; i++) {
1723 f533f224 Vangelis Koukis
            if (images[i]['id'] == imageRef) {
1724 f533f224 Vangelis Koukis
                current_image = images[i];
1725 f533f224 Vangelis Koukis
            }
1726 f533f224 Vangelis Koukis
        }
1727 7ffea202 Dimitris Moraitis
        try {
1728 7ffea202 Dimitris Moraitis
            image_name = current_image['name'];
1729 7ffea202 Dimitris Moraitis
        } catch(err) { image_name = 'undefined'; }
1730 7ffea202 Dimitris Moraitis
        try{
1731 7ffea202 Dimitris Moraitis
            image_size = current_image['metadata']['values']['size'];
1732 7ffea202 Dimitris Moraitis
        } catch(err) { image_size = 'undefined'; }
1733 f533f224 Vangelis Koukis
    } else {
1734 f533f224 Vangelis Koukis
        image_name = 'undefined';
1735 f533f224 Vangelis Koukis
        image_size = 'undefined';
1736 f533f224 Vangelis Koukis
    }
1737 f533f224 Vangelis Koukis
    return {'name': image_name,'size': image_size};
1738 f533f224 Vangelis Koukis
}
1739 f533f224 Vangelis Koukis
1740 f533f224 Vangelis Koukis
function get_public_ips(server) {
1741 f533f224 Vangelis Koukis
    var ip4, ip6;
1742 f533f224 Vangelis Koukis
    try {
1743 f533f224 Vangelis Koukis
        if (server.addresses.values) {
1744 f533f224 Vangelis Koukis
            $.each (server.addresses.values, function(i, value) {
1745 f533f224 Vangelis Koukis
                if (value.id == 'public') {
1746 f533f224 Vangelis Koukis
                    try {
1747 f533f224 Vangelis Koukis
                        $.each (value.values, function(i, ip) {
1748 f533f224 Vangelis Koukis
                            if (ip.version == '4') {
1749 f533f224 Vangelis Koukis
                                ip4 = ip.addr;
1750 f533f224 Vangelis Koukis
                            } else if (ip.version == '6') {
1751 f533f224 Vangelis Koukis
                                ip6 = ip.addr;
1752 f533f224 Vangelis Koukis
                            } else {
1753 ffbf30f9 Kostas Papadimitriou
                                ip4 = 'pending';
1754 ffbf30f9 Kostas Papadimitriou
                                ip6 = 'pending';
1755 f533f224 Vangelis Koukis
                            }
1756 f533f224 Vangelis Koukis
                        });
1757 f533f224 Vangelis Koukis
                    } catch (err){
1758 f533f224 Vangelis Koukis
                        try{console.info('Server ' + server.id + ' has invalid ips')}catch(err){};
1759 ffbf30f9 Kostas Papadimitriou
                        ip4 = 'pending';
1760 ffbf30f9 Kostas Papadimitriou
                        ip6 = 'pending';
1761 f533f224 Vangelis Koukis
                    }
1762 f533f224 Vangelis Koukis
                }
1763 f533f224 Vangelis Koukis
            });
1764 f533f224 Vangelis Koukis
        }
1765 f533f224 Vangelis Koukis
    } catch (err) {
1766 f533f224 Vangelis Koukis
        try{console.info('Server ' + server.id + ' has no network addresses')}catch(err){};
1767 ffbf30f9 Kostas Papadimitriou
        ip4 = 'pending';
1768 ffbf30f9 Kostas Papadimitriou
        ip6 = 'pending';
1769 f533f224 Vangelis Koukis
    }
1770 f533f224 Vangelis Koukis
    return {'ip4': ip4, 'ip6': ip6};
1771 6902f72e clopy
}
1772 6902f72e clopy
1773 f533f224 Vangelis Koukis
function get_private_ips(server) {
1774 f533f224 Vangelis Koukis
1775 f533f224 Vangelis Koukis
}
1776 716c3ead Dimitris Moraitis
1777 716c3ead Dimitris Moraitis
function close_all_overlays() {
1778 716c3ead Dimitris Moraitis
        try {
1779 716c3ead Dimitris Moraitis
                $("a#networkscreate").overlay().close();
1780 716c3ead Dimitris Moraitis
        } catch(err) {}
1781 716c3ead Dimitris Moraitis
        try {
1782 716c3ead Dimitris Moraitis
                $('a#create').overlay().close();
1783 716c3ead Dimitris Moraitis
        } catch(err) {}
1784 716c3ead Dimitris Moraitis
        try {
1785 716c3ead Dimitris Moraitis
                $("a#add-machines-overlay").overlay().close();
1786 716c3ead Dimitris Moraitis
        } catch(err) {}
1787 716c3ead Dimitris Moraitis
        try {
1788 716c3ead Dimitris Moraitis
                $("a#metadata-scrollable").overlay().close();
1789 82835e06 Christodoulos Psaltis
        } catch(err) {}
1790 d1e14e2c Mike Muzurakis
}
1791 a583aa29 Kostas Papadimitriou
1792 af6fc929 Kostas Papadimitriou
// logout
1793 af6fc929 Kostas Papadimitriou
function user_session_logout() {
1794 af6fc929 Kostas Papadimitriou
    $.cookie("X-Auth-Token", null);
1795 8e5122dd Kostas Papadimitriou
    if (window.LOGOUT_REDIRECT !== undefined)
1796 8e5122dd Kostas Papadimitriou
    {
1797 8e5122dd Kostas Papadimitriou
        window.location = window.LOGOUT_REDIRECT;
1798 8e5122dd Kostas Papadimitriou
    } else {
1799 8e5122dd Kostas Papadimitriou
        window.location.reload();
1800 8e5122dd Kostas Papadimitriou
    }
1801 af6fc929 Kostas Papadimitriou
}
1802 af6fc929 Kostas Papadimitriou
1803 a583aa29 Kostas Papadimitriou
// action indicators
1804 a583aa29 Kostas Papadimitriou
function init_action_indicator_handlers(machines_view)
1805 a583aa29 Kostas Papadimitriou
{
1806 70eab221 Kostas Papadimitriou
    // init once for each view
1807 70eab221 Kostas Papadimitriou
    if (window.ACTION_ICON_HANDLERS == undefined)
1808 70eab221 Kostas Papadimitriou
    {
1809 70eab221 Kostas Papadimitriou
        window.ACTION_ICON_HANDLERS = {};
1810 70eab221 Kostas Papadimitriou
    }
1811 70eab221 Kostas Papadimitriou
1812 70eab221 Kostas Papadimitriou
    if (machines_view in window.ACTION_ICON_HANDLERS)
1813 70eab221 Kostas Papadimitriou
    {
1814 70eab221 Kostas Papadimitriou
        return;
1815 70eab221 Kostas Papadimitriou
    }
1816 70eab221 Kostas Papadimitriou
    window.ACTION_ICON_HANDLERS[machines_view] = 1;
1817 23ca3bc9 Christodoulos Psaltis
1818 a583aa29 Kostas Papadimitriou
    if (machines_view == "list")
1819 23ca3bc9 Christodoulos Psaltis
    {
1820 a583aa29 Kostas Papadimitriou
        // totally different logic for list view
1821 a583aa29 Kostas Papadimitriou
        init_action_indicator_list_handlers();
1822 a583aa29 Kostas Papadimitriou
        return;
1823 a583aa29 Kostas Papadimitriou
    }
1824 23ca3bc9 Christodoulos Psaltis
1825 cce434fc Kostas Papadimitriou
    function update_action_icon_indicators(force)
1826 23ca3bc9 Christodoulos Psaltis
    {
1827 cce434fc Kostas Papadimitriou
        function show(el, action) {
1828 cce434fc Kostas Papadimitriou
            $(".action-indicator", $(el)).attr("class", "action-indicator " + action);
1829 cce434fc Kostas Papadimitriou
            $(".action-indicator", $(el)).show();
1830 cce434fc Kostas Papadimitriou
        }
1831 cce434fc Kostas Papadimitriou
1832 23ca3bc9 Christodoulos Psaltis
        function hide(el) {
1833 cce434fc Kostas Papadimitriou
            $(".action-indicator", $(el)).hide();
1834 cce434fc Kostas Papadimitriou
        }
1835 23ca3bc9 Christodoulos Psaltis
1836 cce434fc Kostas Papadimitriou
        function get_pending_actions(el) {
1837 cce434fc Kostas Papadimitriou
            return $(".confirm_single:visible", $(el));
1838 cce434fc Kostas Papadimitriou
        }
1839 23ca3bc9 Christodoulos Psaltis
1840 cce434fc Kostas Papadimitriou
        function other_indicators(el) {
1841 cce434fc Kostas Papadimitriou
           return $("img.wave:visible, img.spinner:visible", $(el))
1842 cce434fc Kostas Papadimitriou
        }
1843 23ca3bc9 Christodoulos Psaltis
1844 cce434fc Kostas Papadimitriou
        $("div.machine:visible, div.single-container").each(function(index, el){
1845 cce434fc Kostas Papadimitriou
            var el = $(el);
1846 cce434fc Kostas Papadimitriou
            var pending = get_pending_actions(el);
1847 cce434fc Kostas Papadimitriou
            var other = other_indicators(el);
1848 cce434fc Kostas Papadimitriou
            var action = undefined;
1849 cce434fc Kostas Papadimitriou
            var force_action = force;
1850 cce434fc Kostas Papadimitriou
            var visible = $(el).css("display") == "block";
1851 cce434fc Kostas Papadimitriou
1852 cce434fc Kostas Papadimitriou
            if (force_action !==undefined && force_action.el !== el[0]) {
1853 cce434fc Kostas Papadimitriou
                // force action for other vm
1854 cce434fc Kostas Papadimitriou
                // skipping force action
1855 cce434fc Kostas Papadimitriou
                force_action = undefined;
1856 cce434fc Kostas Papadimitriou
            }
1857 23ca3bc9 Christodoulos Psaltis
1858 cce434fc Kostas Papadimitriou
            if (force_action !==undefined && force_action.el === el[0]) {
1859 cce434fc Kostas Papadimitriou
                action = force_action.action;
1860 cce434fc Kostas Papadimitriou
            }
1861 cce434fc Kostas Papadimitriou
1862 cce434fc Kostas Papadimitriou
            if (other.length >= 1) {
1863 cce434fc Kostas Papadimitriou
                return;
1864 cce434fc Kostas Papadimitriou
            }
1865 cce434fc Kostas Papadimitriou
1866 23ca3bc9 Christodoulos Psaltis
            if (pending.length >= 1 && force_action === undefined) {
1867 cce434fc Kostas Papadimitriou
                action = $(pending.parent()).attr("class").replace("action-container","");
1868 cce434fc Kostas Papadimitriou
            }
1869 23ca3bc9 Christodoulos Psaltis
1870 cce434fc Kostas Papadimitriou
            if (action in {'console':''}) {
1871 cce434fc Kostas Papadimitriou
                return;
1872 cce434fc Kostas Papadimitriou
            }
1873 23ca3bc9 Christodoulos Psaltis
1874 cce434fc Kostas Papadimitriou
            if (action !== undefined) {
1875 cce434fc Kostas Papadimitriou
                show(el, action);
1876 cce434fc Kostas Papadimitriou
            } else {
1877 23ca3bc9 Christodoulos Psaltis
                try {
1878 cce434fc Kostas Papadimitriou
                    if (el.attr('id') == pending_actions[0][1])
1879 cce434fc Kostas Papadimitriou
                    {
1880 23ca3bc9 Christodoulos Psaltis
                        return;
1881 cce434fc Kostas Papadimitriou
                    }
1882 cce434fc Kostas Papadimitriou
                } catch (err) {
1883 cce434fc Kostas Papadimitriou
                }
1884 cce434fc Kostas Papadimitriou
                hide(el);
1885 cce434fc Kostas Papadimitriou
            }
1886 cce434fc Kostas Papadimitriou
1887 cce434fc Kostas Papadimitriou
        });
1888 a583aa29 Kostas Papadimitriou
    }
1889 a583aa29 Kostas Papadimitriou
1890 a583aa29 Kostas Papadimitriou
    // action indicators
1891 cce434fc Kostas Papadimitriou
    $(".action-container").live('mouseover', function(evn) {
1892 cce434fc Kostas Papadimitriou
        force_action = {'el': $(evn.currentTarget).parent().parent()[0], 'action':$(evn.currentTarget).attr("class").replace("action-container","")};
1893 70eab221 Kostas Papadimitriou
        // single view case
1894 cce434fc Kostas Papadimitriou
        if ($(force_action.el).attr("class") == "upper")
1895 a583aa29 Kostas Papadimitriou
        {
1896 cce434fc Kostas Papadimitriou
            force_action.el = $(evn.currentTarget).parent().parent().parent()[0]
1897 cce434fc Kostas Papadimitriou
        };
1898 cce434fc Kostas Papadimitriou
        update_action_icon_indicators(force_action);
1899 a583aa29 Kostas Papadimitriou
    });
1900 a583aa29 Kostas Papadimitriou
1901 70eab221 Kostas Papadimitriou
    $("img.spinner, img.wave").live('hide', function(){
1902 70eab221 Kostas Papadimitriou
        update_action_icon_indicators();
1903 70eab221 Kostas Papadimitriou
    });
1904 cce434fc Kostas Papadimitriou
    // register events where icons should get updated
1905 cce434fc Kostas Papadimitriou
1906 a583aa29 Kostas Papadimitriou
    // hide action indicator image on mouse out, spinner appear, wave appear
1907 a583aa29 Kostas Papadimitriou
    $(".action-container").live("mouseout", function(evn){
1908 cce434fc Kostas Papadimitriou
        update_action_icon_indicators();
1909 cce434fc Kostas Papadimitriou
    });
1910 a583aa29 Kostas Papadimitriou
1911 cce434fc Kostas Papadimitriou
    $(".confirm_single").live("click", function(evn){
1912 cce434fc Kostas Papadimitriou
        update_action_icon_indicators();
1913 a583aa29 Kostas Papadimitriou
    });
1914 a583aa29 Kostas Papadimitriou
1915 a583aa29 Kostas Papadimitriou
    $("img.spinner, img.wave").live('show', function(){
1916 a583aa29 Kostas Papadimitriou
        $("div.action-indicator").hide();
1917 a583aa29 Kostas Papadimitriou
    });
1918 cce434fc Kostas Papadimitriou
1919 cce434fc Kostas Papadimitriou
    $(".confirm_single button.no").live('click', function(evn){
1920 cce434fc Kostas Papadimitriou
        $("div.action-indicator", $(evn.currentTarget).parent().parent()).hide();
1921 cce434fc Kostas Papadimitriou
    });
1922 cce434fc Kostas Papadimitriou
1923 cce434fc Kostas Papadimitriou
    $(".confirm_multiple button.no").click(function(){
1924 cce434fc Kostas Papadimitriou
        $("div.action-indicator").hide();
1925 cce434fc Kostas Papadimitriou
    });
1926 cce434fc Kostas Papadimitriou
1927 cce434fc Kostas Papadimitriou
    $(".confirm_multiple button.yes").click(function(){
1928 cce434fc Kostas Papadimitriou
        $("div.action-indicator").hide();
1929 cce434fc Kostas Papadimitriou
    });
1930 a583aa29 Kostas Papadimitriou
}
1931 a583aa29 Kostas Papadimitriou
1932 a583aa29 Kostas Papadimitriou
function init_action_indicator_list_handlers()
1933 23ca3bc9 Christodoulos Psaltis
{
1934 a583aa29 Kostas Papadimitriou
    var skip_actions = { 'console':'','connect':'','details':'' };
1935 a583aa29 Kostas Papadimitriou
1936 a583aa29 Kostas Papadimitriou
    var has_pending_confirmation = function()
1937 a583aa29 Kostas Papadimitriou
    {
1938 a583aa29 Kostas Papadimitriou
        return $(".confirm_multiple:visible").length >= 1
1939 a583aa29 Kostas Papadimitriou
    }
1940 23ca3bc9 Christodoulos Psaltis
1941 a583aa29 Kostas Papadimitriou
    function update_action_indicator_icons(force_action, skip_pending)
1942 23ca3bc9 Christodoulos Psaltis
    {
1943 a583aa29 Kostas Papadimitriou
        // pending action based on the element class
1944 a583aa29 Kostas Papadimitriou
        var pending_action = $(".selected", $(".actions"))[0];
1945 a583aa29 Kostas Papadimitriou
        var selected = get_list_view_selected_machine_rows();
1946 a583aa29 Kostas Papadimitriou
1947 a583aa29 Kostas Papadimitriou
        // reset previous state
1948 a583aa29 Kostas Papadimitriou
        list_view_hide_action_indicators();
1949 23ca3bc9 Christodoulos Psaltis
1950 a583aa29 Kostas Papadimitriou
        if (pending_action == undefined && !force_action)
1951 a583aa29 Kostas Papadimitriou
        {
1952 a583aa29 Kostas Papadimitriou
            // no action selected
1953 a583aa29 Kostas Papadimitriou
            return;
1954 a583aa29 Kostas Papadimitriou
        }
1955 23ca3bc9 Christodoulos Psaltis
1956 a583aa29 Kostas Papadimitriou
        if (force_action != undefined)
1957 a583aa29 Kostas Papadimitriou
        {
1958 a583aa29 Kostas Papadimitriou
            // user forced action choice
1959 a583aa29 Kostas Papadimitriou
            var action_class = force_action;
1960 a583aa29 Kostas Papadimitriou
        } else {
1961 a583aa29 Kostas Papadimitriou
            // retrieve action name (reboot, stop, etc..)
1962 a583aa29 Kostas Papadimitriou
            var action_class = $(pending_action).attr("id").replace("action-","");
1963 a583aa29 Kostas Papadimitriou
        }
1964 a583aa29 Kostas Papadimitriou
1965 a583aa29 Kostas Papadimitriou
        selected.each(function(index, el) {
1966 a583aa29 Kostas Papadimitriou
            if (has_pending_confirmation() && skip_pending)
1967 a583aa29 Kostas Papadimitriou
            {
1968 a583aa29 Kostas Papadimitriou
                return;
1969 a583aa29 Kostas Papadimitriou
            }
1970 a583aa29 Kostas Papadimitriou
            var el = $(el);
1971 a583aa29 Kostas Papadimitriou
            var logo = $("img.list-logo", el);
1972 a583aa29 Kostas Papadimitriou
            $(".action-indicator", el).remove();
1973 a583aa29 Kostas Papadimitriou
            var cls = "action-indicator " + action_class;
1974 a583aa29 Kostas Papadimitriou
            // add icon div
1975 a583aa29 Kostas Papadimitriou
            logo.after('<div class="' + cls + '"></div>');
1976 a583aa29 Kostas Papadimitriou
            // hide os logo
1977 a583aa29 Kostas Papadimitriou
            $("img.list-logo", el).hide();
1978 a583aa29 Kostas Papadimitriou
        });
1979 23ca3bc9 Christodoulos Psaltis
    }
1980 23ca3bc9 Christodoulos Psaltis
1981 a583aa29 Kostas Papadimitriou
    // on mouseover we force the images to the hovered action
1982 a583aa29 Kostas Papadimitriou
    $(".actions a").live("mouseover", function(evn) {
1983 a583aa29 Kostas Papadimitriou
        var el = $(evn.currentTarget);
1984 a583aa29 Kostas Papadimitriou
        if (!el.hasClass("enabled"))
1985 23ca3bc9 Christodoulos Psaltis
        {
1986 a583aa29 Kostas Papadimitriou
            return;
1987 a583aa29 Kostas Papadimitriou
        }
1988 a583aa29 Kostas Papadimitriou
        var action_class = el.attr("id").replace("action-","");
1989 a583aa29 Kostas Papadimitriou
        if (action_class in skip_actions)
1990 a583aa29 Kostas Papadimitriou
        {
1991 a583aa29 Kostas Papadimitriou
            return;
1992 a583aa29 Kostas Papadimitriou
        }
1993 a583aa29 Kostas Papadimitriou
        update_action_indicator_icons(action_class, false);
1994 a583aa29 Kostas Papadimitriou
    });
1995 23ca3bc9 Christodoulos Psaltis
1996 cce434fc Kostas Papadimitriou
1997 cce434fc Kostas Papadimitriou
    // register events where icons should get updated
1998 b35cda16 Kostas Papadimitriou
    $(".actions a.enabled").live("click", function(evn) {
1999 b35cda16 Kostas Papadimitriou
        // clear previous selections
2000 b35cda16 Kostas Papadimitriou
        $("a.selected").removeClass("selected");
2001 b35cda16 Kostas Papadimitriou
2002 a583aa29 Kostas Papadimitriou
        var el = $(evn.currentTarget);
2003 a583aa29 Kostas Papadimitriou
        el.addClass("selected");
2004 a583aa29 Kostas Papadimitriou
        update_action_indicator_icons(undefined, false);
2005 a583aa29 Kostas Papadimitriou
    });
2006 a583aa29 Kostas Papadimitriou
2007 a583aa29 Kostas Papadimitriou
    $(".actions a").live("mouseout", function(evn) {
2008 a583aa29 Kostas Papadimitriou
        update_action_indicator_icons(undefined, false);
2009 a583aa29 Kostas Papadimitriou
    });
2010 23ca3bc9 Christodoulos Psaltis
2011 a583aa29 Kostas Papadimitriou
    $(".confirm_multiple button.no").click(function(){
2012 a583aa29 Kostas Papadimitriou
        list_view_hide_action_indicators();
2013 a583aa29 Kostas Papadimitriou
    });
2014 a583aa29 Kostas Papadimitriou
2015 a583aa29 Kostas Papadimitriou
    $(".confirm_multiple button.yes").click(function(){
2016 a583aa29 Kostas Papadimitriou
        list_view_hide_action_indicators();
2017 a583aa29 Kostas Papadimitriou
    });
2018 23ca3bc9 Christodoulos Psaltis
2019 a583aa29 Kostas Papadimitriou
    $("input[type=checkbox]").live('change', function(){
2020 a583aa29 Kostas Papadimitriou
        // pending_actions will become empty on every checkbox click/change
2021 a583aa29 Kostas Papadimitriou
        // line 154 machines_list.html
2022 a583aa29 Kostas Papadimitriou
        pending_actions = [];
2023 a583aa29 Kostas Papadimitriou
        if (pending_actions.length == 0)
2024 a583aa29 Kostas Papadimitriou
        {
2025 a583aa29 Kostas Papadimitriou
            $(".confirm_multiple").hide();
2026 23ca3bc9 Christodoulos Psaltis
            $("a.selected").each(function(index, el){$(el).removeClass("selected")});
2027 a583aa29 Kostas Papadimitriou
        }
2028 a583aa29 Kostas Papadimitriou
        update_action_indicator_icons(undefined, false);
2029 a583aa29 Kostas Papadimitriou
    });
2030 23ca3bc9 Christodoulos Psaltis
2031 a583aa29 Kostas Papadimitriou
}
2032 a583aa29 Kostas Papadimitriou
2033 a583aa29 Kostas Papadimitriou
function list_view_hide_action_indicators()
2034 a583aa29 Kostas Papadimitriou
{
2035 a583aa29 Kostas Papadimitriou
    $("tr td .action-indicator").remove();
2036 a583aa29 Kostas Papadimitriou
    $("tr td img.list-logo").show();
2037 a583aa29 Kostas Papadimitriou
}
2038 a583aa29 Kostas Papadimitriou
2039 a583aa29 Kostas Papadimitriou
function get_list_view_selected_machine_rows()
2040 23ca3bc9 Christodoulos Psaltis
{
2041 a583aa29 Kostas Papadimitriou
    var table = $("table.list-machines");
2042 a583aa29 Kostas Papadimitriou
    var rows = $("tr:has(input[type=checkbox]:checked)",table);
2043 a583aa29 Kostas Papadimitriou
    return rows;
2044 a583aa29 Kostas Papadimitriou
}
2045 7af53e78 Kostas Papadimitriou
2046 7af53e78 Kostas Papadimitriou
// machines images utils
2047 7af53e78 Kostas Papadimitriou
function set_machine_os_image(machine, machines_view, state, os, skip_reset_states, remove_state) {
2048 7af53e78 Kostas Papadimitriou
    var views_map = {'single': '.single-image', 'icon': '.logo'};
2049 7af53e78 Kostas Papadimitriou
    var states_map = {'on': 'state1', 'off': 'state3', 'hover': 'state4', 'click': 'state2'}
2050 7af53e78 Kostas Papadimitriou
    var sizes_map = {'single': 'large', 'icon': 'medium'}
2051 7af53e78 Kostas Papadimitriou
2052 7af53e78 Kostas Papadimitriou
    var size = sizes_map[machines_view];
2053 7af53e78 Kostas Papadimitriou
    var img_selector = views_map[machines_view];
2054 7af53e78 Kostas Papadimitriou
    var cls = states_map[state];
2055 40e77a49 Kostas Papadimitriou
2056 40e77a49 Kostas Papadimitriou
    if (os === "unknown") { os = "okeanos" } ;
2057 7af53e78 Kostas Papadimitriou
    var new_img = 'url("./static/icons/machines/' + size + '/' + os + '-sprite.png")';
2058 7af53e78 Kostas Papadimitriou
2059 7af53e78 Kostas Papadimitriou
    var el = $(img_selector, machine);
2060 7af53e78 Kostas Papadimitriou
    var current_img = el.css("backgroundImage");
2061 7af53e78 Kostas Papadimitriou
    if (os == undefined){
2062 7af53e78 Kostas Papadimitriou
        new_img = current_img;
2063 7af53e78 Kostas Papadimitriou
    }
2064 7af53e78 Kostas Papadimitriou
2065 7af53e78 Kostas Papadimitriou
    // os changed
2066 7af53e78 Kostas Papadimitriou
    el.css("backgroundImage", new_img);
2067 7af53e78 Kostas Papadimitriou
2068 7af53e78 Kostas Papadimitriou
    // reset current state
2069 7af53e78 Kostas Papadimitriou
    if (skip_reset_states === undefined)
2070 7af53e78 Kostas Papadimitriou
    {
2071 7af53e78 Kostas Papadimitriou
        el.removeClass("single-image-state1");
2072 7af53e78 Kostas Papadimitriou
        el.removeClass("single-image-state2");
2073 7af53e78 Kostas Papadimitriou
        el.removeClass("single-image-state3");
2074 23a4a31b Kostas Papadimitriou
        el.removeClass("single-image-state4");
2075 7af53e78 Kostas Papadimitriou
    }
2076 7af53e78 Kostas Papadimitriou
2077 7af53e78 Kostas Papadimitriou
    if (remove_state !== undefined)
2078 7af53e78 Kostas Papadimitriou
    {
2079 7af53e78 Kostas Papadimitriou
        remove_state = "single-image-" + states_map[remove_state];
2080 7af53e78 Kostas Papadimitriou
        el.removeClass(remove_state);
2081 7af53e78 Kostas Papadimitriou
        return;
2082 7af53e78 Kostas Papadimitriou
    }
2083 7af53e78 Kostas Papadimitriou
    
2084 7af53e78 Kostas Papadimitriou
    // set proper state
2085 7af53e78 Kostas Papadimitriou
    el.addClass("single-image-" + cls);
2086 7af53e78 Kostas Papadimitriou
}
2087 7af53e78 Kostas Papadimitriou
2088 29772683 Kostas Papadimitriou
2089 29772683 Kostas Papadimitriou
// generic info box
2090 29772683 Kostas Papadimitriou
2091 29772683 Kostas Papadimitriou
function msg_box(config) {
2092 29772683 Kostas Papadimitriou
    var config = $.extend({'title':'Info message', 'content': 'this is an info message', 'ajax': false, 'extra':false}, config);
2093 29772683 Kostas Papadimitriou
    // prepare the error message
2094 29772683 Kostas Papadimitriou
    // bring up success notification
2095 29772683 Kostas Papadimitriou
2096 29772683 Kostas Papadimitriou
    var box = $("#notification-box");
2097 29772683 Kostas Papadimitriou
    box.addClass('success');
2098 29772683 Kostas Papadimitriou
    box.removeClass('error');
2099 29772683 Kostas Papadimitriou
2100 9eefb3a2 Kostas Papadimitriou
    var sel = function(s){return $(s, box)};
2101 29772683 Kostas Papadimitriou
2102 29772683 Kostas Papadimitriou
    sel("h3 span.header-box").text(config.title);
2103 29772683 Kostas Papadimitriou
    sel("div.machine-now-building").html(config.content);
2104 29772683 Kostas Papadimitriou
    sel(".popup-header").removeClass("popup-header-error");
2105 29772683 Kostas Papadimitriou
    box.removeClass("popup-border-error");
2106 29772683 Kostas Papadimitriou
    sel(".popup-details").removeClass("popup-details-error");
2107 29772683 Kostas Papadimitriou
    sel(".popup-separator").removeClass("popup-separator-error");
2108 29772683 Kostas Papadimitriou
    
2109 29772683 Kostas Papadimitriou
    sel(".password-container").hide();
2110 29772683 Kostas Papadimitriou
    if (config.extra) {
2111 29772683 Kostas Papadimitriou
        sel(".password-container .password").html(config.extra);
2112 29772683 Kostas Papadimitriou
        sel(".password-container").show();
2113 29772683 Kostas Papadimitriou
    }
2114 29772683 Kostas Papadimitriou
2115 29772683 Kostas Papadimitriou
    var triggers = $("a#msgbox").overlay({
2116 29772683 Kostas Papadimitriou
        // some mask tweaks suitable for modal dialogs
2117 29772683 Kostas Papadimitriou
        mask: '#666',
2118 29772683 Kostas Papadimitriou
        top: 'center',
2119 29772683 Kostas Papadimitriou
        closeOnClick: false,
2120 29772683 Kostas Papadimitriou
        oneInstance: false,
2121 29772683 Kostas Papadimitriou
        load: false,
2122 29772683 Kostas Papadimitriou
        onClose: function () {
2123 29772683 Kostas Papadimitriou
            // With partial refresh working properly,
2124 29772683 Kostas Papadimitriou
            // it is no longer necessary to refresh the whole page
2125 29772683 Kostas Papadimitriou
            // choose_view();
2126 29772683 Kostas Papadimitriou
        }
2127 29772683 Kostas Papadimitriou
    });
2128 29772683 Kostas Papadimitriou
    $("a#msgbox").data('overlay').load();
2129 29772683 Kostas Papadimitriou
    
2130 29772683 Kostas Papadimitriou
    var parse_data = config.parse_data || false;
2131 19e01943 Kostas Papadimitriou
    var load_html = config.html || false;
2132 19e01943 Kostas Papadimitriou
    var user_success = config.success || false;
2133 19e01943 Kostas Papadimitriou
    config.ajax = config.ajax || {};
2134 19e01943 Kostas Papadimitriou
2135 19e01943 Kostas Papadimitriou
    // requested to show remote data in msg_box
2136 29772683 Kostas Papadimitriou
    if (config.ajax) {
2137 19e01943 Kostas Papadimitriou
        $.ajax($.extend({ 
2138 29772683 Kostas Papadimitriou
            url:config.ajax, 
2139 29772683 Kostas Papadimitriou
            success: function(data){
2140 19e01943 Kostas Papadimitriou
                // we want to get our data parsed before
2141 19e01943 Kostas Papadimitriou
                // placing them in content
2142 29772683 Kostas Papadimitriou
                if (parse_data) {
2143 29772683 Kostas Papadimitriou
                    data = parse_data(data);
2144 29772683 Kostas Papadimitriou
                }
2145 29772683 Kostas Papadimitriou
2146 19e01943 Kostas Papadimitriou
                // no json response
2147 19e01943 Kostas Papadimitriou
                // load html body
2148 19e01943 Kostas Papadimitriou
                if (load_html) {
2149 19e01943 Kostas Papadimitriou
                    sel("div.machine-now-building").html(data);
2150 19e01943 Kostas Papadimitriou
                    sel("div.machine-now-building").html(data);
2151 19e01943 Kostas Papadimitriou
                } else {
2152 29772683 Kostas Papadimitriou
2153 19e01943 Kostas Papadimitriou
                    if (data.title)
2154 19e01943 Kostas Papadimitriou
                        sel("h3 span.header-box").text(data.title);
2155 29772683 Kostas Papadimitriou
2156 19e01943 Kostas Papadimitriou
                    if (data.content) {
2157 19e01943 Kostas Papadimitriou
                        sel("div.machine-now-building").html(data.content);
2158 19e01943 Kostas Papadimitriou
                    }
2159 19e01943 Kostas Papadimitriou
                    if (data.extra) {
2160 19e01943 Kostas Papadimitriou
                        sel(".password-container .password").html(data.extra);
2161 19e01943 Kostas Papadimitriou
                        sel(".password-container").show();
2162 19e01943 Kostas Papadimitriou
                    }
2163 29772683 Kostas Papadimitriou
                }
2164 19e01943 Kostas Papadimitriou
2165 19e01943 Kostas Papadimitriou
                if (user_success) {
2166 19e01943 Kostas Papadimitriou
                    user_success($("div.machine-now-building"));
2167 19e01943 Kostas Papadimitriou
                }
2168 19e01943 Kostas Papadimitriou
            },
2169 19e01943 Kostas Papadimitriou
        }, config.ajax_config));
2170 29772683 Kostas Papadimitriou
    }
2171 29772683 Kostas Papadimitriou
    return false;
2172 29772683 Kostas Papadimitriou
}
2173 19e01943 Kostas Papadimitriou
2174 19e01943 Kostas Papadimitriou
2175 19e01943 Kostas Papadimitriou
function show_invitations() {
2176 19e01943 Kostas Papadimitriou
2177 19e01943 Kostas Papadimitriou
    handle_invitations = function(el) {
2178 19e01943 Kostas Papadimitriou
        el.addClass("invitations");
2179 19e01943 Kostas Papadimitriou
        var cont = el;
2180 19e01943 Kostas Papadimitriou
        var form = $(el).find("form");
2181 f2141829 Kostas Papadimitriou
2182 f2141829 Kostas Papadimitriou
        // remove garbage rows that stay in DOM between requests
2183 f2141829 Kostas Papadimitriou
        $(".removable-field-row:hidden").remove();
2184 19e01943 Kostas Papadimitriou
        $("#invform #removable-name-container-1").dynamicField();
2185 19e01943 Kostas Papadimitriou
        form.submit(function(evn){
2186 19e01943 Kostas Papadimitriou
            evn.preventDefault();
2187 f2141829 Kostas Papadimitriou
            $.post(form.attr("action"), form.serialize(), function(data) {
2188 f2141829 Kostas Papadimitriou
                $(cont).html(data); 
2189 f2141829 Kostas Papadimitriou
                handle_invitations(cont);
2190 f2141829 Kostas Papadimitriou
            });
2191 19e01943 Kostas Papadimitriou
            return false;
2192 19e01943 Kostas Papadimitriou
        });
2193 19e01943 Kostas Papadimitriou
    }
2194 19e01943 Kostas Papadimitriou
    msg_box({title:window.INVITATIONS_TITLE, content:'', ajax:INVITATIONS_URL, html:true, success: function(el){ 
2195 19e01943 Kostas Papadimitriou
        handle_invitations(el)}
2196 19e01943 Kostas Papadimitriou
    });
2197 19e01943 Kostas Papadimitriou
}