diff --git a/src/oca/ruby/opennebula/pool.rb b/src/oca/ruby/opennebula/pool.rb index 807d3eacd6..e5193f25c5 100644 --- a/src/oca/ruby/opennebula/pool.rb +++ b/src/oca/ruby/opennebula/pool.rb @@ -127,6 +127,19 @@ module OpenNebula return hash end + def monitoring_last(xml_method, *args) + rc = @client.call(xml_method, *args) + + if OpenNebula.is_error?(rc) + return rc + end + + xmldoc = XMLElement.new + xmldoc.initialize_xml(rc, 'MONITORING_DATA') + + xmldoc.to_hash + end + private # Calls to the corresponding info method to retreive the pool # representation in XML format diff --git a/src/oca/ruby/opennebula/virtual_machine_pool.rb b/src/oca/ruby/opennebula/virtual_machine_pool.rb index cf52744dc5..3c75315fa2 100644 --- a/src/oca/ruby/opennebula/virtual_machine_pool.rb +++ b/src/oca/ruby/opennebula/virtual_machine_pool.rb @@ -202,6 +202,10 @@ module OpenNebula return super(VM_POOL_METHODS[:monitoring], xpaths, filter_flag) end + def monitoring_last(filter_flag=INFO_ALL) + return super(VM_POOL_METHODS[:monitoring], filter_flag, 0) + end + # Retrieves the monitoring data for all the VMs in the pool, in XML # # @param [Integer] filter_flag Optional filter flag to retrieve all or diff --git a/src/sunstone/models/SunstoneServer.rb b/src/sunstone/models/SunstoneServer.rb index bae0f2bc95..94d78e07fb 100644 --- a/src/sunstone/models/SunstoneServer.rb +++ b/src/sunstone/models/SunstoneServer.rb @@ -309,7 +309,7 @@ class SunstoneServer < CloudServer ######################################################################## # Accounting & Monitoring ######################################################################## - def get_pool_monitoring(resource, meters) + def get_pool_monitoring(resource) #pool_element pool = case resource when "vm", "VM" @@ -321,9 +321,7 @@ class SunstoneServer < CloudServer return [200, error.to_json] end - meters_a = meters.split(',') - - rc = pool.monitoring(meters_a) + rc = pool.monitoring_last if OpenNebula.is_error?(rc) error = Error.new(rc.message) diff --git a/src/sunstone/public/app/opennebula/action.js b/src/sunstone/public/app/opennebula/action.js index 06d1b79359..0a5aa7483c 100644 --- a/src/sunstone/public/app/opennebula/action.js +++ b/src/sunstone/public/app/opennebula/action.js @@ -164,7 +164,7 @@ define(function(require) { }); } }, - "list": function(params, resource, path, process) { + "list": function(params, resource, path, process, extra_params = {}, async = true) { var callback = params.success; var callbackError = params.error; var timeout = params.timeout || false; @@ -182,14 +182,12 @@ define(function(require) { _clearCache(cache_name); } - if (!force && - listCache[cache_name] && - listCache[cache_name]["timestamp"] + CACHE_EXPIRE > new Date().getTime()) { - - //console.log(cache_name+" list. Cache used"); - - return callback ? - callback(request, listCache[cache_name]["data"]) : null; + if ( + !force && + listCache[cache_name] && + listCache[cache_name]["timestamp"] + CACHE_EXPIRE > new Date().getTime() + ) { + return callback ? callback(request, listCache[cache_name]["data"]) : null; } // TODO: Because callbacks are queued, we may need to force a @@ -204,19 +202,20 @@ define(function(require) { error : callbackError }); - //console.log(cache_name+" list. Callback queued"); - if (listWaiting[cache_name]) { return; } listWaiting[cache_name] = true; var pool_filter = Config.isChangedFilter()?-4:-2; - //console.log(cache_name+" list. NO cache, calling ajax"); + + let data = $.extend(extra_params, { timeout: timeout, pool_filter: pool_filter }) + $.ajax({ url: reqPath, type: "GET", - data: {timeout: timeout, pool_filter: pool_filter}, + data: data, + async: async, dataType: "json", success: function(response) { var list; diff --git a/src/sunstone/public/app/opennebula/vm.js b/src/sunstone/public/app/opennebula/vm.js index f191fa0371..c63744127b 100644 --- a/src/sunstone/public/app/opennebula/vm.js +++ b/src/sunstone/public/app/opennebula/vm.js @@ -24,6 +24,7 @@ define(function(require) { Navigation = require("utils/navigation"); var RESOURCE = "VM"; + var VM_MONITORING_CACHE_NAME = 'VM.MONITORING'; var STATES_STR = [ "INIT", @@ -541,7 +542,19 @@ define(function(require) { OpenNebulaAction.monitor(params, RESOURCE, false); }, "pool_monitor" : function(params) { - OpenNebulaAction.monitor(params, RESOURCE, true); + if (!Config.isExtendedVmMonitoring) return; + + let process = function(response) { + let monitoringPool = response && response["MONITORING_DATA"] && response["MONITORING_DATA"]["MONITORING"]; + + return Array.isArray(monitoringPool) + ? monitoringPool.reduce(function(result, monitoringVM) { + return $.extend(result, { [monitoringVM.ID]: monitoringVM }) + }, {}) + : {} + } + + OpenNebulaAction.list(params, VM_MONITORING_CACHE_NAME, 'vm/monitor', process, undefined, false); }, "resize" : function(params) { var action_obj = params.data.extra_param; @@ -691,6 +704,25 @@ define(function(require) { } }; + function _getMonitoringPool() { + var monitoring = undefined; + var cache = OpenNebulaAction.cache(VM_MONITORING_CACHE_NAME); + + if (cache && cache.data) { + monitoring = cache.data + } + + if (!monitoring || $.isEmptyObject(monitoring)) { + VM.pool_monitor({ + success: function(response) { + monitoring = response + } + }) + } + + return monitoring || {} + } + function retrieveLastHistoryRecord(element) { if (element.HISTORY_RECORDS && element.HISTORY_RECORDS.HISTORY) { var history = element.HISTORY_RECORDS.HISTORY; @@ -787,6 +819,29 @@ define(function(require) { return nics; } + function getNicsFromMonitoring(element = {}) { + let monitoringPool = _getMonitoringPool() + let monitoringVM = monitoringPool[element.ID] + + if (!monitoringPool || $.isEmptyObject(monitoringPool) || !monitoringVM) return []; + + return EXTERNAL_IP_ATTRS.reduce(function(externalNics, attr) { + let monitoringValues = monitoringVM[attr] + + if (monitoringValues) { + $.each(monitoringValues.split(','), function(_, ip) { + let exists = externalNics.some(function(nic) { return nic.IP === ip }) + + if (!exists) { + externalNics.push({ NIC_ID: '_', IP: ip }); + } + }); + } + + return externalNics; + }, []) + } + // Return the IP or several IPs of a VM function ipsStr(element, options) { options = $.extend({ @@ -797,38 +852,21 @@ define(function(require) { }, options) var nics = getNICs(element); - var monitoring = element && element.MONITORING; - var ips = []; - if (monitoring) { - var externalIP; - $.each(EXTERNAL_IP_ATTRS, function(index, IPAttr) { - externalIP = monitoring[IPAttr]; - if (externalIP) { - var splitArr = externalIP.split(","); - $.each(splitArr, function(i,ip){ - if (ip && ($.inArray(ip, ips) == -1)) { - ips.push(ip); - } - }); - } - }); - } + var nicsFromMonitoring = getNicsFromMonitoring(element) + + nics = nics.concat(nicsFromMonitoring) // infoextended: alias will be group by nic if (Config.isExtendedVmInfo || options.forceGroup) { return options.groupStrFunction(element, nics) } - return (ips.length === 0 && nics && nics.length > 0) ? ( - $.map(nics, function(nic) { - return $.map(NIC_ALIAS_IP_ATTRS, function(attribute) { - return nic[attribute] - }) - }).join(options.divider) - ) : ( - options.defaultValue - ) + return $.map(nics, function(nic) { + return $.map(NIC_ALIAS_IP_ATTRS, function(attribute) { + return nic[attribute] + }) + }).join(options.divider) || options.defaultValue }; // Return a dropdown with all the @@ -859,7 +897,7 @@ define(function(require) { // Format the other IPs inside a dropdown if (ips.length){ - html += "