Statistics
| Branch: | Tag: | Revision:

root / ui / static / synnefo.js @ 623d7244

History | View | Annotate | Download (23.9 kB)

1 146b6003 Dimitris Moraitis
var flavors = [], images = [], servers = [], disks = [], cpus = [], ram = [];
2 267403ca Dimitris Moraitis
var changes_since = 0, deferred = 0, update_request = false, load_request = false, pending_actions = [];
3 22afb635 Vangelis Koukis
var API_URL = "/api/v1.1";
4 146b6003 Dimitris Moraitis
5 c5a032c4 Markos Gogoulos
function ISODateString(d){
6 c5a032c4 Markos Gogoulos
    //return a date in an ISO 8601 format using UTC. 
7 c5a032c4 Markos Gogoulos
    //do not include time zone info (Z) at the end
8 c5a032c4 Markos Gogoulos
    //taken from the Mozilla Developer Center 
9 267403ca Dimitris Moraitis
    function pad(n){ return n<10 ? '0'+n : n }
10 267403ca Dimitris Moraitis
    return  d.getUTCFullYear()+ '-' +
11 267403ca Dimitris Moraitis
                        pad(d.getUTCMonth()+1) + '-' +
12 267403ca Dimitris Moraitis
                        pad(d.getUTCDate()) + 'T' +
13 267403ca Dimitris Moraitis
                        pad(d.getUTCHours()) + ':' +
14 038383b1 Dimitris Moraitis
                        pad(d.getUTCMinutes()) + ':' +
15 038383b1 Dimitris Moraitis
                        pad(d.getUTCSeconds()) +'Z'
16 038383b1 Dimitris Moraitis
}
17 038383b1 Dimitris Moraitis
18 038383b1 Dimitris Moraitis
function parse_error(responseText){
19 038383b1 Dimitris Moraitis
        var errors = [];
20 a8e592c7 Dimitris Moraitis
        if (responseText.length == 0){
21 a8e592c7 Dimitris Moraitis
                errors[0] = {'code': 503};
22 a8e592c7 Dimitris Moraitis
        } else {
23 a8e592c7 Dimitris Moraitis
                responseObj = JSON.parse(responseText);
24 a8e592c7 Dimitris Moraitis
                //console.info(inp);
25 a8e592c7 Dimitris Moraitis
                for (var err in responseObj){
26 a8e592c7 Dimitris Moraitis
                        errors[errors.length] = responseObj[err];
27 a8e592c7 Dimitris Moraitis
                }
28 038383b1 Dimitris Moraitis
        }
29 038383b1 Dimitris Moraitis
        return errors;
30 267403ca Dimitris Moraitis
}
31 c5a032c4 Markos Gogoulos
32 41cad45d Dimitris Moraitis
// indexOf prototype for IE
33 41cad45d Dimitris Moraitis
if (!Array.prototype.indexOf) {
34 41cad45d Dimitris Moraitis
  Array.prototype.indexOf = function(elt /*, from*/) {
35 41cad45d Dimitris Moraitis
    var len = this.length;
36 41cad45d Dimitris Moraitis
    var from = Number(arguments[1]) || 0;
37 41cad45d Dimitris Moraitis
    from = (from < 0)
38 41cad45d Dimitris Moraitis
         ? Math.ceil(from)
39 41cad45d Dimitris Moraitis
         : Math.floor(from);
40 41cad45d Dimitris Moraitis
    if (from < 0)
41 41cad45d Dimitris Moraitis
      from += len;
42 41cad45d Dimitris Moraitis
43 41cad45d Dimitris Moraitis
    for (; from < len; from++) {
44 41cad45d Dimitris Moraitis
      if (from in this &&
45 41cad45d Dimitris Moraitis
          this[from] === elt)
46 41cad45d Dimitris Moraitis
        return from;
47 41cad45d Dimitris Moraitis
    }
48 41cad45d Dimitris Moraitis
    return -1;
49 41cad45d Dimitris Moraitis
  };
50 41cad45d Dimitris Moraitis
}
51 41cad45d Dimitris Moraitis
52 41cad45d Dimitris Moraitis
53 3d286f84 Dimitris Moraitis
function update_confirmations(){
54 dcf153ce Christodoulos Psaltis
    // hide all confirm boxes to begin with
55 dcf153ce Christodoulos Psaltis
    $('div.confirm_single').hide();
56 695e1b21 Dimitris Moraitis
    $('div.confirm_multiple').hide();
57 dcf153ce Christodoulos Psaltis
   
58 990772be Dimitris Moraitis
        // standard view only
59 990772be Dimitris Moraitis
        if ($.cookie("list") != '1') { 
60 ef7770cf Dimitris Moraitis
                for (var i=0;i<pending_actions.length;i++){
61 dcf153ce Christodoulos Psaltis
            // show single confirms
62 990772be Dimitris Moraitis
                        $("div.machine#"+pending_actions[i][1]+' .confirm_single').show();        
63 990772be Dimitris Moraitis
                }                
64 990772be Dimitris Moraitis
        }
65 dcf153ce Christodoulos Psaltis
66 dcf153ce Christodoulos Psaltis
        // if more than one pending action show multiple confirm box
67 dcf153ce Christodoulos Psaltis
        if (pending_actions.length>1 || $.cookie("list") == '1' && pending_actions.length == 1){ 
68 3d286f84 Dimitris Moraitis
                $('div.confirm_multiple span.actionLen').text(pending_actions.length);
69 3d286f84 Dimitris Moraitis
                $('div.confirm_multiple').show();
70 3d286f84 Dimitris Moraitis
        }
71 3d286f84 Dimitris Moraitis
}
72 3d286f84 Dimitris Moraitis
73 42f67a2a Dimitris Moraitis
function list_view() {
74 1a49199e Dimitris Moraitis
        changes_since = 0; // to reload full list
75 3d286f84 Dimitris Moraitis
        pending_actions = []; // clear pending actions
76 3d286f84 Dimitris Moraitis
        update_confirmations();
77 1a49199e Dimitris Moraitis
        clearTimeout(deferred);        // clear old deferred calls
78 1c7978ce Dimitris Moraitis
        try {
79 267403ca Dimitris Moraitis
                update_request.abort(); // cancel pending ajax updates
80 267403ca Dimitris Moraitis
                load_request.abort();
81 1c7978ce Dimitris Moraitis
        }catch(err){}
82 42f67a2a Dimitris Moraitis
    $.cookie("list", '1'); // set list cookie
83 267403ca Dimitris Moraitis
        
84 267403ca Dimitris Moraitis
        uri = $("#list").attr("href");
85 267403ca Dimitris Moraitis
    load_request = $.ajax({
86 267403ca Dimitris Moraitis
        url: uri,
87 267403ca Dimitris Moraitis
        type: "GET",
88 267403ca Dimitris Moraitis
        timeout: TIMEOUT,
89 267403ca Dimitris Moraitis
        dataType: "html",
90 267403ca Dimitris Moraitis
        error: function(jqXHR, textStatus, errorThrown) {                                                
91 267403ca Dimitris Moraitis
                        return false;
92 267403ca Dimitris Moraitis
                },
93 267403ca Dimitris Moraitis
        success: function(data, textStatus, jqXHR) {
94 aa1e0cab Markos Gogoulos
                        $("a#list")[0].className += ' activelink';
95 aa1e0cab Markos Gogoulos
                        $("a#standard")[0].className = '';
96 267403ca Dimitris Moraitis
                        $("div#machinesview").html(data);
97 267403ca Dimitris Moraitis
                }
98 267403ca Dimitris Moraitis
        });
99 267403ca Dimitris Moraitis
    
100 42f67a2a Dimitris Moraitis
    return false;
101 42f67a2a Dimitris Moraitis
}
102 42f67a2a Dimitris Moraitis
103 42f67a2a Dimitris Moraitis
function standard_view() {
104 1a49199e Dimitris Moraitis
        changes_since = 0; // to reload full list
105 3d286f84 Dimitris Moraitis
        pending_actions = []; // clear pending actions
106 3d286f84 Dimitris Moraitis
        update_confirmations();
107 1a49199e Dimitris Moraitis
        clearTimeout(deferred);        // clear old deferred calls
108 1c7978ce Dimitris Moraitis
        try {
109 1c7978ce Dimitris Moraitis
                update_request.abort() // cancel pending ajax updates
110 267403ca Dimitris Moraitis
                load_request.abort();
111 1c7978ce Dimitris Moraitis
        }catch(err){}        
112 42f67a2a Dimitris Moraitis
    $.cookie("list", '0');
113 267403ca Dimitris Moraitis
        
114 267403ca Dimitris Moraitis
    uri = $("a#standard").attr("href");
115 267403ca Dimitris Moraitis
    load_request = $.ajax({
116 267403ca Dimitris Moraitis
        url: uri,
117 267403ca Dimitris Moraitis
        type: "GET",
118 267403ca Dimitris Moraitis
        timeout: TIMEOUT,
119 267403ca Dimitris Moraitis
        dataType: "html",
120 267403ca Dimitris Moraitis
        error: function(jqXHR, textStatus, errorThrown) {                                                
121 267403ca Dimitris Moraitis
                        return false;
122 267403ca Dimitris Moraitis
                },
123 267403ca Dimitris Moraitis
        success: function(data, textStatus, jqXHR) {
124 aa1e0cab Markos Gogoulos
                        $("a#standard")[0].className += ' activelink';
125 aa1e0cab Markos Gogoulos
                        $("a#list")[0].className = '';
126 267403ca Dimitris Moraitis
                        $("div#machinesview").html(data);
127 267403ca Dimitris Moraitis
                }
128 267403ca Dimitris Moraitis
        });        
129 267403ca Dimitris Moraitis
130 42f67a2a Dimitris Moraitis
    return false;
131 42f67a2a Dimitris Moraitis
}
132 42f67a2a Dimitris Moraitis
133 42f67a2a Dimitris Moraitis
function choose_view() {
134 42f67a2a Dimitris Moraitis
    if ($.cookie("list")=='1') {
135 42f67a2a Dimitris Moraitis
        list_view();
136 42f67a2a Dimitris Moraitis
    } else {
137 42f67a2a Dimitris Moraitis
        standard_view();
138 42f67a2a Dimitris Moraitis
    }
139 42f67a2a Dimitris Moraitis
}
140 42f67a2a Dimitris Moraitis
141 42f67a2a Dimitris Moraitis
function toggleMenu() {
142 42f67a2a Dimitris Moraitis
    var primary = $("ul.css-tabs li a.primary");
143 42f67a2a Dimitris Moraitis
    var secondary = $("ul.css-tabs li a.secondary");
144 42f67a2a Dimitris Moraitis
    var all = $("ul.css-tabs li a");                        
145 42f67a2a Dimitris Moraitis
    var toggled = $('ul.css-tabs li a.current').hasClass('secondary');
146 42f67a2a Dimitris Moraitis
    
147 42f67a2a Dimitris Moraitis
    // if anything is still moving, do nothing
148 42f67a2a Dimitris Moraitis
    if ($(":animated").length) {
149 42f67a2a Dimitris Moraitis
        return;
150 42f67a2a Dimitris Moraitis
    } 
151 42f67a2a Dimitris Moraitis
    
152 42f67a2a Dimitris Moraitis
    // nothing is current to begin with
153 42f67a2a Dimitris Moraitis
    $('ul.css-tabs li a.current').removeClass('current');
154 42f67a2a Dimitris Moraitis
    
155 42f67a2a Dimitris Moraitis
    // move stuff around
156 42f67a2a Dimitris Moraitis
    all.animate({top:'30px'}, {complete: function() { 
157 42f67a2a Dimitris Moraitis
        $(this).hide();
158 42f67a2a Dimitris Moraitis
        if (toggled) {
159 42f67a2a Dimitris Moraitis
            primary.show();
160 42f67a2a Dimitris Moraitis
            primary.animate({top:'9px'}, {complete: function() {
161 42f67a2a Dimitris Moraitis
                $('ul.css-tabs li a.primary#machines').addClass('current');
162 42f67a2a Dimitris Moraitis
                $('a#machines').click();                                   
163 42f67a2a Dimitris Moraitis
            }});
164 42f67a2a Dimitris Moraitis
        } else {
165 42f67a2a Dimitris Moraitis
            secondary.show();
166 42f67a2a Dimitris Moraitis
            secondary.animate({top:'9px'}, {complete: function() {
167 42f67a2a Dimitris Moraitis
                $('ul.css-tabs li a.secondary#files').addClass('current');
168 42f67a2a Dimitris Moraitis
                $('a#files').click();                                                                           
169 42f67a2a Dimitris Moraitis
            }});
170 42f67a2a Dimitris Moraitis
        }                                              
171 42f67a2a Dimitris Moraitis
    }});
172 42f67a2a Dimitris Moraitis
    
173 42f67a2a Dimitris Moraitis
    // rotate arrow icon
174 42f67a2a Dimitris Moraitis
    if (toggled) {
175 42f67a2a Dimitris Moraitis
        $("#arrow").rotate({animateAngle: (0), bind:[{"click":function(){toggleMenu()}}]});
176 42f67a2a Dimitris Moraitis
        $("#arrow").rotateAnimation(0);                    
177 42f67a2a Dimitris Moraitis
    } else {
178 42f67a2a Dimitris Moraitis
        $("#arrow").rotate({animateAngle: (-180), bind:[{"click":function(){toggleMenu()}}]});
179 42f67a2a Dimitris Moraitis
        $("#arrow").rotateAnimation(-180);
180 42f67a2a Dimitris Moraitis
    }            
181 42f67a2a Dimitris Moraitis
}
182 42f67a2a Dimitris Moraitis
183 42f67a2a Dimitris Moraitis
// confirmation overlay generation
184 42f67a2a Dimitris Moraitis
function confirm_action(action_string, action_function, serverIDs, serverNames) {
185 42f67a2a Dimitris Moraitis
    if (serverIDs.length == 1){
186 42f67a2a Dimitris Moraitis
        $("#yes-no h3").text('You are about to ' + action_string + ' vm ' + serverNames[0]);
187 42f67a2a Dimitris Moraitis
    } else if (serverIDs.length > 1){
188 eae0a59a Dimitris Moraitis
        $("#yes-no h3").text('You are about to ' + action_string + ' ' + serverIDs.length + ' machines');
189 42f67a2a Dimitris Moraitis
    } else {
190 42f67a2a Dimitris Moraitis
        return false;
191 42f67a2a Dimitris Moraitis
    }
192 42f67a2a Dimitris Moraitis
    // action confirmation overlay
193 42f67a2a Dimitris Moraitis
    var triggers = $("a#confirmation").overlay({
194 42f67a2a Dimitris Moraitis
            // some mask tweaks suitable for modal dialogs
195 42f67a2a Dimitris Moraitis
            mask: {
196 42f67a2a Dimitris Moraitis
                    color: '#ebecff',
197 42f67a2a Dimitris Moraitis
                    opacity: '0.9'
198 42f67a2a Dimitris Moraitis
            },
199 42f67a2a Dimitris Moraitis
        top: 'center',
200 42f67a2a Dimitris Moraitis
        load: false
201 42f67a2a Dimitris Moraitis
    });
202 42f67a2a Dimitris Moraitis
    // yes or no?
203 42f67a2a Dimitris Moraitis
    var buttons = $("#yes-no button").click(function(e) {
204 42f67a2a Dimitris Moraitis
            // get user input
205 42f67a2a Dimitris Moraitis
            var yes = buttons.index(this) === 0;
206 42f67a2a Dimitris Moraitis
        //close the confirmation window
207 42f67a2a Dimitris Moraitis
        $("a#confirmation").overlay().close(); 
208 42f67a2a Dimitris Moraitis
        // return true=yes or false=no
209 42f67a2a Dimitris Moraitis
        if (yes) {
210 42f67a2a Dimitris Moraitis
            action_function(serverIDs);
211 42f67a2a Dimitris Moraitis
        }
212 42f67a2a Dimitris Moraitis
    });
213 42f67a2a Dimitris Moraitis
    $("a#confirmation").data('overlay').load();
214 42f67a2a Dimitris Moraitis
    return false;
215 42f67a2a Dimitris Moraitis
}
216 42f67a2a Dimitris Moraitis
217 42f67a2a Dimitris Moraitis
// get and show a list of running and terminated machines
218 146b6003 Dimitris Moraitis
function update_vms(interval) {
219 aa819ce8 Dimitris Moraitis
    try{ console.info('updating machines'); } catch(err){}
220 22afb635 Vangelis Koukis
        var uri= API_URL + '/servers/detail';
221 ce4f9227 Mike Muzurakis
222 c5a032c4 Markos Gogoulos
        if (changes_since != 0)
223 ab5282e4 Dimitris Moraitis
                uri+='?changes-since='+changes_since
224 1a49199e Dimitris Moraitis
                
225 1c7978ce Dimitris Moraitis
    update_request = $.ajax({
226 1a49199e Dimitris Moraitis
        url: uri,
227 42f67a2a Dimitris Moraitis
        type: "GET",
228 42f67a2a Dimitris Moraitis
        timeout: TIMEOUT,
229 42f67a2a Dimitris Moraitis
        dataType: "json",
230 146b6003 Dimitris Moraitis
        error: function(jqXHR, textStatus, errorThrown) {
231 1a49199e Dimitris Moraitis
                        // don't forget to try again later
232 146b6003 Dimitris Moraitis
                        if (interval) {
233 1c7978ce Dimitris Moraitis
                                clearTimeout(deferred);        // clear old deferred calls
234 1a49199e Dimitris Moraitis
                                deferred = setTimeout(update_vms,interval,interval);
235 146b6003 Dimitris Moraitis
                        }
236 1a49199e Dimitris Moraitis
                        // as for now, just show an error message
237 0317c509 Dimitris Moraitis
                        try { console.info('update_vms errback:' + jqXHR.status ) } catch(err) {}
238 038383b1 Dimitris Moraitis
                        ajax_error(jqXHR.status, undefined, 'Update VMs', jqXHR.responseText);                                                
239 1a49199e Dimitris Moraitis
                        return false;
240 1a49199e Dimitris Moraitis
                        },
241 1a49199e Dimitris Moraitis
        success: function(data, textStatus, jqXHR) {
242 267403ca Dimitris Moraitis
                        // create changes_since string if necessary
243 267403ca Dimitris Moraitis
                        if (jqXHR.getResponseHeader('Date') != null){
244 267403ca Dimitris Moraitis
                                changes_since_date = new Date(jqXHR.getResponseHeader('Date'));
245 267403ca Dimitris Moraitis
                                changes_since = ISODateString(changes_since_date);
246 267403ca Dimitris Moraitis
                        }
247 267403ca Dimitris Moraitis
                        
248 1c7978ce Dimitris Moraitis
                        if (interval) {
249 1c7978ce Dimitris Moraitis
                                clearTimeout(deferred);        // clear old deferred calls
250 0317c509 Dimitris Moraitis
                                deferred = setTimeout(update_vms,interval,interval);
251 0317c509 Dimitris Moraitis
                        }
252 0317c509 Dimitris Moraitis
                        
253 0317c509 Dimitris Moraitis
                        if (jqXHR.status == 200 || jqXHR.status == 203) {
254 1a49199e Dimitris Moraitis
                                try {
255 7e45ddef Dimitris Moraitis
                                        servers = data.servers.values;
256 038383b1 Dimitris Moraitis
                                } catch(err) { ajax_error('400', undefined, 'Update VMs', jqXHR.responseText);}
257 1a49199e Dimitris Moraitis
                                update_machines_view(data);
258 0317c509 Dimitris Moraitis
                        } else if (jqXHR.status != 304){
259 0317c509 Dimitris Moraitis
                                try { console.info('update_vms callback:' + jqXHR.status ) } catch(err) {}
260 038383b1 Dimitris Moraitis
                                //ajax_error(jqXHR.status, undefined, 'Update VMs', jqXHR.responseText);                                        
261 1a49199e Dimitris Moraitis
                        }
262 1a49199e Dimitris Moraitis
                        return false;
263 42f67a2a Dimitris Moraitis
        }
264 42f67a2a Dimitris Moraitis
    });
265 42f67a2a Dimitris Moraitis
    return false;
266 42f67a2a Dimitris Moraitis
}
267 42f67a2a Dimitris Moraitis
268 146b6003 Dimitris Moraitis
// get and show a list of available standard and custom images
269 42f67a2a Dimitris Moraitis
function update_images() { 
270 42f67a2a Dimitris Moraitis
    $.ajax({
271 73c2c75b Markos Gogoulos
        url: API_URL + '/images/detail',
272 42f67a2a Dimitris Moraitis
        type: "GET",
273 42f67a2a Dimitris Moraitis
        //async: false,
274 42f67a2a Dimitris Moraitis
        dataType: "json",
275 42f67a2a Dimitris Moraitis
        timeout: TIMEOUT,
276 42f67a2a Dimitris Moraitis
        error: function(jqXHR, textStatus, errorThrown) { 
277 038383b1 Dimitris Moraitis
                    ajax_error(jqXHR.status, undefined, 'Update Images', jqXHR.responseText);
278 42f67a2a Dimitris Moraitis
                    },
279 42f67a2a Dimitris Moraitis
        success: function(data, textStatus, jqXHR) {
280 146b6003 Dimitris Moraitis
            try {
281 73c2c75b Markos Gogoulos
                                images = data.images.values;
282 d134b632 Dimitris Moraitis
                                update_wizard_images();
283 146b6003 Dimitris Moraitis
                        } catch(err){
284 146b6003 Dimitris Moraitis
                                ajax_error("NO_IMAGES");
285 146b6003 Dimitris Moraitis
                        }
286 42f67a2a Dimitris Moraitis
        }
287 42f67a2a Dimitris Moraitis
    });
288 42f67a2a Dimitris Moraitis
    return false;
289 42f67a2a Dimitris Moraitis
}
290 42f67a2a Dimitris Moraitis
291 d134b632 Dimitris Moraitis
function update_wizard_images() {
292 d134b632 Dimitris Moraitis
        if ($("ul#standard-images li").toArray().length + $("ul#custom-images li").toArray().length == 0) {
293 d134b632 Dimitris Moraitis
                $.each(images, function(i,image){
294 d134b632 Dimitris Moraitis
                        var img = $('#image-template').clone().attr("id","img-"+image.id).fadeIn("slow");
295 d134b632 Dimitris Moraitis
                        img.find("label").attr('for',"img-radio-" + image.id);
296 d134b632 Dimitris Moraitis
                        img.find(".image-title").text(image.name);
297 73c2c75b Markos Gogoulos
            if (image.metadata) {
298 73c2c75b Markos Gogoulos
                if (image.metadata.values.description != undefined) {
299 73c2c75b Markos Gogoulos
                    img.find(".description").text(image.metadata.values.description);
300 73c2c75b Markos Gogoulos
                }
301 73c2c75b Markos Gogoulos
                if (image.metadata.values.size != undefined) {
302 afa2ebd2 Mike Muzurakis
                                img.find("#size").text(image.metadata.values.size);
303 73c2c75b Markos Gogoulos
                }
304 73c2c75b Markos Gogoulos
            }
305 d134b632 Dimitris Moraitis
                        img.find("input.radio").attr('id',"img-radio-" + image.id);
306 d134b632 Dimitris Moraitis
                        if (i==0) img.find("input.radio").attr("checked","checked"); 
307 a64e74f0 Markos Gogoulos
            var image_logo = os_icon(image.metadata);
308 a64e74f0 Markos Gogoulos
                        img.find("img.image-logo").attr('src','static/os_logos/'+image_logo+'.png');
309 73c2c75b Markos Gogoulos
            if (image.metadata) {
310 73c2c75b Markos Gogoulos
                if (image.metadata.values.serverId != undefined) {
311 73c2c75b Markos Gogoulos
                    img.appendTo("ul#custom-images");
312 73c2c75b Markos Gogoulos
                } else {
313 73c2c75b Markos Gogoulos
                    img.appendTo("ul#standard-images");
314 73c2c75b Markos Gogoulos
                }
315 73c2c75b Markos Gogoulos
            } else {
316 73c2c75b Markos Gogoulos
                img.appendTo("ul#standard-images");
317 73c2c75b Markos Gogoulos
            }
318 d134b632 Dimitris Moraitis
                });
319 d134b632 Dimitris Moraitis
        }        
320 d134b632 Dimitris Moraitis
}
321 d134b632 Dimitris Moraitis
322 d134b632 Dimitris Moraitis
function update_wizard_flavors(){
323 d134b632 Dimitris Moraitis
        // sliders for selecting VM flavor
324 d134b632 Dimitris Moraitis
        $("#cpu:range").rangeinput({min:0,
325 d134b632 Dimitris Moraitis
                                                           value:0,
326 d134b632 Dimitris Moraitis
                                                           step:1,
327 d134b632 Dimitris Moraitis
                                                           progress: true,
328 d134b632 Dimitris Moraitis
                                                           max:cpus.length-1});
329 d134b632 Dimitris Moraitis
        
330 d134b632 Dimitris Moraitis
        $("#storage:range").rangeinput({min:0,
331 d134b632 Dimitris Moraitis
                                                           value:0,
332 d134b632 Dimitris Moraitis
                                                           step:1,
333 d134b632 Dimitris Moraitis
                                                           progress: true,
334 d134b632 Dimitris Moraitis
                                                           max:disks.length-1});
335 d134b632 Dimitris Moraitis
336 d134b632 Dimitris Moraitis
        $("#ram:range").rangeinput({min:0,
337 d134b632 Dimitris Moraitis
                                                           value:0,
338 d134b632 Dimitris Moraitis
                                                           step:1,
339 d134b632 Dimitris Moraitis
                                                           progress: true,
340 d134b632 Dimitris Moraitis
                                                           max:ram.length-1});
341 d134b632 Dimitris Moraitis
        $("#small").click();
342 afa2ebd2 Mike Muzurakis
343 d134b632 Dimitris Moraitis
        // update the indicators when sliding
344 d134b632 Dimitris Moraitis
        $("#cpu:range").data().rangeinput.onSlide(function(event,value){
345 d134b632 Dimitris Moraitis
                $("#cpu-indicator")[0].value = cpus[Number(value)];
346 afa2ebd2 Mike Muzurakis
        $("#cpu-indicator").addClass('selectedrange');
347 d134b632 Dimitris Moraitis
        });
348 d134b632 Dimitris Moraitis
        $("#cpu:range").data().rangeinput.change(function(event,value){
349 d134b632 Dimitris Moraitis
                $("#cpu-indicator")[0].value = cpus[Number(value)];                                
350 94adeabb Mike Muzurakis
                $("#custom").click();
351 afa2ebd2 Mike Muzurakis
        $("#cpu-indicator").removeClass('selectedrange');                
352 d134b632 Dimitris Moraitis
        });                        
353 d134b632 Dimitris Moraitis
        $("#ram:range").data().rangeinput.onSlide(function(event,value){
354 d134b632 Dimitris Moraitis
                $("#ram-indicator")[0].value = ram[Number(value)];
355 afa2ebd2 Mike Muzurakis
        $("#ram-indicator").addClass('selectedrange');
356 d134b632 Dimitris Moraitis
        });
357 d134b632 Dimitris Moraitis
        $("#ram:range").data().rangeinput.change(function(event,value){
358 d134b632 Dimitris Moraitis
                $("#ram-indicator")[0].value = ram[Number(value)];                                
359 d134b632 Dimitris Moraitis
                $("#custom").click();
360 afa2ebd2 Mike Muzurakis
        $("#ram-indicator").removeClass('selectedrange');                
361 d134b632 Dimitris Moraitis
        });                        
362 d134b632 Dimitris Moraitis
        $("#storage:range").data().rangeinput.onSlide(function(event,value){
363 d134b632 Dimitris Moraitis
                $("#storage-indicator")[0].value = disks[Number(value)];
364 afa2ebd2 Mike Muzurakis
        $("#storage-indicator").addClass('selectedrange');
365 d134b632 Dimitris Moraitis
        });
366 d134b632 Dimitris Moraitis
        $("#storage:range").data().rangeinput.change(function(event,value){
367 d134b632 Dimitris Moraitis
                $("#storage-indicator")[0].value = disks[Number(value)];                                
368 d134b632 Dimitris Moraitis
                $("#custom").click();
369 afa2ebd2 Mike Muzurakis
        $("#storage-indicator").removeClass('selectedrange');                
370 d134b632 Dimitris Moraitis
        });                                
371 d134b632 Dimitris Moraitis
}
372 d134b632 Dimitris Moraitis
373 42f67a2a Dimitris Moraitis
Array.prototype.unique = function () {
374 42f67a2a Dimitris Moraitis
        var r = new Array();
375 42f67a2a Dimitris Moraitis
        o:for(var i = 0, n = this.length; i < n; i++)
376 42f67a2a Dimitris Moraitis
        {
377 42f67a2a Dimitris Moraitis
                for(var x = 0, y = r.length; x < y; x++)
378 42f67a2a Dimitris Moraitis
                {
379 42f67a2a Dimitris Moraitis
                        if(r[x]==this[i])
380 42f67a2a Dimitris Moraitis
                        {
381 42f67a2a Dimitris Moraitis
                                continue o;
382 42f67a2a Dimitris Moraitis
                        }
383 42f67a2a Dimitris Moraitis
                }
384 42f67a2a Dimitris Moraitis
                r[r.length] = this[i];
385 42f67a2a Dimitris Moraitis
        }
386 42f67a2a Dimitris Moraitis
        return r;
387 42f67a2a Dimitris Moraitis
}
388 42f67a2a Dimitris Moraitis
389 42f67a2a Dimitris Moraitis
// get and configure flavor selection
390 42f67a2a Dimitris Moraitis
function update_flavors() { 
391 42f67a2a Dimitris Moraitis
    $.ajax({
392 f1641e4d Markos Gogoulos
        url: API_URL + '/flavors/detail',
393 42f67a2a Dimitris Moraitis
        type: "GET",
394 42f67a2a Dimitris Moraitis
        //async: false,
395 42f67a2a Dimitris Moraitis
        dataType: "json",
396 42f67a2a Dimitris Moraitis
        timeout: TIMEOUT,
397 42f67a2a Dimitris Moraitis
        error: function(jqXHR, textStatus, errorThrown) { 
398 146b6003 Dimitris Moraitis
            try {
399 038383b1 Dimitris Moraitis
                                ajax_error(jqXHR.status, undefined, 'Update Flavors', jqXHR.responseText);
400 146b6003 Dimitris Moraitis
                        } catch (err) {
401 146b6003 Dimitris Moraitis
                                ajax_error(err);
402 146b6003 Dimitris Moraitis
                        }
403 66307c9e Christodoulos Psaltis
            // start updating vm list
404 66307c9e Christodoulos Psaltis
            update_vms(UPDATE_INTERVAL);
405 42f67a2a Dimitris Moraitis
        },
406 42f67a2a Dimitris Moraitis
        success: function(data, textStatus, jqXHR) {
407 f1641e4d Markos Gogoulos
            flavors = data.flavors.values;
408 42f67a2a Dimitris Moraitis
            $.each(flavors, function(i, flavor) {
409 42f67a2a Dimitris Moraitis
                cpus[i] = flavor['cpu'];
410 42f67a2a Dimitris Moraitis
                disks[i] = flavor['disk'];
411 42f67a2a Dimitris Moraitis
                ram[i] = flavor['ram'];
412 42f67a2a Dimitris Moraitis
            });
413 42f67a2a Dimitris Moraitis
            cpus = cpus.unique();
414 42f67a2a Dimitris Moraitis
            disks = disks.unique();
415 42f67a2a Dimitris Moraitis
            ram = ram.unique();
416 d134b632 Dimitris Moraitis
                        update_wizard_flavors();
417 66307c9e Christodoulos Psaltis
            // start updating vm list
418 66307c9e Christodoulos Psaltis
            update_vms(UPDATE_INTERVAL);
419 42f67a2a Dimitris Moraitis
        }
420 42f67a2a Dimitris Moraitis
    });
421 42f67a2a Dimitris Moraitis
    return false;
422 42f67a2a Dimitris Moraitis
}
423 1a49199e Dimitris Moraitis
424 b335768e Markos Gogoulos
// return flavorRef from cpu, disk, ram values
425 42f67a2a Dimitris Moraitis
function identify_flavor(cpu, disk, ram){
426 42f67a2a Dimitris Moraitis
    for (i=0;i<flavors.length;i++){
427 42f67a2a Dimitris Moraitis
        if (flavors[i]['cpu'] == cpu && flavors[i]['disk']==disk && flavors[i]['ram']==ram) {
428 42f67a2a Dimitris Moraitis
            return flavors[i]['id']
429 42f67a2a Dimitris Moraitis
        }
430 42f67a2a Dimitris Moraitis
    }
431 42f67a2a Dimitris Moraitis
    return 0;
432 42f67a2a Dimitris Moraitis
}
433 42f67a2a Dimitris Moraitis
434 45ab204d Markos Gogoulos
// return image entry from imageRef
435 45ab204d Markos Gogoulos
function get_image(imageRef) {
436 45ab204d Markos Gogoulos
    for (i=0;i<images.length;i++){
437 45ab204d Markos Gogoulos
        if (images[i]['id'] == imageRef) {
438 45ab204d Markos Gogoulos
            return images[i];
439 45ab204d Markos Gogoulos
        }
440 45ab204d Markos Gogoulos
    }
441 45ab204d Markos Gogoulos
    return 0;
442 45ab204d Markos Gogoulos
}
443 45ab204d Markos Gogoulos
444 dcf153ce Christodoulos Psaltis
// update the actions in list view
445 e32c2a5d Dimitris Moraitis
function updateActions() {
446 e32c2a5d Dimitris Moraitis
        var states = [];
447 e32c2a5d Dimitris Moraitis
        var on = [];
448 e32c2a5d Dimitris Moraitis
        var checked = $("table.list-machines tbody input[type='checkbox']:checked");
449 e32c2a5d Dimitris Moraitis
        // disable all actions to begin with
450 e32c2a5d Dimitris Moraitis
        for (action in actions) {
451 e32c2a5d Dimitris Moraitis
                $("#action-" + action).removeClass('enabled');
452 e32c2a5d Dimitris Moraitis
        }
453 e32c2a5d Dimitris Moraitis
454 e32c2a5d Dimitris Moraitis
        // are there multiple machines selected?
455 e32c2a5d Dimitris Moraitis
        if (checked.length>1)
456 e32c2a5d Dimitris Moraitis
                states[0] = 'multiple';
457 e32c2a5d Dimitris Moraitis
        
458 e32c2a5d Dimitris Moraitis
        // check the states of selected machines
459 e32c2a5d Dimitris Moraitis
        checked.each(function(i,checkbox) {
460 e32c2a5d Dimitris Moraitis
                states[states.length] = checkbox.className;
461 e32c2a5d Dimitris Moraitis
                var ip = $("#" + checkbox.id.replace('input-','') + ".ip span.public").text();
462 e32c2a5d Dimitris Moraitis
                if (ip.replace('undefined','').length)
463 e32c2a5d Dimitris Moraitis
                        states[states.length] = 'network';
464 e32c2a5d Dimitris Moraitis
        });
465 e32c2a5d Dimitris Moraitis
466 e32c2a5d Dimitris Moraitis
        // decide which actions should be enabled
467 e32c2a5d Dimitris Moraitis
        for (a in actions) {
468 e32c2a5d Dimitris Moraitis
                var enabled = false;
469 e32c2a5d Dimitris Moraitis
                for (var s =0; s<states.length; s++) {
470 e32c2a5d Dimitris Moraitis
                        if (actions[a].indexOf(states[s]) != -1 ) {
471 e32c2a5d Dimitris Moraitis
                                enabled = true;
472 e32c2a5d Dimitris Moraitis
                        } else {
473 e32c2a5d Dimitris Moraitis
                                enabled = false;
474 e32c2a5d Dimitris Moraitis
                                break;
475 e32c2a5d Dimitris Moraitis
                        }
476 e32c2a5d Dimitris Moraitis
                }
477 e32c2a5d Dimitris Moraitis
                if (enabled)
478 e32c2a5d Dimitris Moraitis
                        on[on.length]=a;
479 e32c2a5d Dimitris Moraitis
        }
480 e32c2a5d Dimitris Moraitis
        // enable those actions
481 e32c2a5d Dimitris Moraitis
        for (action in on) {
482 e32c2a5d Dimitris Moraitis
                $("#action-" + on[action]).addClass('enabled');
483 e32c2a5d Dimitris Moraitis
        }
484 e32c2a5d Dimitris Moraitis
}
485 146b6003 Dimitris Moraitis
486 0971fa71 Markos Gogoulos
//create server action
487 0971fa71 Markos Gogoulos
function create_vm(machineName, imageRef, flavorRef){
488 45ab204d Markos Gogoulos
489 45ab204d Markos Gogoulos
    var image_logo = os_icon(get_image(imageRef).metadata);
490 45ab204d Markos Gogoulos
491 0971fa71 Markos Gogoulos
    var payload = {
492 0971fa71 Markos Gogoulos
        "server": {
493 0971fa71 Markos Gogoulos
            "name": machineName,
494 0971fa71 Markos Gogoulos
            "imageRef": imageRef,
495 0971fa71 Markos Gogoulos
            "flavorRef" : flavorRef,
496 0971fa71 Markos Gogoulos
            "metadata" : {
497 45ab204d Markos Gogoulos
                "OS" : image_logo
498 038383b1 Dimitris Moraitis
            }
499 0971fa71 Markos Gogoulos
        }
500 0971fa71 Markos Gogoulos
    };
501 7e45ddef Dimitris Moraitis
        var uri = API_URL + '/servers';
502 0971fa71 Markos Gogoulos
503 0971fa71 Markos Gogoulos
    $.ajax({
504 7e45ddef Dimitris Moraitis
    url: uri,
505 0971fa71 Markos Gogoulos
    type: "POST",
506 7e45ddef Dimitris Moraitis
        contentType: "application/json",
507 0971fa71 Markos Gogoulos
    dataType: "json",    
508 0971fa71 Markos Gogoulos
    data: JSON.stringify(payload),
509 0971fa71 Markos Gogoulos
    timeout: TIMEOUT,
510 0971fa71 Markos Gogoulos
    error: function(jqXHR, textStatus, errorThrown) { 
511 038383b1 Dimitris Moraitis
                ajax_error(jqXHR.status, undefined, 'Create VM', jqXHR.responseText);
512 0971fa71 Markos Gogoulos
           },
513 0971fa71 Markos Gogoulos
    success: function(data, textStatus, jqXHR) {
514 0971fa71 Markos Gogoulos
                if ( jqXHR.status == '202') {
515 0971fa71 Markos Gogoulos
                    ajax_success("CREATE_VM_SUCCESS", data.server.adminPass);                   
516 0971fa71 Markos Gogoulos
                } else {
517 038383b1 Dimitris Moraitis
                    ajax_error(jqXHR.status, undefined, 'Create VM', jqXHR.responseText);
518 0971fa71 Markos Gogoulos
                }
519 0971fa71 Markos Gogoulos
            }
520 0971fa71 Markos Gogoulos
    });
521 0971fa71 Markos Gogoulos
}
522 0971fa71 Markos Gogoulos
523 42f67a2a Dimitris Moraitis
// reboot action
524 42f67a2a Dimitris Moraitis
function reboot(serverIDs){
525 42f67a2a Dimitris Moraitis
        if (!serverIDs.length){
526 a1a31201 Dimitris Moraitis
                //ajax_success('DEFAULT');
527 42f67a2a Dimitris Moraitis
                return false;
528 42f67a2a Dimitris Moraitis
        }        
529 42f67a2a Dimitris Moraitis
    // ajax post reboot call
530 42f67a2a Dimitris Moraitis
    var payload = {
531 42f67a2a Dimitris Moraitis
        "reboot": {"type" : "HARD"}
532 42f67a2a Dimitris Moraitis
    };
533 a1a31201 Dimitris Moraitis
    var serverID = serverIDs.pop();
534 42f67a2a Dimitris Moraitis
        
535 42f67a2a Dimitris Moraitis
        $.ajax({
536 0971fa71 Markos Gogoulos
                url: API_URL + '/servers/' + serverID + '/action',
537 7e45ddef Dimitris Moraitis
                type: "POST",
538 7e45ddef Dimitris Moraitis
                contentType: "application/json",
539 42f67a2a Dimitris Moraitis
                dataType: "json",
540 42f67a2a Dimitris Moraitis
                data: JSON.stringify(payload),
541 42f67a2a Dimitris Moraitis
                timeout: TIMEOUT,
542 42f67a2a Dimitris Moraitis
                error: function(jqXHR, textStatus, errorThrown) {
543 038383b1 Dimitris Moraitis
                    display_failure(jqXHR.status, serverID, 'Reboot', jqXHR.responseText)
544 42f67a2a Dimitris Moraitis
                                },
545 42f67a2a Dimitris Moraitis
                success: function(data, textStatus, jqXHR) {
546 583932c4 Christodoulos Psaltis
                                        if ( jqXHR.status == '202') {
547 583932c4 Christodoulos Psaltis
                        try {
548 583932c4 Christodoulos Psaltis
                            console.info('rebooted ' + serverID);
549 a1a31201 Dimitris Moraitis
                        } catch(err) {}
550 a1a31201 Dimitris Moraitis
                                                // indicate that the action succeeded
551 a1a31201 Dimitris Moraitis
                                                display_success(serverID);
552 a1a31201 Dimitris Moraitis
                                                // continue with the rest of the servers
553 42f67a2a Dimitris Moraitis
                                                reboot(serverIDs);
554 583932c4 Christodoulos Psaltis
                                        } else {
555 038383b1 Dimitris Moraitis
                                                ajax_error(jqXHR.status, serverID, 'Reboot', jqXHR.responseText);
556 42f67a2a Dimitris Moraitis
                                        }
557 42f67a2a Dimitris Moraitis
                                }
558 42f67a2a Dimitris Moraitis
    });
559 583932c4 Christodoulos Psaltis
560 42f67a2a Dimitris Moraitis
    return false;
561 42f67a2a Dimitris Moraitis
}
562 42f67a2a Dimitris Moraitis
563 42f67a2a Dimitris Moraitis
// shutdown action
564 42f67a2a Dimitris Moraitis
function shutdown(serverIDs) {
565 42f67a2a Dimitris Moraitis
        if (!serverIDs.length){
566 a1a31201 Dimitris Moraitis
                //ajax_success('DEFAULT');
567 42f67a2a Dimitris Moraitis
                return false;
568 42f67a2a Dimitris Moraitis
        }
569 42f67a2a Dimitris Moraitis
    // ajax post shutdown call
570 42f67a2a Dimitris Moraitis
    var payload = {
571 9bc2dbfa Vangelis Koukis
        "shutdown": {}
572 42f67a2a Dimitris Moraitis
    };   
573 42f67a2a Dimitris Moraitis
574 a1a31201 Dimitris Moraitis
        var serverID = serverIDs.pop()
575 42f67a2a Dimitris Moraitis
    $.ajax({
576 0971fa71 Markos Gogoulos
            url: API_URL + '/servers/' + serverID + '/action',
577 42f67a2a Dimitris Moraitis
            type: "POST",
578 7e45ddef Dimitris Moraitis
                contentType: "application/json",
579 42f67a2a Dimitris Moraitis
            dataType: "json",
580 42f67a2a Dimitris Moraitis
        data: JSON.stringify(payload),
581 42f67a2a Dimitris Moraitis
        timeout: TIMEOUT,
582 42f67a2a Dimitris Moraitis
        error: function(jqXHR, textStatus, errorThrown) { 
583 038383b1 Dimitris Moraitis
                    display_failure(jqXHR.status, serverID, 'Shutdown', jqXHR.responseText)
584 42f67a2a Dimitris Moraitis
                    },
585 42f67a2a Dimitris Moraitis
        success: function(data, textStatus, jqXHR) {
586 42f67a2a Dimitris Moraitis
                    if ( jqXHR.status == '202') {
587 583932c4 Christodoulos Psaltis
                                                try {
588 583932c4 Christodoulos Psaltis
                            console.info('suspended ' + serverID);
589 a1a31201 Dimitris Moraitis
                        } catch(err) {}
590 a1a31201 Dimitris Moraitis
                                                // indicate that the action succeeded
591 a1a31201 Dimitris Moraitis
                                                display_success(serverID);
592 a1a31201 Dimitris Moraitis
                                                // continue with the rest of the servers                        
593 42f67a2a Dimitris Moraitis
                        shutdown(serverIDs);
594 42f67a2a Dimitris Moraitis
                    } else {
595 038383b1 Dimitris Moraitis
                        ajax_error(jqXHR.status, serverID, 'Shutdown', jqXHR.responseText);
596 748139ba Christodoulos Psaltis
                    }
597 748139ba Christodoulos Psaltis
                }             
598 42f67a2a Dimitris Moraitis
    });
599 583932c4 Christodoulos Psaltis
600 42f67a2a Dimitris Moraitis
    return false;    
601 42f67a2a Dimitris Moraitis
}
602 42f67a2a Dimitris Moraitis
603 42f67a2a Dimitris Moraitis
// destroy action
604 42f67a2a Dimitris Moraitis
function destroy(serverIDs) {
605 42f67a2a Dimitris Moraitis
        if (!serverIDs.length){
606 a1a31201 Dimitris Moraitis
                //ajax_success('DEFAULT');
607 42f67a2a Dimitris Moraitis
                return false;
608 42f67a2a Dimitris Moraitis
        }
609 f15025bc Christodoulos Psaltis
    // ajax post destroy call can have an empty request body
610 f15025bc Christodoulos Psaltis
    var payload = {};   
611 42f67a2a Dimitris Moraitis
612 42f67a2a Dimitris Moraitis
        serverID = serverIDs.pop()
613 42f67a2a Dimitris Moraitis
    $.ajax({
614 0971fa71 Markos Gogoulos
            url: API_URL + '/servers/' + serverID,
615 42f67a2a Dimitris Moraitis
            type: "DELETE",
616 7e45ddef Dimitris Moraitis
                contentType: "application/json",
617 42f67a2a Dimitris Moraitis
            dataType: "json",
618 42f67a2a Dimitris Moraitis
        data: JSON.stringify(payload),
619 42f67a2a Dimitris Moraitis
        timeout: TIMEOUT,
620 42f67a2a Dimitris Moraitis
        error: function(jqXHR, textStatus, errorThrown) { 
621 038383b1 Dimitris Moraitis
                    display_failure(jqXHR.status, serverID, 'Destroy', jqXHR.responseText)
622 42f67a2a Dimitris Moraitis
                    },
623 42f67a2a Dimitris Moraitis
        success: function(data, textStatus, jqXHR) {
624 2d5cea9b Markos Gogoulos
                    if ( jqXHR.status == '204') {
625 583932c4 Christodoulos Psaltis
                                                try {
626 f15025bc Christodoulos Psaltis
                            console.info('destroyed ' + serverID);
627 a1a31201 Dimitris Moraitis
                        } catch (err) {}
628 a1a31201 Dimitris Moraitis
                                                // indicate that the action succeeded
629 a1a31201 Dimitris Moraitis
                                                display_success(serverID);
630 a1a31201 Dimitris Moraitis
                                                // continue with the rest of the servers
631 38b1f387 Christodoulos Psaltis
                        destroy(serverIDs);
632 42f67a2a Dimitris Moraitis
                    } else {
633 038383b1 Dimitris Moraitis
                        ajax_error(jqXHR.status, serverID, 'Destroy', jqXHR.responseText);
634 748139ba Christodoulos Psaltis
                    }
635 748139ba Christodoulos Psaltis
                }             
636 42f67a2a Dimitris Moraitis
    });
637 583932c4 Christodoulos Psaltis
638 42f67a2a Dimitris Moraitis
    return false;    
639 42f67a2a Dimitris Moraitis
}
640 42f67a2a Dimitris Moraitis
641 42f67a2a Dimitris Moraitis
// start action
642 42f67a2a Dimitris Moraitis
function start(serverIDs){
643 42f67a2a Dimitris Moraitis
        if (!serverIDs.length){
644 a1a31201 Dimitris Moraitis
                //ajax_success('DEFAULT');
645 42f67a2a Dimitris Moraitis
                return false;
646 42f67a2a Dimitris Moraitis
        }        
647 42f67a2a Dimitris Moraitis
    // ajax post start call
648 42f67a2a Dimitris Moraitis
    var payload = {
649 623d7244 Vangelis Koukis
        "start": {}
650 42f67a2a Dimitris Moraitis
    };   
651 42f67a2a Dimitris Moraitis
652 a1a31201 Dimitris Moraitis
        var serverID = serverIDs.pop()
653 42f67a2a Dimitris Moraitis
    $.ajax({
654 0971fa71 Markos Gogoulos
        url: API_URL + '/servers/' + serverID + '/action',
655 42f67a2a Dimitris Moraitis
        type: "POST",
656 7e45ddef Dimitris Moraitis
                contentType: "application/json",
657 42f67a2a Dimitris Moraitis
        dataType: "json",
658 42f67a2a Dimitris Moraitis
        data: JSON.stringify(payload),
659 42f67a2a Dimitris Moraitis
        timeout: TIMEOUT,
660 42f67a2a Dimitris Moraitis
        error: function(jqXHR, textStatus, errorThrown) { 
661 038383b1 Dimitris Moraitis
                    display_failure(jqXHR.status, serverID, 'Start', jqXHR.responseText)
662 42f67a2a Dimitris Moraitis
                    },
663 42f67a2a Dimitris Moraitis
        success: function(data, textStatus, jqXHR) {
664 42f67a2a Dimitris Moraitis
                    if ( jqXHR.status == '202') {
665 583932c4 Christodoulos Psaltis
                                            try {
666 583932c4 Christodoulos Psaltis
                            console.info('started ' + serverID);
667 a1a31201 Dimitris Moraitis
                        } catch(err) {}
668 a1a31201 Dimitris Moraitis
                                                // indicate that the action succeeded
669 a1a31201 Dimitris Moraitis
                                                display_success(serverID);
670 a1a31201 Dimitris Moraitis
                                                // continue with the rest of the servers                                                
671 42f67a2a Dimitris Moraitis
                        start(serverIDs);
672 42f67a2a Dimitris Moraitis
                    } else {
673 038383b1 Dimitris Moraitis
                        ajax_error(jqXHR.status, serverID, 'Start', jqXHR.responseText);
674 748139ba Christodoulos Psaltis
                    }
675 748139ba Christodoulos Psaltis
                }
676 42f67a2a Dimitris Moraitis
    });
677 583932c4 Christodoulos Psaltis
678 42f67a2a Dimitris Moraitis
    return false;
679 42f67a2a Dimitris Moraitis
}
680 6902f72e clopy
681 853c53ea Markos Gogoulos
// rename server name action
682 a70a9116 Mike Muzurakis
function rename(serverID, serverName){
683 a70a9116 Mike Muzurakis
        if (!serverID.length){
684 0d4faeb8 Mike Muzurakis
                //ajax_success('DEFAULT');
685 0d4faeb8 Mike Muzurakis
                return false;
686 0d4faeb8 Mike Muzurakis
        }        
687 0d4faeb8 Mike Muzurakis
    // ajax post rename call
688 0d4faeb8 Mike Muzurakis
    var payload = {
689 73715544 Christodoulos Psaltis
        "server": {"name": serverName}
690 0d4faeb8 Mike Muzurakis
    };   
691 0d4faeb8 Mike Muzurakis
692 0d4faeb8 Mike Muzurakis
    $.ajax({
693 5b35631e Markos Gogoulos
        url: API_URL + '/servers/' + serverID,
694 a70a9116 Mike Muzurakis
        type: "PUT",
695 0d4faeb8 Mike Muzurakis
                contentType: "application/json",
696 0d4faeb8 Mike Muzurakis
        dataType: "json",
697 0d4faeb8 Mike Muzurakis
        data: JSON.stringify(payload),
698 0d4faeb8 Mike Muzurakis
        timeout: TIMEOUT,
699 0d4faeb8 Mike Muzurakis
        error: function(jqXHR, textStatus, errorThrown) { 
700 0d4faeb8 Mike Muzurakis
                    display_failure(jqXHR.status, serverID, 'Rename', jqXHR.responseText)
701 0d4faeb8 Mike Muzurakis
                    },
702 0d4faeb8 Mike Muzurakis
        success: function(data, textStatus, jqXHR) {
703 853c53ea Markos Gogoulos
                    if ( jqXHR.status == '204') {
704 0d4faeb8 Mike Muzurakis
                                            try {
705 0d4faeb8 Mike Muzurakis
                            console.info('renamed ' + serverID);
706 0d4faeb8 Mike Muzurakis
                        } catch(err) {}
707 0d4faeb8 Mike Muzurakis
                                                // indicate that the action succeeded
708 0d4faeb8 Mike Muzurakis
                                                display_success(serverID);
709 0d4faeb8 Mike Muzurakis
                    } else {
710 0d4faeb8 Mike Muzurakis
                        ajax_error(jqXHR.status, serverID, 'Rename', jqXHR.responseText);
711 0d4faeb8 Mike Muzurakis
                    }
712 0d4faeb8 Mike Muzurakis
                }
713 0d4faeb8 Mike Muzurakis
    });
714 0d4faeb8 Mike Muzurakis
715 0d4faeb8 Mike Muzurakis
    return false;
716 0d4faeb8 Mike Muzurakis
}
717 0d4faeb8 Mike Muzurakis
718 5186eb04 Christodoulos Psaltis
// get server metadata
719 5186eb04 Christodoulos Psaltis
function get_metadata(serverID) { 
720 5186eb04 Christodoulos Psaltis
    $.ajax({
721 5186eb04 Christodoulos Psaltis
        url: API_URL + '/servers/' + serverID + '/meta',
722 5186eb04 Christodoulos Psaltis
        type: "GET",
723 5186eb04 Christodoulos Psaltis
        //async: false,
724 5186eb04 Christodoulos Psaltis
        dataType: "json",
725 5186eb04 Christodoulos Psaltis
        timeout: TIMEOUT,
726 5186eb04 Christodoulos Psaltis
        error: function(jqXHR, textStatus, errorThrown) { 
727 5186eb04 Christodoulos Psaltis
            try {
728 5186eb04 Christodoulos Psaltis
                                ajax_error(jqXHR.status, undefined, 'Get metadata', jqXHR.responseText);
729 5186eb04 Christodoulos Psaltis
                        } catch (err) {
730 5186eb04 Christodoulos Psaltis
                                ajax_error(err);
731 5186eb04 Christodoulos Psaltis
                        }
732 5186eb04 Christodoulos Psaltis
        },
733 5186eb04 Christodoulos Psaltis
        success: function(data, textStatus, jqXHR) {
734 1b3857ab Christodoulos Psaltis
            // to list the new results in the edit dialog
735 dd604c16 Christodoulos Psaltis
            list_metadata(data);
736 5186eb04 Christodoulos Psaltis
        }
737 5186eb04 Christodoulos Psaltis
    });
738 5186eb04 Christodoulos Psaltis
    return false;
739 5186eb04 Christodoulos Psaltis
}
740 5186eb04 Christodoulos Psaltis
741 1b3857ab Christodoulos Psaltis
// delete metadata key-value pair
742 1b3857ab Christodoulos Psaltis
function delete_metadata(serverID, meta_key) {
743 0943cc77 Markos Gogoulos
    $.ajax({
744 0943cc77 Markos Gogoulos
        url: API_URL + '/servers/' + serverID + '/meta/' + meta_key,
745 0943cc77 Markos Gogoulos
        type: "DELETE",
746 0943cc77 Markos Gogoulos
        //async: false,
747 0943cc77 Markos Gogoulos
        dataType: "json",
748 0943cc77 Markos Gogoulos
        timeout: TIMEOUT,
749 0943cc77 Markos Gogoulos
        error: function(jqXHR, textStatus, errorThrown) { 
750 0943cc77 Markos Gogoulos
            try {
751 0943cc77 Markos Gogoulos
                                ajax_error(jqXHR.status, undefined, 'Delete metadata', jqXHR.responseText);
752 0943cc77 Markos Gogoulos
                        } catch (err) {
753 0943cc77 Markos Gogoulos
                                ajax_error(err);
754 0943cc77 Markos Gogoulos
                        }
755 0943cc77 Markos Gogoulos
        },
756 0943cc77 Markos Gogoulos
        success: function(data, textStatus, jqXHR) {
757 1b3857ab Christodoulos Psaltis
            // to GET new results and list them in the edit dialog
758 0943cc77 Markos Gogoulos
            get_metadata(serverID);
759 0943cc77 Markos Gogoulos
        }
760 0943cc77 Markos Gogoulos
    });
761 0943cc77 Markos Gogoulos
    return false;
762 0943cc77 Markos Gogoulos
}
763 0943cc77 Markos Gogoulos
764 0943cc77 Markos Gogoulos
765 1b3857ab Christodoulos Psaltis
// add metadata key-value pair
766 1b3857ab Christodoulos Psaltis
function add_metadata(serverID, meta_key, meta_value) {
767 0c578a28 Markos Gogoulos
768 0c578a28 Markos Gogoulos
    var payload = {
769 0c578a28 Markos Gogoulos
        "meta": {
770 0c578a28 Markos Gogoulos
        }
771 0c578a28 Markos Gogoulos
    };
772 0c578a28 Markos Gogoulos
    payload["meta"][meta_key] = meta_value;
773 0c578a28 Markos Gogoulos
774 0c578a28 Markos Gogoulos
    $.ajax({
775 0c578a28 Markos Gogoulos
        url: API_URL + '/servers/' + serverID + '/meta/' + meta_key,
776 0c578a28 Markos Gogoulos
        type: "PUT",
777 0c578a28 Markos Gogoulos
            contentType: "application/json",
778 0c578a28 Markos Gogoulos
        dataType: "json",    
779 0c578a28 Markos Gogoulos
        data: JSON.stringify(payload),
780 0c578a28 Markos Gogoulos
        timeout: TIMEOUT,
781 0c578a28 Markos Gogoulos
        error: function(jqXHR, textStatus, errorThrown) { 
782 0c578a28 Markos Gogoulos
            try {
783 0c578a28 Markos Gogoulos
                                ajax_error(jqXHR.status, undefined, 'add metadata', jqXHR.responseText);
784 0c578a28 Markos Gogoulos
                        } catch (err) {
785 0c578a28 Markos Gogoulos
                                ajax_error(err);
786 0c578a28 Markos Gogoulos
                        }
787 0c578a28 Markos Gogoulos
        },
788 0c578a28 Markos Gogoulos
        success: function(data, textStatus, jqXHR) {
789 1b3857ab Christodoulos Psaltis
            // to GET new results and list them in the edit dialog
790 0c578a28 Markos Gogoulos
            get_metadata(serverID);
791 0c578a28 Markos Gogoulos
        }
792 0c578a28 Markos Gogoulos
    });
793 0c578a28 Markos Gogoulos
    return false;
794 0c578a28 Markos Gogoulos
}
795 0c578a28 Markos Gogoulos
796 0c578a28 Markos Gogoulos
797 6902f72e clopy
// show the welcome screen
798 6902f72e clopy
function showWelcome() {
799 f5ebca32 Mike Muzurakis
    $("#view-select").fadeOut("fast");
800 cebcd8ea Mike Muzurakis
    $("#machinesview.standard").fadeOut("fast");
801 6902f72e clopy
    $("#createcontainer").addClass('emptycreatecontainer')
802 6902f72e clopy
    $("#create").addClass('emptycreate')
803 f5ebca32 Mike Muzurakis
    $("#emptymachineslist").fadeIn("fast");
804 f5ebca32 Mike Muzurakis
    $("#createbody").fadeIn("fast");
805 ce4f9227 Mike Muzurakis
    $("#create").css("display", "block");
806 6902f72e clopy
}
807 6902f72e clopy
808 6902f72e clopy
// hide the welcome screen
809 6902f72e clopy
function hideWelcome() {
810 6902f72e clopy
    $("#emptymachineslist").fadeOut("fast");
811 6902f72e clopy
    $("#createbody").fadeOut("fast");
812 6902f72e clopy
    $("#createcontainer").removeClass('emptycreatecontainer')
813 6902f72e clopy
    $("#create").removeClass('emptycreate')
814 6902f72e clopy
    $("#view-select").fadeIn("fast");
815 cebcd8ea Mike Muzurakis
    $("#machinesview.standard").fadeIn("fast");
816 ce4f9227 Mike Muzurakis
    $("div#view-select").show();
817 ce4f9227 Mike Muzurakis
    $("#create").css("display", "inline");
818 6902f72e clopy
}