Refactor the get_cluster_host_utilization method

The same method logic was being used in two places but only one was calling the method
get_cluster_host_utilization, so this refactors it to use the method for both.
The method could also return an empty array and the subsequent line would try
to .sort[0][1] which would return undefined method [] for nil:NilClass in that
case. The return value is now checked and an exception raised
This commit is contained in:
Samuel Beaulieu 2017-06-07 17:04:21 +01:00
parent 1fcb19bd7b
commit 26d6cb28d9

View file

@ -513,6 +513,11 @@ module Vmpooler
# Params: # Params:
# +model+:: CPU arch version to match on # +model+:: CPU arch version to match on
# +limit+:: Hard limit for CPU or memory utilization beyond which a host is excluded for deployments # +limit+:: Hard limit for CPU or memory utilization beyond which a host is excluded for deployments
# returns nil if one on these conditions is true:
# the model param is defined and cannot be found
# the host is in maintenance mode
# the host status is not 'green'
# the cpu or memory utilization is bigger than the limit param
def get_host_utilization(host, model = nil, limit = 90) def get_host_utilization(host, model = nil, limit = 90)
if model if model
return nil unless host_has_cpu_model?(host, model) return nil unless host_has_cpu_model?(host, model)
@ -555,6 +560,7 @@ module Vmpooler
def find_least_used_host(cluster, connection) def find_least_used_host(cluster, connection)
cluster_object = find_cluster(cluster, connection) cluster_object = find_cluster(cluster, connection)
target_hosts = get_cluster_host_utilization(cluster_object) target_hosts = get_cluster_host_utilization(cluster_object)
raise("There is no host candidate in vcenter that meets all the required conditions, check that the cluster has available hosts in a 'green' status, not in maintenance mode and not overloaded CPU and memory'") if target_hosts.empty?
least_used_host = target_hosts.sort[0][1] least_used_host = target_hosts.sort[0][1]
least_used_host least_used_host
end end
@ -564,10 +570,10 @@ module Vmpooler
datacenter.hostFolder.children.find { |cluster_object| cluster_object.name == cluster } datacenter.hostFolder.children.find { |cluster_object| cluster_object.name == cluster }
end end
def get_cluster_host_utilization(cluster) def get_cluster_host_utilization(cluster, model=nil)
cluster_hosts = [] cluster_hosts = []
cluster.host.each do |host| cluster.host.each do |host|
host_usage = get_host_utilization(host) host_usage = get_host_utilization(host, model)
cluster_hosts << host_usage if host_usage cluster_hosts << host_usage if host_usage
end end
cluster_hosts cluster_hosts
@ -577,11 +583,8 @@ module Vmpooler
source_host = vm.summary.runtime.host source_host = vm.summary.runtime.host
model = get_host_cpu_arch_version(source_host) model = get_host_cpu_arch_version(source_host)
cluster = source_host.parent cluster = source_host.parent
target_hosts = [] target_hosts = get_cluster_host_utilization(cluster, model)
cluster.host.each do |host| raise("There is no host candidate in vcenter that meets all the required conditions, check that the cluster has available hosts in a 'green' status, not in maintenance mode and not overloaded CPU and memory'") if target_hosts.empty?
host_usage = get_host_utilization(host, model)
target_hosts << host_usage if host_usage
end
target_host = target_hosts.sort[0][1] target_host = target_hosts.sort[0][1]
[target_host, target_host.name] [target_host, target_host.name]
end end