class VsphereHelper

Apache Licensed - (github/puppetlabs) ripped from puppet_acceptance. ** See Legal notes Changes include namespace swaps, and refactoring

Public Class Methods

load_config(authfile) click to toggle source

Class methods

# File lib/vmreverter/hypervisor/vsphere_helper.rb, line 7
def self.load_config authfile
  vsphere_credentials = {}

  if File.exists?(authfile)
    vInfo = YAML.load_file(authfile)
  elsif File.exists?( File.join(ENV['HOME'], '.fog') )
    vInfo = YAML.load_file( File.join(ENV['HOME'], '.fog') )
  else
    report_and_raise(@logger, RuntimeError.new("Couldn't authentication for vSphere in auth file !"), "VSphereHelper::load_config")
  end

  begin
    vsphere_credentials[:server] = vInfo[:default][:vsphere_server]
    vsphere_credentials[:user]   = vInfo[:default][:vsphere_username]
    vsphere_credentials[:pass]   = vInfo[:default][:vsphere_password]
  rescue
    report_and_raise(@logger, RuntimeError.new("Couldn't load authentication for vSphere in auth file !"), "VSphereHelper::load_config")
  end

  return vsphere_credentials
end
new(vInfo, logger) click to toggle source
# File lib/vmreverter/hypervisor/vsphere_helper.rb, line 29
def initialize(vInfo, logger)

  @logger = logger
  begin
    require 'rbvmomi'
  rescue LoadError
    raise "Unable to load RbVmomi, please ensure its installed"
  end

  # If you don’t have trusted SSL certificates installed on the host you’re connecting to,
  #you’ll get an +OpenSSL::SSL::SSLError+ “certificate verify failed”.
  #You can work around this by using the :insecure option to +RbVmomi::VIM.connect+.

  @connection = RbVmomi::VIM.connect :host     => vInfo[:server],
                                     :user     => vInfo[:user],
                                     :password => vInfo[:pass],
                                     :insecure => true
end

Public Instance Methods

close_connection() click to toggle source
# File lib/vmreverter/hypervisor/vsphere_helper.rb, line 178
def close_connection
  @connection.close
end
find_customization(name) click to toggle source
# File lib/vmreverter/hypervisor/vsphere_helper.rb, line 64
def find_customization name
  csm = @connection.serviceContent.customizationSpecManager

  begin
    customizationSpec = csm.GetCustomizationSpec({:name => name}).spec
  rescue
    customizationSpec = nil
  end

  return customizationSpec
end
find_datastore(datastorename) click to toggle source
# File lib/vmreverter/hypervisor/vsphere_helper.rb, line 127
def find_datastore datastorename
  datacenter = @connection.serviceInstance.find_datacenter
  datacenter.find_datastore(datastorename)
end
find_folder(foldername) click to toggle source
# File lib/vmreverter/hypervisor/vsphere_helper.rb, line 132
def find_folder foldername
  datacenter = @connection.serviceInstance.find_datacenter
  base = datacenter.vmFolder
  folders = foldername.split('/')
  folders.each do |folder|
    case base
      when RbVmomi::VIM::Folder
        base = base.childEntity.find { |f| f.name == folder }
      else
        abort "Unexpected object type encountered (#{base.class}) while finding folder"
    end
  end

  base
end
find_pool(poolname) click to toggle source
# File lib/vmreverter/hypervisor/vsphere_helper.rb, line 148
def find_pool poolname
  datacenter = @connection.serviceInstance.find_datacenter
  base = datacenter.hostFolder
  pools = poolname.split('/')
  pools.each do |pool|
    case base
      when RbVmomi::VIM::Folder
        base = base.childEntity.find { |f| f.name == pool }
      when RbVmomi::VIM::ClusterComputeResource
        base = base.resourcePool.resourcePool.find { |f| f.name == pool }
      when RbVmomi::VIM::ResourcePool
        base = base.resourcePool.find { |f| f.name == pool }
      else
        abort "Unexpected object type encountered (#{base.class}) while finding resource pool"
    end
  end

  base = base.resourcePool unless base.is_a?(RbVmomi::VIM::ResourcePool) and base.respond_to?(:resourcePool)
  base
end
find_snapshot(vm, snapname) click to toggle source

Instance Methods

# File lib/vmreverter/hypervisor/vsphere_helper.rb, line 48
def find_snapshot vm, snapname
  search_child_snaps vm.snapshot.rootSnapshotList, snapname
end
find_vms(names, connection = @connection) click to toggle source

an easier wrapper around the horrid PropertyCollector interface, necessary for searching VMs in all Datacenters that may be nested within folders of arbitrary depth returns a hash array of <name> => <VirtualMachine ManagedObjects>

# File lib/vmreverter/hypervisor/vsphere_helper.rb, line 80
def find_vms names, connection = @connection
  names = names.is_a?(Array) ? names : [ names ]
  containerView = get_base_vm_container_from connection
  propertyCollector = connection.propertyCollector

  objectSet = [{
    :obj => containerView,
    :skip => true,
    :selectSet => [ RbVmomi::VIM::TraversalSpec.new({
        :name => 'gettingTheVMs',
        :path => 'view',
        :skip => false,
        :type => 'ContainerView'
    }) ]
  }]

  propSet = [{
    :pathSet => [ 'name' ],
    :type => 'VirtualMachine'
  }]

  results = propertyCollector.RetrievePropertiesEx({
    :specSet => [{
      :objectSet => objectSet,
      :propSet   => propSet
    }],
    :options => { :maxObjects => nil }
  })

  vms = {}
  results.objects.each do |result|
    name = result.propSet.first.val
    next unless names.include? name
    vms[name] = result.obj
  end

  while results.token do
    results = propertyCollector.ContinueRetrievePropertiesEx({:token => results.token})
    results.objects.each do |result|
      name = result.propSet.first.val
      next unless names.include? name
      vms[name] = result.obj
    end
  end
  vms
end
get_base_vm_container_from(connection) click to toggle source
# File lib/vmreverter/hypervisor/vsphere_helper.rb, line 169
def get_base_vm_container_from connection
  viewManager = connection.serviceContent.viewManager
  viewManager.CreateContainerView({
    :container => connection.serviceContent.rootFolder,
    :recursive => true,
    :type      => [ 'VirtualMachine' ]
  })
end
search_child_snaps(tree, snapname) click to toggle source
# File lib/vmreverter/hypervisor/vsphere_helper.rb, line 52
def search_child_snaps tree, snapname
  snapshot = nil
  tree.each do |child|
    if child.name == snapname
      snapshot ||= child.snapshot
    else
      snapshot ||= search_child_snaps child.childSnapshotList, snapname
    end
  end
  snapshot
end