mirror of
https://github.com/fog/fog.git
synced 2022-11-09 13:51:43 -05:00
75 lines
2.7 KiB
Ruby
75 lines
2.7 KiB
Ruby
module Fog
|
|
module Compute
|
|
class Vsphere
|
|
class Real
|
|
def get_folder(path, datacenter_name, type = nil)
|
|
type ||= 'vm'
|
|
|
|
# Cycle through all types of folders.
|
|
case type
|
|
when 'vm', :vm
|
|
# if you're a vm then grab the VM.
|
|
folder = get_raw_vmfolder(path, datacenter_name)
|
|
raise(Fog::Compute::Vsphere::NotFound) unless folder
|
|
folder_attributes(folder, datacenter_name)
|
|
when 'network', :network
|
|
raise "not implemented"
|
|
when 'datastore', :datastore
|
|
raise "not implemented"
|
|
else
|
|
raise ArgumentError, "#{type} is unknown"
|
|
end
|
|
end
|
|
|
|
protected
|
|
|
|
def get_raw_vmfolder(path, datacenter_name)
|
|
# The required path syntax - 'topfolder/subfolder
|
|
|
|
# Clean up path to be relative since we're providing datacenter name
|
|
dc = find_raw_datacenter(datacenter_name)
|
|
dc_root_folder = dc.vmFolder
|
|
# Filter the root path for this datacenter not to be used."
|
|
dc_root_folder_path=dc_root_folder.path.map { | id, name | name }.join("/")
|
|
paths = path.sub(/^\/?#{Regexp.quote(dc_root_folder_path)}\/?/, '').split('/')
|
|
|
|
return dc_root_folder if paths.empty?
|
|
# Walk the tree resetting the folder pointer as we go
|
|
paths.inject(dc_root_folder) do |last_returned_folder, sub_folder|
|
|
# JJM VIM::Folder#find appears to be quite efficient as it uses the
|
|
# searchIndex It certainly appears to be faster than
|
|
# VIM::Folder#inventory since that returns _all_ managed objects of
|
|
# a certain type _and_ their properties.
|
|
sub = last_returned_folder.find(sub_folder, RbVmomi::VIM::Folder)
|
|
raise ArgumentError, "Could not descend into #{sub_folder}. Please check your path. #{path}" unless sub
|
|
sub
|
|
end
|
|
end
|
|
|
|
def folder_attributes(folder, datacenter_name)
|
|
{
|
|
:id => managed_obj_id(folder),
|
|
:name => folder.name,
|
|
:parent => folder.parent.name,
|
|
:datacenter => datacenter_name,
|
|
:type => folder_type(folder),
|
|
:path => "/"+folder.path.map(&:last).join('/'),
|
|
}
|
|
end
|
|
|
|
def folder_type(folder)
|
|
types = folder.childType
|
|
return :vm if types.include?('VirtualMachine')
|
|
return :network if types.include?('Network')
|
|
return :datastore if types.include?('Datastore')
|
|
end
|
|
end
|
|
|
|
class Mock
|
|
def get_folder(path, filters = { })
|
|
end
|
|
end
|
|
|
|
end
|
|
end
|
|
end
|