bosh_vsphere_cpi 1.2690.4.0 → 1.2693.0

Sign up to get free protection for your applications and to get access to all the features.
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