bosh_vsphere_cpi 2.2.0 → 2.2.1

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: 20484247b0bb76cefc40f2f28054428a6680991b
4
- data.tar.gz: 1d48fb046acb02cf0417b6b803c28e6883291b0a
3
+ metadata.gz: 4395e6dd0db3e79ecccc8d4475dfca0aebac8684
4
+ data.tar.gz: 48fe6a81c8586522b8040cbc45c03d32d5305fa1
5
5
  SHA512:
6
- metadata.gz: 0ca9d5f7600ad20b84ce67c8ddeab6381c7d77ffa2baaff0323f492bfb267e57570385249b91f0c49970ddbb75b98c453b6422e02e5abd5c443f0e7f42d91627
7
- data.tar.gz: 17673951c1c87149dc4e32ba21627f1d139a96af603d81cdd4deace7791dbcdf7a4cf341f9ec7ba0f5b825bb300e33ce3bd147beb60b2bc2cd387da756938bb1
6
+ metadata.gz: 07c5278031cb259efb6dbd019db122a2cf06365eddd31a19a7fc7a7a377ea290fee62f6a43ab6ac514eb51173350d3e5def2829544351b1e5e02fc33ce1760ff
7
+ data.tar.gz: 8cdc7000a67cced611bc18859ecb4390f292b081e669fe03209ba38dfd563e9bc8c0ebf8e23e335d0142bb535082fa58f710bb0db4550b03ca8af6423bbcbeef
@@ -73,7 +73,7 @@ module VSphereCloud
73
73
  cdrom.backing = backing_info
74
74
 
75
75
  config = Vim::Vm::ConfigSpec.new
76
- config.device_change = [create_edit_device_spec(cdrom)]
76
+ config.device_change = [Resources::VM.create_edit_device_spec(cdrom)]
77
77
  @client.reconfig_vm(vm, config)
78
78
  end
79
79
 
@@ -82,7 +82,7 @@ module VSphereCloud
82
82
  if cdrom.connectable.connected
83
83
  cdrom.connectable.connected = false
84
84
  config = Vim::Vm::ConfigSpec.new
85
- config.device_change = [create_edit_device_spec(cdrom)]
85
+ config.device_change = [Resources::VM.create_edit_device_spec(cdrom)]
86
86
  @client.reconfig_vm(vm, config)
87
87
  end
88
88
  end
@@ -111,12 +111,5 @@ module VSphereCloud
111
111
  def genisoimage
112
112
  @genisoimage ||= which(%w{genisoimage mkisofs})
113
113
  end
114
-
115
- def create_edit_device_spec(device)
116
- device_config_spec = Vim::Vm::Device::VirtualDeviceSpec.new
117
- device_config_spec.device = device
118
- device_config_spec.operation = Vim::Vm::Device::VirtualDeviceSpec::Operation::EDIT
119
- device_config_spec
120
- end
121
114
  end
122
115
  end
@@ -14,7 +14,12 @@ module VSphereCloud
14
14
  @soap_stub = SoapStub.new(host, options[:soap_log]).create
15
15
 
16
16
  @service_instance = Vim::ServiceInstance.new('ServiceInstance', @soap_stub)
17
- @service_content = @service_instance.content
17
+
18
+ begin
19
+ @service_content = @service_instance.content
20
+ rescue HTTPClient::ConnectTimeoutError => e
21
+ raise "Please make sure the CPI has proper network access to vSphere. (#{e.class}: #{e.message})"
22
+ end
18
23
 
19
24
  @metrics_cache = {}
20
25
  @lock = Mutex.new
@@ -32,6 +37,8 @@ module VSphereCloud
32
37
  raise NotLoggedInException unless @session
33
38
  @session = nil
34
39
  @service_content.session_manager.logout
40
+ rescue VimSdk::SoapError => e
41
+ @logger.info "Failed to logout: #{e.message}"
35
42
  end
36
43
 
37
44
  def find_parent(obj, parent_type)
@@ -79,8 +86,8 @@ module VSphereCloud
79
86
  devices.find { |device| device.kind_of?(Vim::Vm::Device::VirtualCdrom) }
80
87
  end
81
88
 
82
- def delete_path(datacenter, path)
83
- task = @service_content.file_manager.delete_file(path, datacenter)
89
+ def delete_path(datacenter_mob, path)
90
+ task = @service_content.file_manager.delete_file(path, datacenter_mob)
84
91
  begin
85
92
  wait_for_task(task)
86
93
  rescue => e
@@ -90,26 +97,35 @@ module VSphereCloud
90
97
  end
91
98
  end
92
99
 
93
- def delete_disk(datacenter, path)
94
- base_path = path.chomp(File.extname(path))
95
- [".vmdk", "-flat.vmdk"].each do |extension|
96
- delete_path(datacenter, "#{base_path}#{extension}")
100
+ def delete_disk(datacenter_mob, path)
101
+ task = service_content.virtual_disk_manager.delete_virtual_disk(
102
+ path,
103
+ datacenter_mob
104
+ )
105
+
106
+ begin
107
+ wait_for_task(task)
108
+ rescue => e
109
+ unless e.message =~ /File .* was not found/
110
+ raise e
111
+ end
97
112
  end
98
113
  end
99
114
 
100
- def move_disk(source_datacenter, source_path, dest_datacenter, dest_path)
101
- create_parent_folder(dest_datacenter, dest_path)
102
- tasks = []
103
- base_source_path = source_path.chomp(File.extname(source_path))
104
- base_dest_path = dest_path.chomp(File.extname(dest_path))
105
- [".vmdk", "-flat.vmdk"].each do |extension|
106
- tasks << @service_content.file_manager.move_file(
107
- "#{base_source_path}#{extension}", source_datacenter.mob,
108
- "#{base_dest_path}#{extension}", dest_datacenter.mob, false
109
- )
110
- end
115
+ def move_disk(source_datacenter_mob, source_path, dest_datacenter_mob, dest_path)
116
+ create_parent_folder(dest_datacenter_mob, dest_path)
117
+ @logger.info("Moving disk: #{source_path} to #{dest_path}")
118
+ task = service_content.virtual_disk_manager.move_virtual_disk(
119
+ source_path,
120
+ source_datacenter_mob,
121
+ dest_path,
122
+ dest_datacenter_mob,
123
+ false,
124
+ nil
125
+ )
111
126
 
112
- tasks.each { |task| wait_for_task(task) }
127
+ wait_for_task(task)
128
+ @logger.info('Moved disk')
113
129
  end
114
130
 
115
131
  def create_datastore_folder(folder_path, datacenter)
@@ -155,6 +171,21 @@ module VSphereCloud
155
171
  matches
156
172
  end
157
173
 
174
+ def find_all_stemcell_replicas_in_datastore(datacenter, stemcell_id, datastore_name)
175
+ matches = []
176
+ yield_all_resources_by_name(datacenter, 'VirtualMachine') do |vm_mob, name|
177
+ if name =~ Regexp.new(stemcell_id)
178
+ vm_datastore = @cloud_searcher.get_property(vm_mob,
179
+ Vim::VirtualMachine, 'datastore', ensure_all: true)
180
+ if vm_datastore.first.name == datastore_name
181
+ matches << vm_mob
182
+ end
183
+ end
184
+ end
185
+
186
+ matches
187
+ end
188
+
158
189
  def wait_for_task(task)
159
190
  interval = 1.0
160
191
  started = Time.now
@@ -228,19 +259,18 @@ module VSphereCloud
228
259
  end
229
260
 
230
261
  def find_disk(disk_cid, datastore, disk_folder)
231
- disk_path = "[#{datastore.name}] #{disk_folder}/#{disk_cid}.vmdk"
232
262
  disk_size_in_mb = find_disk_size_using_browser(datastore, disk_cid, disk_folder)
233
- disk_size_in_mb.nil? ? nil : Resources::Disk.new(disk_cid, disk_size_in_mb, datastore, disk_path)
263
+ disk_size_in_mb.nil? ? nil : Resources::PersistentDisk.new(disk_cid, disk_size_in_mb, datastore, disk_folder)
234
264
  end
235
265
 
236
- def create_disk(datacenter, datastore, disk_cid, disk_folder, disk_size_in_mb, disk_type)
266
+ def create_disk(datacenter_mob, datastore, disk_cid, disk_folder, disk_size_in_mb, disk_type)
237
267
  if disk_type.nil?
238
268
  raise 'no disk type specified'
239
269
  end
240
270
 
241
271
  disk_path = "[#{datastore.name}] #{disk_folder}/#{disk_cid}.vmdk"
242
272
 
243
- create_parent_folder(datacenter, disk_path)
273
+ create_parent_folder(datacenter_mob, disk_path)
244
274
 
245
275
  disk_spec = VimSdk::Vim::VirtualDiskManager::FileBackedVirtualDiskSpec.new
246
276
  disk_spec.disk_type = disk_type
@@ -249,19 +279,12 @@ module VSphereCloud
249
279
 
250
280
  task = service_content.virtual_disk_manager.create_virtual_disk(
251
281
  disk_path,
252
- datacenter.mob,
282
+ datacenter_mob,
253
283
  disk_spec
254
284
  )
255
285
  wait_for_task(task)
256
286
 
257
- Resources::Disk.new(disk_cid, disk_size_in_mb, datastore, disk_path)
258
- end
259
-
260
- private
261
-
262
- def create_parent_folder(datacenter, disk_path)
263
- destination_folder = File.dirname(disk_path)
264
- create_datastore_folder(destination_folder, datacenter.mob)
287
+ Resources::PersistentDisk.new(disk_cid, disk_size_in_mb, datastore, disk_folder)
265
288
  end
266
289
 
267
290
  def find_disk_size_using_browser(datastore, disk_cid, disk_folder)
@@ -279,7 +302,9 @@ module VSphereCloud
279
302
  search_spec.match_pattern = ["#{disk_cid}.vmdk"]
280
303
  search_spec.query = [query]
281
304
 
282
- vm_disk_infos = wait_for_task(datastore.mob.browser.search("[#{datastore.name}] #{disk_folder}", search_spec)).file
305
+ datastore_path = "[#{datastore.name}] #{disk_folder}"
306
+ @logger.debug("Trying to find disk in : #{datastore_path}")
307
+ vm_disk_infos = wait_for_task(datastore.mob.browser.search(datastore_path, search_spec)).file
283
308
  return nil if vm_disk_infos.empty?
284
309
 
285
310
  vm_disk_infos.first.capacity_kb / 1024
@@ -287,6 +312,78 @@ module VSphereCloud
287
312
  nil
288
313
  end
289
314
 
315
+ def disk_path_exists?(vm_mob, disk_path)
316
+ match = /\[(.+)\] (.+)\/(.+\.vmdk)/.match(disk_path)
317
+ search_spec_details = VimSdk::Vim::Host::DatastoreBrowser::FileInfo::Details.new
318
+ search_spec_details.file_type = true # actually return VmDiskInfos not FileInfos
319
+
320
+ search_spec = VimSdk::Vim::Host::DatastoreBrowser::SearchSpec.new
321
+ search_spec.details = search_spec_details
322
+ search_spec.match_pattern = [match[3]]
323
+
324
+ datastore_path = "[#{match[1]}] #{match[2]}"
325
+ @logger.debug("Trying to find disk in : #{datastore_path}")
326
+ vm_disk_infos = wait_for_task(vm_mob.environment_browser.datastore_browser.search(datastore_path, search_spec)).file
327
+ return false if vm_disk_infos.empty?
328
+
329
+ true
330
+ rescue VimSdk::SoapError, FileNotFoundException
331
+ false
332
+ end
333
+
334
+ def add_persistent_disk_property_to_vm(vm, disk)
335
+ vm_disk = vm.disk_by_cid(disk.cid)
336
+ disk_device_key = vm_disk.key
337
+
338
+ if vm.get_vapp_property_by_key(disk_device_key) != nil
339
+ @logger.debug("Disk property already exists '#{disk.cid}' on vm '#{vm.cid}'")
340
+ return
341
+ end
342
+
343
+ v_app_property_info = VimSdk::Vim::VApp::PropertyInfo.new
344
+ v_app_property_info.key = disk_device_key
345
+ v_app_property_info.id = disk.cid
346
+ v_app_property_info.label = disk.cid
347
+ v_app_property_info.category = 'BOSH Persistent Disks'
348
+ v_app_property_info.type = 'string'
349
+ v_app_property_info.value = disk.path
350
+ v_app_property_info.description = 'Used by BOSH to track persistent disks. Change at your own risk.'
351
+ v_app_property_info.user_configurable = true
352
+
353
+ v_app_property_spec = VimSdk::Vim::VApp::PropertySpec.new
354
+ v_app_property_spec.info = v_app_property_info
355
+ v_app_property_spec.operation = VimSdk::Vim::Option::ArrayUpdateSpec::Operation::ADD
356
+
357
+ v_app_config_spec = VimSdk::Vim::VApp::VmConfigSpec.new
358
+ v_app_config_spec.property << v_app_property_spec
359
+
360
+ vm_config = Vim::Vm::ConfigSpec.new
361
+ vm_config.v_app_config = v_app_config_spec
362
+
363
+ reconfig_vm(vm.mob, vm_config)
364
+ end
365
+
366
+ def delete_persistent_disk_property_from_vm(vm, disk_device_key)
367
+ if vm.get_vapp_property_by_key(disk_device_key).nil?
368
+ @logger.debug("Disk property[#{disk_device_key}] does not exist on vm '#{vm.cid}'")
369
+ return
370
+ end
371
+
372
+ v_app_property_spec = VimSdk::Vim::VApp::PropertySpec.new
373
+ v_app_property_spec.remove_key = disk_device_key
374
+ v_app_property_spec.operation = VimSdk::Vim::Option::ArrayUpdateSpec::Operation::REMOVE
375
+
376
+ v_app_config_spec = VimSdk::Vim::VApp::VmConfigSpec.new
377
+ v_app_config_spec.property << v_app_property_spec
378
+
379
+ vm_config = Vim::Vm::ConfigSpec.new
380
+ vm_config.v_app_config = v_app_config_spec
381
+
382
+ reconfig_vm(vm.mob, vm_config)
383
+ end
384
+
385
+ private
386
+
290
387
  def task_exception_for_vim_fault(fault)
291
388
  exceptions_by_fault = {
292
389
  VimSdk::Vim::Fault::FileNotFound => FileNotFoundException,
@@ -375,5 +472,10 @@ module VSphereCloud
375
472
  end
376
473
  end
377
474
  end
475
+
476
+ def create_parent_folder(datacenter_mob, disk_path)
477
+ destination_folder = File.dirname(disk_path)
478
+ create_datastore_folder(destination_folder, datacenter_mob)
479
+ end
378
480
  end
379
481
  end