Statistics
| Branch: | Tag: | Revision:

root / ui / static / synnefo.js @ 6912c72b

History | View | Annotate | Download (25.9 kB)

1
var flavors = [], images = [], servers = [], disks = [], cpus = [], ram = [];
2
var changes_since = 0, deferred = 0, update_request = false, load_request = false, pending_actions = [];
3
var API_URL = "/api/v1.1";
4

    
5
function ISODateString(d){
6
    //return a date in an ISO 8601 format using UTC.
7
    //do not include time zone info (Z) at the end
8
    //taken from the Mozilla Developer Center
9
    function pad(n){ return n<10 ? '0'+n : n }
10
    return  d.getUTCFullYear()+ '-' +
11
                        pad(d.getUTCMonth()+1) + '-' +
12
                        pad(d.getUTCDate()) + 'T' +
13
                        pad(d.getUTCHours()) + ':' +
14
                        pad(d.getUTCMinutes()) + ':' +
15
                        pad(d.getUTCSeconds()) +'Z'
16
}
17

    
18
function parse_error(responseText){
19
        var errors = [];
20
        if (responseText.length == 0){
21
                errors[0] = {'code': 0};
22
        } else {
23
                responseObj = JSON.parse(responseText);
24
                //console.info(inp);
25
                for (var err in responseObj){
26
                        errors[errors.length] = responseObj[err];
27
                }
28
        }
29
        return errors;
30
}
31

    
32
// indexOf prototype for IE
33
if (!Array.prototype.indexOf) {
34
  Array.prototype.indexOf = function(elt /*, from*/) {
35
    var len = this.length;
36
    var from = Number(arguments[1]) || 0;
37
    from = (from < 0)
38
         ? Math.ceil(from)
39
         : Math.floor(from);
40
    if (from < 0)
41
      from += len;
42

    
43
    for (; from < len; from++) {
44
      if (from in this &&
45
          this[from] === elt)
46
        return from;
47
    }
48
    return -1;
49
  };
50
}
51

    
52

    
53
function update_confirmations(){
54
    // hide all confirm boxes to begin with
55
    $('div.confirm_single').hide();
56
    $('div.confirm_multiple').hide();
57

    
58
        // standard view only
59
        if ($.cookie("list") != '1') {
60
                for (var i=0;i<pending_actions.length;i++){
61
            // show single confirms
62
                        $("div.machine#"+pending_actions[i][1]+' .confirm_single').show();
63
                }                
64
        }
65

    
66
        // if more than one pending action show multiple confirm box
67
        if (pending_actions.length>1 || $.cookie("list") == '1' && pending_actions.length == 1){
68
                $('div.confirm_multiple span.actionLen').text(pending_actions.length);
69
                $('div.confirm_multiple').show();
70
        }
71
}
72

    
73
function list_view() {
74
        changes_since = 0; // to reload full list
75
        pending_actions = []; // clear pending actions
76
        update_confirmations();
77
        clearTimeout(deferred);        // clear old deferred calls
78
        try {
79
                update_request.abort(); // cancel pending ajax updates
80
                load_request.abort();
81
        }catch(err){}
82
    $.cookie("list", '1'); // set list cookie
83
        
84
        uri = $("#list").attr("href");
85
    load_request = $.ajax({
86
        url: uri,
87
        type: "GET",
88
        timeout: TIMEOUT,
89
        dataType: "html",
90
        error: function(jqXHR, textStatus, errorThrown) {                                                
91
                        return false;
92
                },
93
        success: function(data, textStatus, jqXHR) {
94
                        $("a#list")[0].className += ' activelink';
95
                        $("a#standard")[0].className = '';
96
                        $("div#machinesview").html(data);
97
                }
98
        });
99

    
100
    return false;
101
}
102

    
103
function standard_view() {
104
        changes_since = 0; // to reload full list
105
        pending_actions = []; // clear pending actions
106
        update_confirmations();
107
        clearTimeout(deferred);        // clear old deferred calls
108
        try {
109
                update_request.abort() // cancel pending ajax updates
110
                load_request.abort();
111
        }catch(err){}        
112
    $.cookie("list", '0');
113
        
114
    uri = $("a#standard").attr("href");
115
    load_request = $.ajax({
116
        url: uri,
117
        type: "GET",
118
        timeout: TIMEOUT,
119
        dataType: "html",
120
        error: function(jqXHR, textStatus, errorThrown) {                                                
121
                        return false;
122
                },
123
        success: function(data, textStatus, jqXHR) {
124
                        $("a#standard")[0].className += ' activelink';
125
                        $("a#list")[0].className = '';
126
                        $("div#machinesview").html(data);
127
                }
128
        });        
129

    
130
    return false;
131
}
132

    
133
function choose_view() {
134
    if ($.cookie("list")=='1') {
135
        list_view();
136
    } else {
137
        standard_view();
138
    }
139
}
140

    
141
function toggleMenu() {
142
    var primary = $("ul.css-tabs li a.primary");
143
    var secondary = $("ul.css-tabs li a.secondary");
144
    var all = $("ul.css-tabs li a");                        
145
    var toggled = $('ul.css-tabs li a.current').hasClass('secondary');
146

    
147
    // if anything is still moving, do nothing
148
    if ($(":animated").length) {
149
        return;
150
    }
151

    
152
    // nothing is current to begin with
153
    $('ul.css-tabs li a.current').removeClass('current');
154

    
155
    // move stuff around
156
    all.animate({top:'30px'}, {complete: function() {
157
        $(this).hide();
158
        if (toggled) {
159
            primary.show();
160
            primary.animate({top:'9px'}, {complete: function() {
161
                $('ul.css-tabs li a.primary#machines').addClass('current');
162
                $('a#machines').click();                                   
163
            }});
164
        } else {
165
            secondary.show();
166
            secondary.animate({top:'9px'}, {complete: function() {
167
                $('ul.css-tabs li a.secondary#files').addClass('current');
168
                $('a#files').click();                                                                           
169
            }});
170
        }
171
    }});
172

    
173
    // rotate arrow icon
174
    if (toggled) {
175
        $("#arrow").rotate({animateAngle: (0), bind:[{"click":function(){toggleMenu()}}]});
176
        $("#arrow").rotateAnimation(0);                    
177
    } else {
178
        $("#arrow").rotate({animateAngle: (-180), bind:[{"click":function(){toggleMenu()}}]});
179
        $("#arrow").rotateAnimation(-180);
180
    }
181
}
182

    
183
// confirmation overlay generation
184
function confirm_action(action_string, action_function, serverIDs, serverNames) {
185
    if (serverIDs.length == 1){
186
        $("#yes-no h3").text('You are about to ' + action_string + ' vm ' + serverNames[0]);
187
    } else if (serverIDs.length > 1){
188
        $("#yes-no h3").text('You are about to ' + action_string + ' ' + serverIDs.length + ' machines');
189
    } else {
190
        return false;
191
    }
192
    // action confirmation overlay
193
    var triggers = $("a#confirmation").overlay({
194
            // some mask tweaks suitable for modal dialogs
195
            mask: {
196
                    color: '#ebecff',
197
                    opacity: '0.9'
198
            },
199
        top: 'center',
200
        load: false
201
    });
202
    // yes or no?
203
    var buttons = $("#yes-no button").click(function(e) {
204
            // get user input
205
            var yes = buttons.index(this) === 0;
206
        //close the confirmation window
207
        $("a#confirmation").overlay().close();
208
        // return true=yes or false=no
209
        if (yes) {
210
            action_function(serverIDs);
211
        }
212
    });
213
    $("a#confirmation").data('overlay').load();
214
    return false;
215
}
216

    
217
// get and show a list of running and terminated machines
218
function update_vms(interval) {
219
    try{ console.info('updating machines'); } catch(err){}
220
        var uri= API_URL + '/servers/detail';
221

    
222
        if (changes_since != 0)
223
                uri+='?changes-since='+changes_since
224
                
225
    update_request = $.ajax({
226
        url: uri,
227
        type: "GET",
228
        timeout: TIMEOUT,
229
        dataType: "json",
230
        error: function(jqXHR, textStatus, errorThrown) {
231
                        // don't forget to try again later
232
                        if (interval) {
233
                                clearTimeout(deferred);        // clear old deferred calls
234
                                deferred = setTimeout(update_vms,interval,interval);
235
                        }
236
                        // as for now, just show an error message
237
                        try { console.info('update_vms errback:' + jqXHR.status ) } catch(err) {}
238
                        ajax_error(jqXHR.status, undefined, 'Update VMs', jqXHR.responseText);                                                
239
                        return false;
240
                        },
241
        success: function(data, textStatus, jqXHR) {
242
                        // create changes_since string if necessary
243
                        if (jqXHR.getResponseHeader('Date') != null){
244
                                changes_since_date = new Date(jqXHR.getResponseHeader('Date'));
245
                                changes_since = ISODateString(changes_since_date);
246
                        }
247
                        
248
                        if (interval) {
249
                                clearTimeout(deferred);        // clear old deferred calls
250
                                deferred = setTimeout(update_vms,interval,interval);
251
                        }
252
                        
253
                        if (jqXHR.status == 200 || jqXHR.status == 203) {
254
                                try {
255
                                        servers = data.servers.values;
256
                                } catch(err) { ajax_error('400', undefined, 'Update VMs', jqXHR.responseText);}
257
                                update_machines_view(data);
258
                        } else if (jqXHR.status != 304){
259
                                try { console.info('update_vms callback:' + jqXHR.status ) } catch(err) {}
260
                                //ajax_error(jqXHR.status, undefined, 'Update VMs', jqXHR.responseText);                                        
261
                        }
262
                        return false;
263
        }
264
    });
265
    return false;
266
}
267

    
268
// get and show a list of available standard and custom images
269
function update_images() {
270
    $.ajax({
271
        url: API_URL + '/images/detail',
272
        type: "GET",
273
        //async: false,
274
        dataType: "json",
275
        timeout: TIMEOUT,
276
        error: function(jqXHR, textStatus, errorThrown) {
277
                    ajax_error(jqXHR.status, undefined, 'Update Images', jqXHR.responseText);
278
                    },
279
        success: function(data, textStatus, jqXHR) {
280
            try {
281
                                images = data.images.values;
282
                                update_wizard_images();
283
                        } catch(err){
284
                                ajax_error("NO_IMAGES");
285
                        }
286
        }
287
    });
288
    return false;
289
}
290

    
291
function update_wizard_images() {
292
        if ($("ul#standard-images li").toArray().length + $("ul#custom-images li").toArray().length == 0) {
293
                $.each(images, function(i,image){
294
                        var img = $('#image-template').clone().attr("id","img-"+image.id).fadeIn("slow");
295
                        img.find("label").attr('for',"img-radio-" + image.id);
296
                        img.find(".image-title").text(image.name);
297
            if (image.metadata) {
298
                if (image.metadata.values.description != undefined) {
299
                    img.find(".description").text(image.metadata.values.description);
300
                }
301
                if (image.metadata.values.size != undefined) {
302
                                img.find("#size").text(image.metadata.values.size);
303
                }
304
            }
305
                        img.find("input.radio").attr('id',"img-radio-" + image.id);
306
                        if (i==0) img.find("input.radio").attr("checked","checked");
307
            var image_logo = os_icon(image.metadata);
308
                        img.find("img.image-logo").attr('src','static/os_logos/'+image_logo+'.png');
309
            if (image.metadata) {
310
                if (image.metadata.values.serverId != undefined) {
311
                    img.appendTo("ul#custom-images");
312
                } else {
313
                    img.appendTo("ul#standard-images");
314
                }
315
            } else {
316
                img.appendTo("ul#standard-images");
317
            }
318
                });
319
        }        
320
}
321

    
322
function update_wizard_flavors(){
323
        // sliders for selecting VM flavor
324
        $("#cpu:range").rangeinput({min:0,
325
                                                           value:0,
326
                                                           step:1,
327
                                                           progress: true,
328
                                                           max:cpus.length-1});
329
        
330
        $("#storage:range").rangeinput({min:0,
331
                                                           value:0,
332
                                                           step:1,
333
                                                           progress: true,
334
                                                           max:disks.length-1});
335

    
336
        $("#ram:range").rangeinput({min:0,
337
                                                           value:0,
338
                                                           step:1,
339
                                                           progress: true,
340
                                                           max:ram.length-1});
341
        $("#small").click();
342

    
343
        // update the indicators when sliding
344
        $("#cpu:range").data().rangeinput.onSlide(function(event,value){
345
                $("#cpu-indicator")[0].value = cpus[Number(value)];
346
        $("#cpu-indicator").addClass('selectedrange');
347
        });
348
        $("#cpu:range").data().rangeinput.change(function(event,value){
349
                $("#cpu-indicator")[0].value = cpus[Number(value)];                                
350
                $("#custom").click();
351
        $("#cpu-indicator").removeClass('selectedrange');                
352
        });                        
353
        $("#ram:range").data().rangeinput.onSlide(function(event,value){
354
                $("#ram-indicator")[0].value = ram[Number(value)];
355
        $("#ram-indicator").addClass('selectedrange');
356
        });
357
        $("#ram:range").data().rangeinput.change(function(event,value){
358
                $("#ram-indicator")[0].value = ram[Number(value)];                                
359
                $("#custom").click();
360
        $("#ram-indicator").removeClass('selectedrange');                
361
        });                        
362
        $("#storage:range").data().rangeinput.onSlide(function(event,value){
363
                $("#storage-indicator")[0].value = disks[Number(value)];
364
        $("#storage-indicator").addClass('selectedrange');
365
        });
366
        $("#storage:range").data().rangeinput.change(function(event,value){
367
                $("#storage-indicator")[0].value = disks[Number(value)];                                
368
                $("#custom").click();
369
        $("#storage-indicator").removeClass('selectedrange');                
370
        });                                
371
}
372

    
373
Array.prototype.unique = function () {
374
        var r = new Array();
375
        o:for(var i = 0, n = this.length; i < n; i++)
376
        {
377
                for(var x = 0, y = r.length; x < y; x++)
378
                {
379
                        if(r[x]==this[i])
380
                        {
381
                                continue o;
382
                        }
383
                }
384
                r[r.length] = this[i];
385
        }
386
        return r;
387
}
388

    
389
// get and configure flavor selection
390
function update_flavors() {
391
    $.ajax({
392
        url: API_URL + '/flavors/detail',
393
        type: "GET",
394
        //async: false,
395
        dataType: "json",
396
        timeout: TIMEOUT,
397
        error: function(jqXHR, textStatus, errorThrown) {
398
            try {
399
                                ajax_error(jqXHR.status, undefined, 'Update Flavors', jqXHR.responseText);
400
                        } catch (err) {
401
                                ajax_error(err);
402
                        }
403
            // start updating vm list
404
            update_vms(UPDATE_INTERVAL);
405
        },
406
        success: function(data, textStatus, jqXHR) {
407
            flavors = data.flavors.values;
408
            $.each(flavors, function(i, flavor) {
409
                cpus[i] = flavor['cpu'];
410
                disks[i] = flavor['disk'];
411
                ram[i] = flavor['ram'];
412
            });
413
            cpus = cpus.unique();
414
            disks = disks.unique();
415
            ram = ram.unique();
416
                        update_wizard_flavors();
417
            // start updating vm list
418
            update_vms(UPDATE_INTERVAL);
419
        }
420
    });
421
    return false;
422
}
423

    
424
// return flavorRef from cpu, disk, ram values
425
function identify_flavor(cpu, disk, ram){
426
    for (i=0;i<flavors.length;i++){
427
        if (flavors[i]['cpu'] == cpu && flavors[i]['disk']==disk && flavors[i]['ram']==ram) {
428
            return flavors[i]['id']
429
        }
430
    }
431
    return 0;
432
}
433

    
434
// return image entry from imageRef
435
function get_image(imageRef) {
436
    for (i=0;i<images.length;i++){
437
        if (images[i]['id'] == imageRef) {
438
            return images[i];
439
        }
440
    }
441
    return 0;
442
}
443

    
444
// update the actions in list view
445
function updateActions() {
446
        var states = [];
447
        var on = [];
448
        var checked = $("table.list-machines tbody input[type='checkbox']:checked");
449
        // disable all actions to begin with
450
        for (action in actions) {
451
                $("#action-" + action).removeClass('enabled');
452
        }
453

    
454
        // are there multiple machines selected?
455
        if (checked.length>1)
456
                states[0] = 'multiple';
457
        
458
        // check the states of selected machines
459
        checked.each(function(i,checkbox) {
460
                states[states.length] = checkbox.className;
461
                var ip = $("#" + checkbox.id.replace('input-','') + ".ip span.public").text();
462
                if (ip.replace('undefined','').length)
463
                        states[states.length] = 'network';
464
        });
465

    
466
        // decide which actions should be enabled
467
        for (a in actions) {
468
                var enabled = false;
469
                for (var s =0; s<states.length; s++) {
470
                        if (actions[a].indexOf(states[s]) != -1 ) {
471
                                enabled = true;
472
                        } else {
473
                                enabled = false;
474
                                break;
475
                        }
476
                }
477
                if (enabled)
478
                        on[on.length]=a;
479
        }
480
        // enable those actions
481
        for (action in on) {
482
                $("#action-" + on[action]).addClass('enabled');
483
        }
484
}
485

    
486
//create server action
487
function create_vm(machineName, imageRef, flavorRef){
488

    
489
    var image_logo = os_icon(get_image(imageRef).metadata);
490

    
491
    var payload = {
492
        "server": {
493
            "name": machineName,
494
            "imageRef": imageRef,
495
            "flavorRef" : flavorRef,
496
            "metadata" : {
497
                "OS" : image_logo
498
            }
499
        }
500
    };
501
        var uri = API_URL + '/servers';
502

    
503
    $.ajax({
504
    url: uri,
505
    type: "POST",
506
        contentType: "application/json",
507
    dataType: "json",
508
    data: JSON.stringify(payload),
509
    timeout: TIMEOUT,
510
    error: function(jqXHR, textStatus, errorThrown) {
511
                ajax_error(jqXHR.status, undefined, 'Create VM', jqXHR.responseText);
512
           },
513
    success: function(data, textStatus, jqXHR) {
514
                if ( jqXHR.status == '202') {
515
                    ajax_success("CREATE_VM_SUCCESS", data.server.adminPass);
516
                } else {
517
                    ajax_error(jqXHR.status, undefined, 'Create VM', jqXHR.responseText);
518
                }
519
            }
520
    });
521
}
522

    
523
// reboot action
524
function reboot(serverIDs){
525
        if (!serverIDs.length){
526
                //ajax_success('DEFAULT');
527
                return false;
528
        }        
529
    // ajax post reboot call
530
    var payload = {
531
        "reboot": {"type" : "HARD"}
532
    };
533
    var serverID = serverIDs.pop();
534
        
535
        $.ajax({
536
                url: API_URL + '/servers/' + serverID + '/action',
537
                type: "POST",
538
                contentType: "application/json",
539
                dataType: "json",
540
                data: JSON.stringify(payload),
541
                timeout: TIMEOUT,
542
                error: function(jqXHR, textStatus, errorThrown) {
543
                    display_failure(jqXHR.status, serverID, 'Reboot', jqXHR.responseText)
544
                                },
545
                success: function(data, textStatus, jqXHR) {
546
                                        if ( jqXHR.status == '202') {
547
                        try {
548
                            console.info('rebooted ' + serverID);
549
                        } catch(err) {}
550
                                                // indicate that the action succeeded
551
                                                display_success(serverID);
552
                                                // continue with the rest of the servers
553
                                                reboot(serverIDs);
554
                                        } else {
555
                                                ajax_error(jqXHR.status, serverID, 'Reboot', jqXHR.responseText);
556
                                        }
557
                                }
558
    });
559

    
560
    return false;
561
}
562

    
563
// shutdown action
564
function shutdown(serverIDs) {
565
        if (!serverIDs.length){
566
                //ajax_success('DEFAULT');
567
                return false;
568
        }
569
    // ajax post shutdown call
570
    var payload = {
571
        "shutdown": {}
572
    };
573

    
574
        var serverID = serverIDs.pop()
575
    $.ajax({
576
            url: API_URL + '/servers/' + serverID + '/action',
577
            type: "POST",
578
                contentType: "application/json",
579
            dataType: "json",
580
        data: JSON.stringify(payload),
581
        timeout: TIMEOUT,
582
        error: function(jqXHR, textStatus, errorThrown) {
583
                    display_failure(jqXHR.status, serverID, 'Shutdown', jqXHR.responseText)
584
                    },
585
        success: function(data, textStatus, jqXHR) {
586
                    if ( jqXHR.status == '202') {
587
                                                try {
588
                            console.info('suspended ' + serverID);
589
                        } catch(err) {}
590
                                                // indicate that the action succeeded
591
                                                display_success(serverID);
592
                                                // continue with the rest of the servers
593
                        shutdown(serverIDs);
594
                    } else {
595
                        ajax_error(jqXHR.status, serverID, 'Shutdown', jqXHR.responseText);
596
                    }
597
                }
598
    });
599

    
600
    return false;
601
}
602

    
603
// destroy action
604
function destroy(serverIDs) {
605
        if (!serverIDs.length){
606
                //ajax_success('DEFAULT');
607
                return false;
608
        }
609
    // ajax post destroy call can have an empty request body
610
    var payload = {};
611

    
612
        serverID = serverIDs.pop()
613
    $.ajax({
614
            url: API_URL + '/servers/' + serverID,
615
            type: "DELETE",
616
                contentType: "application/json",
617
            dataType: "json",
618
        data: JSON.stringify(payload),
619
        timeout: TIMEOUT,
620
        error: function(jqXHR, textStatus, errorThrown) {
621
                    display_failure(jqXHR.status, serverID, 'Destroy', jqXHR.responseText)
622
                    },
623
        success: function(data, textStatus, jqXHR) {
624
                    if ( jqXHR.status == '204') {
625
                                                try {
626
                            console.info('destroyed ' + serverID);
627
                        } catch (err) {}
628
                                                // indicate that the action succeeded
629
                                                display_success(serverID);
630
                                                // continue with the rest of the servers
631
                        destroy(serverIDs);
632
                    } else {
633
                        ajax_error(jqXHR.status, serverID, 'Destroy', jqXHR.responseText);
634
                    }
635
                }
636
    });
637

    
638
    return false;
639
}
640

    
641
// start action
642
function start(serverIDs){
643
        if (!serverIDs.length){
644
                //ajax_success('DEFAULT');
645
                return false;
646
        }        
647
    // ajax post start call
648
    var payload = {
649
        "start": {}
650
    };
651

    
652
        var serverID = serverIDs.pop()
653
    $.ajax({
654
        url: API_URL + '/servers/' + serverID + '/action',
655
        type: "POST",
656
                contentType: "application/json",
657
        dataType: "json",
658
        data: JSON.stringify(payload),
659
        timeout: TIMEOUT,
660
        error: function(jqXHR, textStatus, errorThrown) {
661
                    display_failure(jqXHR.status, serverID, 'Start', jqXHR.responseText)
662
                    },
663
        success: function(data, textStatus, jqXHR) {
664
                    if ( jqXHR.status == '202') {
665
                                            try {
666
                            console.info('started ' + serverID);
667
                        } catch(err) {}
668
                                                // indicate that the action succeeded
669
                                                display_success(serverID);
670
                                                // continue with the rest of the servers                                                
671
                        start(serverIDs);
672
                    } else {
673
                        ajax_error(jqXHR.status, serverID, 'Start', jqXHR.responseText);
674
                    }
675
                }
676
    });
677

    
678
    return false;
679
}
680

    
681
// Show VNC console
682
function vnc_attachment(host, port, password) {
683
    // FIXME: Must be made into parameters, in settings.py
684
    //vnc = open("", "displayWindow",
685
    //    "status=yes,toolbar=yes,menubar=yes");
686
    vd = document.open("application/x-vnc");
687

    
688
    vd.writeln("[connection]");
689
    vd.writeln("host=" + host);
690
    vd.writeln("port=" + port);
691
    vd.writeln("password=" + password);
692

    
693
    vd.close();
694
}
695

    
696

    
697
// Show VNC console
698
function show_vnc_console(host, port, password) {
699
    // FIXME: Must be made into parameters, in settings.py
700

    
701
    var params_url = '?host=' + host + '&port=' + port + '&password=' + password ;
702

    
703
    window.open('/machines/console' + params_url, 'formresult', 'scrollbars=no,menubar=no,height=600,width=800,resizable=yes,toolbar=no,status=no');
704

    
705
    return false;
706
}
707

    
708

    
709
// console action
710
function open_console(serverIDs){
711
        if (!serverIDs.length){
712
                //ajax_success('DEFAULT');
713
                return false;
714
        }
715
    // ajax post start call
716
    var payload = {
717
        "console": {"type": "vnc"}
718
    };
719

    
720
        var serverID = serverIDs.pop()
721
    $.ajax({
722
        url: API_URL + '/servers/' + serverID + '/action',
723
        type: "POST",
724
                contentType: "application/json",
725
        dataType: "json",
726
        data: JSON.stringify(payload),
727
        timeout: TIMEOUT,
728
        error: function(jqXHR, textStatus, errorThrown) {
729
                    display_failure(jqXHR.status, serverID, 'Console', jqXHR.responseText)
730
                    },
731
        success: function(data, textStatus, jqXHR) {
732
                    if ( jqXHR.status == '200') {
733
                                            try {
734
                            console.info('got_console ' + serverID);
735
                        } catch(err) {}
736
                                                // indicate that the action succeeded
737
                        show_vnc_console(data.console.host,data.console.port,data.console.password);
738
                                                display_success(serverID);
739
                        // hide spinner
740
                        $('#' + serverID + ' .spinner').hide();
741
                                                // continue with the rest of the servers
742
                        open_console(serverIDs);
743
                    } else {
744
                        ajax_error(jqXHR.status, serverID, 'Console', jqXHR.responseText);
745
                    }
746
                }
747
    });
748
    return false;
749
}
750

    
751

    
752
// rename server name action
753
function rename(serverID, serverName){
754
        if (!serverID.length){
755
                //ajax_success('DEFAULT');
756
                return false;
757
        }        
758
    // ajax post rename call
759
    var payload = {
760
        "server": {"name": serverName}
761
    };
762

    
763
    $.ajax({
764
        url: API_URL + '/servers/' + serverID,
765
        type: "PUT",
766
                contentType: "application/json",
767
        dataType: "json",
768
        data: JSON.stringify(payload),
769
        timeout: TIMEOUT,
770
        error: function(jqXHR, textStatus, errorThrown) {
771
                    display_failure(jqXHR.status, serverID, 'Rename', jqXHR.responseText)
772
                    },
773
        success: function(data, textStatus, jqXHR) {
774
                    if ( jqXHR.status == '204') {
775
                                            try {
776
                            console.info('renamed ' + serverID);
777
                        } catch(err) {}
778
                                                // indicate that the action succeeded
779
                                                display_success(serverID);
780
                    } else {
781
                        ajax_error(jqXHR.status, serverID, 'Rename', jqXHR.responseText);
782
                    }
783
                }
784
    });
785

    
786
    return false;
787
}
788

    
789
// get server metadata
790
function get_metadata(serverID) {
791
    $.ajax({
792
        url: API_URL + '/servers/' + serverID + '/meta',
793
        type: "GET",
794
        //async: false,
795
        dataType: "json",
796
        timeout: TIMEOUT,
797
        error: function(jqXHR, textStatus, errorThrown) {
798
            try {
799
                                ajax_error(jqXHR.status, undefined, 'Get metadata', jqXHR.responseText);
800
                        } catch (err) {
801
                                ajax_error(err);
802
                        }
803
        },
804
        success: function(data, textStatus, jqXHR) {
805
            // to list the new results in the edit dialog
806
            list_metadata(data);
807
            list_metadata_keys(serverID, data);
808
        }
809
    });
810
    return false;
811
}
812

    
813
// delete metadata key-value pair
814
function delete_metadata(serverID, meta_key) {
815
    $.ajax({
816
        url: API_URL + '/servers/' + serverID + '/meta/' + meta_key,
817
        type: "DELETE",
818
        //async: false,
819
        dataType: "json",
820
        timeout: TIMEOUT,
821
        error: function(jqXHR, textStatus, errorThrown) {
822
            try {
823
                                ajax_error(jqXHR.status, undefined, 'Delete metadata', jqXHR.responseText);
824
                        } catch (err) {
825
                                ajax_error(err);
826
                        }
827
        },
828
        success: function(data, textStatus, jqXHR) {
829
            // to GET new results and list them in the edit dialog
830
            get_metadata(serverID);
831
        }
832
    });
833
    return false;
834
}
835

    
836

    
837
// add metadata key-value pair
838
function add_metadata(serverID, meta_key, meta_value) {
839

    
840
    var payload = {
841
        "meta": {
842
        }
843
    };
844
    payload["meta"][meta_key] = meta_value;
845

    
846
    $.ajax({
847
        url: API_URL + '/servers/' + serverID + '/meta/' + meta_key,
848
        type: "PUT",
849
            contentType: "application/json",
850
        dataType: "json",
851
        data: JSON.stringify(payload),
852
        timeout: TIMEOUT,
853
        error: function(jqXHR, textStatus, errorThrown) {
854
            try {
855
                                ajax_error(jqXHR.status, undefined, 'add metadata', jqXHR.responseText);
856
                        } catch (err) {
857
                                ajax_error(err);
858
                        }
859
        },
860
        success: function(data, textStatus, jqXHR) {
861
            // to GET new results and list them in the edit dialog
862
            get_metadata(serverID);
863
        }
864
    });
865
    return false;
866
}
867

    
868

    
869
// show the welcome screen
870
function showWelcome() {
871
    $("#view-select").fadeOut("fast");
872
    $("#machinesview.standard").fadeOut("fast");
873
    $("#createcontainer").addClass('emptycreatecontainer')
874
    $("#create").addClass('emptycreate')
875
    $("#emptymachineslist").fadeIn("fast");
876
    $("#createbody").fadeIn("fast");
877
    $("#create").css("display", "block");
878
}
879

    
880
// hide the welcome screen
881
function hideWelcome() {
882
    $("#emptymachineslist").fadeOut("fast");
883
    $("#createbody").fadeOut("fast");
884
    $("#createcontainer").removeClass('emptycreatecontainer')
885
    $("#create").removeClass('emptycreate')
886
    $("#view-select").fadeIn("fast");
887
    $("#machinesview.standard").fadeIn("fast");
888
    $("div#view-select").show();
889
    $("#create").css("display", "inline");
890
}
891