bosh_vsphere_cpi 1.2690.4.0 → 1.2693.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 891a95afcb3fa6552a51216efc923b9a9bdc3706
4
- data.tar.gz: ab195064157845a46715c6bebce2b5a00aa48fdb
3
+ metadata.gz: 0a37fd96a19b749f7fb7023caeb04e53d9e2fb64
4
+ data.tar.gz: 5d99a25f25a4f27b9dfb893ef273d863733cd525
5
5
  SHA512:
6
- metadata.gz: 38ba8d39aa0dcad873f1f471c67c315905a5332e73c7a35d425dec05e255c3c1e46eafc3d3931949267921cf5db3b1cf7c0cf41a47f0d4712accfef0a0d51c7e
7
- data.tar.gz: f18331b1fe07adab8d9b491e94c99d562a21484f2c749a450bba57f70ce372a3f657c0faa163944b509416a04d61ab951a50b22fd5392f2ff1a5f718097bd13b
6
+ metadata.gz: fe5b85fae3bed0d442b7bbe1f69997b573171afd78ab582d7a5201272ece1a5c80a07ce666c80b53729b672529148faf74d88edaf5573fc886e95f922ce924df
7
+ data.tar.gz: 913bb1de5cabef9f080cfbbb44e6408aec39949561901c88c86ed71eebbd92f953e35b94b7076803862e9381060022ed301cae8800ce12e8f90be2ebe4e9a3d5
@@ -3,9 +3,10 @@ module VSphereCloud
3
3
  include VimSdk
4
4
  include RetryBlock
5
5
 
6
- def initialize(client, file_provider)
6
+ def initialize(client, file_provider, cloud_searcher)
7
7
  @client = client
8
8
  @file_provider = file_provider
9
+ @cloud_searcher = cloud_searcher
9
10
  end
10
11
 
11
12
  def get_current_env(vm, datacenter_name)
@@ -30,7 +31,7 @@ module VSphereCloud
30
31
  @file_provider.upload_file(location[:datacenter], location[:datastore], "#{location[:vm]}/env.json", env_json)
31
32
  @file_provider.upload_file(location[:datacenter], location[:datastore], "#{location[:vm]}/env.iso", generate_env_iso(env_json))
32
33
 
33
- datastore = @client.get_managed_object(Vim::Datastore, name: location[:datastore])
34
+ datastore = @cloud_searcher.get_managed_object(Vim::Datastore, name: location[:datastore])
34
35
  file_name = "[#{location[:datastore]}] #{location[:vm]}/env.iso"
35
36
 
36
37
  update_cdrom_env(vm, datastore, file_name)
@@ -1,41 +1,27 @@
1
1
  require 'ruby_vim_sdk'
2
+ require 'cloud/vsphere/cloud_searcher'
3
+ require 'cloud/vsphere/soap_stub'
2
4
 
3
5
  module VSphereCloud
4
6
 
5
7
  class Client
6
8
  include VimSdk
7
- PC = Vmodl::Query::PropertyCollector
8
-
9
9
  class AlreadyLoggedInException < StandardError; end
10
10
  class NotLoggedInException < StandardError; end
11
11
 
12
- attr_accessor :service_content
13
- attr_accessor :soap_stub
14
- attr_accessor :service_instance
15
-
16
- def initialize(host, options = {})
17
- http_client = HTTPClient.new
18
- soap_log = options['soap_log']
19
- case soap_log
20
- when String
21
- log_file = File.open(soap_log, 'w')
22
- log_file.sync = true
23
- http_client.debug_dev = log_file
24
- when IO, StringIO
25
- http_client.debug_dev = soap_log
26
- end
27
- http_client.send_timeout = 14400
28
- http_client.receive_timeout = 14400
29
- http_client.connect_timeout = 30
30
- http_client.ssl_config.verify_mode = OpenSSL::SSL::VERIFY_NONE
12
+ attr_reader :cloud_searcher, :service_content, :service_instance, :soap_stub
13
+
14
+ def initialize(host, options={})
15
+ @soap_stub = SoapStub.new(host, options[:soap_log]).create
31
16
 
32
- @soap_stub = Soap::StubAdapter.new(host, 'vim.version.version6', http_client)
17
+ @service_instance =Vim::ServiceInstance.new('ServiceInstance', @soap_stub)
18
+ @service_content = @service_instance.content
33
19
 
34
- @service_instance = Vim::ServiceInstance.new('ServiceInstance', soap_stub)
35
- @service_content = service_instance.content
36
20
  @metrics_cache = {}
37
21
  @lock = Mutex.new
38
22
  @logger = Bosh::Clouds::Config.logger
23
+
24
+ @cloud_searcher = CloudSearcher.new(service_content, @logger)
39
25
  end
40
26
 
41
27
  def login(username, password, locale)
@@ -49,94 +35,9 @@ module VSphereCloud
49
35
  @service_content.session_manager.logout
50
36
  end
51
37
 
52
- def get_properties(obj, type, properties, options = {})
53
- properties = [properties] if properties.kind_of?(String)
54
- property_specs = [PC::PropertySpec.new(:type => type, :all => false, :path_set => properties)]
55
-
56
- if obj.is_a?(Vmodl::ManagedObject)
57
- object_spec = PC::ObjectSpec.new(:obj => obj, :skip => false)
58
- else
59
- object_spec = obj.collect { |o| PC::ObjectSpec.new(:obj => o, :skip => false) }
60
- end
61
-
62
- filter_spec = PC::FilterSpec.new(:prop_set => property_specs, :object_set => object_spec)
63
-
64
- attempts = 0
65
- begin
66
- properties_response = get_all_properties(filter_spec)
67
- result = {}
68
-
69
- properties_response.each do |object_content|
70
- object_properties = {:obj => object_content.obj}
71
- if options[:ensure_all]
72
- remaining_properties = Set.new(properties)
73
- else
74
- remaining_properties = Set.new(options[:ensure])
75
- end
76
- if object_content.prop_set
77
- object_content.prop_set.each do |property|
78
- object_properties[property.name] = property.val
79
- remaining_properties.delete(property.name)
80
- end
81
- end
82
- unless remaining_properties.empty?
83
- raise "The object[s] #{obj.pretty_inspect} " +
84
- "should have the following properties: #{properties.pretty_inspect}, " +
85
- "but they were missing these: #{remaining_properties.pretty_inspect}."
86
- end
87
- result[object_content.obj] = object_properties
88
- end
89
-
90
- result = result.values.first if obj.is_a?(Vmodl::ManagedObject)
91
- result
92
- rescue => e
93
- attempts += 1
94
- if attempts < 8
95
- sleep_interval = 2 ** attempts
96
- @logger.warn("Error retrieving properties, retrying in #{sleep_interval} seconds: " +
97
- "#{e} - #{e.backtrace.join("\n")}")
98
- sleep(sleep_interval)
99
- retry
100
- else
101
- raise e
102
- end
103
- end
104
- end
105
-
106
- def get_property(obj, type, property, options = {})
107
- get_properties(obj, type, property, options)[property]
108
- end
109
-
110
- def get_managed_objects(type, options={})
111
- root = options[:root] || @service_content.root_folder
112
- property_specs = [PC::PropertySpec.new(:type => type, :all => false, :path_set => ["name"])]
113
- filter_spec = get_search_filter_spec(root, property_specs)
114
- object_specs = get_all_properties(filter_spec)
115
-
116
- result = []
117
- object_specs.each do |object_spec|
118
- name = object_spec.prop_set.first.val
119
- if options[:name].nil? || name == options[:name]
120
- if options[:include_name]
121
- result << [name , object_spec.obj]
122
- else
123
- result << object_spec.obj
124
- end
125
- end
126
- end
127
- result
128
- end
129
-
130
- def get_managed_object(type, options)
131
- result = get_managed_objects(type, options)
132
- raise "Could not find #{type}: #{options.pretty_inspect}" if result.length == 0
133
- raise "Found more than one #{type}: #{options.pretty_inspect}" if result.length > 1
134
- result.first
135
- end
136
-
137
38
  def find_parent(obj, parent_type)
138
39
  while obj && obj.class != parent_type
139
- obj = get_property(obj, obj.class, "parent", :ensure_all => true)
40
+ obj = @cloud_searcher.get_property(obj, obj.class, "parent", :ensure_all => true)
140
41
  end
141
42
  obj
142
43
  end
@@ -175,7 +76,7 @@ module VSphereCloud
175
76
  end
176
77
 
177
78
  def get_cdrom_device(vm)
178
- devices = get_property(vm, Vim::VirtualMachine, 'config.hardware.device', ensure_all: true)
79
+ devices = @cloud_searcher.get_property(vm, Vim::VirtualMachine, 'config.hardware.device', ensure_all: true)
179
80
  devices.find { |device| device.kind_of?(Vim::Vm::Device::VirtualCdrom) }
180
81
  end
181
82
 
@@ -199,8 +100,10 @@ module VSphereCloud
199
100
  def move_disk(source_datacenter, source_path, dest_datacenter, dest_path)
200
101
  tasks = []
201
102
  [".vmdk", "-flat.vmdk"].each do |extension|
202
- tasks << @service_content.file_manager.move_file("#{source_path}#{extension}", source_datacenter,
203
- "#{dest_path}#{extension}", dest_datacenter, false)
103
+ tasks << @service_content.file_manager.move_file(
104
+ "#{source_path}#{extension}", source_datacenter,
105
+ "#{dest_path}#{extension}", dest_datacenter, false
106
+ )
204
107
  end
205
108
 
206
109
  tasks.each { |task| wait_for_task(task) }
@@ -260,8 +163,12 @@ module VSphereCloud
260
163
  interval = 1.0
261
164
  started = Time.now
262
165
  loop do
263
- properties = get_properties([task], Vim::Task, ["info.progress", "info.state", "info.result", "info.error"],
264
- :ensure => ["info.state"])[task]
166
+ properties = @cloud_searcher.get_properties(
167
+ [task],
168
+ Vim::Task,
169
+ ["info.progress", "info.state", "info.result", "info.error"],
170
+ ensure: ["info.state"]
171
+ )[task]
265
172
 
266
173
  duration = Time.now - started
267
174
  raise "Task taking too long" if duration > 3600 # 1 hour
@@ -291,128 +198,6 @@ module VSphereCloud
291
198
  end
292
199
  end
293
200
 
294
- def get_search_filter_spec(obj, property_specs)
295
- resource_pool_traversal_spec = PC::TraversalSpec.new(
296
- :name => "resourcePoolTraversalSpec",
297
- :type => Vim::ResourcePool,
298
- :path => "resourcePool",
299
- :skip => false,
300
- :select_set => [
301
- PC::SelectionSpec.new(:name => "resourcePoolTraversalSpec"),
302
- PC::SelectionSpec.new(:name => "resourcePoolVmTraversalSpec")
303
- ]
304
- )
305
-
306
- resource_pool_vm_traversal_spec = PC::TraversalSpec.new(
307
- :name => "resourcePoolVmTraversalSpec",
308
- :type => Vim::ResourcePool,
309
- :path => "vm",
310
- :skip => false
311
- )
312
-
313
- compute_resource_rp_traversal_spec = PC::TraversalSpec.new(
314
- :name => "computeResourceRpTraversalSpec",
315
- :type => Vim::ComputeResource,
316
- :path => "resourcePool",
317
- :skip => false,
318
- :select_set => [
319
- PC::SelectionSpec.new(:name => "resourcePoolTraversalSpec"),
320
- PC::SelectionSpec.new(:name => "resourcePoolVmTraversalSpec")
321
- ]
322
- )
323
-
324
- compute_resource_datastore_traversal_spec = PC::TraversalSpec.new(
325
- :name => "computeResourceDatastoreTraversalSpec",
326
- :type => Vim::ComputeResource,
327
- :path => "datastore",
328
- :skip => false
329
- )
330
-
331
- compute_resource_host_traversal_spec = PC::TraversalSpec.new(
332
- :name => "computeResourceHostTraversalSpec",
333
- :type => Vim::ComputeResource,
334
- :path => "host",
335
- :skip => false
336
- )
337
-
338
- datacenter_host_traversal_spec = PC::TraversalSpec.new(
339
- :name => "datacenterHostTraversalSpec",
340
- :type => Vim::Datacenter,
341
- :path => "hostFolder",
342
- :skip => false,
343
- :select_set => [
344
- PC::SelectionSpec.new(:name => "folderTraversalSpec")
345
- ]
346
- )
347
-
348
- datacenter_vm_traversal_spec = PC::TraversalSpec.new(
349
- :name => "datacenterVmTraversalSpec",
350
- :type => Vim::Datacenter,
351
- :path => "vmFolder",
352
- :skip => false,
353
- :select_set => [
354
- PC::SelectionSpec.new(:name => "folderTraversalSpec")
355
- ]
356
- )
357
-
358
- host_vm_traversal_spec = PC::TraversalSpec.new(
359
- :name => "hostVmTraversalSpec",
360
- :type => Vim::HostSystem,
361
- :path => "vm",
362
- :skip => false,
363
- :select_set => [
364
- PC::SelectionSpec.new(:name => "folderTraversalSpec")
365
- ]
366
- )
367
-
368
- folder_traversal_spec = PC::TraversalSpec.new(
369
- :name => "folderTraversalSpec",
370
- :type => Vim::Folder,
371
- :path => "childEntity",
372
- :skip => false,
373
- :select_set => [
374
- PC::SelectionSpec.new(:name => "folderTraversalSpec"),
375
- PC::SelectionSpec.new(:name => "datacenterHostTraversalSpec"),
376
- PC::SelectionSpec.new(:name => "datacenterVmTraversalSpec"),
377
- PC::SelectionSpec.new(:name => "computeResourceRpTraversalSpec"),
378
- PC::SelectionSpec.new(:name => "computeResourceDatastoreTraversalSpec"),
379
- PC::SelectionSpec.new(:name => "computeResourceHostTraversalSpec"),
380
- PC::SelectionSpec.new(:name => "hostVmTraversalSpec"),
381
- PC::SelectionSpec.new(:name => "resourcePoolVmTraversalSpec")
382
- ]
383
- )
384
-
385
- obj_spec = PC::ObjectSpec.new(
386
- :obj => obj,
387
- :skip => false,
388
- :select_set => [
389
- folder_traversal_spec,
390
- datacenter_vm_traversal_spec,
391
- datacenter_host_traversal_spec,
392
- compute_resource_host_traversal_spec,
393
- compute_resource_datastore_traversal_spec,
394
- compute_resource_rp_traversal_spec,
395
- resource_pool_traversal_spec,
396
- host_vm_traversal_spec,
397
- resource_pool_vm_traversal_spec
398
- ]
399
- )
400
-
401
- PC::FilterSpec.new(:prop_set => property_specs, :object_set => [obj_spec])
402
- end
403
-
404
- def get_all_properties(filter_spec)
405
- result = []
406
- retrieve_result = @service_content.property_collector.retrieve_properties_ex([filter_spec],
407
- PC::RetrieveOptions.new)
408
- until retrieve_result.nil?
409
- retrieve_result.objects.each { |object_content| result << object_content }
410
- break if retrieve_result.token.nil?
411
- retrieve_result = @service_content.property_collector.continue_retrieve_properties_ex(retrieve_result.token)
412
- end
413
- result
414
- end
415
-
416
201
  def get_perf_counters(mobs, names, options = {})
417
202
  metrics = find_perf_metric_names(mobs.first, names)
418
203
  metric_ids = metrics.values
@@ -446,6 +231,8 @@ module VSphereCloud
446
231
  result
447
232
  end
448
233
 
234
+ private
235
+
449
236
  def find_perf_metric_names(mob, names)
450
237
  @lock.synchronize do
451
238
  unless @metrics_cache.has_key?(mob.class)
@@ -477,5 +264,4 @@ module VSphereCloud
477
264
  result
478
265
  end
479
266
  end
480
-
481
267
  end
@@ -9,6 +9,7 @@ require 'cloud/vsphere/file_provider'
9
9
  require 'cloud/vsphere/agent_env'
10
10
  require 'cloud/vsphere/lease_obtainer'
11
11
  require 'cloud/vsphere/lease_updater'
12
+ require 'cloud/vsphere/drs_rules/drs_rule_cleaner'
12
13
  require 'cloud/vsphere/resources'
13
14
  require 'cloud/vsphere/resources/cluster'
14
15
  require 'cloud/vsphere/resources/datacenter'
@@ -38,9 +39,11 @@ module VSphereCloud
38
39
 
39
40
  @logger = config.logger
40
41
  @client = config.client
42
+ @cloud_searcher = CloudSearcher.new(@client.service_content, @logger)
43
+
41
44
  @resources = Resources.new(config)
42
45
  @file_provider = FileProvider.new(config.rest_client, config.vcenter_host)
43
- @agent_env = AgentEnv.new(client, @file_provider)
46
+ @agent_env = AgentEnv.new(client, @file_provider, @cloud_searcher)
44
47
 
45
48
  # Global lock
46
49
  @lock = Mutex.new
@@ -76,7 +79,12 @@ module VSphereCloud
76
79
  disk = VSphereCloud::Models::Disk.find(uuid: disk_id)
77
80
 
78
81
  return false unless disk
79
- return false unless disk.path
82
+ # Disk path is only being set when disk is created in vSphere.
83
+ # If the path is not set it means that disk was only created in
84
+ # CPI database and attach disk was not called or failed.
85
+ # We consider that disk is missing only if CPI desired state
86
+ # is to be present but it actually missing in infrastructure.
87
+ return true unless disk.path
80
88
  return false unless disk.datacenter
81
89
 
82
90
  @client.has_disk?(disk.path, disk.datacenter)
@@ -103,7 +111,7 @@ module VSphereCloud
103
111
 
104
112
  import_spec_result = import_ovf(name, ovf_file, cluster.resource_pool.mob, datastore.mob)
105
113
 
106
- lease_obtainer = LeaseObtainer.new(@client, @logger)
114
+ lease_obtainer = LeaseObtainer.new(@cloud_searcher, @logger)
107
115
  nfc_lease = lease_obtainer.obtain(
108
116
  cluster.resource_pool,
109
117
  import_spec_result.import_spec,
@@ -115,7 +123,7 @@ module VSphereCloud
115
123
  result = name
116
124
 
117
125
  @logger.info('Removing NICs')
118
- devices = client.get_property(vm, Vim::VirtualMachine, 'config.hardware.device', ensure_all: true)
126
+ devices = @cloud_searcher.get_property(vm, Vim::VirtualMachine, 'config.hardware.device', ensure_all: true)
119
127
  config = Vim::Vm::ConfigSpec.new
120
128
  config.device_change = []
121
129
 
@@ -142,8 +150,8 @@ module VSphereCloud
142
150
  Bosh::ThreadPool.new(max_threads: 32, logger: @logger).wrap do |pool|
143
151
  @resources.datacenters.each_value do |datacenter|
144
152
  @logger.info("Looking for stemcell replicas in: #{datacenter.name}")
145
- templates = client.get_property(datacenter.template_folder.mob, Vim::Folder, 'childEntity', ensure_all: true)
146
- template_properties = client.get_properties(templates, Vim::VirtualMachine, ['name'])
153
+ templates = @cloud_searcher.get_property(datacenter.template_folder.mob, Vim::Folder, 'childEntity', ensure_all: true)
154
+ template_properties = @cloud_searcher.get_properties(templates, Vim::VirtualMachine, ['name'])
147
155
  template_properties.each_value do |properties|
148
156
  template_name = properties['name'].gsub('%2f', '/')
149
157
  if template_name.split('/').first.strip == stemcell
@@ -186,6 +194,7 @@ module VSphereCloud
186
194
  choose_placer(cloud_properties),
187
195
  cloud_properties,
188
196
  @client,
197
+ @cloud_searcher,
189
198
  @logger,
190
199
  self,
191
200
  @agent_env,
@@ -201,7 +210,7 @@ module VSphereCloud
201
210
  vm = get_vm_by_cid(vm_cid)
202
211
  datacenter = client.find_parent(vm, Vim::Datacenter)
203
212
  properties =
204
- client.get_properties(
213
+ @cloud_searcher.get_properties(
205
214
  vm,
206
215
  Vim::VirtualMachine,
207
216
  ['runtime.powerState', 'runtime.question', 'config.hardware.device', 'name'],
@@ -215,7 +224,7 @@ module VSphereCloud
215
224
  @logger.info("VM is blocked on a question: #{question.text}, " +
216
225
  "providing default answer: #{choices.choice_info[choices.default_index].label}")
217
226
  client.answer_vm(vm, question.id, choices.choice_info[choices.default_index].key)
218
- power_state = client.get_property(vm, Vim::VirtualMachine, 'runtime.powerState')
227
+ power_state = @cloud_searcher.get_property(vm, Vim::VirtualMachine, 'runtime.powerState')
219
228
  else
220
229
  power_state = properties['runtime.powerState']
221
230
  end
@@ -256,6 +265,12 @@ module VSphereCloud
256
265
  end
257
266
  end
258
267
  end
268
+
269
+ DrsRuleCleaner.new(
270
+ @cloud_searcher,
271
+ @client.service_content.custom_fields_manager,
272
+ @logger
273
+ ).clean
259
274
  end
260
275
  end
261
276
 
@@ -263,7 +278,7 @@ module VSphereCloud
263
278
  with_thread_name("reboot_vm(#{vm_cid})") do
264
279
  vm = get_vm_by_cid(vm_cid)
265
280
  datacenter = client.find_parent(vm, Vim::Datacenter)
266
- power_state = client.get_property(vm, Vim::VirtualMachine, 'runtime.powerState')
281
+ power_state = @cloud_searcher.get_property(vm, Vim::VirtualMachine, 'runtime.powerState')
267
282
 
268
283
  @logger.info("Reboot vm = #{vm_cid}")
269
284
  if power_state != Vim::VirtualMachine::PowerState::POWERED_ON
@@ -336,9 +351,9 @@ module VSphereCloud
336
351
 
337
352
  @logger.info("Configuring: #{vm_cid} to use the following network settings: #{networks.pretty_inspect}")
338
353
  vm = get_vm_by_cid(vm_cid)
339
- devices = client.get_property(vm, Vim::VirtualMachine, 'config.hardware.device', ensure_all: true)
354
+ devices = @cloud_searcher.get_property(vm, Vim::VirtualMachine, 'config.hardware.device', ensure_all: true)
340
355
  datacenter = client.find_parent(vm, Vim::Datacenter)
341
- datacenter_name = client.get_property(datacenter, Vim::Datacenter, 'name')
356
+ datacenter_name = @cloud_searcher.get_property(datacenter, Vim::Datacenter, 'name')
342
357
  pci_controller = devices.find { |device| device.kind_of?(Vim::Vm::Device::VirtualPCIController) }
343
358
 
344
359
  config = Vim::Vm::ConfigSpec.new
@@ -364,7 +379,7 @@ module VSphereCloud
364
379
  env = @agent_env.get_current_env(vm, datacenter_name)
365
380
  @logger.debug("Reading current agent env: #{env.pretty_inspect}")
366
381
 
367
- devices = client.get_property(vm, Vim::VirtualMachine, 'config.hardware.device', ensure_all: true)
382
+ devices = @cloud_searcher.get_property(vm, Vim::VirtualMachine, 'config.hardware.device', ensure_all: true)
368
383
  env['networks'] = generate_network_env(devices, networks, dvs_index)
369
384
 
370
385
  @logger.debug("Updating agent env to: #{env.pretty_inspect}")
@@ -377,18 +392,18 @@ module VSphereCloud
377
392
  end
378
393
 
379
394
  def get_vm_host_info(vm_ref)
380
- vm = @client.get_properties(vm_ref, Vim::VirtualMachine, 'runtime')
395
+ vm = @cloud_searcher.get_properties(vm_ref, Vim::VirtualMachine, 'runtime')
381
396
  vm_runtime = vm['runtime']
382
397
 
383
- properties = @client.get_properties(vm_runtime.host, Vim::HostSystem, ['datastore', 'parent'], ensure_all: true)
398
+ properties = @cloud_searcher.get_properties(vm_runtime.host, Vim::HostSystem, ['datastore', 'parent'], ensure_all: true)
384
399
 
385
400
  # Get the cluster that the vm's host belongs to.
386
- cluster = @client.get_properties(properties['parent'], Vim::ClusterComputeResource, 'name')
401
+ cluster = @cloud_searcher.get_properties(properties['parent'], Vim::ClusterComputeResource, 'name')
387
402
 
388
403
  # Get the datastores that are accessible to the vm's host.
389
404
  datastores_accessible = []
390
405
  properties['datastore'].each do |store|
391
- ds = @client.get_properties(store, Vim::Datastore, 'info', ensure_all: true)
406
+ ds = @cloud_searcher.get_properties(store, Vim::Datastore, 'info', ensure_all: true)
392
407
  datastores_accessible << ds['info'].name
393
408
  end
394
409
 
@@ -421,7 +436,7 @@ module VSphereCloud
421
436
  datacenter = client.find_parent(vm, Vim::Datacenter)
422
437
  datacenter_name = config.datacenter_name
423
438
 
424
- vm_properties = client.get_properties(vm, Vim::VirtualMachine, 'config.hardware.device', ensure_all: true)
439
+ vm_properties = @cloud_searcher.get_properties(vm, Vim::VirtualMachine, 'config.hardware.device', ensure_all: true)
425
440
  host_info = get_vm_host_info(vm)
426
441
 
427
442
  create_disk = false
@@ -523,7 +538,7 @@ module VSphereCloud
523
538
  @agent_env.set_env(vm, location, env)
524
539
  end
525
540
 
526
- devices = client.get_property(vm, Vim::VirtualMachine, 'config.hardware.device', ensure_all: true)
541
+ devices = @cloud_searcher.get_property(vm, Vim::VirtualMachine, 'config.hardware.device', ensure_all: true)
527
542
  vmdk_path = "#{disk.path}.vmdk"
528
543
  virtual_disk =
529
544
  devices.find do |device|
@@ -543,7 +558,7 @@ module VSphereCloud
543
558
  # that the change has been applied. This is a known issue for vsphere 4.
544
559
  # Fixed in vsphere 5.
545
560
  5.times do
546
- devices = client.get_property(vm, Vim::VirtualMachine, 'config.hardware.device', ensure_all: true)
561
+ devices = @cloud_searcher.get_property(vm, Vim::VirtualMachine, 'config.hardware.device', ensure_all: true)
547
562
  virtual_disk =
548
563
  devices.find do |device|
549
564
  device.kind_of?(Vim::Vm::Device::VirtualDisk) &&
@@ -575,12 +590,17 @@ module VSphereCloud
575
590
  @logger.info("Deleting disk: #{disk_cid}")
576
591
  disk = Models::Disk.first(uuid: disk_cid)
577
592
  if disk
578
- if disk.path
579
- datacenter = client.find_by_inventory_path(disk.datacenter)
580
- raise Bosh::Clouds::DiskNotFound.new(true), "disk #{disk_cid} not found" if datacenter.nil?
593
+ unless has_disk?(disk_cid)
594
+ raise Bosh::Clouds::DiskNotFound.new(true), "disk #{disk_cid} not found"
595
+ end
581
596
 
582
- client.delete_disk(datacenter, disk.path)
597
+ datacenter = client.find_by_inventory_path(disk.datacenter)
598
+ if datacenter.nil?
599
+ raise Bosh::Clouds::DiskNotFound.new(true), "datacenter for disk #{disk_cid} not found"
583
600
  end
601
+
602
+ client.delete_disk(datacenter, disk.path) if disk.path
603
+
584
604
  disk.destroy
585
605
  @logger.info('Finished deleting disk')
586
606
  else
@@ -601,7 +621,7 @@ module VSphereCloud
601
621
  stemcell_vm = client.find_by_inventory_path([cluster.datacenter.name, 'vm',
602
622
  cluster.datacenter.template_folder.name, stemcell])
603
623
  raise "Could not find stemcell: #{stemcell}" if stemcell_vm.nil?
604
- stemcell_datastore = client.get_property(stemcell_vm, Vim::VirtualMachine, 'datastore', ensure_all: true)
624
+ stemcell_datastore = @cloud_searcher.get_property(stemcell_vm, Vim::VirtualMachine, 'datastore', ensure_all: true)
605
625
 
606
626
  if stemcell_datastore != datastore.mob
607
627
  @logger.info("Stemcell lives on a different datastore, looking for a local copy of: #{stemcell}.")
@@ -715,13 +735,13 @@ module VSphereCloud
715
735
 
716
736
  if vm_name.nil? || datastore_name.nil?
717
737
  vm_properties =
718
- client.get_properties(vm, Vim::VirtualMachine, ['config.hardware.device', 'name'], ensure_all: true)
738
+ @cloud_searcher.get_properties(vm, Vim::VirtualMachine, ['config.hardware.device', 'name'], ensure_all: true)
719
739
  vm_name = vm_properties['name']
720
740
 
721
741
  unless datastore_name
722
742
  devices = vm_properties['config.hardware.device']
723
743
  datastore = get_primary_datastore(devices)
724
- datastore_name = client.get_property(datastore, Vim::Datastore, 'name')
744
+ datastore_name = @cloud_searcher.get_property(datastore, Vim::Datastore, 'name')
725
745
  end
726
746
  end
727
747
 
@@ -794,13 +814,13 @@ module VSphereCloud
794
814
  def create_nic_config_spec(v_network_name, network, controller_key, dvs_index)
795
815
  raise "Can't find network: #{v_network_name}" if network.nil?
796
816
  if network.class == Vim::Dvs::DistributedVirtualPortgroup
797
- portgroup_properties = client.get_properties(network,
817
+ portgroup_properties = @cloud_searcher.get_properties(network,
798
818
  Vim::Dvs::DistributedVirtualPortgroup,
799
819
  ['config.key', 'config.distributedVirtualSwitch'],
800
820
  ensure_all: true)
801
821
 
802
822
  switch = portgroup_properties['config.distributedVirtualSwitch']
803
- switch_uuid = client.get_property(switch, Vim::DistributedVirtualSwitch, 'uuid', ensure_all: true)
823
+ switch_uuid = @cloud_searcher.get_property(switch, Vim::DistributedVirtualSwitch, 'uuid', ensure_all: true)
804
824
 
805
825
  port = Vim::Dvs::PortConnection.new
806
826
  port.switch_uuid = switch_uuid
@@ -878,14 +898,14 @@ module VSphereCloud
878
898
 
879
899
  def wait_for_nfc_lease(lease)
880
900
  loop do
881
- state = client.get_property(lease, Vim::HttpNfcLease, 'state')
901
+ state = @cloud_searcher.get_property(lease, Vim::HttpNfcLease, 'state')
882
902
  return state unless state == Vim::HttpNfcLease::State::INITIALIZING
883
903
  sleep(1.0)
884
904
  end
885
905
  end
886
906
 
887
907
  def upload_ovf(ovf, lease, file_items)
888
- info = client.get_property(lease, Vim::HttpNfcLease, 'info', ensure_all: true)
908
+ info = @cloud_searcher.get_property(lease, Vim::HttpNfcLease, 'info', ensure_all: true)
889
909
  lease_updater = LeaseUpdater.new(client, lease)
890
910
 
891
911
  info.device_url.each do |device_url|
@@ -925,7 +945,7 @@ module VSphereCloud
925
945
  def wait_until_off(vm, timeout)
926
946
  started = Time.now
927
947
  loop do
928
- power_state = client.get_property(vm, Vim::VirtualMachine, 'runtime.powerState')
948
+ power_state = @cloud_searcher.get_property(vm, Vim::VirtualMachine, 'runtime.powerState')
929
949
  break if power_state == Vim::VirtualMachine::PowerState::POWERED_OFF
930
950
  raise TimeoutException if Time.now - started > timeout
931
951
  sleep(1.0)
@@ -960,14 +980,21 @@ module VSphereCloud
960
980
  def choose_placer(cloud_properties)
961
981
  datacenter_spec = cloud_properties.fetch('datacenters', []).first
962
982
  cluster_spec = datacenter_spec.fetch('clusters', []).first if datacenter_spec
963
- placer = FixedClusterPlacer.new(find_cluster(cluster_spec)) unless cluster_spec.nil?
983
+
984
+ unless cluster_spec.nil?
985
+ cluster_name = cluster_spec.keys.first
986
+ cluster = find_cluster(cluster_name)
987
+ cluster_config = cluster_spec.values.first
988
+ drs_rules = cluster_config.fetch('drs_rules', [])
989
+ placer = FixedClusterPlacer.new(cluster, drs_rules)
990
+ end
964
991
 
965
992
  placer.nil? ? @resources : placer
966
993
  end
967
994
 
968
- def find_cluster(cluster_spec)
995
+ def find_cluster(cluster_name)
969
996
  datacenter = Resources::Datacenter.new(config)
970
- datacenter.clusters[cluster_spec.keys.first]
997
+ datacenter.clusters[cluster_name]
971
998
  end
972
999
 
973
1000
  attr_reader :config