bosh_vsphere_cpi 1.2690.4.0 → 1.2693.0
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 +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
|