bosh_vsphere_cpi 2.2.1 → 2.2.2
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 +4 -4
- data/lib/cloud/vsphere/client.rb +46 -38
- data/lib/cloud/vsphere/cloud.rb +37 -37
- data/lib/cloud/vsphere/resources/vm.rb +25 -60
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 8cf26eed256c7480a429cb3d09eaf357656adb64
|
|
4
|
+
data.tar.gz: 66f4347df33381995b727d84370de31160acd7cd
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: d29158bac673485edb46eea81b1678482774e05d38114c97dfa8210460b6fd33fa0b8d2e737b963f3eaf73d1fc3bb646420868e4db92b8e59b5b88fe9bfddfc8
|
|
7
|
+
data.tar.gz: 09c56e204697cb410e700f5cd3510067d069dae5ea17f3b2775e127d338d09d3b32d9ec58387de82f9f048e6b4192fe364f0c8797afcb2fb2da244dc3f878118
|
data/lib/cloud/vsphere/client.rb
CHANGED
|
@@ -304,7 +304,7 @@ module VSphereCloud
|
|
|
304
304
|
|
|
305
305
|
datastore_path = "[#{datastore.name}] #{disk_folder}"
|
|
306
306
|
@logger.debug("Trying to find disk in : #{datastore_path}")
|
|
307
|
-
vm_disk_infos = wait_for_task(datastore.mob.browser.search(
|
|
307
|
+
vm_disk_infos = wait_for_task(datastore.mob.browser.search("[#{datastore.name}] #{disk_folder}", search_spec)).file
|
|
308
308
|
return nil if vm_disk_infos.empty?
|
|
309
309
|
|
|
310
310
|
vm_disk_infos.first.capacity_kb / 1024
|
|
@@ -312,26 +312,13 @@ module VSphereCloud
|
|
|
312
312
|
nil
|
|
313
313
|
end
|
|
314
314
|
|
|
315
|
-
def
|
|
316
|
-
|
|
317
|
-
|
|
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?
|
|
315
|
+
def add_persistent_disk_property_to_vm(vm, disk)
|
|
316
|
+
vm_config = Vim::Vm::ConfigSpec.new
|
|
317
|
+
v_app_config_spec = VimSdk::Vim::VApp::VmConfigSpec.new
|
|
328
318
|
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
false
|
|
332
|
-
end
|
|
319
|
+
v_app_property_spec = VimSdk::Vim::VApp::PropertySpec.new
|
|
320
|
+
v_app_property_info = VimSdk::Vim::VApp::PropertyInfo.new
|
|
333
321
|
|
|
334
|
-
def add_persistent_disk_property_to_vm(vm, disk)
|
|
335
322
|
vm_disk = vm.disk_by_cid(disk.cid)
|
|
336
323
|
disk_device_key = vm_disk.key
|
|
337
324
|
|
|
@@ -340,7 +327,6 @@ module VSphereCloud
|
|
|
340
327
|
return
|
|
341
328
|
end
|
|
342
329
|
|
|
343
|
-
v_app_property_info = VimSdk::Vim::VApp::PropertyInfo.new
|
|
344
330
|
v_app_property_info.key = disk_device_key
|
|
345
331
|
v_app_property_info.id = disk.cid
|
|
346
332
|
v_app_property_info.label = disk.cid
|
|
@@ -350,36 +336,58 @@ module VSphereCloud
|
|
|
350
336
|
v_app_property_info.description = 'Used by BOSH to track persistent disks. Change at your own risk.'
|
|
351
337
|
v_app_property_info.user_configurable = true
|
|
352
338
|
|
|
353
|
-
v_app_property_spec = VimSdk::Vim::VApp::PropertySpec.new
|
|
354
339
|
v_app_property_spec.info = v_app_property_info
|
|
355
340
|
v_app_property_spec.operation = VimSdk::Vim::Option::ArrayUpdateSpec::Operation::ADD
|
|
356
|
-
|
|
357
|
-
v_app_config_spec = VimSdk::Vim::VApp::VmConfigSpec.new
|
|
358
341
|
v_app_config_spec.property << v_app_property_spec
|
|
359
342
|
|
|
360
|
-
vm_config = Vim::Vm::ConfigSpec.new
|
|
361
343
|
vm_config.v_app_config = v_app_config_spec
|
|
362
344
|
|
|
363
345
|
reconfig_vm(vm.mob, vm_config)
|
|
364
346
|
end
|
|
365
347
|
|
|
366
|
-
def
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
348
|
+
def set_custom_field(mob, name, value)
|
|
349
|
+
@fields_manager ||= @service_content.custom_fields_manager
|
|
350
|
+
name = name.to_s
|
|
351
|
+
value = value.to_s
|
|
352
|
+
field = nil
|
|
371
353
|
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
354
|
+
begin
|
|
355
|
+
field = @fields_manager.add_field_definition(name, mob.class, nil, nil)
|
|
356
|
+
rescue SoapError => e
|
|
357
|
+
if e.fault.kind_of?(Vim::Fault::NoPermission)
|
|
358
|
+
@logger.warn("Can't create custom field definition due to lack of permission: #{e.message}")
|
|
359
|
+
elsif e.fault.kind_of?(Vim::Fault::DuplicateName)
|
|
360
|
+
@logger.warn("Custom field definition already exists: #{e.message}")
|
|
361
|
+
custom_fields = @fields_manager.field
|
|
362
|
+
field = custom_fields.find do |field|
|
|
363
|
+
field.name == name && field.managed_object_type == mob.class
|
|
364
|
+
end
|
|
365
|
+
else
|
|
366
|
+
raise e
|
|
367
|
+
end
|
|
368
|
+
end
|
|
378
369
|
|
|
379
|
-
|
|
380
|
-
|
|
370
|
+
unless field.nil?
|
|
371
|
+
begin
|
|
372
|
+
@fields_manager.set_field(mob, field.key, value)
|
|
373
|
+
rescue SoapError => e
|
|
374
|
+
if e.fault.kind_of?(Vim::Fault::NoPermission)
|
|
375
|
+
@logger.warn("Can't set custom fields due to lack of permission: #{e.message}")
|
|
376
|
+
end
|
|
377
|
+
end
|
|
378
|
+
end
|
|
379
|
+
end
|
|
381
380
|
|
|
382
|
-
|
|
381
|
+
def remove_custom_field_def(name, mob_type)
|
|
382
|
+
@fields_manager ||= @service_content.custom_fields_manager
|
|
383
|
+
name = name.to_s
|
|
384
|
+
custom_fields = @fields_manager.field
|
|
385
|
+
field = custom_fields.find do |field|
|
|
386
|
+
field.name == name && field.managed_object_type == mob_type
|
|
387
|
+
end
|
|
388
|
+
unless field.nil?
|
|
389
|
+
@fields_manager.remove_field_definition(field.key)
|
|
390
|
+
end
|
|
383
391
|
end
|
|
384
392
|
|
|
385
393
|
private
|
data/lib/cloud/vsphere/cloud.rb
CHANGED
|
@@ -195,7 +195,34 @@ module VSphereCloud
|
|
|
195
195
|
|
|
196
196
|
persistent_disks = vm.persistent_disks
|
|
197
197
|
unless persistent_disks.empty?
|
|
198
|
-
|
|
198
|
+
disks_to_move = []
|
|
199
|
+
@logger.info("Found #{persistent_disks.size} persistent disk(s)")
|
|
200
|
+
config = Vim::Vm::ConfigSpec.new
|
|
201
|
+
config.device_change = []
|
|
202
|
+
|
|
203
|
+
persistent_disks.each do |virtual_disk|
|
|
204
|
+
@logger.info("Detaching: #{virtual_disk.backing.file_name}")
|
|
205
|
+
config.device_change << Resources::VM.create_delete_device_spec(virtual_disk)
|
|
206
|
+
|
|
207
|
+
if vm.has_persistent_disk_property_mismatch?(virtual_disk)
|
|
208
|
+
@logger.info("Property Mismatch")
|
|
209
|
+
disks_to_move << virtual_disk
|
|
210
|
+
end
|
|
211
|
+
end
|
|
212
|
+
retry_block { client.reconfig_vm(vm.mob, config) }
|
|
213
|
+
@logger.info("Detached #{persistent_disks.size} persistent disk(s)")
|
|
214
|
+
|
|
215
|
+
@logger.info("Renaming #{disks_to_move.size} persistent disk(s)")
|
|
216
|
+
disks_to_move.each do |disk|
|
|
217
|
+
current_path = disk.backing.file_name
|
|
218
|
+
|
|
219
|
+
current_datastore = current_path.split(" ").first
|
|
220
|
+
original_disk_path = vm.get_old_disk_filepath(disk.key)
|
|
221
|
+
dest_filename = original_disk_path.split(" ").last
|
|
222
|
+
dest_path = "#{current_datastore} #{dest_filename}"
|
|
223
|
+
|
|
224
|
+
@datacenter.move_disk(current_path, dest_path)
|
|
225
|
+
end
|
|
199
226
|
end
|
|
200
227
|
|
|
201
228
|
# Delete env.iso and VM specific files managed by the director
|
|
@@ -232,35 +259,9 @@ module VSphereCloud
|
|
|
232
259
|
|
|
233
260
|
def set_vm_metadata(vm_cid, metadata)
|
|
234
261
|
with_thread_name("set_vm_metadata(#{vm_cid}, ...)") do
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
name_to_key_id = {}
|
|
239
|
-
|
|
240
|
-
metadata.each_key do |name|
|
|
241
|
-
field = custom_fields.find { |field| field.name == name.to_s &&
|
|
242
|
-
field.managed_object_type == Vim::VirtualMachine }
|
|
243
|
-
unless field
|
|
244
|
-
field = fields_manager.add_field_definition(name.to_s, Vim::VirtualMachine, nil, nil)
|
|
245
|
-
end
|
|
246
|
-
name_to_key_id[name] = field.key
|
|
247
|
-
end
|
|
248
|
-
|
|
249
|
-
vm = vm_provider.find(vm_cid)
|
|
250
|
-
|
|
251
|
-
metadata.each do |name, value|
|
|
252
|
-
value = '' if value.nil? # value is required
|
|
253
|
-
fields_manager.set_field(vm.mob, name_to_key_id[name], value)
|
|
254
|
-
end
|
|
255
|
-
rescue SoapError => e
|
|
256
|
-
if e.fault.kind_of?(Vim::Fault::NoPermission)
|
|
257
|
-
@logger.warn("Can't set custom fields due to lack of " +
|
|
258
|
-
"permission: #{e.message}")
|
|
259
|
-
elsif e.fault.kind_of?(Vim::Fault::DuplicateName)
|
|
260
|
-
@logger.warn("Can't add custom field definition that already exists: #{e.message}")
|
|
261
|
-
else
|
|
262
|
-
raise e
|
|
263
|
-
end
|
|
262
|
+
vm = vm_provider.find(vm_cid)
|
|
263
|
+
metadata.each do |name, value|
|
|
264
|
+
client.set_custom_field(vm.mob, name, value)
|
|
264
265
|
end
|
|
265
266
|
end
|
|
266
267
|
end
|
|
@@ -326,12 +327,11 @@ module VSphereCloud
|
|
|
326
327
|
with_thread_name("detach_disk(#{vm_cid}, #{disk_cid})") do
|
|
327
328
|
@logger.info("Detaching disk: #{disk_cid} from vm: #{vm_cid}")
|
|
328
329
|
|
|
330
|
+
disk = @datacenter.find_disk(disk_cid)
|
|
329
331
|
vm = vm_provider.find(vm_cid)
|
|
330
|
-
disk = vm.disk_by_original_cid(disk_cid)
|
|
331
|
-
raise Bosh::Clouds::DiskNotAttached.new(true), "Disk '#{disk_cid}' is not attached to VM '#{vm_cid}'" if disk.nil?
|
|
332
332
|
|
|
333
|
-
delete_disk_from_agent_env(vm,
|
|
334
|
-
vm.
|
|
333
|
+
delete_disk_from_agent_env(vm, disk)
|
|
334
|
+
vm.detach_disk(disk)
|
|
335
335
|
end
|
|
336
336
|
end
|
|
337
337
|
|
|
@@ -647,13 +647,13 @@ module VSphereCloud
|
|
|
647
647
|
@logger.info("Updated agent env to: #{env.pretty_inspect}")
|
|
648
648
|
end
|
|
649
649
|
|
|
650
|
-
def delete_disk_from_agent_env(vm,
|
|
650
|
+
def delete_disk_from_agent_env(vm, disk)
|
|
651
651
|
vm_mob = vm.mob
|
|
652
652
|
location = get_vm_location(vm_mob)
|
|
653
653
|
env = @agent_env.get_current_env(vm_mob, location[:datacenter])
|
|
654
654
|
@logger.info("Reading current agent env: #{env.pretty_inspect}")
|
|
655
|
-
if env['disks']['persistent'][
|
|
656
|
-
env['disks']['persistent'].delete(
|
|
655
|
+
if env['disks']['persistent'][disk.cid]
|
|
656
|
+
env['disks']['persistent'].delete(disk.cid)
|
|
657
657
|
@logger.info("Updating agent env to: #{env.pretty_inspect}")
|
|
658
658
|
|
|
659
659
|
@agent_env.set_env(vm_mob, location, env)
|
|
@@ -60,7 +60,7 @@ module VSphereCloud
|
|
|
60
60
|
end
|
|
61
61
|
|
|
62
62
|
def persistent_disks
|
|
63
|
-
|
|
63
|
+
devices.select do |device|
|
|
64
64
|
device.kind_of?(Vim::Vm::Device::VirtualDisk) &&
|
|
65
65
|
device.backing.disk_mode == Vim::Vm::Device::VirtualDiskOption::DiskMode::INDEPENDENT_PERSISTENT
|
|
66
66
|
end
|
|
@@ -77,7 +77,7 @@ module VSphereCloud
|
|
|
77
77
|
end
|
|
78
78
|
|
|
79
79
|
def fix_device_unit_numbers(device_changes)
|
|
80
|
-
controllers_available_unit_numbers = Hash.new { |h,
|
|
80
|
+
controllers_available_unit_numbers = Hash.new { |h,k| h[k] = (0..15).to_a }
|
|
81
81
|
devices.each do |device|
|
|
82
82
|
if device.controller_key
|
|
83
83
|
available_unit_numbers = controllers_available_unit_numbers[device.controller_key]
|
|
@@ -117,7 +117,7 @@ module VSphereCloud
|
|
|
117
117
|
if question
|
|
118
118
|
choices = question.choice
|
|
119
119
|
@logger.info("VM is blocked on a question: #{question.text}, " +
|
|
120
|
-
|
|
120
|
+
"providing default answer: #{choices.choice_info[choices.default_index].label}")
|
|
121
121
|
@client.answer_vm(@mob, question.id, choices.choice_info[choices.default_index].key)
|
|
122
122
|
power_state = cloud_searcher.get_property(@mob, Vim::VirtualMachine, 'runtime.powerState')
|
|
123
123
|
else
|
|
@@ -138,21 +138,6 @@ module VSphereCloud
|
|
|
138
138
|
end
|
|
139
139
|
end
|
|
140
140
|
|
|
141
|
-
def disk_by_original_cid(disk_cid)
|
|
142
|
-
devices.each do |d|
|
|
143
|
-
if d.kind_of?(Vim::Vm::Device::VirtualDisk)
|
|
144
|
-
found_property = get_vapp_property_by_key(d.key)
|
|
145
|
-
unless found_property.nil?
|
|
146
|
-
if verify_persistent_disk_property?(found_property) && found_property.label == disk_cid
|
|
147
|
-
return d
|
|
148
|
-
end
|
|
149
|
-
end
|
|
150
|
-
end
|
|
151
|
-
end
|
|
152
|
-
|
|
153
|
-
nil
|
|
154
|
-
end
|
|
155
|
-
|
|
156
141
|
def reboot
|
|
157
142
|
@mob.reboot_guest
|
|
158
143
|
end
|
|
@@ -189,8 +174,8 @@ module VSphereCloud
|
|
|
189
174
|
return false if found_property.nil? || !verify_persistent_disk_property?(found_property)
|
|
190
175
|
|
|
191
176
|
# get full path without a datastore
|
|
192
|
-
file_path = disk.backing.file_name[/([^\]]*)\.vmdk/,
|
|
193
|
-
original_file_path =
|
|
177
|
+
file_path = disk.backing.file_name[/([^\]]*)\.vmdk/,1].strip
|
|
178
|
+
original_file_path =found_property.value[/([^\]]*)\.vmdk/,1].strip
|
|
194
179
|
@logger.debug("Current file path is #{file_path}")
|
|
195
180
|
@logger.debug("Original file path is #{original_file_path}")
|
|
196
181
|
|
|
@@ -231,51 +216,31 @@ module VSphereCloud
|
|
|
231
216
|
return disk_config_spec
|
|
232
217
|
end
|
|
233
218
|
|
|
234
|
-
def
|
|
219
|
+
def detach_disk(disk)
|
|
235
220
|
reload
|
|
236
|
-
|
|
237
|
-
|
|
221
|
+
virtual_disk = disk_by_cid(disk.cid)
|
|
222
|
+
raise Bosh::Clouds::DiskNotAttached.new(true), "Disk '#{disk.cid}' is not attached to VM '#{@cid}'" if virtual_disk.nil?
|
|
223
|
+
|
|
238
224
|
config = Vim::Vm::ConfigSpec.new
|
|
239
225
|
config.device_change = []
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
226
|
+
config.device_change << self.class.create_delete_device_spec(virtual_disk)
|
|
227
|
+
|
|
228
|
+
@logger.info('Detaching disk')
|
|
229
|
+
@client.reconfig_vm(@mob, config)
|
|
230
|
+
|
|
231
|
+
# detach-disk is async and task completion does not necessarily mean
|
|
232
|
+
# that changes have been applied to VC side. Query VC until we confirm
|
|
233
|
+
# that the change has been applied. This is a known issue for vsphere 4.
|
|
234
|
+
# Fixed in vsphere 5.
|
|
235
|
+
5.times do
|
|
236
|
+
reload
|
|
237
|
+
virtual_disk = disk_by_cid(disk.cid)
|
|
238
|
+
break if virtual_disk.nil?
|
|
239
|
+
sleep(1.0)
|
|
252
240
|
end
|
|
253
|
-
|
|
254
|
-
@logger.info("Detached #{virtual_disks.size} persistent disk(s)")
|
|
255
|
-
|
|
256
|
-
move_disks_to_old_path(disks_to_move)
|
|
257
|
-
|
|
258
|
-
@logger.info('Finished detaching disk(s)')
|
|
241
|
+
raise "Failed to detach disk '#{disk.cid}' from vm '#{@cid}'" unless virtual_disk.nil?
|
|
259
242
|
|
|
260
|
-
|
|
261
|
-
@logger.debug("Deleting persistent disk property #{disk.key} from vm '#{@cid}'")
|
|
262
|
-
@client.delete_persistent_disk_property_from_vm(self, disk.key)
|
|
263
|
-
end
|
|
264
|
-
@logger.debug('Finished deleting persistent disk properties from vm')
|
|
265
|
-
end
|
|
266
|
-
|
|
267
|
-
def move_disks_to_old_path(disks_to_move)
|
|
268
|
-
@logger.info("Renaming #{disks_to_move.size} persistent disk(s)")
|
|
269
|
-
disks_to_move.each do |virtual_disk|
|
|
270
|
-
current_path = virtual_disk.backing.file_name
|
|
271
|
-
|
|
272
|
-
current_datastore = current_path.split(" ").first
|
|
273
|
-
original_disk_path = get_old_disk_filepath(virtual_disk.key)
|
|
274
|
-
dest_filename = original_disk_path.split(" ").last
|
|
275
|
-
dest_path = "#{current_datastore} #{dest_filename}"
|
|
276
|
-
|
|
277
|
-
@client.move_disk(datacenter, current_path, datacenter, dest_path)
|
|
278
|
-
end
|
|
243
|
+
@logger.info('Finished detaching disk')
|
|
279
244
|
end
|
|
280
245
|
|
|
281
246
|
def self.create_delete_device_spec(device, options = {})
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: bosh_vsphere_cpi
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 2.2.
|
|
4
|
+
version: 2.2.2
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- VMware
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2016-
|
|
11
|
+
date: 2016-02-02 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: bosh_common
|