diff --git a/lib/vmpooler/pool_manager.rb b/lib/vmpooler/pool_manager.rb index ee93fb4..f9ba48b 100644 --- a/lib/vmpooler/pool_manager.rb +++ b/lib/vmpooler/pool_manager.rb @@ -195,9 +195,15 @@ module Vmpooler }) ) + # Choose a clone target + if ($config[:config]['clone_target'] + $clone_target = $vsphere[vm['template']].find_least_used_host($config[:config]['clone_target']) + end + # Put the VM in the specified folder and resource pool relocateSpec = RbVmomi::VIM.VirtualMachineRelocateSpec( :datastore => $vsphere[vm['template']].find_datastore(datastore), + :host => $clone_target, :diskMoveType => :moveChildMostDiskBacking ) diff --git a/lib/vmpooler/vsphere_helper.rb b/lib/vmpooler/vsphere_helper.rb index 402530b..c9edb67 100644 --- a/lib/vmpooler/vsphere_helper.rb +++ b/lib/vmpooler/vsphere_helper.rb @@ -51,6 +51,30 @@ module Vmpooler + def find_least_used_host cluster + begin + @connection.serviceInstance.CurrentTime + rescue + initialize() + end + + hosts = Hash.new + hosts_sort = Hash.new + + datacenter = @connection.serviceInstance.find_datacenter + datacenter.hostFolder.children.each do |folder| + next unless folder.name == cluster + folder.host.each do |host| + hosts[host.name] = host + hosts_sort[host.name] = host.vm.length + end + end + + hosts[hosts_sort.sort_by { |k,v| v }[0][0]] + end + + + def find_pool poolname begin @connection.serviceInstance.CurrentTime diff --git a/vmpooler.yaml.example b/vmpooler.yaml.example index 0e06c08..4e877d2 100644 --- a/vmpooler.yaml.example +++ b/vmpooler.yaml.example @@ -83,6 +83,10 @@ # The path to vmpooler's log file. # (optional; default: '/var/log/vmpooler.log') # +# - clone_target +# The target cluster VMs are cloned into (host with least VMs chosen) +# (optional; default: same cluster/host as origin template) +# # - task_limit # The number of concurrent VMware vSphere tasks to perform. # (optional; default: '10')