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 +4 -4
- data/lib/cloud/vsphere/agent_env.rb +2 -9
- data/lib/cloud/vsphere/client.rb +135 -33
- data/lib/cloud/vsphere/cloud.rb +131 -210
- data/lib/cloud/vsphere/config.rb +1 -4
- data/lib/cloud/vsphere/resources/cluster.rb +10 -35
- data/lib/cloud/vsphere/resources/cluster_provider.rb +1 -1
- data/lib/cloud/vsphere/resources/datacenter.rb +177 -14
- data/lib/cloud/vsphere/resources/datastore.rb +3 -1
- data/lib/cloud/vsphere/resources/disk.rb +33 -7
- data/lib/cloud/vsphere/resources/ephemeral_disk.rb +23 -0
- data/lib/cloud/vsphere/resources/folder.rb +1 -1
- data/lib/cloud/vsphere/resources/nic.rb +38 -0
- data/lib/cloud/vsphere/resources/persistent_disk.rb +22 -0
- data/lib/cloud/vsphere/resources/resource_pool.rb +1 -1
- data/lib/cloud/vsphere/resources/scorer.rb +3 -3
- data/lib/cloud/vsphere/resources/util.rb +1 -1
- data/lib/cloud/vsphere/resources/vm.rb +145 -5
- data/lib/cloud/vsphere/resources.rb +1 -150
- data/lib/cloud/vsphere/vm_creator.rb +22 -15
- data/lib/cloud/vsphere/vm_creator_builder.rb +4 -3
- data/lib/cloud/vsphere.rb +8 -4
- metadata +7 -8
- data/lib/cloud/vsphere/disk_provider.rb +0 -94
- data/lib/cloud/vsphere/fixed_cluster_placer.rb +0 -32
- data/lib/cloud/vsphere/resources/disk/disk_config.rb +0 -35
- data/lib/cloud/vsphere/resources/disk/ephemeral_disk.rb +0 -22
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 4395e6dd0db3e79ecccc8d4475dfca0aebac8684
|
|
4
|
+
data.tar.gz: 48fe6a81c8586522b8040cbc45c03d32d5305fa1
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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
|
data/lib/cloud/vsphere/client.rb
CHANGED
|
@@ -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
|
-
|
|
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(
|
|
83
|
-
task = @service_content.file_manager.delete_file(path,
|
|
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(
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
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(
|
|
101
|
-
create_parent_folder(
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
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
|
-
|
|
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::
|
|
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(
|
|
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(
|
|
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
|
-
|
|
282
|
+
datacenter_mob,
|
|
253
283
|
disk_spec
|
|
254
284
|
)
|
|
255
285
|
wait_for_task(task)
|
|
256
286
|
|
|
257
|
-
Resources::
|
|
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
|
-
|
|
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
|