bosh_vsphere_cpi 2.2.0 → 2.2.1

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: 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