36 |
36 |
var changes_since = 0, deferred = 0, update_request = false, load_request = false, pending_actions = [];
|
37 |
37 |
var flavors = [], images = [], servers = [], disks = [], cpus = [], ram = [];
|
38 |
38 |
var networks = [], networks_changes_since = 0;
|
39 |
|
|
40 |
|
|
41 |
39 |
var error_timeout = 20000;
|
|
40 |
var last_request = {};
|
|
41 |
|
42 |
42 |
$.ajaxSetup({
|
43 |
43 |
'beforeSend': function(xhr) {
|
|
44 |
// save ajax settings, we might need them for error reporting
|
|
45 |
last_request = this;
|
44 |
46 |
xhr.setRequestHeader("X-Auth-Token", $.cookie("X-Auth-Token"));
|
45 |
47 |
},
|
46 |
48 |
|
... | ... | |
48 |
50 |
// stop interaction and show only for the 5xx errors
|
49 |
51 |
// refresh the page after 20secs
|
50 |
52 |
error: function(jqXHR, textStatus, errorThrown) {
|
|
53 |
|
|
54 |
// check if xhr is in valid state (no status property)
|
|
55 |
try {
|
|
56 |
var status = jqXHR.status;
|
|
57 |
} catch (err) {
|
|
58 |
return false;
|
|
59 |
}
|
|
60 |
|
51 |
61 |
// stop interaction for important (aka 500) error codes only
|
52 |
62 |
if (jqXHR.status >= 500 && jqXHR.status < 600)
|
53 |
63 |
{
|
54 |
64 |
try {
|
55 |
65 |
ajax_error(jqXHR.status, undefined, 'Unknown', jqXHR.responseText);
|
56 |
66 |
} catch(err) {
|
57 |
|
ajax_error(-5, "UI Error", 'Unknown', err);
|
|
67 |
if (!isXhrException(err)) {
|
|
68 |
ajax_error(-501, "UI Error", 'Generic error', err);
|
|
69 |
} else {
|
|
70 |
return false;
|
|
71 |
}
|
58 |
72 |
}
|
59 |
73 |
}
|
60 |
74 |
|
... | ... | |
63 |
77 |
}
|
64 |
78 |
});
|
65 |
79 |
|
|
80 |
function isXhrException(err) {
|
|
81 |
|
|
82 |
DOM_EXCEPTION_NAMES = [
|
|
83 |
"NS_ERROR_NOT_AVAILABLE", // Firefox
|
|
84 |
"INVALID_STATE_ERR" // Chrome
|
|
85 |
];
|
|
86 |
|
|
87 |
try {
|
|
88 |
if (DOM_EXCEPTION_NAMES.indexOf(err.name) != -1) {
|
|
89 |
return true;
|
|
90 |
}
|
|
91 |
|
|
92 |
// ie !!!!
|
|
93 |
if (err.number == -2147467259) {
|
|
94 |
return true;
|
|
95 |
}
|
|
96 |
|
|
97 |
} catch(err) {
|
|
98 |
return false;
|
|
99 |
}
|
|
100 |
|
|
101 |
return false;
|
|
102 |
}
|
|
103 |
|
66 |
104 |
Object.prototype.toString = function(o){
|
67 |
105 |
|
68 |
106 |
var parse = function(_o){
|
... | ... | |
371 |
409 |
}
|
372 |
410 |
// as for now, just show an error message
|
373 |
411 |
try { console.info('update_vms errback:' + jqXHR.status ) } catch(err) {}
|
374 |
|
try {
|
375 |
|
ajax_error(jqXHR.status, undefined, 'Update VMs', jqXHR.responseText);
|
376 |
|
} catch(err) {
|
377 |
|
ajax_error(-5, "UI Error", 'Update VMs', err);
|
378 |
|
}
|
379 |
|
return false;
|
|
412 |
try {
|
|
413 |
ajax_error(jqXHR.status, undefined, 'Update VMs', jqXHR.responseText);
|
|
414 |
} catch(err) {
|
|
415 |
if (!isXhrException(err)) {
|
|
416 |
ajax_error(-502, "UI Error", 'Update VMs', err);
|
|
417 |
} else {
|
|
418 |
return false;
|
|
419 |
}
|
|
420 |
}
|
|
421 |
return false;
|
380 |
422 |
},
|
381 |
423 |
success: function(data, textStatus, jqXHR) {
|
382 |
424 |
// create changes_since string if necessary
|
... | ... | |
395 |
437 |
//servers = data.servers.values;
|
396 |
438 |
update_servers_data(data.servers.values, data);
|
397 |
439 |
update_machines_view(data);
|
398 |
|
} catch(err) { ajax_error(-5, "UI Error", 'Update VMs', err);}
|
|
440 |
} catch (err) { ajax_error(-503, "UI Error", 'Update VMs', err);}
|
399 |
441 |
} else if (jqXHR.status != 304){
|
400 |
442 |
try { console.info('update_vms callback:' + jqXHR.status ) } catch(err) {}
|
401 |
443 |
/*
|
... | ... | |
535 |
577 |
}
|
536 |
578 |
// as for now, just show an error message
|
537 |
579 |
try { console.info('update_networks errback:' + jqXHR.status ) } catch(err) {}
|
|
580 |
|
538 |
581 |
try {
|
539 |
582 |
ajax_error(jqXHR.status, undefined, 'Update networks', jqXHR.responseText);
|
540 |
583 |
} catch(err) {
|
541 |
|
ajax_error(-5, "UI Error", 'Update networks', err);
|
|
584 |
if (!isXhrException(err)) {
|
|
585 |
ajax_error(-504, "UI Error", 'Update networks', err);
|
|
586 |
} else {
|
|
587 |
return false;
|
|
588 |
}
|
542 |
589 |
}
|
543 |
590 |
return false;
|
544 |
591 |
},
|
... | ... | |
559 |
606 |
//servers = data.servers.values;
|
560 |
607 |
update_servers_data(data.servers.values, data);
|
561 |
608 |
update_network_names(data);
|
562 |
|
} catch(err) { ajax_error(-5, "UI Error", 'Update networks', err);}
|
|
609 |
} catch(err) { ajax_error(-505, "UI Error", 'Update networks', err);}
|
563 |
610 |
} else if (jqXHR.status == 304) {
|
564 |
611 |
update_network_names();
|
565 |
612 |
}
|
... | ... | |
602 |
649 |
try {
|
603 |
650 |
ajax_error(jqXHR.status, undefined, 'Update network names', jqXHR.responseText);
|
604 |
651 |
} catch(err) {
|
605 |
|
ajax_error(-5, "UI Error", 'Update network names', err);
|
|
652 |
ajax_error(-506, "UI Error", 'Update network names', err);
|
606 |
653 |
}
|
607 |
654 |
return false;
|
608 |
655 |
},
|
... | ... | |
618 |
665 |
networks = data.networks.values;
|
619 |
666 |
update_networks_view(servers_data, data);
|
620 |
667 |
} catch(err) {
|
621 |
|
ajax_error(-5, "UI Error", 'Update network names', err);
|
|
668 |
ajax_error(-507, "UI Error", 'Update network names', err);
|
622 |
669 |
}
|
623 |
670 |
} else if (jqXHR.status == 304) {
|
624 |
|
update_networks_view(servers_data);
|
|
671 |
update_networks_view(servers_data);
|
625 |
672 |
} else if (jqXHR.status != 304){
|
626 |
673 |
try { console.info('update_network_names callback:' + jqXHR.status ) } catch(err) {}
|
627 |
674 |
/*
|
... | ... | |
650 |
697 |
try {
|
651 |
698 |
ajax_error(jqXHR.status, undefined, 'Update Images', jqXHR.responseText);
|
652 |
699 |
} catch(err) {
|
653 |
|
ajax_error(-5, "UI error", 'Update Images', err);
|
|
700 |
ajax_error(-508, "UI error", 'Update Images', err);
|
654 |
701 |
}
|
655 |
702 |
},
|
656 |
703 |
success: function(data, textStatus, jqXHR) {
|
... | ... | |
776 |
823 |
try {
|
777 |
824 |
ajax_error(jqXHR.status, undefined, 'Update Flavors', jqXHR.responseText);
|
778 |
825 |
} catch (err) {
|
779 |
|
ajax_error(-5, "UI Error", "Update Flavors", err);
|
|
826 |
ajax_error(-509, "UI Error", "Update Flavors", err);
|
780 |
827 |
}
|
781 |
828 |
// start updating vm list
|
782 |
829 |
update_vms(UPDATE_INTERVAL);
|
... | ... | |
926 |
973 |
try {
|
927 |
974 |
ajax_error(jqXHR.status, undefined, 'Create VM', jqXHR.responseText);
|
928 |
975 |
} catch(err) {
|
929 |
|
ajax_error(-5, "UI Error", 'Create VM', err);
|
|
976 |
if (!isXhrException(err)) {
|
|
977 |
ajax_error(-510, "UI Error", 'Create VM', err);
|
|
978 |
}
|
930 |
979 |
}
|
931 |
980 |
},
|
932 |
981 |
success: function(data, textStatus, jqXHR) {
|
... | ... | |
1386 |
1435 |
$("a#metadata-scrollable").data('overlay').close();
|
1387 |
1436 |
ajax_error(jqXHR.status, undefined, 'Get metadata', jqXHR.responseText);
|
1388 |
1437 |
} catch (err) {
|
1389 |
|
ajax_error(-5, "UI Error", "Get metadata", err);
|
|
1438 |
if (!isXhrException(err)) {
|
|
1439 |
ajax_error(-511, "UI Error", "Get metadata", err);
|
|
1440 |
} else {
|
|
1441 |
return false;
|
|
1442 |
}
|
1390 |
1443 |
}
|
1391 |
1444 |
},
|
1392 |
1445 |
success: function(data, textStatus, jqXHR) {
|
... | ... | |
1418 |
1471 |
$("a#metadata-scrollable").data('overlay').close();
|
1419 |
1472 |
ajax_error(jqXHR.status, undefined, 'Delete metadata', jqXHR.responseText);
|
1420 |
1473 |
} catch (err) {
|
1421 |
|
ajax_error(-5, "UI Error", "Delete metadata", err);
|
|
1474 |
if (!isXhrException(err)) {
|
|
1475 |
ajax_error(-512, "UI Error", "Delete metadata", err);
|
|
1476 |
} else {
|
|
1477 |
return false;
|
|
1478 |
}
|
1422 |
1479 |
}
|
1423 |
1480 |
},
|
1424 |
1481 |
success: function(data, textStatus, jqXHR) {
|
... | ... | |
1447 |
1504 |
try {
|
1448 |
1505 |
// close wizard and show error box
|
1449 |
1506 |
$("a#metadata-scrollable").data('overlay').close();
|
1450 |
|
ajax_error(jqXHR.status, undefined, 'add metadata', jqXHR.responseText);
|
|
1507 |
ajax_error(jqXHR.status, undefined, 'Add metadata', jqXHR.responseText);
|
1451 |
1508 |
} catch (err) {
|
1452 |
|
ajax_error(-5, "UI Error", "add metadata", err);
|
|
1509 |
if (!isXhrException(err)) {
|
|
1510 |
ajax_error(-513, "UI Error", "Add metadata", err);
|
|
1511 |
} else {
|
|
1512 |
return false;
|
|
1513 |
}
|
1453 |
1514 |
}
|
1454 |
1515 |
},
|
1455 |
1516 |
success: function(data, textStatus, jqXHR) {
|
... | ... | |
1521 |
1582 |
$("a#networkscreate").overlay().close();
|
1522 |
1583 |
ajax_error(jqXHR.status, undefined, 'Create network', jqXHR.responseText);
|
1523 |
1584 |
} catch (err) {
|
1524 |
|
ajax_error(-5, "UI Error", "Create network", err);
|
|
1585 |
if (!isXhrException(err)) {
|
|
1586 |
ajax_error(-514, "UI Error", "Create network", err);
|
|
1587 |
} else {
|
|
1588 |
return false;
|
|
1589 |
}
|
1525 |
1590 |
}
|
1526 |
1591 |
},
|
1527 |
1592 |
success: function(data, textStatus, jqXHR) {
|
... | ... | |
1567 |
1632 |
try {
|
1568 |
1633 |
ajax_error(jqXHR.status, undefined, 'Rename network', jqXHR.responseText);
|
1569 |
1634 |
} catch (err) {
|
1570 |
|
ajax_error(-1, "UI Error", 'Rename network', err);
|
|
1635 |
if (!isXhrException(err)) {
|
|
1636 |
ajax_error(-515, "UI Error", 'Rename network', err);
|
|
1637 |
} else {
|
|
1638 |
return false;
|
|
1639 |
}
|
1571 |
1640 |
}
|
1572 |
1641 |
},
|
1573 |
1642 |
success: function(data, textStatus, jqXHR) {
|
... | ... | |
1654 |
1723 |
$("a#add-machines-overlay").data('overlay').close();
|
1655 |
1724 |
ajax_error(jqXHR.status, undefined, 'Add server to network', jqXHR.responseText);
|
1656 |
1725 |
} catch (err) {
|
1657 |
|
ajax_error(-5, "UI Error", 'Add server to network', err);
|
|
1726 |
if (!isXhrException(err)) {
|
|
1727 |
ajax_error(-516, "UI Error", 'Add server to network', err);
|
|
1728 |
} else {
|
|
1729 |
return false;
|
|
1730 |
}
|
1658 |
1731 |
}
|
1659 |
1732 |
},
|
1660 |
1733 |
success: function(data, textStatus, jqXHR) {
|
... | ... | |
1702 |
1775 |
try {
|
1703 |
1776 |
ajax_error(jqXHR.status, undefined, 'Remove server form network', jqXHR.responseText);
|
1704 |
1777 |
} catch (err) {
|
1705 |
|
ajax_error(-5, "UI Error", 'Remove server form network', err);
|
|
1778 |
if (!isXhrException(err)) {
|
|
1779 |
ajax_error(-517, "UI Error", 'Remove server form network', err);
|
|
1780 |
} else {
|
|
1781 |
return false;
|
|
1782 |
}
|
1706 |
1783 |
}
|
1707 |
1784 |
},
|
1708 |
1785 |
success: function(data, textStatus, jqXHR) {
|
... | ... | |
1743 |
1820 |
try {
|
1744 |
1821 |
ajax_error(jqXHR.status, undefined, 'Set firewall profile', jqXHR.responseText);
|
1745 |
1822 |
} catch (err) {
|
1746 |
|
ajax_error(-5, "UI Error", 'Set firewall profile', err);
|
|
1823 |
if (!isXhrException(err)) {
|
|
1824 |
ajax_error(-518, "UI Error", 'Set firewall profile', err);
|
|
1825 |
} else {
|
|
1826 |
return false;
|
|
1827 |
}
|
1747 |
1828 |
}
|
1748 |
1829 |
},
|
1749 |
1830 |
success: function(data, textStatus, jqXHR) {
|
... | ... | |
2249 |
2330 |
return;
|
2250 |
2331 |
}
|
2251 |
2332 |
|
2252 |
|
$("textarea.data-text", this).val("").val(JSON.stringify(get_user_data()));
|
|
2333 |
$("textarea.data-text", this).val("").val(get_user_data_json());
|
2253 |
2334 |
|
2254 |
2335 |
$.ajax({
|
2255 |
2336 |
url: FEEDBACK_URL,
|
... | ... | |
2274 |
2355 |
}
|
2275 |
2356 |
|
2276 |
2357 |
function get_user_data(extra_data) {
|
|
2358 |
try {
|
|
2359 |
var last_req = $.extend({}, last_request);
|
|
2360 |
|
|
2361 |
// reset xhr, might raise exceptions while converting to JSON
|
|
2362 |
last_req.xhr = {};
|
|
2363 |
} catch (err) {
|
|
2364 |
var last_req = {}
|
|
2365 |
}
|
|
2366 |
|
2277 |
2367 |
return $.extend({
|
2278 |
2368 |
'servers': $.extend({}, servers),
|
2279 |
2369 |
'client': {'browser': $.browser, 'screen': $.extend({}, screen), 'client': $.client},
|
2280 |
|
'dates': {'now': new Date, 'lastUpdate': changes_since_date}
|
|
2370 |
'dates': {'now': new Date, 'lastUpdate': changes_since_date},
|
|
2371 |
'last_request': last_req
|
2281 |
2372 |
}, extra_data);
|
2282 |
2373 |
}
|
2283 |
2374 |
|
|
2375 |
function get_user_data_json() {
|
|
2376 |
try {
|
|
2377 |
return JSON.stringify(get_user_data());
|
|
2378 |
} catch (err) {
|
|
2379 |
return JSON.stringify({'error': err});
|
|
2380 |
}
|
|
2381 |
}
|
|
2382 |
|
2284 |
2383 |
function msg_box(config) {
|
2285 |
2384 |
var config = $.extend({'title':'Info message', 'content': 'this is an info message', 'ajax': false, 'extra':false}, config);
|
2286 |
2385 |
// prepare the error message
|
... | ... | |
2381 |
2480 |
}
|
2382 |
2481 |
},
|
2383 |
2482 |
error: function(xhr, status, err) {
|
2384 |
|
ajax_error(-5, "UI Error", "Machine connect", err);
|
|
2483 |
ajax_error(-519, "UI Error", "Machine connect", err);
|
2385 |
2484 |
}
|
2386 |
2485 |
}, config.ajax_config));
|
2387 |
2486 |
}
|