mirror of
https://github.com/puppetlabs/vmpooler.git
synced 2026-01-26 01:58:41 -05:00
Merge pull request #268 from mattkirby/reduce_object_lookups
Reduce object lookups for finding folders
This commit is contained in:
commit
a72012b754
2 changed files with 69 additions and 176 deletions
|
|
@ -46,8 +46,7 @@ module Vmpooler
|
|||
vms = []
|
||||
@connection_pool.with_metrics do |pool_object|
|
||||
connection = ensured_vsphere_connection(pool_object)
|
||||
foldername = pool_config(pool_name)['folder']
|
||||
folder_object = find_folder(foldername, connection, get_target_datacenter_from_config(pool_name))
|
||||
folder_object = find_vm_folder(pool_name, connection)
|
||||
|
||||
return vms if folder_object.nil?
|
||||
|
||||
|
|
@ -168,18 +167,7 @@ module Vmpooler
|
|||
vm_object = find_vm(pool_name, vm_name, connection)
|
||||
return vm_hash if vm_object.nil?
|
||||
|
||||
vm_folder_path = get_vm_folder_path(vm_object)
|
||||
# Find the pool name based on the folder path
|
||||
pool_name = nil
|
||||
template_name = nil
|
||||
global_config[:pools].each do |pool|
|
||||
if pool['folder'] == vm_folder_path
|
||||
pool_name = pool['name']
|
||||
template_name = pool['template']
|
||||
end
|
||||
end
|
||||
|
||||
vm_hash = generate_vm_hash(vm_object, template_name, pool_name)
|
||||
vm_hash = generate_vm_hash(vm_object, pool_name)
|
||||
end
|
||||
vm_hash
|
||||
end
|
||||
|
|
@ -243,7 +231,7 @@ module Vmpooler
|
|||
)
|
||||
|
||||
begin
|
||||
vm_target_folder = find_folder(target_folder_path, connection, target_datacenter_name)
|
||||
vm_target_folder = find_vm_folder(pool_name, connection)
|
||||
if vm_target_folder.nil? and @config[:config].key?('create_folders') and @config[:config]['create_folders'] == true
|
||||
vm_target_folder = create_folder(connection, target_folder_path, target_datacenter_name)
|
||||
end
|
||||
|
|
@ -262,7 +250,7 @@ module Vmpooler
|
|||
spec: clone_spec
|
||||
).wait_for_completion
|
||||
|
||||
vm_hash = generate_vm_hash(new_vm_object, template_path, pool_name)
|
||||
vm_hash = generate_vm_hash(new_vm_object, pool_name)
|
||||
end
|
||||
vm_hash
|
||||
end
|
||||
|
|
@ -365,15 +353,24 @@ module Vmpooler
|
|||
nil
|
||||
end
|
||||
|
||||
def generate_vm_hash(vm_object, template_name, pool_name)
|
||||
hash = { 'name' => nil, 'hostname' => nil, 'template' => nil, 'poolname' => nil, 'boottime' => nil, 'powerstate' => nil }
|
||||
# Return a hash of VM data
|
||||
# Provides vmname, hostname, template, poolname, boottime and powerstate information
|
||||
def generate_vm_hash(vm_object, pool_name)
|
||||
pool_configuration = pool_config(pool_name)
|
||||
return nil if pool_configuration.nil?
|
||||
|
||||
hash['name'] = vm_object.name
|
||||
hash['hostname'] = vm_object.summary.guest.hostName if vm_object.summary && vm_object.summary.guest && vm_object.summary.guest.hostName
|
||||
hash['template'] = template_name
|
||||
hash['poolname'] = pool_name
|
||||
hash['boottime'] = vm_object.runtime.bootTime if vm_object.runtime && vm_object.runtime.bootTime
|
||||
hash['powerstate'] = vm_object.runtime.powerState if vm_object.runtime && vm_object.runtime.powerState
|
||||
hostname = vm_object.summary.guest.hostName if vm_object.summary && vm_object.summary.guest && vm_object.summary.guest.hostName
|
||||
boottime = vm_object.runtime.bootTime if vm_object.runtime && vm_object.runtime.bootTime
|
||||
powerstate = vm_object.runtime.powerState if vm_object.runtime && vm_object.runtime.powerState
|
||||
|
||||
hash = {
|
||||
'name' => vm_object.name,
|
||||
'hostname' => hostname,
|
||||
'template' => pool_configuration['template'],
|
||||
'poolname' => pool_name,
|
||||
'boottime' => boottime,
|
||||
'powerstate' => powerstate,
|
||||
}
|
||||
|
||||
hash
|
||||
end
|
||||
|
|
@ -580,24 +577,28 @@ module Vmpooler
|
|||
available_unit_numbers.sort[0]
|
||||
end
|
||||
|
||||
# Finds the first reference to and returns the folder object for a foldername and an optional datacenter
|
||||
# Finds a folder object by inventory path
|
||||
# Params:
|
||||
# +foldername+:: the folder to find (optionally with / in which case the foldername will be split and each element searched for)
|
||||
# +pool_name+:: the pool to find the folder for
|
||||
# +connection+:: the vsphere connection object
|
||||
# +datacentername+:: the datacenter where the folder resides, or nil to return the first datacenter found
|
||||
# returns a ManagedObjectReference for the first folder found or nil if none found
|
||||
def find_folder(foldername, connection, datacentername)
|
||||
datacenter = connection.serviceInstance.find_datacenter(datacentername)
|
||||
raise("Datacenter #{datacentername} does not exist") if datacenter.nil?
|
||||
base = datacenter.vmFolder
|
||||
# returns a ManagedObjectReference for the folder found or nil if not found
|
||||
def find_vm_folder(pool_name, connection)
|
||||
# Find a folder by its inventory path and return the object
|
||||
# Returns nil when the object found is not a folder
|
||||
pool_configuration = pool_config(pool_name)
|
||||
return nil if pool_configuration.nil?
|
||||
folder = pool_configuration['folder']
|
||||
datacenter = get_target_datacenter_from_config(pool_name)
|
||||
return nil if datacenter.nil?
|
||||
|
||||
folders = foldername.split('/')
|
||||
folders.each do |folder|
|
||||
raise("Unexpected object type encountered (#{base.class}) while finding folder") unless base.is_a? RbVmomi::VIM::Folder
|
||||
base = base.childEntity.find { |f| f.name == folder }
|
||||
end
|
||||
propSpecs = {
|
||||
:entity => self,
|
||||
:inventoryPath => "#{datacenter}/vm/#{folder}"
|
||||
}
|
||||
|
||||
base
|
||||
folder_object = connection.searchIndex.FindByInventoryPath(propSpecs)
|
||||
return nil unless folder_object.class == RbVmomi::VIM::Folder
|
||||
folder_object
|
||||
end
|
||||
|
||||
# Returns an array containing cumulative CPU and memory utilization of a host, and its object reference
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue