Class: VsphereHelper

Inherits:
Object
  • Object
show all
Defined in:
lib/vmreverter/hypervisor/vsphere_helper.rb

Overview

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

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(vInfo, logger) ⇒ VsphereHelper

Returns a new instance of VsphereHelper.



29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# 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

Class Method Details

.load_config(authfile) ⇒ Object

Class methods



7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 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

Instance Method Details

#close_connectionObject



178
179
180
# File 'lib/vmreverter/hypervisor/vsphere_helper.rb', line 178

def close_connection
  @connection.close
end

#find_customization(name) ⇒ Object



64
65
66
67
68
69
70
71
72
73
74
# 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) ⇒ Object



127
128
129
130
# 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) ⇒ Object



132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
# 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) ⇒ Object



148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
# 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) ⇒ Object

Instance Methods



48
49
50
# 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) ⇒ Object

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>



80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
# 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) ⇒ Object



169
170
171
172
173
174
175
176
# 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) ⇒ Object



52
53
54
55
56
57
58
59
60
61
62
# 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