class RbVmomi::VIM::Folder # Retrieve a child entity # @param name [String] Name of the child. # @param type [Class] Return nil unless the found entity is_a? type. # @return [VIM::ManagedEntity] def find name, type=Object x = @soap.searchIndex.FindChild(:entity => self, :name => name) x if x.is_a? type end # Retrieve a virtual machine or host by DNS name # @param name [String] The fully qualified domain name to find. # @param type [Class] Return nil unless the found entity is_a? type. # @param dc [RbVmomi::VIM::Datacenter] Restricts the query to entities in the given Datacenter. # @return [VIM::ManagedEntity] def findByDnsName name, type=RbVmomi::VIM::VirtualMachine, dc=nil propSpecs = { :entity => self, :dnsName => name, :vmSearch => type == RbVmomi::VIM::VirtualMachine } propSpecs[:datacenter] = dc if dc x = @soap.searchIndex.FindByDnsName(propSpecs) x if x.is_a? type end # Retrieve a virtual machine or host by IP address # @param ip [String] The IP address is in dot-decimal notation. # @param type [Class] Return nil unless the found entity is_a? type. # @param dc [RbVmomi::VIM::Datacenter] Restricts the query to entities in the given Datacenter. # @return [VIM::ManagedEntity] def findByIp ip, type=RbVmomi::VIM::VirtualMachine, dc=nil propSpecs = { :entity => self, :ip => ip, :vmSearch => type == RbVmomi::VIM::VirtualMachine } propSpecs[:datacenter] = dc if dc x = @soap.searchIndex.FindByIp(propSpecs) x if x.is_a? type end # Retrieve a virtual machine or host by BIOS UUID. # @param uuid [String] The UUID to find. # @param type [Class] Return nil unless the found entity is_a? type. # @param dc [RbVmomi::VIM::Datacenter] Restricts the query to entities in the given Datacenter. # @return [VIM::ManagedEntity] def findByUuid uuid, type=RbVmomi::VIM::VirtualMachine, dc=nil propSpecs = { :entity => self, :uuid => uuid, :instanceUuid => false, :vmSearch => type == RbVmomi::VIM::VirtualMachine } propSpecs[:datacenter] = dc if dc x = @soap.searchIndex.FindByUuid(propSpecs) x if x.is_a? type end # Alias to traverse path, type, true # @see #traverse def traverse! path, type=Object traverse path, type, true end # Retrieve a descendant of this Folder. # @param path [String] Path delimited by '/', or an array of path elements. # @param type (see Folder#find) # @param create [Boolean] If set, create folders that don't exist. # @return (see Folder#find) # @todo Move +create+ functionality into another method. def traverse path, type=Object, create=false if path.is_a? String es = path.split('/').reject(&:empty?) elsif path.is_a? Enumerable es = path else fail "unexpected path class" end return self if es.empty? final = es.pop p = es.inject(self) do |f,e| f.find(e, RbVmomi::VIM::Folder) || (create && f.CreateFolder(:name => e)) || return end if x = p.find(final, type) x elsif create and type == RbVmomi::VIM::Folder p.CreateFolder(:name => final) else nil end end # Alias to +childEntity+. def children childEntity end # Efficiently retrieve properties from descendants of this folder. # # @param propSpecs [Hash] Specification of which properties to retrieve from # which entities. Keys may be symbols, strings, or # classes identifying ManagedEntity subtypes to be # included in the results. Values are an array of # property paths (strings) or the symbol :all. # # @return [Hash] Tree of inventory items. Folders are hashes from child name # to child result. Objects are hashes from property path to # value. # # @todo Return ObjectContent instead of the leaf hash. def inventory propSpecs={} propSet = [{ :type => 'Folder', :pathSet => ['name', 'parent'] }] propSpecs.each do |k,v| case k when RbVmomi::VIM::ManagedEntity k = k.wsdl_name when Symbol, String k = k.to_s else fail "key must be a ManagedEntity" end h = { :type => k } if v == :all h[:all] = true elsif v.is_a? Array h[:pathSet] = v + %w(parent) else fail "value must be an array of property paths or :all" end propSet << h end filterSpec = RbVmomi::VIM.PropertyFilterSpec( :objectSet => [ :obj => self, :selectSet => [ RbVmomi::VIM.TraversalSpec( :name => 'tsFolder', :type => 'Folder', :path => 'childEntity', :skip => false, :selectSet => [ RbVmomi::VIM.SelectionSpec(:name => 'tsFolder') ] ) ] ], :propSet => propSet ) result = @soap.propertyCollector.RetrieveProperties(:specSet => [filterSpec]) tree = { self => {} } result.each do |x| obj = x.obj next if obj == self h = Hash[x.propSet.map { |y| [y.name, y.val] }] tree[h['parent']][h['name']] = [obj, h] tree[obj] = {} if obj.is_a? RbVmomi::VIM::Folder end tree end end