Statistics
| Branch: | Tag: | Revision:

root / ui / static / synnefo.js @ deb9d144

History | View | Annotate | Download (43.8 kB)

1 22afb635 Vangelis Koukis
var API_URL = "/api/v1.1";
2 f533f224 Vangelis Koukis
var changes_since = 0, deferred = 0, update_request = false, load_request = false, pending_actions = [];
3 f533f224 Vangelis Koukis
var flavors = [], images = [], servers = [], disks = [], cpus = [], ram = [];
4 f533f224 Vangelis Koukis
var networks = [], networks_changes_since = 0;
5 f533f224 Vangelis Koukis
6 146b6003 Dimitris Moraitis
7 f533f224 Vangelis Koukis
//FIXME: authentication
8 be066a83 Markos Gogoulos
//if cookie with value X-Auth-Token exists, set the value on the headers.
9 d994d118 Markos Gogoulos
    $.ajaxSetup({
10 8b17cf6e Markos Gogoulos
        'beforeSend': function(xhr) {
11 89b6b240 Georgios Gousios
            //if ($.cookie("X-Auth-Token") != null) {
12 be066a83 Markos Gogoulos
              xhr.setRequestHeader("X-Auth-Token", $.cookie("X-Auth-Token"));
13 89b6b240 Georgios Gousios
            //} else {
14 89b6b240 Georgios Gousios
            //    $.cookie("X-Auth-Token", "46e427d657b20defe352804f0eb6f8a2"); // set X-Auth-Token cookie
15 89b6b240 Georgios Gousios
            //}
16 8b17cf6e Markos Gogoulos
        }
17 d994d118 Markos Gogoulos
    });
18 d994d118 Markos Gogoulos
19 c5a032c4 Markos Gogoulos
function ISODateString(d){
20 b02144c8 Vangelis Koukis
    //return a date in an ISO 8601 format using UTC.
21 c5a032c4 Markos Gogoulos
    //do not include time zone info (Z) at the end
22 b02144c8 Vangelis Koukis
    //taken from the Mozilla Developer Center
23 267403ca Dimitris Moraitis
    function pad(n){ return n<10 ? '0'+n : n }
24 267403ca Dimitris Moraitis
    return  d.getUTCFullYear()+ '-' +
25 f533f224 Vangelis Koukis
            pad(d.getUTCMonth()+1) + '-' +
26 f533f224 Vangelis Koukis
            pad(d.getUTCDate()) + 'T' +
27 f533f224 Vangelis Koukis
            pad(d.getUTCHours()) + ':' +
28 f533f224 Vangelis Koukis
            pad(d.getUTCMinutes()) + ':' +
29 f533f224 Vangelis Koukis
            pad(d.getUTCSeconds()) +'Z'
30 038383b1 Dimitris Moraitis
}
31 038383b1 Dimitris Moraitis
32 f533f224 Vangelis Koukis
function parse_error(responseText, errorCode){
33 f533f224 Vangelis Koukis
    var errors = [];
34 f533f224 Vangelis Koukis
    try {
35 f533f224 Vangelis Koukis
        responseObj = JSON.parse(responseText);
36 f533f224 Vangelis Koukis
    }
37 f533f224 Vangelis Koukis
    catch(err) {
38 f533f224 Vangelis Koukis
        errors[0] = {'code': errorCode};
39 f533f224 Vangelis Koukis
        return errors;
40 f533f224 Vangelis Koukis
    }
41 f533f224 Vangelis Koukis
    for (var err in responseObj){
42 f533f224 Vangelis Koukis
        errors[errors.length] = responseObj[err];
43 f533f224 Vangelis Koukis
    }
44 f533f224 Vangelis Koukis
    return errors;
45 267403ca Dimitris Moraitis
}
46 c5a032c4 Markos Gogoulos
47 41cad45d Dimitris Moraitis
// indexOf prototype for IE
48 41cad45d Dimitris Moraitis
if (!Array.prototype.indexOf) {
49 41cad45d Dimitris Moraitis
  Array.prototype.indexOf = function(elt /*, from*/) {
50 41cad45d Dimitris Moraitis
    var len = this.length;
51 41cad45d Dimitris Moraitis
    var from = Number(arguments[1]) || 0;
52 41cad45d Dimitris Moraitis
    from = (from < 0)
53 41cad45d Dimitris Moraitis
         ? Math.ceil(from)
54 41cad45d Dimitris Moraitis
         : Math.floor(from);
55 41cad45d Dimitris Moraitis
    if (from < 0)
56 41cad45d Dimitris Moraitis
      from += len;
57 41cad45d Dimitris Moraitis
58 41cad45d Dimitris Moraitis
    for (; from < len; from++) {
59 41cad45d Dimitris Moraitis
      if (from in this &&
60 41cad45d Dimitris Moraitis
          this[from] === elt)
61 41cad45d Dimitris Moraitis
        return from;
62 41cad45d Dimitris Moraitis
    }
63 41cad45d Dimitris Moraitis
    return -1;
64 41cad45d Dimitris Moraitis
  };
65 41cad45d Dimitris Moraitis
}
66 41cad45d Dimitris Moraitis
67 3d286f84 Dimitris Moraitis
function update_confirmations(){
68 dcf153ce Christodoulos Psaltis
    // hide all confirm boxes to begin with
69 f533f224 Vangelis Koukis
    $('#machines-pane div.confirm_single').hide();
70 f533f224 Vangelis Koukis
    $('#machines-pane div.confirm_multiple').hide();
71 f533f224 Vangelis Koukis
    // standard view only
72 f533f224 Vangelis Koukis
    if ($.cookie("view") == '0') {
73 f533f224 Vangelis Koukis
        for (var i=0;i<pending_actions.length;i++){
74 dcf153ce Christodoulos Psaltis
            // show single confirms
75 f533f224 Vangelis Koukis
            $("#machines-pane div.machine-container#"+pending_actions[i][1]+' .confirm_single').show();
76 f533f224 Vangelis Koukis
        }
77 f533f224 Vangelis Koukis
    }
78 f533f224 Vangelis Koukis
79 f533f224 Vangelis Koukis
    // if more than one pending action show multiple confirm box
80 f533f224 Vangelis Koukis
    if (pending_actions.length>1 || $.cookie("view") == '1' && pending_actions.length == 1){
81 f533f224 Vangelis Koukis
        $('#machines-pane div.confirm_multiple span.actionLen').text(pending_actions.length);
82 f533f224 Vangelis Koukis
        $('#machines-pane div.confirm_multiple').show();
83 f533f224 Vangelis Koukis
    }
84 f533f224 Vangelis Koukis
}
85 dcf153ce Christodoulos Psaltis
86 f533f224 Vangelis Koukis
function update_network_confirmations(){
87 f533f224 Vangelis Koukis
    // hide all confirm boxes to begin with
88 f533f224 Vangelis Koukis
    $('#networks-pane div.confirm_multiple').hide();
89 f533f224 Vangelis Koukis
90 f533f224 Vangelis Koukis
    for (var i=0;i<pending_actions.length;i++){
91 f533f224 Vangelis Koukis
        // show single confirms depending on the action
92 f533f224 Vangelis Koukis
        if (pending_actions[i][0] == delete_network) {
93 f533f224 Vangelis Koukis
            $("#networks-pane div.network#net-"+pending_actions[i][1]).children('.confirm_single').show();
94 f533f224 Vangelis Koukis
        } else if (pending_actions[i][0] == remove_server_from_network) {
95 f533f224 Vangelis Koukis
            $("#networks-pane div.network #net-"+pending_actions[i][1]+"-server-"+pending_actions[i][2]).children('.confirm_single').show();
96 f533f224 Vangelis Koukis
        } // else {}
97 f533f224 Vangelis Koukis
    }
98 f533f224 Vangelis Koukis
99 f533f224 Vangelis Koukis
    // if more than one pending action show multiple confirm box
100 f533f224 Vangelis Koukis
    if (pending_actions.length > 1){
101 f533f224 Vangelis Koukis
        $('#networks-pane div.confirm_multiple span.actionLen').text(pending_actions.length);
102 f533f224 Vangelis Koukis
        $('#networks-pane div.confirm_multiple').show();
103 f533f224 Vangelis Koukis
    }
104 3d286f84 Dimitris Moraitis
}
105 3d286f84 Dimitris Moraitis
106 42f67a2a Dimitris Moraitis
function list_view() {
107 f533f224 Vangelis Koukis
    changes_since = 0; // to reload full list
108 f533f224 Vangelis Koukis
    pending_actions = []; // clear pending actions
109 f533f224 Vangelis Koukis
    update_confirmations();
110 f533f224 Vangelis Koukis
    clearTimeout(deferred);    // clear old deferred calls
111 f533f224 Vangelis Koukis
    try {
112 f533f224 Vangelis Koukis
        update_request.abort(); // cancel pending ajax updates
113 f533f224 Vangelis Koukis
        load_request.abort();
114 f533f224 Vangelis Koukis
    }catch(err){}
115 f533f224 Vangelis Koukis
    $.cookie("view", '1'); // set list cookie
116 f533f224 Vangelis Koukis
    uri = $("a#list").attr("href");
117 267403ca Dimitris Moraitis
    load_request = $.ajax({
118 267403ca Dimitris Moraitis
        url: uri,
119 267403ca Dimitris Moraitis
        type: "GET",
120 267403ca Dimitris Moraitis
        timeout: TIMEOUT,
121 267403ca Dimitris Moraitis
        dataType: "html",
122 f533f224 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
123 f533f224 Vangelis Koukis
            return false;
124 f533f224 Vangelis Koukis
        },
125 267403ca Dimitris Moraitis
        success: function(data, textStatus, jqXHR) {
126 f533f224 Vangelis Koukis
            $("a#list")[0].className += ' activelink';
127 f533f224 Vangelis Koukis
            $("a#standard")[0].className = '';
128 f533f224 Vangelis Koukis
            $("a#single")[0].className = '';
129 f533f224 Vangelis Koukis
            $("div#machinesview").html(data);
130 f533f224 Vangelis Koukis
        }
131 f533f224 Vangelis Koukis
    });
132 f533f224 Vangelis Koukis
    return false;
133 f533f224 Vangelis Koukis
}
134 b02144c8 Vangelis Koukis
135 f533f224 Vangelis Koukis
function single_view() {
136 f533f224 Vangelis Koukis
    changes_since = 0; // to reload full list
137 f533f224 Vangelis Koukis
    pending_actions = []; // clear pending actions
138 f533f224 Vangelis Koukis
    update_confirmations();
139 f533f224 Vangelis Koukis
    clearTimeout(deferred);    // clear old deferred calls
140 f533f224 Vangelis Koukis
    try {
141 f533f224 Vangelis Koukis
        update_request.abort(); // cancel pending ajax updates
142 f533f224 Vangelis Koukis
        load_request.abort();
143 f533f224 Vangelis Koukis
    }catch(err){}
144 f533f224 Vangelis Koukis
    $.cookie("view", '2'); // set list cookie
145 f533f224 Vangelis Koukis
    uri = $("a#single").attr("href");
146 f533f224 Vangelis Koukis
    load_request = $.ajax({
147 f533f224 Vangelis Koukis
        url: uri,
148 f533f224 Vangelis Koukis
        type: "GET",
149 f533f224 Vangelis Koukis
        timeout: TIMEOUT,
150 f533f224 Vangelis Koukis
        dataType: "html",
151 f533f224 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
152 f533f224 Vangelis Koukis
            return false;
153 f533f224 Vangelis Koukis
        },
154 f533f224 Vangelis Koukis
        success: function(data, textStatus, jqXHR) {
155 f533f224 Vangelis Koukis
            $("a#single")[0].className += ' activelink';
156 f533f224 Vangelis Koukis
            $("a#standard")[0].className = '';
157 f533f224 Vangelis Koukis
            $("a#list")[0].className = '';
158 f533f224 Vangelis Koukis
            $("div#machinesview").html(data);
159 f533f224 Vangelis Koukis
        }
160 f533f224 Vangelis Koukis
    });
161 42f67a2a Dimitris Moraitis
    return false;
162 42f67a2a Dimitris Moraitis
}
163 42f67a2a Dimitris Moraitis
164 42f67a2a Dimitris Moraitis
function standard_view() {
165 f533f224 Vangelis Koukis
    changes_since = 0; // to reload full list
166 f533f224 Vangelis Koukis
    pending_actions = []; // clear pending actions
167 f533f224 Vangelis Koukis
    update_confirmations();
168 f533f224 Vangelis Koukis
    clearTimeout(deferred);    // clear old deferred calls
169 f533f224 Vangelis Koukis
    try {
170 f533f224 Vangelis Koukis
        update_request.abort() // cancel pending ajax updates
171 f533f224 Vangelis Koukis
        load_request.abort();
172 f533f224 Vangelis Koukis
    }catch(err){}
173 f533f224 Vangelis Koukis
    $.cookie("view", '0');
174 267403ca Dimitris Moraitis
    uri = $("a#standard").attr("href");
175 267403ca Dimitris Moraitis
    load_request = $.ajax({
176 267403ca Dimitris Moraitis
        url: uri,
177 267403ca Dimitris Moraitis
        type: "GET",
178 267403ca Dimitris Moraitis
        timeout: TIMEOUT,
179 267403ca Dimitris Moraitis
        dataType: "html",
180 f533f224 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
181 f533f224 Vangelis Koukis
            return false;
182 f533f224 Vangelis Koukis
        },
183 267403ca Dimitris Moraitis
        success: function(data, textStatus, jqXHR) {
184 f533f224 Vangelis Koukis
            $("a#standard")[0].className += ' activelink';
185 f533f224 Vangelis Koukis
            $("a#list")[0].className = '';
186 f533f224 Vangelis Koukis
            $("a#single")[0].className = '';
187 f533f224 Vangelis Koukis
            $("div#machinesview").html(data);
188 f533f224 Vangelis Koukis
        }
189 f533f224 Vangelis Koukis
    });
190 42f67a2a Dimitris Moraitis
    return false;
191 42f67a2a Dimitris Moraitis
}
192 42f67a2a Dimitris Moraitis
193 42f67a2a Dimitris Moraitis
function choose_view() {
194 f533f224 Vangelis Koukis
    if ($.cookie("view")=='1') {
195 42f67a2a Dimitris Moraitis
        list_view();
196 f533f224 Vangelis Koukis
    } else if ($.cookie("view")=='2'){
197 f533f224 Vangelis Koukis
        single_view();
198 42f67a2a Dimitris Moraitis
    } else {
199 42f67a2a Dimitris Moraitis
        standard_view();
200 42f67a2a Dimitris Moraitis
    }
201 42f67a2a Dimitris Moraitis
}
202 42f67a2a Dimitris Moraitis
203 f533f224 Vangelis Koukis
// get and show a list of running and terminated machines
204 f533f224 Vangelis Koukis
function update_vms(interval) {
205 f533f224 Vangelis Koukis
    try{ console.info('updating machines'); } catch(err){}
206 f533f224 Vangelis Koukis
    var uri= API_URL + '/servers/detail';
207 b02144c8 Vangelis Koukis
208 f533f224 Vangelis Koukis
    if (changes_since != 0)
209 f533f224 Vangelis Koukis
        uri+='?changes-since='+changes_since
210 b02144c8 Vangelis Koukis
211 f533f224 Vangelis Koukis
    update_request = $.ajax({
212 f533f224 Vangelis Koukis
        cache: false,
213 f533f224 Vangelis Koukis
        url: uri,
214 f533f224 Vangelis Koukis
        type: "GET",
215 f533f224 Vangelis Koukis
        timeout: TIMEOUT,
216 f533f224 Vangelis Koukis
        dataType: "json",
217 f533f224 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
218 f533f224 Vangelis Koukis
            // don't forget to try again later
219 f533f224 Vangelis Koukis
            if (interval) {
220 f533f224 Vangelis Koukis
                clearTimeout(deferred);    // clear old deferred calls
221 f533f224 Vangelis Koukis
                deferred = setTimeout(function() {update_vms(interval);},interval,interval);
222 f533f224 Vangelis Koukis
            }
223 f533f224 Vangelis Koukis
            // as for now, just show an error message
224 f533f224 Vangelis Koukis
            try { console.info('update_vms errback:' + jqXHR.status ) } catch(err) {}
225 f533f224 Vangelis Koukis
            ajax_error(jqXHR.status, undefined, 'Update VMs', jqXHR.responseText);
226 f533f224 Vangelis Koukis
            return false;
227 f533f224 Vangelis Koukis
            },
228 f533f224 Vangelis Koukis
        success: function(data, textStatus, jqXHR) {
229 f533f224 Vangelis Koukis
            // create changes_since string if necessary
230 f533f224 Vangelis Koukis
            if (jqXHR.getResponseHeader('Date') != null){
231 f533f224 Vangelis Koukis
                changes_since_date = new Date(jqXHR.getResponseHeader('Date'));
232 f533f224 Vangelis Koukis
                changes_since = ISODateString(changes_since_date);
233 f533f224 Vangelis Koukis
            }
234 b02144c8 Vangelis Koukis
235 f533f224 Vangelis Koukis
            if (interval) {
236 f533f224 Vangelis Koukis
                clearTimeout(deferred);    // clear old deferred calls
237 f533f224 Vangelis Koukis
                deferred = setTimeout(function() {update_vms(interval);},interval,interval);
238 f533f224 Vangelis Koukis
            }
239 42f67a2a Dimitris Moraitis
240 f533f224 Vangelis Koukis
            if (jqXHR.status == 200 || jqXHR.status == 203) {
241 f533f224 Vangelis Koukis
                try {
242 f533f224 Vangelis Koukis
                    servers = data.servers.values;
243 f533f224 Vangelis Koukis
                } catch(err) { ajax_error('400', undefined, 'Update VMs', jqXHR.responseText);}
244 f533f224 Vangelis Koukis
                update_machines_view(data);
245 f533f224 Vangelis Koukis
            } else if (jqXHR.status != 304){
246 f533f224 Vangelis Koukis
                try { console.info('update_vms callback:' + jqXHR.status ) } catch(err) {}
247 f533f224 Vangelis Koukis
                /*
248 f533f224 Vangelis Koukis
                FIXME:  Here it should return the error, however Opera does not support 304.
249 f533f224 Vangelis Koukis
                        Instead 304 it returns 0. To dealt with this we treat 0 as an
250 f533f224 Vangelis Koukis
                        304, which should be corrected (Bug #317).
251 f533f224 Vangelis Koukis
                */
252 f533f224 Vangelis Koukis
                //ajax_error(jqXHR.status, undefined, 'Update VMs', jqXHR.responseText);
253 f533f224 Vangelis Koukis
            }
254 f533f224 Vangelis Koukis
            return false;
255 f533f224 Vangelis Koukis
        }
256 42f67a2a Dimitris Moraitis
    });
257 f533f224 Vangelis Koukis
    return false;
258 f533f224 Vangelis Koukis
}
259 f533f224 Vangelis Koukis
260 f533f224 Vangelis Koukis
// get a list of running and terminated machines, used in network view
261 f533f224 Vangelis Koukis
function update_networks(interval) {
262 f533f224 Vangelis Koukis
    try{ console.info('updating networks'); } catch(err){}
263 f533f224 Vangelis Koukis
    var uri= API_URL + '/servers/detail';
264 f533f224 Vangelis Koukis
265 f533f224 Vangelis Koukis
    if (changes_since != 0)
266 f533f224 Vangelis Koukis
        uri+='?changes-since='+changes_since
267 f533f224 Vangelis Koukis
268 f533f224 Vangelis Koukis
    update_request = $.ajax({
269 f533f224 Vangelis Koukis
        cache: false,
270 f533f224 Vangelis Koukis
        url: uri,
271 f533f224 Vangelis Koukis
        type: "GET",
272 f533f224 Vangelis Koukis
        timeout: TIMEOUT,
273 f533f224 Vangelis Koukis
        dataType: "json",
274 f533f224 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
275 f533f224 Vangelis Koukis
            // don't forget to try again later
276 f533f224 Vangelis Koukis
            if (interval) {
277 f533f224 Vangelis Koukis
                clearTimeout(deferred);    // clear old deferred calls
278 f533f224 Vangelis Koukis
                deferred = setTimeout(function() {update_networks(interval);},interval,interval);
279 f533f224 Vangelis Koukis
            }
280 f533f224 Vangelis Koukis
            // as for now, just show an error message
281 f533f224 Vangelis Koukis
            try { console.info('update_networks errback:' + jqXHR.status ) } catch(err) {}
282 f533f224 Vangelis Koukis
            ajax_error(jqXHR.status, undefined, 'Update networks', jqXHR.responseText);
283 f533f224 Vangelis Koukis
            return false;
284 f533f224 Vangelis Koukis
            },
285 f533f224 Vangelis Koukis
        success: function(data, textStatus, jqXHR) {
286 f533f224 Vangelis Koukis
            // create changes_since string if necessary
287 f533f224 Vangelis Koukis
            if (jqXHR.getResponseHeader('Date') != null){
288 f533f224 Vangelis Koukis
                changes_since_date = new Date(jqXHR.getResponseHeader('Date'));
289 f533f224 Vangelis Koukis
                changes_since = ISODateString(changes_since_date);
290 f533f224 Vangelis Koukis
            }
291 f533f224 Vangelis Koukis
292 f533f224 Vangelis Koukis
            if (interval) {
293 f533f224 Vangelis Koukis
                clearTimeout(deferred);    // clear old deferred calls
294 f533f224 Vangelis Koukis
                deferred = setTimeout(function() {update_networks(interval);},interval,interval);
295 f533f224 Vangelis Koukis
            }
296 f533f224 Vangelis Koukis
297 f533f224 Vangelis Koukis
            if (jqXHR.status == 200 || jqXHR.status == 203) {
298 f533f224 Vangelis Koukis
                try {
299 f533f224 Vangelis Koukis
                    servers = data.servers.values;
300 f533f224 Vangelis Koukis
                } catch(err) { ajax_error('400', undefined, 'Update networks', jqXHR.responseText);}
301 f533f224 Vangelis Koukis
                update_network_names(data);
302 f533f224 Vangelis Koukis
            } else if (jqXHR.status == 304) {
303 f533f224 Vangelis Koukis
                update_network_names();
304 f533f224 Vangelis Koukis
            }
305 f533f224 Vangelis Koukis
            else {
306 f533f224 Vangelis Koukis
                try { console.info('update_networks callback:' + jqXHR.status ) } catch(err) {}
307 f533f224 Vangelis Koukis
                /*
308 f533f224 Vangelis Koukis
                FIXME:  Here it should return the error, however Opera does not support 304.
309 f533f224 Vangelis Koukis
                        Instead 304 it returns 0. To dealt with this we treat 0 as an
310 f533f224 Vangelis Koukis
                        304, which should be corrected (Bug #317).
311 f533f224 Vangelis Koukis
                */
312 f533f224 Vangelis Koukis
                //ajax_error(jqXHR.status, undefined, 'Update networks', jqXHR.responseText);
313 f533f224 Vangelis Koukis
                update_network_names();
314 f533f224 Vangelis Koukis
            }
315 f533f224 Vangelis Koukis
            return false;
316 42f67a2a Dimitris Moraitis
        }
317 42f67a2a Dimitris Moraitis
    });
318 42f67a2a Dimitris Moraitis
    return false;
319 42f67a2a Dimitris Moraitis
}
320 42f67a2a Dimitris Moraitis
321 f533f224 Vangelis Koukis
// get and show a list of public and private networks
322 f533f224 Vangelis Koukis
function update_network_names(servers_data) {
323 f533f224 Vangelis Koukis
    try{ console.info('updating network names'); } catch(err){}
324 f533f224 Vangelis Koukis
    var uri= API_URL + '/networks/detail';
325 f533f224 Vangelis Koukis
326 f533f224 Vangelis Koukis
    if (networks_changes_since != 0)
327 f533f224 Vangelis Koukis
        //FIXME: Comment out the following, until metadata do not 304 when changed
328 f533f224 Vangelis Koukis
        uri+='?changes-since=' + networks_changes_since
329 ce4f9227 Mike Muzurakis
330 1c7978ce Dimitris Moraitis
    update_request = $.ajax({
331 c8bde382 Mike Muzurakis
        cache: false,
332 1a49199e Dimitris Moraitis
        url: uri,
333 42f67a2a Dimitris Moraitis
        type: "GET",
334 42f67a2a Dimitris Moraitis
        timeout: TIMEOUT,
335 42f67a2a Dimitris Moraitis
        dataType: "json",
336 146b6003 Dimitris Moraitis
        error: function(jqXHR, textStatus, errorThrown) {
337 f533f224 Vangelis Koukis
            // as for now, just show an error message
338 f533f224 Vangelis Koukis
            try {
339 f533f224 Vangelis Koukis
                console.info('update_network names errback:' + jqXHR.status )
340 f533f224 Vangelis Koukis
            } catch(err) {}
341 f533f224 Vangelis Koukis
            ajax_error(jqXHR.status, undefined, 'Update network names', jqXHR.responseText);
342 f533f224 Vangelis Koukis
            return false;
343 f533f224 Vangelis Koukis
            },
344 1a49199e Dimitris Moraitis
        success: function(data, textStatus, jqXHR) {
345 e6561111 Mike Muzurakis
            // create changes_since string if necessary
346 e6561111 Mike Muzurakis
            if (jqXHR.getResponseHeader('Date') != null){
347 f533f224 Vangelis Koukis
                changes_since_date = new Date(jqXHR.getResponseHeader('Date'));
348 f533f224 Vangelis Koukis
                networks_changes_since = ISODateString(changes_since_date);
349 f533f224 Vangelis Koukis
            }
350 f533f224 Vangelis Koukis
351 f533f224 Vangelis Koukis
            if (jqXHR.status == 200 || jqXHR.status == 203) {
352 f533f224 Vangelis Koukis
                try {
353 f533f224 Vangelis Koukis
                    networks = data.networks.values;
354 f533f224 Vangelis Koukis
                } catch(err) {
355 f533f224 Vangelis Koukis
                    ajax_error('400', undefined, 'Update network names', jqXHR.responseText);
356 f533f224 Vangelis Koukis
                }
357 f533f224 Vangelis Koukis
                update_networks_view(servers_data, data);
358 f533f224 Vangelis Koukis
            } else if (jqXHR.status == 304) {
359 f533f224 Vangelis Koukis
                update_networks_view(servers_data);
360 f533f224 Vangelis Koukis
            } else if (jqXHR.status != 304){
361 f533f224 Vangelis Koukis
                try { console.info('update_network_names callback:' + jqXHR.status ) } catch(err) {}
362 f533f224 Vangelis Koukis
                /*
363 f533f224 Vangelis Koukis
                FIXME:  Here it should return the error, however Opera does not support 304.
364 f533f224 Vangelis Koukis
                        Instead 304 it returns 0. To dealt with this we treat 0 as an
365 f533f224 Vangelis Koukis
                        304, which should be corrected (Bug #317).
366 f533f224 Vangelis Koukis
                */
367 f533f224 Vangelis Koukis
                //ajax_error(jqXHR.status, undefined, 'Update network names', jqXHR.responseText);
368 f533f224 Vangelis Koukis
                update_networks_view(servers_data);
369 f533f224 Vangelis Koukis
            }
370 f533f224 Vangelis Koukis
            return false;
371 42f67a2a Dimitris Moraitis
        }
372 42f67a2a Dimitris Moraitis
    });
373 42f67a2a Dimitris Moraitis
    return false;
374 42f67a2a Dimitris Moraitis
}
375 42f67a2a Dimitris Moraitis
376 146b6003 Dimitris Moraitis
// get and show a list of available standard and custom images
377 b02144c8 Vangelis Koukis
function update_images() {
378 42f67a2a Dimitris Moraitis
    $.ajax({
379 73c2c75b Markos Gogoulos
        url: API_URL + '/images/detail',
380 42f67a2a Dimitris Moraitis
        type: "GET",
381 42f67a2a Dimitris Moraitis
        //async: false,
382 42f67a2a Dimitris Moraitis
        dataType: "json",
383 42f67a2a Dimitris Moraitis
        timeout: TIMEOUT,
384 b02144c8 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
385 038383b1 Dimitris Moraitis
                    ajax_error(jqXHR.status, undefined, 'Update Images', jqXHR.responseText);
386 42f67a2a Dimitris Moraitis
                    },
387 42f67a2a Dimitris Moraitis
        success: function(data, textStatus, jqXHR) {
388 146b6003 Dimitris Moraitis
            try {
389 f533f224 Vangelis Koukis
                images = data.images.values;
390 f533f224 Vangelis Koukis
                update_wizard_images();
391 f533f224 Vangelis Koukis
            } catch(err){
392 f533f224 Vangelis Koukis
                ajax_error("NO_IMAGES");
393 f533f224 Vangelis Koukis
            }
394 42f67a2a Dimitris Moraitis
        }
395 42f67a2a Dimitris Moraitis
    });
396 42f67a2a Dimitris Moraitis
    return false;
397 42f67a2a Dimitris Moraitis
}
398 42f67a2a Dimitris Moraitis
399 d134b632 Dimitris Moraitis
function update_wizard_images() {
400 f533f224 Vangelis Koukis
    if ($("ul#standard-images li").toArray().length + $("ul#custom-images li").toArray().length == 0) {
401 f533f224 Vangelis Koukis
        $.each(images, function(i,image){
402 f533f224 Vangelis Koukis
            var img = $('#image-template').clone().attr("id","img-"+image.id).fadeIn("slow");
403 f533f224 Vangelis Koukis
            img.find("label").attr('for',"img-radio-" + image.id);
404 f533f224 Vangelis Koukis
            img.find(".image-title").text(image.name);
405 73c2c75b Markos Gogoulos
            if (image.metadata) {
406 73c2c75b Markos Gogoulos
                if (image.metadata.values.description != undefined) {
407 73c2c75b Markos Gogoulos
                    img.find(".description").text(image.metadata.values.description);
408 73c2c75b Markos Gogoulos
                }
409 73c2c75b Markos Gogoulos
                if (image.metadata.values.size != undefined) {
410 f533f224 Vangelis Koukis
                    img.find("#size").text(image.metadata.values.size);
411 73c2c75b Markos Gogoulos
                }
412 73c2c75b Markos Gogoulos
            }
413 f533f224 Vangelis Koukis
            img.find("input.radio").attr('id',"img-radio-" + image.id);
414 f533f224 Vangelis Koukis
            if (i==0) img.find("input.radio").attr("checked","checked");
415 a64e74f0 Markos Gogoulos
            var image_logo = os_icon(image.metadata);
416 f533f224 Vangelis Koukis
            img.find("img.image-logo").attr('src','static/icons/os/'+image_logo+'.png');
417 73c2c75b Markos Gogoulos
            if (image.metadata) {
418 73c2c75b Markos Gogoulos
                if (image.metadata.values.serverId != undefined) {
419 73c2c75b Markos Gogoulos
                    img.appendTo("ul#custom-images");
420 73c2c75b Markos Gogoulos
                } else {
421 73c2c75b Markos Gogoulos
                    img.appendTo("ul#standard-images");
422 73c2c75b Markos Gogoulos
                }
423 73c2c75b Markos Gogoulos
            } else {
424 73c2c75b Markos Gogoulos
                img.appendTo("ul#standard-images");
425 73c2c75b Markos Gogoulos
            }
426 f533f224 Vangelis Koukis
        });
427 f533f224 Vangelis Koukis
    }
428 d134b632 Dimitris Moraitis
}
429 d134b632 Dimitris Moraitis
430 d134b632 Dimitris Moraitis
function update_wizard_flavors(){
431 f533f224 Vangelis Koukis
    // sliders for selecting VM flavor
432 f533f224 Vangelis Koukis
    $("#cpu:range").rangeinput({min:0,
433 f533f224 Vangelis Koukis
                               value:0,
434 f533f224 Vangelis Koukis
                               step:1,
435 f533f224 Vangelis Koukis
                               progress: true,
436 f533f224 Vangelis Koukis
                               max:cpus.length-1});
437 f533f224 Vangelis Koukis
438 f533f224 Vangelis Koukis
    $("#storage:range").rangeinput({min:0,
439 f533f224 Vangelis Koukis
                               value:0,
440 f533f224 Vangelis Koukis
                               step:1,
441 f533f224 Vangelis Koukis
                               progress: true,
442 f533f224 Vangelis Koukis
                               max:disks.length-1});
443 f533f224 Vangelis Koukis
444 f533f224 Vangelis Koukis
    $("#ram:range").rangeinput({min:0,
445 f533f224 Vangelis Koukis
                               value:0,
446 f533f224 Vangelis Koukis
                               step:1,
447 f533f224 Vangelis Koukis
                               progress: true,
448 f533f224 Vangelis Koukis
                               max:ram.length-1});
449 f533f224 Vangelis Koukis
    $("#small").click();
450 f533f224 Vangelis Koukis
451 f533f224 Vangelis Koukis
    // update the indicators when sliding
452 f533f224 Vangelis Koukis
    $("#cpu:range").data().rangeinput.onSlide(function(event,value){
453 f533f224 Vangelis Koukis
        $("#cpu-indicator")[0].value = cpus[Number(value)];
454 afa2ebd2 Mike Muzurakis
        $("#cpu-indicator").addClass('selectedrange');
455 f533f224 Vangelis Koukis
    });
456 f533f224 Vangelis Koukis
    $("#cpu:range").data().rangeinput.change(function(event,value){
457 f533f224 Vangelis Koukis
        $("#cpu-indicator")[0].value = cpus[Number(value)];
458 f533f224 Vangelis Koukis
        $("#custom").click();
459 f533f224 Vangelis Koukis
        $("#cpu-indicator").removeClass('selectedrange');
460 f533f224 Vangelis Koukis
    });
461 f533f224 Vangelis Koukis
    $("#ram:range").data().rangeinput.onSlide(function(event,value){
462 f533f224 Vangelis Koukis
        $("#ram-indicator")[0].value = ram[Number(value)];
463 afa2ebd2 Mike Muzurakis
        $("#ram-indicator").addClass('selectedrange');
464 f533f224 Vangelis Koukis
    });
465 f533f224 Vangelis Koukis
    $("#ram:range").data().rangeinput.change(function(event,value){
466 f533f224 Vangelis Koukis
        $("#ram-indicator")[0].value = ram[Number(value)];
467 f533f224 Vangelis Koukis
        $("#custom").click();
468 f533f224 Vangelis Koukis
        $("#ram-indicator").removeClass('selectedrange');
469 f533f224 Vangelis Koukis
    });
470 f533f224 Vangelis Koukis
    $("#storage:range").data().rangeinput.onSlide(function(event,value){
471 f533f224 Vangelis Koukis
        $("#storage-indicator")[0].value = disks[Number(value)];
472 afa2ebd2 Mike Muzurakis
        $("#storage-indicator").addClass('selectedrange');
473 f533f224 Vangelis Koukis
    });
474 f533f224 Vangelis Koukis
    $("#storage:range").data().rangeinput.change(function(event,value){
475 f533f224 Vangelis Koukis
        $("#storage-indicator")[0].value = disks[Number(value)];
476 f533f224 Vangelis Koukis
        $("#custom").click();
477 f533f224 Vangelis Koukis
        $("#storage-indicator").removeClass('selectedrange');
478 f533f224 Vangelis Koukis
    });
479 d134b632 Dimitris Moraitis
}
480 d134b632 Dimitris Moraitis
481 42f67a2a Dimitris Moraitis
Array.prototype.unique = function () {
482 f533f224 Vangelis Koukis
    var r = new Array();
483 f533f224 Vangelis Koukis
    o:for(var i = 0, n = this.length; i < n; i++)
484 f533f224 Vangelis Koukis
    {
485 f533f224 Vangelis Koukis
        for(var x = 0, y = r.length; x < y; x++)
486 f533f224 Vangelis Koukis
        {
487 f533f224 Vangelis Koukis
            if(r[x]==this[i])
488 f533f224 Vangelis Koukis
            {
489 f533f224 Vangelis Koukis
                continue o;
490 f533f224 Vangelis Koukis
            }
491 f533f224 Vangelis Koukis
        }
492 f533f224 Vangelis Koukis
        r[r.length] = this[i];
493 f533f224 Vangelis Koukis
    }
494 f533f224 Vangelis Koukis
    return r;
495 42f67a2a Dimitris Moraitis
}
496 42f67a2a Dimitris Moraitis
497 42f67a2a Dimitris Moraitis
// get and configure flavor selection
498 b02144c8 Vangelis Koukis
function update_flavors() {
499 42f67a2a Dimitris Moraitis
    $.ajax({
500 f1641e4d Markos Gogoulos
        url: API_URL + '/flavors/detail',
501 42f67a2a Dimitris Moraitis
        type: "GET",
502 42f67a2a Dimitris Moraitis
        //async: false,
503 42f67a2a Dimitris Moraitis
        dataType: "json",
504 42f67a2a Dimitris Moraitis
        timeout: TIMEOUT,
505 b02144c8 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
506 146b6003 Dimitris Moraitis
            try {
507 f533f224 Vangelis Koukis
                ajax_error(jqXHR.status, undefined, 'Update Flavors', jqXHR.responseText);
508 f533f224 Vangelis Koukis
            } catch (err) {
509 f533f224 Vangelis Koukis
                ajax_error(err);
510 f533f224 Vangelis Koukis
            }
511 66307c9e Christodoulos Psaltis
            // start updating vm list
512 66307c9e Christodoulos Psaltis
            update_vms(UPDATE_INTERVAL);
513 42f67a2a Dimitris Moraitis
        },
514 42f67a2a Dimitris Moraitis
        success: function(data, textStatus, jqXHR) {
515 f1641e4d Markos Gogoulos
            flavors = data.flavors.values;
516 42f67a2a Dimitris Moraitis
            $.each(flavors, function(i, flavor) {
517 42f67a2a Dimitris Moraitis
                cpus[i] = flavor['cpu'];
518 42f67a2a Dimitris Moraitis
                disks[i] = flavor['disk'];
519 42f67a2a Dimitris Moraitis
                ram[i] = flavor['ram'];
520 42f67a2a Dimitris Moraitis
            });
521 42f67a2a Dimitris Moraitis
            cpus = cpus.unique();
522 42f67a2a Dimitris Moraitis
            disks = disks.unique();
523 42f67a2a Dimitris Moraitis
            ram = ram.unique();
524 f533f224 Vangelis Koukis
            update_wizard_flavors();
525 66307c9e Christodoulos Psaltis
            // start updating vm list
526 66307c9e Christodoulos Psaltis
            update_vms(UPDATE_INTERVAL);
527 42f67a2a Dimitris Moraitis
        }
528 42f67a2a Dimitris Moraitis
    });
529 42f67a2a Dimitris Moraitis
    return false;
530 42f67a2a Dimitris Moraitis
}
531 1a49199e Dimitris Moraitis
532 b335768e Markos Gogoulos
// return flavorRef from cpu, disk, ram values
533 42f67a2a Dimitris Moraitis
function identify_flavor(cpu, disk, ram){
534 42f67a2a Dimitris Moraitis
    for (i=0;i<flavors.length;i++){
535 42f67a2a Dimitris Moraitis
        if (flavors[i]['cpu'] == cpu && flavors[i]['disk']==disk && flavors[i]['ram']==ram) {
536 42f67a2a Dimitris Moraitis
            return flavors[i]['id']
537 42f67a2a Dimitris Moraitis
        }
538 42f67a2a Dimitris Moraitis
    }
539 42f67a2a Dimitris Moraitis
    return 0;
540 42f67a2a Dimitris Moraitis
}
541 42f67a2a Dimitris Moraitis
542 45ab204d Markos Gogoulos
// return image entry from imageRef
543 45ab204d Markos Gogoulos
function get_image(imageRef) {
544 45ab204d Markos Gogoulos
    for (i=0;i<images.length;i++){
545 45ab204d Markos Gogoulos
        if (images[i]['id'] == imageRef) {
546 45ab204d Markos Gogoulos
            return images[i];
547 45ab204d Markos Gogoulos
        }
548 45ab204d Markos Gogoulos
    }
549 45ab204d Markos Gogoulos
    return 0;
550 45ab204d Markos Gogoulos
}
551 45ab204d Markos Gogoulos
552 f533f224 Vangelis Koukis
// return machine entry from serverID
553 f533f224 Vangelis Koukis
function get_machine(serverID) {
554 f533f224 Vangelis Koukis
    for (i=0;i<servers.length;i++){
555 f533f224 Vangelis Koukis
        if (servers[i]['id'] == serverID) {
556 f533f224 Vangelis Koukis
            return servers[i];
557 f533f224 Vangelis Koukis
        }
558 f533f224 Vangelis Koukis
    }
559 f533f224 Vangelis Koukis
    return 0;
560 f533f224 Vangelis Koukis
}
561 f533f224 Vangelis Koukis
562 f533f224 Vangelis Koukis
// update the actions in icon view, per server
563 f533f224 Vangelis Koukis
function update_iconview_actions(serverID, server_status) {
564 f533f224 Vangelis Koukis
    // remove .disable from all actions to begin with
565 f533f224 Vangelis Koukis
    $('#machinesview-icon.standard #' + serverID + ' div.actions').children().removeClass('disabled');
566 f533f224 Vangelis Koukis
    // decide which actions should be disabled
567 f533f224 Vangelis Koukis
    for (current_action in actions) {
568 f533f224 Vangelis Koukis
        if (actions[current_action].indexOf(server_status) == -1 ) {
569 f533f224 Vangelis Koukis
            $('#machinesview-icon.standard #' + serverID + ' a.action-' + current_action).addClass('disabled');
570 f533f224 Vangelis Koukis
        }
571 f533f224 Vangelis Koukis
    }
572 f533f224 Vangelis Koukis
}
573 f533f224 Vangelis Koukis
574 dcf153ce Christodoulos Psaltis
// update the actions in list view
575 f533f224 Vangelis Koukis
function update_listview_actions() {
576 f533f224 Vangelis Koukis
    var states = [];
577 f533f224 Vangelis Koukis
    var on = [];
578 f533f224 Vangelis Koukis
    var checked = $("table.list-machines tbody input[type='checkbox']:checked");
579 f533f224 Vangelis Koukis
    // disable all actions to begin with
580 f533f224 Vangelis Koukis
    $('#machinesview .list div.actions').children().removeClass('enabled');
581 f533f224 Vangelis Koukis
582 f533f224 Vangelis Koukis
    // are there multiple machines selected?
583 f533f224 Vangelis Koukis
    if (checked.length>1)
584 f533f224 Vangelis Koukis
        states[0] = 'multiple';
585 f533f224 Vangelis Koukis
586 f533f224 Vangelis Koukis
    // check the states of selected machines
587 f533f224 Vangelis Koukis
    checked.each(function(i,checkbox) {
588 f533f224 Vangelis Koukis
        states[states.length] = checkbox.className;
589 f533f224 Vangelis Koukis
        var ip = $("#" + checkbox.id.replace('input-','') + ".ip span.public").text();
590 f533f224 Vangelis Koukis
        if (ip.replace('undefined','').length)
591 f533f224 Vangelis Koukis
            states[states.length] = 'network';
592 f533f224 Vangelis Koukis
    });
593 f533f224 Vangelis Koukis
594 f533f224 Vangelis Koukis
    // decide which actions should be enabled
595 f533f224 Vangelis Koukis
    for (a in actions) {
596 f533f224 Vangelis Koukis
        var enabled = false;
597 f533f224 Vangelis Koukis
        for (var s =0; s<states.length; s++) {
598 f533f224 Vangelis Koukis
            if (actions[a].indexOf(states[s]) != -1 ) {
599 f533f224 Vangelis Koukis
                enabled = true;
600 f533f224 Vangelis Koukis
            } else {
601 f533f224 Vangelis Koukis
                enabled = false;
602 f533f224 Vangelis Koukis
                break;
603 f533f224 Vangelis Koukis
            }
604 f533f224 Vangelis Koukis
        }
605 f533f224 Vangelis Koukis
        if (enabled)
606 f533f224 Vangelis Koukis
            on[on.length]=a;
607 f533f224 Vangelis Koukis
    }
608 f533f224 Vangelis Koukis
    // enable those actions
609 f533f224 Vangelis Koukis
    for (action in on) {
610 f533f224 Vangelis Koukis
        $("#action-" + on[action]).addClass('enabled');
611 f533f224 Vangelis Koukis
    }
612 e32c2a5d Dimitris Moraitis
}
613 146b6003 Dimitris Moraitis
614 0971fa71 Markos Gogoulos
//create server action
615 0971fa71 Markos Gogoulos
function create_vm(machineName, imageRef, flavorRef){
616 45ab204d Markos Gogoulos
    var image_logo = os_icon(get_image(imageRef).metadata);
617 f533f224 Vangelis Koukis
    var uri = API_URL + '/servers';
618 0971fa71 Markos Gogoulos
    var payload = {
619 0971fa71 Markos Gogoulos
        "server": {
620 0971fa71 Markos Gogoulos
            "name": machineName,
621 0971fa71 Markos Gogoulos
            "imageRef": imageRef,
622 0971fa71 Markos Gogoulos
            "flavorRef" : flavorRef,
623 0971fa71 Markos Gogoulos
            "metadata" : {
624 45ab204d Markos Gogoulos
                "OS" : image_logo
625 038383b1 Dimitris Moraitis
            }
626 0971fa71 Markos Gogoulos
        }
627 0971fa71 Markos Gogoulos
    };
628 0971fa71 Markos Gogoulos
629 0971fa71 Markos Gogoulos
    $.ajax({
630 7e45ddef Dimitris Moraitis
    url: uri,
631 0971fa71 Markos Gogoulos
    type: "POST",
632 f533f224 Vangelis Koukis
    contentType: "application/json",
633 b02144c8 Vangelis Koukis
    dataType: "json",
634 0971fa71 Markos Gogoulos
    data: JSON.stringify(payload),
635 0971fa71 Markos Gogoulos
    timeout: TIMEOUT,
636 b02144c8 Vangelis Koukis
    error: function(jqXHR, textStatus, errorThrown) {
637 038383b1 Dimitris Moraitis
                ajax_error(jqXHR.status, undefined, 'Create VM', jqXHR.responseText);
638 0971fa71 Markos Gogoulos
           },
639 0971fa71 Markos Gogoulos
    success: function(data, textStatus, jqXHR) {
640 0971fa71 Markos Gogoulos
                if ( jqXHR.status == '202') {
641 b02144c8 Vangelis Koukis
                    ajax_success("CREATE_VM_SUCCESS", data.server.adminPass);
642 0971fa71 Markos Gogoulos
                } else {
643 038383b1 Dimitris Moraitis
                    ajax_error(jqXHR.status, undefined, 'Create VM', jqXHR.responseText);
644 0971fa71 Markos Gogoulos
                }
645 0971fa71 Markos Gogoulos
            }
646 0971fa71 Markos Gogoulos
    });
647 0971fa71 Markos Gogoulos
}
648 0971fa71 Markos Gogoulos
649 42f67a2a Dimitris Moraitis
// reboot action
650 42f67a2a Dimitris Moraitis
function reboot(serverIDs){
651 f533f224 Vangelis Koukis
    if (!serverIDs.length){
652 f533f224 Vangelis Koukis
        //ajax_success('DEFAULT');
653 f533f224 Vangelis Koukis
        return false;
654 f533f224 Vangelis Koukis
    }
655 42f67a2a Dimitris Moraitis
    // ajax post reboot call
656 42f67a2a Dimitris Moraitis
    var payload = {
657 42f67a2a Dimitris Moraitis
        "reboot": {"type" : "HARD"}
658 42f67a2a Dimitris Moraitis
    };
659 f533f224 Vangelis Koukis
660 a1a31201 Dimitris Moraitis
    var serverID = serverIDs.pop();
661 f533f224 Vangelis Koukis
662 f533f224 Vangelis Koukis
    $.ajax({
663 f533f224 Vangelis Koukis
        url: API_URL + '/servers/' + serverID + '/action',
664 f533f224 Vangelis Koukis
        type: "POST",
665 f533f224 Vangelis Koukis
        contentType: "application/json",
666 f533f224 Vangelis Koukis
        dataType: "json",
667 f533f224 Vangelis Koukis
        data: JSON.stringify(payload),
668 f533f224 Vangelis Koukis
        timeout: TIMEOUT,
669 f533f224 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
670 038383b1 Dimitris Moraitis
                    display_failure(jqXHR.status, serverID, 'Reboot', jqXHR.responseText)
671 f533f224 Vangelis Koukis
                },
672 f533f224 Vangelis Koukis
        success: function(data, textStatus, jqXHR) {
673 f533f224 Vangelis Koukis
                    if ( jqXHR.status == '202') {
674 583932c4 Christodoulos Psaltis
                        try {
675 583932c4 Christodoulos Psaltis
                            console.info('rebooted ' + serverID);
676 a1a31201 Dimitris Moraitis
                        } catch(err) {}
677 f533f224 Vangelis Koukis
                        // indicate that the action succeeded
678 f533f224 Vangelis Koukis
                        display_success(serverID);
679 f533f224 Vangelis Koukis
                        // continue with the rest of the servers
680 f533f224 Vangelis Koukis
                        reboot(serverIDs);
681 f533f224 Vangelis Koukis
                    } else {
682 f533f224 Vangelis Koukis
                        ajax_error(jqXHR.status, serverID, 'Reboot', jqXHR.responseText);
683 f533f224 Vangelis Koukis
                    }
684 f533f224 Vangelis Koukis
                }
685 42f67a2a Dimitris Moraitis
    });
686 42f67a2a Dimitris Moraitis
    return false;
687 42f67a2a Dimitris Moraitis
}
688 42f67a2a Dimitris Moraitis
689 42f67a2a Dimitris Moraitis
// shutdown action
690 42f67a2a Dimitris Moraitis
function shutdown(serverIDs) {
691 f533f224 Vangelis Koukis
    if (!serverIDs.length){
692 f533f224 Vangelis Koukis
        //ajax_success('DEFAULT');
693 f533f224 Vangelis Koukis
        return false;
694 f533f224 Vangelis Koukis
    }
695 42f67a2a Dimitris Moraitis
    // ajax post shutdown call
696 42f67a2a Dimitris Moraitis
    var payload = {
697 9bc2dbfa Vangelis Koukis
        "shutdown": {}
698 b02144c8 Vangelis Koukis
    };
699 42f67a2a Dimitris Moraitis
700 f533f224 Vangelis Koukis
    var serverID = serverIDs.pop();
701 f533f224 Vangelis Koukis
702 42f67a2a Dimitris Moraitis
    $.ajax({
703 f533f224 Vangelis Koukis
        url: API_URL + '/servers/' + serverID + '/action',
704 f533f224 Vangelis Koukis
        type: "POST",
705 f533f224 Vangelis Koukis
        contentType: "application/json",
706 f533f224 Vangelis Koukis
        dataType: "json",
707 42f67a2a Dimitris Moraitis
        data: JSON.stringify(payload),
708 42f67a2a Dimitris Moraitis
        timeout: TIMEOUT,
709 b02144c8 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
710 038383b1 Dimitris Moraitis
                    display_failure(jqXHR.status, serverID, 'Shutdown', jqXHR.responseText)
711 42f67a2a Dimitris Moraitis
                    },
712 42f67a2a Dimitris Moraitis
        success: function(data, textStatus, jqXHR) {
713 42f67a2a Dimitris Moraitis
                    if ( jqXHR.status == '202') {
714 f533f224 Vangelis Koukis
                        try {
715 583932c4 Christodoulos Psaltis
                            console.info('suspended ' + serverID);
716 a1a31201 Dimitris Moraitis
                        } catch(err) {}
717 f533f224 Vangelis Koukis
                        // indicate that the action succeeded
718 f533f224 Vangelis Koukis
                        display_success(serverID);
719 f533f224 Vangelis Koukis
                        // continue with the rest of the servers
720 42f67a2a Dimitris Moraitis
                        shutdown(serverIDs);
721 42f67a2a Dimitris Moraitis
                    } else {
722 038383b1 Dimitris Moraitis
                        ajax_error(jqXHR.status, serverID, 'Shutdown', jqXHR.responseText);
723 748139ba Christodoulos Psaltis
                    }
724 b02144c8 Vangelis Koukis
                }
725 42f67a2a Dimitris Moraitis
    });
726 b02144c8 Vangelis Koukis
    return false;
727 42f67a2a Dimitris Moraitis
}
728 42f67a2a Dimitris Moraitis
729 42f67a2a Dimitris Moraitis
// destroy action
730 42f67a2a Dimitris Moraitis
function destroy(serverIDs) {
731 f533f224 Vangelis Koukis
    if (!serverIDs.length){
732 f533f224 Vangelis Koukis
        //ajax_success('DEFAULT');
733 f533f224 Vangelis Koukis
        return false;
734 f533f224 Vangelis Koukis
    }
735 f15025bc Christodoulos Psaltis
    // ajax post destroy call can have an empty request body
736 b02144c8 Vangelis Koukis
    var payload = {};
737 42f67a2a Dimitris Moraitis
738 f533f224 Vangelis Koukis
    var serverID = serverIDs.pop();
739 f533f224 Vangelis Koukis
740 42f67a2a Dimitris Moraitis
    $.ajax({
741 f533f224 Vangelis Koukis
        url: API_URL + '/servers/' + serverID,
742 f533f224 Vangelis Koukis
        type: "DELETE",
743 f533f224 Vangelis Koukis
        contentType: "application/json",
744 f533f224 Vangelis Koukis
        dataType: "json",
745 42f67a2a Dimitris Moraitis
        data: JSON.stringify(payload),
746 42f67a2a Dimitris Moraitis
        timeout: TIMEOUT,
747 b02144c8 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
748 038383b1 Dimitris Moraitis
                    display_failure(jqXHR.status, serverID, 'Destroy', jqXHR.responseText)
749 42f67a2a Dimitris Moraitis
                    },
750 42f67a2a Dimitris Moraitis
        success: function(data, textStatus, jqXHR) {
751 2d5cea9b Markos Gogoulos
                    if ( jqXHR.status == '204') {
752 f533f224 Vangelis Koukis
                        try {
753 f15025bc Christodoulos Psaltis
                            console.info('destroyed ' + serverID);
754 a1a31201 Dimitris Moraitis
                        } catch (err) {}
755 f533f224 Vangelis Koukis
                        // indicate that the action succeeded
756 f533f224 Vangelis Koukis
                        display_success(serverID);
757 f533f224 Vangelis Koukis
                        // continue with the rest of the servers
758 38b1f387 Christodoulos Psaltis
                        destroy(serverIDs);
759 42f67a2a Dimitris Moraitis
                    } else {
760 038383b1 Dimitris Moraitis
                        ajax_error(jqXHR.status, serverID, 'Destroy', jqXHR.responseText);
761 748139ba Christodoulos Psaltis
                    }
762 b02144c8 Vangelis Koukis
                }
763 42f67a2a Dimitris Moraitis
    });
764 b02144c8 Vangelis Koukis
    return false;
765 42f67a2a Dimitris Moraitis
}
766 42f67a2a Dimitris Moraitis
767 42f67a2a Dimitris Moraitis
// start action
768 42f67a2a Dimitris Moraitis
function start(serverIDs){
769 f533f224 Vangelis Koukis
    if (!serverIDs.length){
770 f533f224 Vangelis Koukis
        //ajax_success('DEFAULT');
771 f533f224 Vangelis Koukis
        return false;
772 f533f224 Vangelis Koukis
    }
773 42f67a2a Dimitris Moraitis
    // ajax post start call
774 42f67a2a Dimitris Moraitis
    var payload = {
775 623d7244 Vangelis Koukis
        "start": {}
776 b02144c8 Vangelis Koukis
    };
777 42f67a2a Dimitris Moraitis
778 f533f224 Vangelis Koukis
    var serverID = serverIDs.pop();
779 f533f224 Vangelis Koukis
780 42f67a2a Dimitris Moraitis
    $.ajax({
781 0971fa71 Markos Gogoulos
        url: API_URL + '/servers/' + serverID + '/action',
782 42f67a2a Dimitris Moraitis
        type: "POST",
783 f533f224 Vangelis Koukis
        contentType: "application/json",
784 42f67a2a Dimitris Moraitis
        dataType: "json",
785 42f67a2a Dimitris Moraitis
        data: JSON.stringify(payload),
786 42f67a2a Dimitris Moraitis
        timeout: TIMEOUT,
787 b02144c8 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
788 038383b1 Dimitris Moraitis
                    display_failure(jqXHR.status, serverID, 'Start', jqXHR.responseText)
789 42f67a2a Dimitris Moraitis
                    },
790 42f67a2a Dimitris Moraitis
        success: function(data, textStatus, jqXHR) {
791 42f67a2a Dimitris Moraitis
                    if ( jqXHR.status == '202') {
792 f533f224 Vangelis Koukis
                        try {
793 583932c4 Christodoulos Psaltis
                            console.info('started ' + serverID);
794 a1a31201 Dimitris Moraitis
                        } catch(err) {}
795 f533f224 Vangelis Koukis
                        // indicate that the action succeeded
796 f533f224 Vangelis Koukis
                        display_success(serverID);
797 f533f224 Vangelis Koukis
                        // continue with the rest of the servers
798 42f67a2a Dimitris Moraitis
                        start(serverIDs);
799 42f67a2a Dimitris Moraitis
                    } else {
800 038383b1 Dimitris Moraitis
                        ajax_error(jqXHR.status, serverID, 'Start', jqXHR.responseText);
801 748139ba Christodoulos Psaltis
                    }
802 748139ba Christodoulos Psaltis
                }
803 42f67a2a Dimitris Moraitis
    });
804 42f67a2a Dimitris Moraitis
    return false;
805 42f67a2a Dimitris Moraitis
}
806 6902f72e clopy
807 b02144c8 Vangelis Koukis
// Show VNC console
808 b02144c8 Vangelis Koukis
function vnc_attachment(host, port, password) {
809 b02144c8 Vangelis Koukis
    // FIXME: Must be made into parameters, in settings.py
810 b02144c8 Vangelis Koukis
    //vnc = open("", "displayWindow",
811 b02144c8 Vangelis Koukis
    //    "status=yes,toolbar=yes,menubar=yes");
812 b02144c8 Vangelis Koukis
    vd = document.open("application/x-vnc");
813 b02144c8 Vangelis Koukis
814 b02144c8 Vangelis Koukis
    vd.writeln("[connection]");
815 b02144c8 Vangelis Koukis
    vd.writeln("host=" + host);
816 b02144c8 Vangelis Koukis
    vd.writeln("port=" + port);
817 b02144c8 Vangelis Koukis
    vd.writeln("password=" + password);
818 b02144c8 Vangelis Koukis
819 b02144c8 Vangelis Koukis
    vd.close();
820 b02144c8 Vangelis Koukis
}
821 b02144c8 Vangelis Koukis
822 b02144c8 Vangelis Koukis
// Show VNC console
823 f533f224 Vangelis Koukis
function show_vnc_console(serverID, serverName, serverIP, host, port, password) {
824 f533f224 Vangelis Koukis
    var params_url = '?machine=' + serverName + '&host_ip=' + serverIP + '&host=' + host + '&port=' + port + '&password=' + password;
825 f533f224 Vangelis Koukis
    var params_window = 'scrollbars=no,' +
826 f533f224 Vangelis Koukis
                        'menubar=no,' +
827 f533f224 Vangelis Koukis
                        'toolbar=no,' +
828 f533f224 Vangelis Koukis
                        'status=no,' +
829 f533f224 Vangelis Koukis
                        'top=0,' +
830 f533f224 Vangelis Koukis
                        'left=0,' +
831 f533f224 Vangelis Koukis
                        'height=' + screen.height + ',' +
832 f533f224 Vangelis Koukis
                        'width=' + screen.width + ',' +
833 f533f224 Vangelis Koukis
                        'fullscreen=yes';
834 f533f224 Vangelis Koukis
835 7e51c3db Markos Gogoulos
    window.open('machines/console' + params_url, 'formresult' + serverID, params_window);
836 f533f224 Vangelis Koukis
837 f533f224 Vangelis Koukis
    // Restore os icon in list view
838 f533f224 Vangelis Koukis
    osIcon = $('#'+serverID).parent().parent().find('.list-logo');
839 f533f224 Vangelis Koukis
    osIcon.attr('src',osIcon.attr('os'));
840 9c901aec Markos Gogoulos
    return false;
841 b02144c8 Vangelis Koukis
}
842 b02144c8 Vangelis Koukis
843 b02144c8 Vangelis Koukis
// console action
844 fb3eec11 Christodoulos Psaltis
function open_console(serverIDs){
845 f533f224 Vangelis Koukis
    if (!serverIDs.length){
846 f533f224 Vangelis Koukis
        //ajax_success('DEFAULT');
847 f533f224 Vangelis Koukis
        return false;
848 f533f224 Vangelis Koukis
    }
849 b02144c8 Vangelis Koukis
    // ajax post start call
850 b02144c8 Vangelis Koukis
    var payload = {
851 b02144c8 Vangelis Koukis
        "console": {"type": "vnc"}
852 b02144c8 Vangelis Koukis
    };
853 b02144c8 Vangelis Koukis
854 f533f224 Vangelis Koukis
    var serverID = serverIDs.pop();
855 f533f224 Vangelis Koukis
856 f533f224 Vangelis Koukis
    var machine = get_machine(serverID);
857 f533f224 Vangelis Koukis
    var serverName = machine.name;
858 f533f224 Vangelis Koukis
    var serverIP = machine.addresses.values[0].values[0].addr;
859 f533f224 Vangelis Koukis
860 b02144c8 Vangelis Koukis
    $.ajax({
861 b02144c8 Vangelis Koukis
        url: API_URL + '/servers/' + serverID + '/action',
862 b02144c8 Vangelis Koukis
        type: "POST",
863 f533f224 Vangelis Koukis
        contentType: "application/json",
864 b02144c8 Vangelis Koukis
        dataType: "json",
865 b02144c8 Vangelis Koukis
        data: JSON.stringify(payload),
866 b02144c8 Vangelis Koukis
        timeout: TIMEOUT,
867 b02144c8 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
868 b02144c8 Vangelis Koukis
                    display_failure(jqXHR.status, serverID, 'Console', jqXHR.responseText)
869 b02144c8 Vangelis Koukis
                    },
870 b02144c8 Vangelis Koukis
        success: function(data, textStatus, jqXHR) {
871 b02144c8 Vangelis Koukis
                    if ( jqXHR.status == '200') {
872 f533f224 Vangelis Koukis
                        try {
873 b02144c8 Vangelis Koukis
                            console.info('got_console ' + serverID);
874 b02144c8 Vangelis Koukis
                        } catch(err) {}
875 f533f224 Vangelis Koukis
                        // indicate that the action succeeded
876 f533f224 Vangelis Koukis
                        //show_vnc_console(serverID, serverName, serverIP, data.console.host,data.console.port,data.console.password);
877 f533f224 Vangelis Koukis
show_vnc_console(serverID, serverName, serverIP, data.console.host,data.console.port,data.console.password);
878 f533f224 Vangelis Koukis
                        display_success(serverID);
879 74175c17 Christodoulos Psaltis
                        // hide spinner
880 74175c17 Christodoulos Psaltis
                        $('#' + serverID + ' .spinner').hide();
881 f533f224 Vangelis Koukis
                        // continue with the rest of the servers
882 74175c17 Christodoulos Psaltis
                        open_console(serverIDs);
883 b02144c8 Vangelis Koukis
                    } else {
884 b02144c8 Vangelis Koukis
                        ajax_error(jqXHR.status, serverID, 'Console', jqXHR.responseText);
885 b02144c8 Vangelis Koukis
                    }
886 b02144c8 Vangelis Koukis
                }
887 b02144c8 Vangelis Koukis
    });
888 b02144c8 Vangelis Koukis
    return false;
889 b02144c8 Vangelis Koukis
}
890 b02144c8 Vangelis Koukis
891 f533f224 Vangelis Koukis
// rename server
892 a70a9116 Mike Muzurakis
function rename(serverID, serverName){
893 f533f224 Vangelis Koukis
    if (!serverID.length){
894 f533f224 Vangelis Koukis
        //ajax_success('DEFAULT');
895 f533f224 Vangelis Koukis
        return false;
896 f533f224 Vangelis Koukis
    }
897 0d4faeb8 Mike Muzurakis
    // ajax post rename call
898 0d4faeb8 Mike Muzurakis
    var payload = {
899 73715544 Christodoulos Psaltis
        "server": {"name": serverName}
900 b02144c8 Vangelis Koukis
    };
901 0d4faeb8 Mike Muzurakis
902 0d4faeb8 Mike Muzurakis
    $.ajax({
903 5b35631e Markos Gogoulos
        url: API_URL + '/servers/' + serverID,
904 a70a9116 Mike Muzurakis
        type: "PUT",
905 f533f224 Vangelis Koukis
        contentType: "application/json",
906 0d4faeb8 Mike Muzurakis
        dataType: "json",
907 0d4faeb8 Mike Muzurakis
        data: JSON.stringify(payload),
908 0d4faeb8 Mike Muzurakis
        timeout: TIMEOUT,
909 b02144c8 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
910 0d4faeb8 Mike Muzurakis
                    display_failure(jqXHR.status, serverID, 'Rename', jqXHR.responseText)
911 0d4faeb8 Mike Muzurakis
                    },
912 0d4faeb8 Mike Muzurakis
        success: function(data, textStatus, jqXHR) {
913 853c53ea Markos Gogoulos
                    if ( jqXHR.status == '204') {
914 f533f224 Vangelis Koukis
                        try {
915 0d4faeb8 Mike Muzurakis
                            console.info('renamed ' + serverID);
916 0d4faeb8 Mike Muzurakis
                        } catch(err) {}
917 f533f224 Vangelis Koukis
                        // indicate that the action succeeded
918 f533f224 Vangelis Koukis
                        display_success(serverID);
919 0d4faeb8 Mike Muzurakis
                    } else {
920 0d4faeb8 Mike Muzurakis
                        ajax_error(jqXHR.status, serverID, 'Rename', jqXHR.responseText);
921 0d4faeb8 Mike Muzurakis
                    }
922 0d4faeb8 Mike Muzurakis
                }
923 0d4faeb8 Mike Muzurakis
    });
924 0d4faeb8 Mike Muzurakis
    return false;
925 0d4faeb8 Mike Muzurakis
}
926 0d4faeb8 Mike Muzurakis
927 5186eb04 Christodoulos Psaltis
// get server metadata
928 f533f224 Vangelis Koukis
function get_metadata(serverID, keys_only) {
929 5186eb04 Christodoulos Psaltis
    $.ajax({
930 5186eb04 Christodoulos Psaltis
        url: API_URL + '/servers/' + serverID + '/meta',
931 5186eb04 Christodoulos Psaltis
        type: "GET",
932 5186eb04 Christodoulos Psaltis
        //async: false,
933 5186eb04 Christodoulos Psaltis
        dataType: "json",
934 5186eb04 Christodoulos Psaltis
        timeout: TIMEOUT,
935 b02144c8 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
936 5186eb04 Christodoulos Psaltis
            try {
937 f533f224 Vangelis Koukis
                ajax_error(jqXHR.status, undefined, 'Get metadata', jqXHR.responseText);
938 f533f224 Vangelis Koukis
            } catch (err) {
939 f533f224 Vangelis Koukis
                ajax_error(err);
940 f533f224 Vangelis Koukis
            }
941 5186eb04 Christodoulos Psaltis
        },
942 5186eb04 Christodoulos Psaltis
        success: function(data, textStatus, jqXHR) {
943 1b3857ab Christodoulos Psaltis
            // to list the new results in the edit dialog
944 f533f224 Vangelis Koukis
            if (keys_only) {
945 f533f224 Vangelis Koukis
                list_metadata_keys(serverID, data.metadata.values);
946 f533f224 Vangelis Koukis
            } else {
947 f533f224 Vangelis Koukis
                list_metadata(data);
948 f533f224 Vangelis Koukis
                list_metadata_keys(serverID, data.metadata.values);
949 f533f224 Vangelis Koukis
            }
950 f533f224 Vangelis Koukis
            //hide spinner
951 f533f224 Vangelis Koukis
            $('#metadata-wizard .large-spinner').hide();
952 5186eb04 Christodoulos Psaltis
        }
953 5186eb04 Christodoulos Psaltis
    });
954 5186eb04 Christodoulos Psaltis
    return false;
955 5186eb04 Christodoulos Psaltis
}
956 5186eb04 Christodoulos Psaltis
957 1b3857ab Christodoulos Psaltis
// delete metadata key-value pair
958 1b3857ab Christodoulos Psaltis
function delete_metadata(serverID, meta_key) {
959 0943cc77 Markos Gogoulos
    $.ajax({
960 0943cc77 Markos Gogoulos
        url: API_URL + '/servers/' + serverID + '/meta/' + meta_key,
961 0943cc77 Markos Gogoulos
        type: "DELETE",
962 0943cc77 Markos Gogoulos
        //async: false,
963 0943cc77 Markos Gogoulos
        dataType: "json",
964 0943cc77 Markos Gogoulos
        timeout: TIMEOUT,
965 b02144c8 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
966 0943cc77 Markos Gogoulos
            try {
967 f533f224 Vangelis Koukis
                ajax_error(jqXHR.status, undefined, 'Delete metadata', jqXHR.responseText);
968 f533f224 Vangelis Koukis
            } catch (err) {
969 f533f224 Vangelis Koukis
                ajax_error(err);
970 f533f224 Vangelis Koukis
            }
971 0943cc77 Markos Gogoulos
        },
972 0943cc77 Markos Gogoulos
        success: function(data, textStatus, jqXHR) {
973 f533f224 Vangelis Koukis
            // success: Do nothing, the UI is already updated
974 0943cc77 Markos Gogoulos
        }
975 0943cc77 Markos Gogoulos
    });
976 0943cc77 Markos Gogoulos
    return false;
977 0943cc77 Markos Gogoulos
}
978 0943cc77 Markos Gogoulos
979 1b3857ab Christodoulos Psaltis
// add metadata key-value pair
980 f533f224 Vangelis Koukis
function update_metadata(serverID, meta_key, meta_value) {
981 0c578a28 Markos Gogoulos
    var payload = {
982 0c578a28 Markos Gogoulos
        "meta": {
983 0c578a28 Markos Gogoulos
        }
984 0c578a28 Markos Gogoulos
    };
985 0c578a28 Markos Gogoulos
    payload["meta"][meta_key] = meta_value;
986 0c578a28 Markos Gogoulos
987 0c578a28 Markos Gogoulos
    $.ajax({
988 0c578a28 Markos Gogoulos
        url: API_URL + '/servers/' + serverID + '/meta/' + meta_key,
989 0c578a28 Markos Gogoulos
        type: "PUT",
990 f533f224 Vangelis Koukis
        contentType: "application/json",
991 f533f224 Vangelis Koukis
        dataType: "json",
992 f533f224 Vangelis Koukis
        data: JSON.stringify(payload),
993 f533f224 Vangelis Koukis
        timeout: TIMEOUT,
994 f533f224 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
995 f533f224 Vangelis Koukis
            try {
996 f533f224 Vangelis Koukis
                ajax_error(jqXHR.status, undefined, 'add metadata', jqXHR.responseText);
997 f533f224 Vangelis Koukis
            } catch (err) {
998 f533f224 Vangelis Koukis
                ajax_error(err);
999 f533f224 Vangelis Koukis
            }
1000 f533f224 Vangelis Koukis
        },
1001 f533f224 Vangelis Koukis
        success: function(data, textStatus, jqXHR) {
1002 f533f224 Vangelis Koukis
            // success: Update icons if meta key is OS
1003 f533f224 Vangelis Koukis
            if (meta_key == "OS") {
1004 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');
1005 f533f224 Vangelis Koukis
                $("#machinesview-icon").find("div#" + serverID).find("img.logo").attr("src", "static/icons/machines/medium/" + os_icon_from_value(meta_value) + '-' + $("#metadata-wizard div#on-off").text() + '.png');
1006 f533f224 Vangelis Koukis
            }
1007 f533f224 Vangelis Koukis
        }
1008 f533f224 Vangelis Koukis
    });
1009 f533f224 Vangelis Koukis
    return false;
1010 f533f224 Vangelis Koukis
}
1011 f533f224 Vangelis Koukis
1012 f533f224 Vangelis Koukis
// create network
1013 f533f224 Vangelis Koukis
function create_network(networkName){
1014 f533f224 Vangelis Koukis
    // ajax post start call
1015 f533f224 Vangelis Koukis
    var payload = {
1016 f533f224 Vangelis Koukis
        "network": { "name": networkName }
1017 f533f224 Vangelis Koukis
    };
1018 f533f224 Vangelis Koukis
1019 f533f224 Vangelis Koukis
    $.ajax({
1020 f533f224 Vangelis Koukis
        url: API_URL + '/networks',
1021 f533f224 Vangelis Koukis
        type: "POST",
1022 f533f224 Vangelis Koukis
        contentType: "application/json",
1023 f533f224 Vangelis Koukis
        dataType: "json",
1024 f533f224 Vangelis Koukis
        data: JSON.stringify(payload),
1025 f533f224 Vangelis Koukis
        timeout: TIMEOUT,
1026 f533f224 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
1027 f533f224 Vangelis Koukis
            try {
1028 f533f224 Vangelis Koukis
                ajax_error(jqXHR.status, undefined, 'Create network', jqXHR.responseText);
1029 f533f224 Vangelis Koukis
            } catch (err) {
1030 f533f224 Vangelis Koukis
                ajax_error(err);
1031 f533f224 Vangelis Koukis
            }
1032 f533f224 Vangelis Koukis
        },
1033 f533f224 Vangelis Koukis
        success: function(data, textStatus, jqXHR) {
1034 f533f224 Vangelis Koukis
            if ( jqXHR.status == '202') {
1035 f533f224 Vangelis Koukis
                try {
1036 f533f224 Vangelis Koukis
                    console.info('created network ' + networkName);
1037 f533f224 Vangelis Koukis
                } catch(err) {}
1038 f533f224 Vangelis Koukis
                update_networks(UPDATE_INTERVAL);
1039 f533f224 Vangelis Koukis
                $("a#networkscreate").overlay().close();
1040 f533f224 Vangelis Koukis
            } else {
1041 f533f224 Vangelis Koukis
                ajax_error(jqXHR.status, undefined, 'Create network', jqXHR.responseText);
1042 f533f224 Vangelis Koukis
            }
1043 f533f224 Vangelis Koukis
        }
1044 f533f224 Vangelis Koukis
    });
1045 f533f224 Vangelis Koukis
    return false;
1046 f533f224 Vangelis Koukis
}
1047 f533f224 Vangelis Koukis
1048 f533f224 Vangelis Koukis
// rename network
1049 f533f224 Vangelis Koukis
function rename_network(networkID, networkName){
1050 f533f224 Vangelis Koukis
    if (!networkID.length){
1051 f533f224 Vangelis Koukis
        //ajax_success('DEFAULT');
1052 f533f224 Vangelis Koukis
        return false;
1053 f533f224 Vangelis Koukis
    }
1054 f533f224 Vangelis Koukis
    // prepare payload
1055 f533f224 Vangelis Koukis
    var payload = {
1056 f533f224 Vangelis Koukis
        "network": {"name": networkName}
1057 f533f224 Vangelis Koukis
    };
1058 f533f224 Vangelis Koukis
    // ajax call
1059 f533f224 Vangelis Koukis
    $.ajax({
1060 f533f224 Vangelis Koukis
        url: API_URL + '/networks/' + networkID,
1061 f533f224 Vangelis Koukis
        type: "PUT",
1062 f533f224 Vangelis Koukis
        contentType: "application/json",
1063 f533f224 Vangelis Koukis
        dataType: "json",
1064 f533f224 Vangelis Koukis
        data: JSON.stringify(payload),
1065 f533f224 Vangelis Koukis
        timeout: TIMEOUT,
1066 f533f224 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
1067 f533f224 Vangelis Koukis
            try {
1068 f533f224 Vangelis Koukis
                ajax_error(jqXHR.status, undefined, 'Rename network', jqXHR.responseText);
1069 f533f224 Vangelis Koukis
            } catch (err) {
1070 f533f224 Vangelis Koukis
                ajax_error(err);
1071 f533f224 Vangelis Koukis
            }
1072 f533f224 Vangelis Koukis
        },
1073 f533f224 Vangelis Koukis
        success: function(data, textStatus, jqXHR) {
1074 f533f224 Vangelis Koukis
            if ( jqXHR.status == '204') {
1075 f533f224 Vangelis Koukis
                try {
1076 f533f224 Vangelis Koukis
                    console.info('renamed network' + networkID);
1077 f533f224 Vangelis Koukis
                } catch(err) {}
1078 f533f224 Vangelis Koukis
            } else {
1079 f533f224 Vangelis Koukis
                ajax_error(jqXHR.status, undefined, 'Rename network', jqXHR.responseText);
1080 f533f224 Vangelis Koukis
            }
1081 f533f224 Vangelis Koukis
        }
1082 f533f224 Vangelis Koukis
    });
1083 f533f224 Vangelis Koukis
    return false;
1084 f533f224 Vangelis Koukis
}
1085 f533f224 Vangelis Koukis
1086 f533f224 Vangelis Koukis
function delete_network(networkIDs){
1087 f533f224 Vangelis Koukis
    if (!networkIDs.length){
1088 f533f224 Vangelis Koukis
        //ajax_success('DEFAULT');
1089 f533f224 Vangelis Koukis
        return false;
1090 f533f224 Vangelis Koukis
    }
1091 f533f224 Vangelis Koukis
    // get a network
1092 f533f224 Vangelis Koukis
    var networkID = networkIDs.pop();
1093 f533f224 Vangelis Koukis
    // ajax post destroy call can have an empty request body
1094 f533f224 Vangelis Koukis
    var payload = {};
1095 f533f224 Vangelis Koukis
    // ajax call
1096 f533f224 Vangelis Koukis
    $.ajax({
1097 f533f224 Vangelis Koukis
        url: API_URL + '/networks/' + networkID,
1098 f533f224 Vangelis Koukis
        type: "DELETE",
1099 f533f224 Vangelis Koukis
        contentType: "application/json",
1100 f533f224 Vangelis Koukis
        dataType: "json",
1101 f533f224 Vangelis Koukis
        data: JSON.stringify(payload),
1102 f533f224 Vangelis Koukis
        timeout: TIMEOUT,
1103 f533f224 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
1104 f533f224 Vangelis Koukis
            try {
1105 f533f224 Vangelis Koukis
                ajax_error(jqXHR.status, undefined, 'Delete network', jqXHR.responseText);
1106 f533f224 Vangelis Koukis
            } catch (err) {
1107 f533f224 Vangelis Koukis
                ajax_error(err);
1108 f533f224 Vangelis Koukis
            }
1109 f533f224 Vangelis Koukis
        },
1110 f533f224 Vangelis Koukis
        success: function(data, textStatus, jqXHR) {
1111 f533f224 Vangelis Koukis
            if ( jqXHR.status == '204') {
1112 f533f224 Vangelis Koukis
                try {
1113 f533f224 Vangelis Koukis
                    console.info('deleted network ' + networkID);
1114 f533f224 Vangelis Koukis
                } catch(err) {}
1115 f533f224 Vangelis Koukis
                // continue with the rest of the servers
1116 f533f224 Vangelis Koukis
                delete_network(networkIDs);
1117 f533f224 Vangelis Koukis
            } else {
1118 f533f224 Vangelis Koukis
                ajax_error(jqXHR.status, undefined, 'Delete network', jqXHR.responseText);
1119 f533f224 Vangelis Koukis
            }
1120 f533f224 Vangelis Koukis
        }
1121 f533f224 Vangelis Koukis
    });
1122 f533f224 Vangelis Koukis
    return false;
1123 f533f224 Vangelis Koukis
}
1124 f533f224 Vangelis Koukis
1125 f533f224 Vangelis Koukis
function add_server_to_network(networkID, serverIDs) {
1126 f533f224 Vangelis Koukis
    if (!serverIDs.length){
1127 f533f224 Vangelis Koukis
        //ajax_success('DEFAULT');
1128 f533f224 Vangelis Koukis
        update_networks(UPDATE_INTERVAL);
1129 f533f224 Vangelis Koukis
        $("a#add-machines-overlay").overlay().close();
1130 f533f224 Vangelis Koukis
        return false;
1131 f533f224 Vangelis Koukis
    }
1132 f533f224 Vangelis Koukis
    // get a server
1133 f533f224 Vangelis Koukis
    var serverID = serverIDs.pop();
1134 f533f224 Vangelis Koukis
    // prepare payload
1135 f533f224 Vangelis Koukis
    var payload = {
1136 f533f224 Vangelis Koukis
            "add": { "serverRef": serverID }
1137 f533f224 Vangelis Koukis
        };
1138 f533f224 Vangelis Koukis
    // prepare ajax call
1139 f533f224 Vangelis Koukis
    $.ajax({
1140 f533f224 Vangelis Koukis
        url: API_URL + '/networks/' + networkID + '/action',
1141 f533f224 Vangelis Koukis
        type: "POST",
1142 f533f224 Vangelis Koukis
        contentType: "application/json",
1143 b02144c8 Vangelis Koukis
        dataType: "json",
1144 0c578a28 Markos Gogoulos
        data: JSON.stringify(payload),
1145 0c578a28 Markos Gogoulos
        timeout: TIMEOUT,
1146 b02144c8 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
1147 0c578a28 Markos Gogoulos
            try {
1148 f533f224 Vangelis Koukis
                ajax_error(jqXHR.status, undefined, 'Add server to network', jqXHR.responseText);
1149 f533f224 Vangelis Koukis
            } catch (err) {
1150 f533f224 Vangelis Koukis
                ajax_error(err);
1151 f533f224 Vangelis Koukis
            }
1152 0c578a28 Markos Gogoulos
        },
1153 0c578a28 Markos Gogoulos
        success: function(data, textStatus, jqXHR) {
1154 f533f224 Vangelis Koukis
            if ( jqXHR.status == '202') {
1155 f533f224 Vangelis Koukis
                try {
1156 f533f224 Vangelis Koukis
                    console.info('added server ' + serverID + ' to network ' + networkID);
1157 f533f224 Vangelis Koukis
                } catch(err) {}
1158 f533f224 Vangelis Koukis
                // continue with the rest of the servers
1159 f533f224 Vangelis Koukis
                add_server_to_network(networkID, serverIDs);
1160 f533f224 Vangelis Koukis
            } else {
1161 f533f224 Vangelis Koukis
                ajax_error(jqXHR.status, undefined, 'Add server to network', jqXHR.responseText);
1162 f533f224 Vangelis Koukis
            }
1163 0c578a28 Markos Gogoulos
        }
1164 0c578a28 Markos Gogoulos
    });
1165 0c578a28 Markos Gogoulos
    return false;
1166 0c578a28 Markos Gogoulos
}
1167 0c578a28 Markos Gogoulos
1168 f533f224 Vangelis Koukis
function remove_server_from_network(networkIDs, serverIDs) {
1169 f533f224 Vangelis Koukis
    if (!networkIDs.length){
1170 f533f224 Vangelis Koukis
        //ajax_success('DEFAULT');
1171 f533f224 Vangelis Koukis
        return false;
1172 f533f224 Vangelis Koukis
    }
1173 f533f224 Vangelis Koukis
    // get a network and a server
1174 f533f224 Vangelis Koukis
    var networkID = networkIDs.pop();
1175 f533f224 Vangelis Koukis
    var serverID = serverIDs.pop();
1176 f533f224 Vangelis Koukis
    // prepare payload
1177 f533f224 Vangelis Koukis
    var payload = {
1178 f533f224 Vangelis Koukis
            "remove": { "serverRef": serverID }
1179 f533f224 Vangelis Koukis
        };
1180 f533f224 Vangelis Koukis
    // prepare ajax call
1181 f533f224 Vangelis Koukis
    $.ajax({
1182 f533f224 Vangelis Koukis
        url: API_URL + '/networks/' + networkID + '/action',
1183 f533f224 Vangelis Koukis
        type: "POST",
1184 f533f224 Vangelis Koukis
        contentType: "application/json",
1185 f533f224 Vangelis Koukis
        dataType: "json",
1186 f533f224 Vangelis Koukis
        data: JSON.stringify(payload),
1187 f533f224 Vangelis Koukis
        timeout: TIMEOUT,
1188 f533f224 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
1189 f533f224 Vangelis Koukis
            try {
1190 f533f224 Vangelis Koukis
                ajax_error(jqXHR.status, undefined, 'Remove server form network', jqXHR.responseText);
1191 f533f224 Vangelis Koukis
            } catch (err) {
1192 f533f224 Vangelis Koukis
                ajax_error(err);
1193 f533f224 Vangelis Koukis
            }
1194 f533f224 Vangelis Koukis
        },
1195 f533f224 Vangelis Koukis
        success: function(data, textStatus, jqXHR) {
1196 f533f224 Vangelis Koukis
            if ( jqXHR.status == '202') {
1197 f533f224 Vangelis Koukis
                try {
1198 f533f224 Vangelis Koukis
                    console.info('deleted server ' + serverID + ' from network ' + networkID);
1199 f533f224 Vangelis Koukis
                } catch(err) {}
1200 f533f224 Vangelis Koukis
                // remove it from DOM
1201 f533f224 Vangelis Koukis
                $('#net-' + networkID + '-server-' + serverID).fadeOut('slow').remove();
1202 f533f224 Vangelis Koukis
                // continue with the rest of the servers
1203 f533f224 Vangelis Koukis
                remove_server_form_network(networkIDs, serverIDs);
1204 f533f224 Vangelis Koukis
            } else {
1205 f533f224 Vangelis Koukis
                ajax_error(jqXHR.status, undefined, 'Remove server form network', jqXHR.responseText);
1206 f533f224 Vangelis Koukis
            }
1207 f533f224 Vangelis Koukis
        }
1208 f533f224 Vangelis Koukis
    });
1209 f533f224 Vangelis Koukis
    return false;
1210 f533f224 Vangelis Koukis
}
1211 0c578a28 Markos Gogoulos
1212 6902f72e clopy
// show the welcome screen
1213 6902f72e clopy
function showWelcome() {
1214 f5ebca32 Mike Muzurakis
    $("#view-select").fadeOut("fast");
1215 f5ebca32 Mike Muzurakis
    $("#emptymachineslist").fadeIn("fast");
1216 f0215d6b Mike Muzurakis
    $("#machinesview").hide();
1217 6902f72e clopy
}
1218 6902f72e clopy
1219 6902f72e clopy
// hide the welcome screen
1220 6902f72e clopy
function hideWelcome() {
1221 6902f72e clopy
    $("#emptymachineslist").fadeOut("fast");
1222 6902f72e clopy
    $("#view-select").fadeIn("fast");
1223 ce4f9227 Mike Muzurakis
    $("div#view-select").show();
1224 f0215d6b Mike Muzurakis
    $("#machinesview").show();
1225 f533f224 Vangelis Koukis
}
1226 f533f224 Vangelis Koukis
1227 f533f224 Vangelis Koukis
function log_server_status_change(server_entry, new_status) {
1228 f533f224 Vangelis Koukis
    // firebug console logging
1229 f533f224 Vangelis Koukis
    try {
1230 f533f224 Vangelis Koukis
        console.info(server_entry.find("div.name span.name").text() +
1231 f533f224 Vangelis Koukis
                    ' from ' + server_entry.find(".status").text() +
1232 f533f224 Vangelis Koukis
                    ' to ' + STATUSES[new_status]);
1233 f533f224 Vangelis Koukis
    } catch(err) {}
1234 f533f224 Vangelis Koukis
}
1235 f533f224 Vangelis Koukis
1236 f533f224 Vangelis Koukis
function get_flavor_params(flavorRef) {
1237 f533f224 Vangelis Koukis
    var cpus, ram, disk;
1238 f533f224 Vangelis Koukis
    if ( flavors.length > 0 ) {
1239 f533f224 Vangelis Koukis
        var current_flavor = '';
1240 f533f224 Vangelis Koukis
        for (i=0; i<flavors.length; i++) {
1241 f533f224 Vangelis Koukis
            if (flavors[i]['id'] == flavorRef) {
1242 f533f224 Vangelis Koukis
                current_flavor = flavors[i];
1243 f533f224 Vangelis Koukis
            }
1244 f533f224 Vangelis Koukis
        }
1245 f533f224 Vangelis Koukis
        cpus = current_flavor['cpu'];
1246 f533f224 Vangelis Koukis
        ram = current_flavor['ram'];
1247 f533f224 Vangelis Koukis
        disk = current_flavor['disk'];
1248 f533f224 Vangelis Koukis
    } else {
1249 f533f224 Vangelis Koukis
        cpus = 'undefined';
1250 f533f224 Vangelis Koukis
        ram = 'undefined';
1251 f533f224 Vangelis Koukis
        disk = 'undefined';
1252 f533f224 Vangelis Koukis
    }
1253 f533f224 Vangelis Koukis
    return {'cpus': cpus, 'ram': ram, 'disk': disk};
1254 f533f224 Vangelis Koukis
}
1255 f533f224 Vangelis Koukis
1256 f533f224 Vangelis Koukis
function get_image_params(imageRef) {
1257 f533f224 Vangelis Koukis
    var image_name, image_size;
1258 f533f224 Vangelis Koukis
    if ( images.length > 0 ) {
1259 f533f224 Vangelis Koukis
        var current_image = '';
1260 f533f224 Vangelis Koukis
        for (i=0; i<images.length; i++) {
1261 f533f224 Vangelis Koukis
            if (images[i]['id'] == imageRef) {
1262 f533f224 Vangelis Koukis
                current_image = images[i];
1263 f533f224 Vangelis Koukis
            }
1264 f533f224 Vangelis Koukis
        }
1265 f533f224 Vangelis Koukis
        image_name = current_image['name'];
1266 f533f224 Vangelis Koukis
        image_size = current_image['metadata']['values']['size'];
1267 f533f224 Vangelis Koukis
    } else {
1268 f533f224 Vangelis Koukis
        image_name = 'undefined';
1269 f533f224 Vangelis Koukis
        image_size = 'undefined';
1270 f533f224 Vangelis Koukis
    }
1271 f533f224 Vangelis Koukis
    return {'name': image_name,'size': image_size};
1272 f533f224 Vangelis Koukis
}
1273 f533f224 Vangelis Koukis
1274 f533f224 Vangelis Koukis
function get_public_ips(server) {
1275 f533f224 Vangelis Koukis
    var ip4, ip6;
1276 f533f224 Vangelis Koukis
    try {
1277 f533f224 Vangelis Koukis
        if (server.addresses.values) {
1278 f533f224 Vangelis Koukis
            $.each (server.addresses.values, function(i, value) {
1279 f533f224 Vangelis Koukis
                if (value.id == 'public') {
1280 f533f224 Vangelis Koukis
                    try {
1281 f533f224 Vangelis Koukis
                        $.each (value.values, function(i, ip) {
1282 f533f224 Vangelis Koukis
                            if (ip.version == '4') {
1283 f533f224 Vangelis Koukis
                                ip4 = ip.addr;
1284 f533f224 Vangelis Koukis
                            } else if (ip.version == '6') {
1285 f533f224 Vangelis Koukis
                                ip6 = ip.addr;
1286 f533f224 Vangelis Koukis
                            } else {
1287 f533f224 Vangelis Koukis
                                ip4 = 'undefined';
1288 f533f224 Vangelis Koukis
                                ip6 = 'undefined';
1289 f533f224 Vangelis Koukis
                            }
1290 f533f224 Vangelis Koukis
                        });
1291 f533f224 Vangelis Koukis
                    } catch (err){
1292 f533f224 Vangelis Koukis
                        try{console.info('Server ' + server.id + ' has invalid ips')}catch(err){};
1293 f533f224 Vangelis Koukis
                        ip4 = 'undefined';
1294 f533f224 Vangelis Koukis
                        ip6 = 'undefined';
1295 f533f224 Vangelis Koukis
                    }
1296 f533f224 Vangelis Koukis
                }
1297 f533f224 Vangelis Koukis
            });
1298 f533f224 Vangelis Koukis
        }
1299 f533f224 Vangelis Koukis
    } catch (err) {
1300 f533f224 Vangelis Koukis
        try{console.info('Server ' + server.id + ' has no network addresses')}catch(err){};
1301 f533f224 Vangelis Koukis
        ip4 = 'undefined';
1302 f533f224 Vangelis Koukis
        ip6 = 'undefined';
1303 f533f224 Vangelis Koukis
    }
1304 f533f224 Vangelis Koukis
    return {'ip4': ip4, 'ip6': ip6};
1305 6902f72e clopy
}
1306 6902f72e clopy
1307 f533f224 Vangelis Koukis
function get_private_ips(server) {
1308 f533f224 Vangelis Koukis
1309 f533f224 Vangelis Koukis
}