Revision 7991d0c5

b/ui/static/synnefo.js
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
    }
b/ui/templates/home.html
287 287
                btn.click(function(){
288 288
                    // wrap in its own try catch to avoid retriggering ajax_error
289 289
                    try {
290
                        var data = $.extend({'error_info': $.extend({}, extra_data)}, get_user_data());
290

  
291
                        // fallback to error object
292
                        try {
293
                            var data = $.extend({'error_info': $.extend({}, extra_data)}, get_user_data());
294
                        } catch (err) {
295
                            var data = {'error': err};
296
                        }
297

  
291 298
                        var payload = {'feedback-msg': "Automated error report", 'feedback-data': JSON.stringify(data)};
292 299

  
293 300
                        // we will close error overlay to display feedback form

Also available in: Unified diff