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