diff --git a/src/sunstone/public/js/opennebula.js b/src/sunstone/public/js/opennebula.js index eb4f149d30..8507ab0b08 100644 --- a/src/sunstone/public/js/opennebula.js +++ b/src/sunstone/public/js/opennebula.js @@ -46,21 +46,24 @@ var OpenNebula = { { switch(type) { - case "HOST","host": + case "HOST": + case "host": return ["INIT", "MONITORING", "MONITORED", "ERROR", "DISABLED"][value]; break; - case "HOST_SIMPLE","host_simple": + case "HOST_SIMPLE": + case "host_simple": return ["ON", "ON", "ON", "ERROR", "OFF"][value]; break; - case "VM","vm": + case "VM": + case "vm": return ["INIT", "PENDING", "HOLD", @@ -70,7 +73,8 @@ var OpenNebula = { "DONE", "FAILED"][value]; break; - case "VM_LCM","vm_lcm": + case "VM_LCM": + case "vm_lcm": return ["LCM_INIT", "PROLOG", "BOOT", @@ -89,7 +93,8 @@ var OpenNebula = { "CLEANUP", "UNKNOWN"][value]; break; - case "IMAGE","image": + case "IMAGE": + case "image": return ["INIT", "READY", "USED", @@ -97,6 +102,14 @@ var OpenNebula = { "LOCKED", "ERROR"][value]; break; + case "VM_MIGRATE_REASON": + case "vm_migrate_reason": + return ["NONE", + "ERROR", + "STOP_RESUME", + "USER", + "CANCEL"][value]; + break; default: return; } diff --git a/src/sunstone/public/js/plugins/vms-tab.js b/src/sunstone/public/js/plugins/vms-tab.js index c8210bea4b..455d2a39d5 100644 --- a/src/sunstone/public/js/plugins/vms-tab.js +++ b/src/sunstone/public/js/plugins/vms-tab.js @@ -593,6 +593,10 @@ var vm_info_panel = { "vm_log_tab" : { title: tr("VM log"), content: "" + }, + "vm_history_tab" : { + title: tr("History information"), + content: "", } } @@ -627,11 +631,11 @@ function ip_str(vm){ var ip = '--'; if ($.isArray(nic)) { ip = ''; - $.each(nic, function(index,value){ - ip += value.IP+'
'; - }); + $.each(nic, function(index,value){ + ip += value.IP+'
'; + }); } else if (nic && nic.IP) { - ip = nic.IP; + ip = nic.IP; }; return ip; }; @@ -719,7 +723,69 @@ function updateVMachinesView(request, vmachine_list){ updateView(vmachine_list_array,dataTable_vMachines); updateDashboard("vms",vmachine_list); updateVResDashboard("vms",vmachine_list); -} +}; + +function generateHistoryTable(vm){ + var html = ' \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + '; + + var history = []; + + if ($.isArray(vm.HISTORY_RECORDS.HISTORY)) + history = vm.HISTORY_RECORDS.HISTORY; + else if (vm.HISTORY_RECORDS.HISTORY.SEQ) + history = [vm.HISTORY_RECORDS.HISTORY]; + + var now = Math.round(new Date().getTime() / 1000); + + for (var i=0; i < history.length; i++){ + // :TIME time calculations copied from onevm_helper.rb + var stime = parseInt(history[i].STIME, 10); + + var etime = parseInt(history[i].ETIME, 10) + etime = etime == 0 ? now : etime; + + var dtime = etime - stime; + // end :TIME + + //:PTIME + var stime2 = parseInt(history[i].PSTIME, 10); + var etime2; + var ptime2 = parseInt(history[i].PETIME, 10); + if (stime2 == 0) + etime2 = 0; + else + etime2 = ptime2 == 0 ? now : ptime2; + var dtime2 = etime2 - stime2; + + //end :PTIME + + + html += ' \ + \ + \ + \ + \ + \ + \ + \ + ' + }; + html += '\ +
'+tr("Sequence")+''+tr("Hostname")+''+tr("Reason")+''+tr("State change time")+''+tr("Total time")+''+tr("Prolog time")+'
'+history[i].SEQ+''+history[i].HOSTNAME+''+OpenNebula.Helper.resource_state("VM_MIGRATE_REASON",parseInt(history[i].REASON, 10))+''+pretty_time(history[i].STIME)+''+pretty_time_runtime(dtime)+''+pretty_time_runtime(dtime2)+'
'; + return html; + +}; // Refreshes the information panel for a VM @@ -821,7 +887,7 @@ function updateVMInfo(request,vm){ \ \ ' - } + }; var template_tab = { title: tr("VM Template"), @@ -830,21 +896,27 @@ function updateVMInfo(request,vm){ '+tr("VM template")+''+ prettyPrintJSON(vm_info.TEMPLATE)+ '' - } + }; var log_tab = { title: tr("VM log"), content: '
'+spinner+'
' - } + }; var monitoring_tab = { title: tr("Monitoring information"), content: generateMonitoringDivs(vm_graphs,"vm_monitor_") - } + }; + + var history_tab = { + title: tr("History information"), + content: generateHistoryTable(vm_info), + }; Sunstone.updateInfoPanelTab("vm_info_panel","vm_info_tab",info_tab); Sunstone.updateInfoPanelTab("vm_info_panel","vm_template_tab",template_tab); Sunstone.updateInfoPanelTab("vm_info_panel","vm_log_tab",log_tab); + Sunstone.updateInfoPanelTab("vm_info_panel","vm_history_tab",history_tab); Sunstone.updateInfoPanelTab("vm_info_panel","vm_monitoring_tab",monitoring_tab); //Pop up the info panel and asynchronously get vm_log and stats diff --git a/src/sunstone/public/js/sunstone-util.js b/src/sunstone/public/js/sunstone-util.js index 22064569de..7877635b51 100644 --- a/src/sunstone/public/js/sunstone-util.js +++ b/src/sunstone/public/js/sunstone-util.js @@ -60,6 +60,20 @@ function pretty_time_axis(time){ return hour + ":" + mins + ":" + secs;// + " " + month + "/" + day; } +function pretty_time_runtime(time){ + var d = new Date(); + d.setTime(time*1000); + + var secs = pad(d.getUTCSeconds(),2); + var hour = pad(d.getUTCHours(),2); + var mins = pad(d.getUTCMinutes(),2); + var day = d.getUTCDate()-1; + var month = pad(d.getUTCMonth()+1,2); //getMonths returns 0-11 + var year = d.getUTCFullYear(); + + return day + "d " + hour + ":" + mins;// + ":" + secs;// + " " + month + "/" + day; +} + //returns a human readable size in Kilo, Mega, Giga or Tera bytes function humanize_size(value) { if (typeof(value) === "undefined") {