diff --git a/src/flow/lib/ServiceAutoScaler.rb b/src/flow/lib/ServiceAutoScaler.rb index b3c04d0c0f..60c67e0b08 100644 --- a/src/flow/lib/ServiceAutoScaler.rb +++ b/src/flow/lib/ServiceAutoScaler.rb @@ -36,7 +36,15 @@ class ServiceAutoScaler def start loop do @srv_pool.info + vm_pool = VirtualMachinePool.new(client) + + # -2 to get all resources, 0 just to get last record + monitoring = vm_pool.monitoring_xml(-2, 0) + monitoring = XMLElement.new(XMLElement.build_xml(monitoring, + 'MONITORING_DATA')) + monitoring = monitoring.to_hash['MONITORING_DATA']['MONITORING'] + vm_pool.info_all_extended @srv_pool.each do |service| @@ -49,7 +57,7 @@ class ServiceAutoScaler 'Checking policies for ' \ "service: #{service.id}" - apply_scaling_policies(service, vm_pool) + apply_scaling_policies(service, vm_pool, monitoring) end sleep(@interval) @@ -67,10 +75,13 @@ class ServiceAutoScaler # If a role needs to scale, its cardinality is updated, and its state is set # to SCALING. Only one role is set to scale. # - # @param [OpenNebula::Service] service - def apply_scaling_policies(service, vm_pool) + # @param service [OpenNebula::Service] + # @param vm_pool [OpenNebula::VirtualMachinePool] VM pool + # @param monitoring [Hash] Monitoring data + def apply_scaling_policies(service, vm_pool, monitoring) service.roles.each do |name, role| - diff, cooldown_duration = role.scale?(vm_pool) + diff, cooldown_duration = role.scale?({ :vm_pool => vm_pool, + :monitoring => monitoring }) policies = {} policies['elasticity_policies'] = role.elasticity_policies diff --git a/src/flow/lib/models/role.rb b/src/flow/lib/models/role.rb index 0b4a2fcd8e..4ecc17b82b 100644 --- a/src/flow/lib/models/role.rb +++ b/src/flow/lib/models/role.rb @@ -244,6 +244,9 @@ module OpenNebula def info_nodes(vm_pool) ret = [] + monitoring = vm_pool[:monitoring] + vm_pool = vm_pool[:vm_pool] + @body['nodes'].each do |node| id = node['deploy_id'] vm = vm_pool.retrieve_xmlelements("/VM_POOL/VM[ID=#{id}]")[0] @@ -255,7 +258,12 @@ module OpenNebula else obj = {} obj['deploy_id'] = node['deploy_id'] - obj['vm_info'] = vm.to_hash + + hash = vm.to_hash + vm_monit = monitoring.select {|v| v['ID'].to_i == id }[0] + + hash['VM']['MONITORING'] = vm_monit if vm_monit + obj['vm_info'] = hash ret << obj end