bosh_vsphere_cpi 1.2690.4.0 → 1.2693.0
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 +3 -2
- data/lib/cloud/vsphere/client.rb +24 -238
- data/lib/cloud/vsphere/cloud.rb +61 -34
- data/lib/cloud/vsphere/cloud_searcher.rb +269 -0
- data/lib/cloud/vsphere/config.rb +15 -4
- data/lib/cloud/vsphere/drs_rules/drs_lock.rb +44 -0
- data/lib/cloud/vsphere/drs_rules/drs_rule.rb +92 -0
- data/lib/cloud/vsphere/drs_rules/drs_rule_cleaner.rb +40 -0
- data/lib/cloud/vsphere/drs_rules/vm_attribute_manager.rb +42 -0
- data/lib/cloud/vsphere/fixed_cluster_placer.rb +4 -1
- data/lib/cloud/vsphere/lease_obtainer.rb +4 -4
- data/lib/cloud/vsphere/resources.rb +3 -0
- data/lib/cloud/vsphere/resources/cluster.rb +4 -4
- data/lib/cloud/vsphere/resources/datacenter.rb +2 -2
- data/lib/cloud/vsphere/resources/resource_pool.rb +1 -1
- data/lib/cloud/vsphere/retry_block.rb +16 -1
- data/lib/cloud/vsphere/soap_stub.rb +29 -0
- data/lib/cloud/vsphere/version.rb +1 -1
- data/lib/cloud/vsphere/vm_creator.rb +32 -4
- data/lib/cloud/vsphere/vm_creator_builder.rb +2 -1
- metadata +27 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0a37fd96a19b749f7fb7023caeb04e53d9e2fb64
|
4
|
+
data.tar.gz: 5d99a25f25a4f27b9dfb893ef273d863733cd525
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fe5b85fae3bed0d442b7bbe1f69997b573171afd78ab582d7a5201272ece1a5c80a07ce666c80b53729b672529148faf74d88edaf5573fc886e95f922ce924df
|
7
|
+
data.tar.gz: 913bb1de5cabef9f080cfbbb44e6408aec39949561901c88c86ed71eebbd92f953e35b94b7076803862e9381060022ed301cae8800ce12e8f90be2ebe4e9a3d5
|
@@ -3,9 +3,10 @@ module VSphereCloud
|
|
3
3
|
include VimSdk
|
4
4
|
include RetryBlock
|
5
5
|
|
6
|
-
def initialize(client, file_provider)
|
6
|
+
def initialize(client, file_provider, cloud_searcher)
|
7
7
|
@client = client
|
8
8
|
@file_provider = file_provider
|
9
|
+
@cloud_searcher = cloud_searcher
|
9
10
|
end
|
10
11
|
|
11
12
|
def get_current_env(vm, datacenter_name)
|
@@ -30,7 +31,7 @@ module VSphereCloud
|
|
30
31
|
@file_provider.upload_file(location[:datacenter], location[:datastore], "#{location[:vm]}/env.json", env_json)
|
31
32
|
@file_provider.upload_file(location[:datacenter], location[:datastore], "#{location[:vm]}/env.iso", generate_env_iso(env_json))
|
32
33
|
|
33
|
-
datastore = @
|
34
|
+
datastore = @cloud_searcher.get_managed_object(Vim::Datastore, name: location[:datastore])
|
34
35
|
file_name = "[#{location[:datastore]}] #{location[:vm]}/env.iso"
|
35
36
|
|
36
37
|
update_cdrom_env(vm, datastore, file_name)
|
data/lib/cloud/vsphere/client.rb
CHANGED
@@ -1,41 +1,27 @@
|
|
1
1
|
require 'ruby_vim_sdk'
|
2
|
+
require 'cloud/vsphere/cloud_searcher'
|
3
|
+
require 'cloud/vsphere/soap_stub'
|
2
4
|
|
3
5
|
module VSphereCloud
|
4
6
|
|
5
7
|
class Client
|
6
8
|
include VimSdk
|
7
|
-
PC = Vmodl::Query::PropertyCollector
|
8
|
-
|
9
9
|
class AlreadyLoggedInException < StandardError; end
|
10
10
|
class NotLoggedInException < StandardError; end
|
11
11
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
def initialize(host, options = {})
|
17
|
-
http_client = HTTPClient.new
|
18
|
-
soap_log = options['soap_log']
|
19
|
-
case soap_log
|
20
|
-
when String
|
21
|
-
log_file = File.open(soap_log, 'w')
|
22
|
-
log_file.sync = true
|
23
|
-
http_client.debug_dev = log_file
|
24
|
-
when IO, StringIO
|
25
|
-
http_client.debug_dev = soap_log
|
26
|
-
end
|
27
|
-
http_client.send_timeout = 14400
|
28
|
-
http_client.receive_timeout = 14400
|
29
|
-
http_client.connect_timeout = 30
|
30
|
-
http_client.ssl_config.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
12
|
+
attr_reader :cloud_searcher, :service_content, :service_instance, :soap_stub
|
13
|
+
|
14
|
+
def initialize(host, options={})
|
15
|
+
@soap_stub = SoapStub.new(host, options[:soap_log]).create
|
31
16
|
|
32
|
-
@
|
17
|
+
@service_instance =Vim::ServiceInstance.new('ServiceInstance', @soap_stub)
|
18
|
+
@service_content = @service_instance.content
|
33
19
|
|
34
|
-
@service_instance = Vim::ServiceInstance.new('ServiceInstance', soap_stub)
|
35
|
-
@service_content = service_instance.content
|
36
20
|
@metrics_cache = {}
|
37
21
|
@lock = Mutex.new
|
38
22
|
@logger = Bosh::Clouds::Config.logger
|
23
|
+
|
24
|
+
@cloud_searcher = CloudSearcher.new(service_content, @logger)
|
39
25
|
end
|
40
26
|
|
41
27
|
def login(username, password, locale)
|
@@ -49,94 +35,9 @@ module VSphereCloud
|
|
49
35
|
@service_content.session_manager.logout
|
50
36
|
end
|
51
37
|
|
52
|
-
def get_properties(obj, type, properties, options = {})
|
53
|
-
properties = [properties] if properties.kind_of?(String)
|
54
|
-
property_specs = [PC::PropertySpec.new(:type => type, :all => false, :path_set => properties)]
|
55
|
-
|
56
|
-
if obj.is_a?(Vmodl::ManagedObject)
|
57
|
-
object_spec = PC::ObjectSpec.new(:obj => obj, :skip => false)
|
58
|
-
else
|
59
|
-
object_spec = obj.collect { |o| PC::ObjectSpec.new(:obj => o, :skip => false) }
|
60
|
-
end
|
61
|
-
|
62
|
-
filter_spec = PC::FilterSpec.new(:prop_set => property_specs, :object_set => object_spec)
|
63
|
-
|
64
|
-
attempts = 0
|
65
|
-
begin
|
66
|
-
properties_response = get_all_properties(filter_spec)
|
67
|
-
result = {}
|
68
|
-
|
69
|
-
properties_response.each do |object_content|
|
70
|
-
object_properties = {:obj => object_content.obj}
|
71
|
-
if options[:ensure_all]
|
72
|
-
remaining_properties = Set.new(properties)
|
73
|
-
else
|
74
|
-
remaining_properties = Set.new(options[:ensure])
|
75
|
-
end
|
76
|
-
if object_content.prop_set
|
77
|
-
object_content.prop_set.each do |property|
|
78
|
-
object_properties[property.name] = property.val
|
79
|
-
remaining_properties.delete(property.name)
|
80
|
-
end
|
81
|
-
end
|
82
|
-
unless remaining_properties.empty?
|
83
|
-
raise "The object[s] #{obj.pretty_inspect} " +
|
84
|
-
"should have the following properties: #{properties.pretty_inspect}, " +
|
85
|
-
"but they were missing these: #{remaining_properties.pretty_inspect}."
|
86
|
-
end
|
87
|
-
result[object_content.obj] = object_properties
|
88
|
-
end
|
89
|
-
|
90
|
-
result = result.values.first if obj.is_a?(Vmodl::ManagedObject)
|
91
|
-
result
|
92
|
-
rescue => e
|
93
|
-
attempts += 1
|
94
|
-
if attempts < 8
|
95
|
-
sleep_interval = 2 ** attempts
|
96
|
-
@logger.warn("Error retrieving properties, retrying in #{sleep_interval} seconds: " +
|
97
|
-
"#{e} - #{e.backtrace.join("\n")}")
|
98
|
-
sleep(sleep_interval)
|
99
|
-
retry
|
100
|
-
else
|
101
|
-
raise e
|
102
|
-
end
|
103
|
-
end
|
104
|
-
end
|
105
|
-
|
106
|
-
def get_property(obj, type, property, options = {})
|
107
|
-
get_properties(obj, type, property, options)[property]
|
108
|
-
end
|
109
|
-
|
110
|
-
def get_managed_objects(type, options={})
|
111
|
-
root = options[:root] || @service_content.root_folder
|
112
|
-
property_specs = [PC::PropertySpec.new(:type => type, :all => false, :path_set => ["name"])]
|
113
|
-
filter_spec = get_search_filter_spec(root, property_specs)
|
114
|
-
object_specs = get_all_properties(filter_spec)
|
115
|
-
|
116
|
-
result = []
|
117
|
-
object_specs.each do |object_spec|
|
118
|
-
name = object_spec.prop_set.first.val
|
119
|
-
if options[:name].nil? || name == options[:name]
|
120
|
-
if options[:include_name]
|
121
|
-
result << [name , object_spec.obj]
|
122
|
-
else
|
123
|
-
result << object_spec.obj
|
124
|
-
end
|
125
|
-
end
|
126
|
-
end
|
127
|
-
result
|
128
|
-
end
|
129
|
-
|
130
|
-
def get_managed_object(type, options)
|
131
|
-
result = get_managed_objects(type, options)
|
132
|
-
raise "Could not find #{type}: #{options.pretty_inspect}" if result.length == 0
|
133
|
-
raise "Found more than one #{type}: #{options.pretty_inspect}" if result.length > 1
|
134
|
-
result.first
|
135
|
-
end
|
136
|
-
|
137
38
|
def find_parent(obj, parent_type)
|
138
39
|
while obj && obj.class != parent_type
|
139
|
-
obj = get_property(obj, obj.class, "parent", :ensure_all => true)
|
40
|
+
obj = @cloud_searcher.get_property(obj, obj.class, "parent", :ensure_all => true)
|
140
41
|
end
|
141
42
|
obj
|
142
43
|
end
|
@@ -175,7 +76,7 @@ module VSphereCloud
|
|
175
76
|
end
|
176
77
|
|
177
78
|
def get_cdrom_device(vm)
|
178
|
-
devices = get_property(vm, Vim::VirtualMachine, 'config.hardware.device', ensure_all: true)
|
79
|
+
devices = @cloud_searcher.get_property(vm, Vim::VirtualMachine, 'config.hardware.device', ensure_all: true)
|
179
80
|
devices.find { |device| device.kind_of?(Vim::Vm::Device::VirtualCdrom) }
|
180
81
|
end
|
181
82
|
|
@@ -199,8 +100,10 @@ module VSphereCloud
|
|
199
100
|
def move_disk(source_datacenter, source_path, dest_datacenter, dest_path)
|
200
101
|
tasks = []
|
201
102
|
[".vmdk", "-flat.vmdk"].each do |extension|
|
202
|
-
tasks << @service_content.file_manager.move_file(
|
203
|
-
|
103
|
+
tasks << @service_content.file_manager.move_file(
|
104
|
+
"#{source_path}#{extension}", source_datacenter,
|
105
|
+
"#{dest_path}#{extension}", dest_datacenter, false
|
106
|
+
)
|
204
107
|
end
|
205
108
|
|
206
109
|
tasks.each { |task| wait_for_task(task) }
|
@@ -260,8 +163,12 @@ module VSphereCloud
|
|
260
163
|
interval = 1.0
|
261
164
|
started = Time.now
|
262
165
|
loop do
|
263
|
-
properties = get_properties(
|
264
|
-
|
166
|
+
properties = @cloud_searcher.get_properties(
|
167
|
+
[task],
|
168
|
+
Vim::Task,
|
169
|
+
["info.progress", "info.state", "info.result", "info.error"],
|
170
|
+
ensure: ["info.state"]
|
171
|
+
)[task]
|
265
172
|
|
266
173
|
duration = Time.now - started
|
267
174
|
raise "Task taking too long" if duration > 3600 # 1 hour
|
@@ -291,128 +198,6 @@ module VSphereCloud
|
|
291
198
|
end
|
292
199
|
end
|
293
200
|
|
294
|
-
def get_search_filter_spec(obj, property_specs)
|
295
|
-
resource_pool_traversal_spec = PC::TraversalSpec.new(
|
296
|
-
:name => "resourcePoolTraversalSpec",
|
297
|
-
:type => Vim::ResourcePool,
|
298
|
-
:path => "resourcePool",
|
299
|
-
:skip => false,
|
300
|
-
:select_set => [
|
301
|
-
PC::SelectionSpec.new(:name => "resourcePoolTraversalSpec"),
|
302
|
-
PC::SelectionSpec.new(:name => "resourcePoolVmTraversalSpec")
|
303
|
-
]
|
304
|
-
)
|
305
|
-
|
306
|
-
resource_pool_vm_traversal_spec = PC::TraversalSpec.new(
|
307
|
-
:name => "resourcePoolVmTraversalSpec",
|
308
|
-
:type => Vim::ResourcePool,
|
309
|
-
:path => "vm",
|
310
|
-
:skip => false
|
311
|
-
)
|
312
|
-
|
313
|
-
compute_resource_rp_traversal_spec = PC::TraversalSpec.new(
|
314
|
-
:name => "computeResourceRpTraversalSpec",
|
315
|
-
:type => Vim::ComputeResource,
|
316
|
-
:path => "resourcePool",
|
317
|
-
:skip => false,
|
318
|
-
:select_set => [
|
319
|
-
PC::SelectionSpec.new(:name => "resourcePoolTraversalSpec"),
|
320
|
-
PC::SelectionSpec.new(:name => "resourcePoolVmTraversalSpec")
|
321
|
-
]
|
322
|
-
)
|
323
|
-
|
324
|
-
compute_resource_datastore_traversal_spec = PC::TraversalSpec.new(
|
325
|
-
:name => "computeResourceDatastoreTraversalSpec",
|
326
|
-
:type => Vim::ComputeResource,
|
327
|
-
:path => "datastore",
|
328
|
-
:skip => false
|
329
|
-
)
|
330
|
-
|
331
|
-
compute_resource_host_traversal_spec = PC::TraversalSpec.new(
|
332
|
-
:name => "computeResourceHostTraversalSpec",
|
333
|
-
:type => Vim::ComputeResource,
|
334
|
-
:path => "host",
|
335
|
-
:skip => false
|
336
|
-
)
|
337
|
-
|
338
|
-
datacenter_host_traversal_spec = PC::TraversalSpec.new(
|
339
|
-
:name => "datacenterHostTraversalSpec",
|
340
|
-
:type => Vim::Datacenter,
|
341
|
-
:path => "hostFolder",
|
342
|
-
:skip => false,
|
343
|
-
:select_set => [
|
344
|
-
PC::SelectionSpec.new(:name => "folderTraversalSpec")
|
345
|
-
]
|
346
|
-
)
|
347
|
-
|
348
|
-
datacenter_vm_traversal_spec = PC::TraversalSpec.new(
|
349
|
-
:name => "datacenterVmTraversalSpec",
|
350
|
-
:type => Vim::Datacenter,
|
351
|
-
:path => "vmFolder",
|
352
|
-
:skip => false,
|
353
|
-
:select_set => [
|
354
|
-
PC::SelectionSpec.new(:name => "folderTraversalSpec")
|
355
|
-
]
|
356
|
-
)
|
357
|
-
|
358
|
-
host_vm_traversal_spec = PC::TraversalSpec.new(
|
359
|
-
:name => "hostVmTraversalSpec",
|
360
|
-
:type => Vim::HostSystem,
|
361
|
-
:path => "vm",
|
362
|
-
:skip => false,
|
363
|
-
:select_set => [
|
364
|
-
PC::SelectionSpec.new(:name => "folderTraversalSpec")
|
365
|
-
]
|
366
|
-
)
|
367
|
-
|
368
|
-
folder_traversal_spec = PC::TraversalSpec.new(
|
369
|
-
:name => "folderTraversalSpec",
|
370
|
-
:type => Vim::Folder,
|
371
|
-
:path => "childEntity",
|
372
|
-
:skip => false,
|
373
|
-
:select_set => [
|
374
|
-
PC::SelectionSpec.new(:name => "folderTraversalSpec"),
|
375
|
-
PC::SelectionSpec.new(:name => "datacenterHostTraversalSpec"),
|
376
|
-
PC::SelectionSpec.new(:name => "datacenterVmTraversalSpec"),
|
377
|
-
PC::SelectionSpec.new(:name => "computeResourceRpTraversalSpec"),
|
378
|
-
PC::SelectionSpec.new(:name => "computeResourceDatastoreTraversalSpec"),
|
379
|
-
PC::SelectionSpec.new(:name => "computeResourceHostTraversalSpec"),
|
380
|
-
PC::SelectionSpec.new(:name => "hostVmTraversalSpec"),
|
381
|
-
PC::SelectionSpec.new(:name => "resourcePoolVmTraversalSpec")
|
382
|
-
]
|
383
|
-
)
|
384
|
-
|
385
|
-
obj_spec = PC::ObjectSpec.new(
|
386
|
-
:obj => obj,
|
387
|
-
:skip => false,
|
388
|
-
:select_set => [
|
389
|
-
folder_traversal_spec,
|
390
|
-
datacenter_vm_traversal_spec,
|
391
|
-
datacenter_host_traversal_spec,
|
392
|
-
compute_resource_host_traversal_spec,
|
393
|
-
compute_resource_datastore_traversal_spec,
|
394
|
-
compute_resource_rp_traversal_spec,
|
395
|
-
resource_pool_traversal_spec,
|
396
|
-
host_vm_traversal_spec,
|
397
|
-
resource_pool_vm_traversal_spec
|
398
|
-
]
|
399
|
-
)
|
400
|
-
|
401
|
-
PC::FilterSpec.new(:prop_set => property_specs, :object_set => [obj_spec])
|
402
|
-
end
|
403
|
-
|
404
|
-
def get_all_properties(filter_spec)
|
405
|
-
result = []
|
406
|
-
retrieve_result = @service_content.property_collector.retrieve_properties_ex([filter_spec],
|
407
|
-
PC::RetrieveOptions.new)
|
408
|
-
until retrieve_result.nil?
|
409
|
-
retrieve_result.objects.each { |object_content| result << object_content }
|
410
|
-
break if retrieve_result.token.nil?
|
411
|
-
retrieve_result = @service_content.property_collector.continue_retrieve_properties_ex(retrieve_result.token)
|
412
|
-
end
|
413
|
-
result
|
414
|
-
end
|
415
|
-
|
416
201
|
def get_perf_counters(mobs, names, options = {})
|
417
202
|
metrics = find_perf_metric_names(mobs.first, names)
|
418
203
|
metric_ids = metrics.values
|
@@ -446,6 +231,8 @@ module VSphereCloud
|
|
446
231
|
result
|
447
232
|
end
|
448
233
|
|
234
|
+
private
|
235
|
+
|
449
236
|
def find_perf_metric_names(mob, names)
|
450
237
|
@lock.synchronize do
|
451
238
|
unless @metrics_cache.has_key?(mob.class)
|
@@ -477,5 +264,4 @@ module VSphereCloud
|
|
477
264
|
result
|
478
265
|
end
|
479
266
|
end
|
480
|
-
|
481
267
|
end
|
data/lib/cloud/vsphere/cloud.rb
CHANGED
@@ -9,6 +9,7 @@ require 'cloud/vsphere/file_provider'
|
|
9
9
|
require 'cloud/vsphere/agent_env'
|
10
10
|
require 'cloud/vsphere/lease_obtainer'
|
11
11
|
require 'cloud/vsphere/lease_updater'
|
12
|
+
require 'cloud/vsphere/drs_rules/drs_rule_cleaner'
|
12
13
|
require 'cloud/vsphere/resources'
|
13
14
|
require 'cloud/vsphere/resources/cluster'
|
14
15
|
require 'cloud/vsphere/resources/datacenter'
|
@@ -38,9 +39,11 @@ module VSphereCloud
|
|
38
39
|
|
39
40
|
@logger = config.logger
|
40
41
|
@client = config.client
|
42
|
+
@cloud_searcher = CloudSearcher.new(@client.service_content, @logger)
|
43
|
+
|
41
44
|
@resources = Resources.new(config)
|
42
45
|
@file_provider = FileProvider.new(config.rest_client, config.vcenter_host)
|
43
|
-
@agent_env = AgentEnv.new(client, @file_provider)
|
46
|
+
@agent_env = AgentEnv.new(client, @file_provider, @cloud_searcher)
|
44
47
|
|
45
48
|
# Global lock
|
46
49
|
@lock = Mutex.new
|
@@ -76,7 +79,12 @@ module VSphereCloud
|
|
76
79
|
disk = VSphereCloud::Models::Disk.find(uuid: disk_id)
|
77
80
|
|
78
81
|
return false unless disk
|
79
|
-
|
82
|
+
# Disk path is only being set when disk is created in vSphere.
|
83
|
+
# If the path is not set it means that disk was only created in
|
84
|
+
# CPI database and attach disk was not called or failed.
|
85
|
+
# We consider that disk is missing only if CPI desired state
|
86
|
+
# is to be present but it actually missing in infrastructure.
|
87
|
+
return true unless disk.path
|
80
88
|
return false unless disk.datacenter
|
81
89
|
|
82
90
|
@client.has_disk?(disk.path, disk.datacenter)
|
@@ -103,7 +111,7 @@ module VSphereCloud
|
|
103
111
|
|
104
112
|
import_spec_result = import_ovf(name, ovf_file, cluster.resource_pool.mob, datastore.mob)
|
105
113
|
|
106
|
-
lease_obtainer = LeaseObtainer.new(@
|
114
|
+
lease_obtainer = LeaseObtainer.new(@cloud_searcher, @logger)
|
107
115
|
nfc_lease = lease_obtainer.obtain(
|
108
116
|
cluster.resource_pool,
|
109
117
|
import_spec_result.import_spec,
|
@@ -115,7 +123,7 @@ module VSphereCloud
|
|
115
123
|
result = name
|
116
124
|
|
117
125
|
@logger.info('Removing NICs')
|
118
|
-
devices =
|
126
|
+
devices = @cloud_searcher.get_property(vm, Vim::VirtualMachine, 'config.hardware.device', ensure_all: true)
|
119
127
|
config = Vim::Vm::ConfigSpec.new
|
120
128
|
config.device_change = []
|
121
129
|
|
@@ -142,8 +150,8 @@ module VSphereCloud
|
|
142
150
|
Bosh::ThreadPool.new(max_threads: 32, logger: @logger).wrap do |pool|
|
143
151
|
@resources.datacenters.each_value do |datacenter|
|
144
152
|
@logger.info("Looking for stemcell replicas in: #{datacenter.name}")
|
145
|
-
templates =
|
146
|
-
template_properties =
|
153
|
+
templates = @cloud_searcher.get_property(datacenter.template_folder.mob, Vim::Folder, 'childEntity', ensure_all: true)
|
154
|
+
template_properties = @cloud_searcher.get_properties(templates, Vim::VirtualMachine, ['name'])
|
147
155
|
template_properties.each_value do |properties|
|
148
156
|
template_name = properties['name'].gsub('%2f', '/')
|
149
157
|
if template_name.split('/').first.strip == stemcell
|
@@ -186,6 +194,7 @@ module VSphereCloud
|
|
186
194
|
choose_placer(cloud_properties),
|
187
195
|
cloud_properties,
|
188
196
|
@client,
|
197
|
+
@cloud_searcher,
|
189
198
|
@logger,
|
190
199
|
self,
|
191
200
|
@agent_env,
|
@@ -201,7 +210,7 @@ module VSphereCloud
|
|
201
210
|
vm = get_vm_by_cid(vm_cid)
|
202
211
|
datacenter = client.find_parent(vm, Vim::Datacenter)
|
203
212
|
properties =
|
204
|
-
|
213
|
+
@cloud_searcher.get_properties(
|
205
214
|
vm,
|
206
215
|
Vim::VirtualMachine,
|
207
216
|
['runtime.powerState', 'runtime.question', 'config.hardware.device', 'name'],
|
@@ -215,7 +224,7 @@ module VSphereCloud
|
|
215
224
|
@logger.info("VM is blocked on a question: #{question.text}, " +
|
216
225
|
"providing default answer: #{choices.choice_info[choices.default_index].label}")
|
217
226
|
client.answer_vm(vm, question.id, choices.choice_info[choices.default_index].key)
|
218
|
-
power_state =
|
227
|
+
power_state = @cloud_searcher.get_property(vm, Vim::VirtualMachine, 'runtime.powerState')
|
219
228
|
else
|
220
229
|
power_state = properties['runtime.powerState']
|
221
230
|
end
|
@@ -256,6 +265,12 @@ module VSphereCloud
|
|
256
265
|
end
|
257
266
|
end
|
258
267
|
end
|
268
|
+
|
269
|
+
DrsRuleCleaner.new(
|
270
|
+
@cloud_searcher,
|
271
|
+
@client.service_content.custom_fields_manager,
|
272
|
+
@logger
|
273
|
+
).clean
|
259
274
|
end
|
260
275
|
end
|
261
276
|
|
@@ -263,7 +278,7 @@ module VSphereCloud
|
|
263
278
|
with_thread_name("reboot_vm(#{vm_cid})") do
|
264
279
|
vm = get_vm_by_cid(vm_cid)
|
265
280
|
datacenter = client.find_parent(vm, Vim::Datacenter)
|
266
|
-
power_state =
|
281
|
+
power_state = @cloud_searcher.get_property(vm, Vim::VirtualMachine, 'runtime.powerState')
|
267
282
|
|
268
283
|
@logger.info("Reboot vm = #{vm_cid}")
|
269
284
|
if power_state != Vim::VirtualMachine::PowerState::POWERED_ON
|
@@ -336,9 +351,9 @@ module VSphereCloud
|
|
336
351
|
|
337
352
|
@logger.info("Configuring: #{vm_cid} to use the following network settings: #{networks.pretty_inspect}")
|
338
353
|
vm = get_vm_by_cid(vm_cid)
|
339
|
-
devices =
|
354
|
+
devices = @cloud_searcher.get_property(vm, Vim::VirtualMachine, 'config.hardware.device', ensure_all: true)
|
340
355
|
datacenter = client.find_parent(vm, Vim::Datacenter)
|
341
|
-
datacenter_name =
|
356
|
+
datacenter_name = @cloud_searcher.get_property(datacenter, Vim::Datacenter, 'name')
|
342
357
|
pci_controller = devices.find { |device| device.kind_of?(Vim::Vm::Device::VirtualPCIController) }
|
343
358
|
|
344
359
|
config = Vim::Vm::ConfigSpec.new
|
@@ -364,7 +379,7 @@ module VSphereCloud
|
|
364
379
|
env = @agent_env.get_current_env(vm, datacenter_name)
|
365
380
|
@logger.debug("Reading current agent env: #{env.pretty_inspect}")
|
366
381
|
|
367
|
-
devices =
|
382
|
+
devices = @cloud_searcher.get_property(vm, Vim::VirtualMachine, 'config.hardware.device', ensure_all: true)
|
368
383
|
env['networks'] = generate_network_env(devices, networks, dvs_index)
|
369
384
|
|
370
385
|
@logger.debug("Updating agent env to: #{env.pretty_inspect}")
|
@@ -377,18 +392,18 @@ module VSphereCloud
|
|
377
392
|
end
|
378
393
|
|
379
394
|
def get_vm_host_info(vm_ref)
|
380
|
-
vm = @
|
395
|
+
vm = @cloud_searcher.get_properties(vm_ref, Vim::VirtualMachine, 'runtime')
|
381
396
|
vm_runtime = vm['runtime']
|
382
397
|
|
383
|
-
properties = @
|
398
|
+
properties = @cloud_searcher.get_properties(vm_runtime.host, Vim::HostSystem, ['datastore', 'parent'], ensure_all: true)
|
384
399
|
|
385
400
|
# Get the cluster that the vm's host belongs to.
|
386
|
-
cluster = @
|
401
|
+
cluster = @cloud_searcher.get_properties(properties['parent'], Vim::ClusterComputeResource, 'name')
|
387
402
|
|
388
403
|
# Get the datastores that are accessible to the vm's host.
|
389
404
|
datastores_accessible = []
|
390
405
|
properties['datastore'].each do |store|
|
391
|
-
ds = @
|
406
|
+
ds = @cloud_searcher.get_properties(store, Vim::Datastore, 'info', ensure_all: true)
|
392
407
|
datastores_accessible << ds['info'].name
|
393
408
|
end
|
394
409
|
|
@@ -421,7 +436,7 @@ module VSphereCloud
|
|
421
436
|
datacenter = client.find_parent(vm, Vim::Datacenter)
|
422
437
|
datacenter_name = config.datacenter_name
|
423
438
|
|
424
|
-
vm_properties =
|
439
|
+
vm_properties = @cloud_searcher.get_properties(vm, Vim::VirtualMachine, 'config.hardware.device', ensure_all: true)
|
425
440
|
host_info = get_vm_host_info(vm)
|
426
441
|
|
427
442
|
create_disk = false
|
@@ -523,7 +538,7 @@ module VSphereCloud
|
|
523
538
|
@agent_env.set_env(vm, location, env)
|
524
539
|
end
|
525
540
|
|
526
|
-
devices =
|
541
|
+
devices = @cloud_searcher.get_property(vm, Vim::VirtualMachine, 'config.hardware.device', ensure_all: true)
|
527
542
|
vmdk_path = "#{disk.path}.vmdk"
|
528
543
|
virtual_disk =
|
529
544
|
devices.find do |device|
|
@@ -543,7 +558,7 @@ module VSphereCloud
|
|
543
558
|
# that the change has been applied. This is a known issue for vsphere 4.
|
544
559
|
# Fixed in vsphere 5.
|
545
560
|
5.times do
|
546
|
-
devices =
|
561
|
+
devices = @cloud_searcher.get_property(vm, Vim::VirtualMachine, 'config.hardware.device', ensure_all: true)
|
547
562
|
virtual_disk =
|
548
563
|
devices.find do |device|
|
549
564
|
device.kind_of?(Vim::Vm::Device::VirtualDisk) &&
|
@@ -575,12 +590,17 @@ module VSphereCloud
|
|
575
590
|
@logger.info("Deleting disk: #{disk_cid}")
|
576
591
|
disk = Models::Disk.first(uuid: disk_cid)
|
577
592
|
if disk
|
578
|
-
|
579
|
-
|
580
|
-
|
593
|
+
unless has_disk?(disk_cid)
|
594
|
+
raise Bosh::Clouds::DiskNotFound.new(true), "disk #{disk_cid} not found"
|
595
|
+
end
|
581
596
|
|
582
|
-
|
597
|
+
datacenter = client.find_by_inventory_path(disk.datacenter)
|
598
|
+
if datacenter.nil?
|
599
|
+
raise Bosh::Clouds::DiskNotFound.new(true), "datacenter for disk #{disk_cid} not found"
|
583
600
|
end
|
601
|
+
|
602
|
+
client.delete_disk(datacenter, disk.path) if disk.path
|
603
|
+
|
584
604
|
disk.destroy
|
585
605
|
@logger.info('Finished deleting disk')
|
586
606
|
else
|
@@ -601,7 +621,7 @@ module VSphereCloud
|
|
601
621
|
stemcell_vm = client.find_by_inventory_path([cluster.datacenter.name, 'vm',
|
602
622
|
cluster.datacenter.template_folder.name, stemcell])
|
603
623
|
raise "Could not find stemcell: #{stemcell}" if stemcell_vm.nil?
|
604
|
-
stemcell_datastore =
|
624
|
+
stemcell_datastore = @cloud_searcher.get_property(stemcell_vm, Vim::VirtualMachine, 'datastore', ensure_all: true)
|
605
625
|
|
606
626
|
if stemcell_datastore != datastore.mob
|
607
627
|
@logger.info("Stemcell lives on a different datastore, looking for a local copy of: #{stemcell}.")
|
@@ -715,13 +735,13 @@ module VSphereCloud
|
|
715
735
|
|
716
736
|
if vm_name.nil? || datastore_name.nil?
|
717
737
|
vm_properties =
|
718
|
-
|
738
|
+
@cloud_searcher.get_properties(vm, Vim::VirtualMachine, ['config.hardware.device', 'name'], ensure_all: true)
|
719
739
|
vm_name = vm_properties['name']
|
720
740
|
|
721
741
|
unless datastore_name
|
722
742
|
devices = vm_properties['config.hardware.device']
|
723
743
|
datastore = get_primary_datastore(devices)
|
724
|
-
datastore_name =
|
744
|
+
datastore_name = @cloud_searcher.get_property(datastore, Vim::Datastore, 'name')
|
725
745
|
end
|
726
746
|
end
|
727
747
|
|
@@ -794,13 +814,13 @@ module VSphereCloud
|
|
794
814
|
def create_nic_config_spec(v_network_name, network, controller_key, dvs_index)
|
795
815
|
raise "Can't find network: #{v_network_name}" if network.nil?
|
796
816
|
if network.class == Vim::Dvs::DistributedVirtualPortgroup
|
797
|
-
portgroup_properties =
|
817
|
+
portgroup_properties = @cloud_searcher.get_properties(network,
|
798
818
|
Vim::Dvs::DistributedVirtualPortgroup,
|
799
819
|
['config.key', 'config.distributedVirtualSwitch'],
|
800
820
|
ensure_all: true)
|
801
821
|
|
802
822
|
switch = portgroup_properties['config.distributedVirtualSwitch']
|
803
|
-
switch_uuid =
|
823
|
+
switch_uuid = @cloud_searcher.get_property(switch, Vim::DistributedVirtualSwitch, 'uuid', ensure_all: true)
|
804
824
|
|
805
825
|
port = Vim::Dvs::PortConnection.new
|
806
826
|
port.switch_uuid = switch_uuid
|
@@ -878,14 +898,14 @@ module VSphereCloud
|
|
878
898
|
|
879
899
|
def wait_for_nfc_lease(lease)
|
880
900
|
loop do
|
881
|
-
state =
|
901
|
+
state = @cloud_searcher.get_property(lease, Vim::HttpNfcLease, 'state')
|
882
902
|
return state unless state == Vim::HttpNfcLease::State::INITIALIZING
|
883
903
|
sleep(1.0)
|
884
904
|
end
|
885
905
|
end
|
886
906
|
|
887
907
|
def upload_ovf(ovf, lease, file_items)
|
888
|
-
info =
|
908
|
+
info = @cloud_searcher.get_property(lease, Vim::HttpNfcLease, 'info', ensure_all: true)
|
889
909
|
lease_updater = LeaseUpdater.new(client, lease)
|
890
910
|
|
891
911
|
info.device_url.each do |device_url|
|
@@ -925,7 +945,7 @@ module VSphereCloud
|
|
925
945
|
def wait_until_off(vm, timeout)
|
926
946
|
started = Time.now
|
927
947
|
loop do
|
928
|
-
power_state =
|
948
|
+
power_state = @cloud_searcher.get_property(vm, Vim::VirtualMachine, 'runtime.powerState')
|
929
949
|
break if power_state == Vim::VirtualMachine::PowerState::POWERED_OFF
|
930
950
|
raise TimeoutException if Time.now - started > timeout
|
931
951
|
sleep(1.0)
|
@@ -960,14 +980,21 @@ module VSphereCloud
|
|
960
980
|
def choose_placer(cloud_properties)
|
961
981
|
datacenter_spec = cloud_properties.fetch('datacenters', []).first
|
962
982
|
cluster_spec = datacenter_spec.fetch('clusters', []).first if datacenter_spec
|
963
|
-
|
983
|
+
|
984
|
+
unless cluster_spec.nil?
|
985
|
+
cluster_name = cluster_spec.keys.first
|
986
|
+
cluster = find_cluster(cluster_name)
|
987
|
+
cluster_config = cluster_spec.values.first
|
988
|
+
drs_rules = cluster_config.fetch('drs_rules', [])
|
989
|
+
placer = FixedClusterPlacer.new(cluster, drs_rules)
|
990
|
+
end
|
964
991
|
|
965
992
|
placer.nil? ? @resources : placer
|
966
993
|
end
|
967
994
|
|
968
|
-
def find_cluster(
|
995
|
+
def find_cluster(cluster_name)
|
969
996
|
datacenter = Resources::Datacenter.new(config)
|
970
|
-
datacenter.clusters[
|
997
|
+
datacenter.clusters[cluster_name]
|
971
998
|
end
|
972
999
|
|
973
1000
|
attr_reader :config
|