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