bosh_vsphere_cpi 0.4.8 → 0.4.9
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/cloud/vsphere/cloud.rb +1 -1
- data/lib/cloud/vsphere/resources.rb +56 -16
- data/lib/cloud/vsphere/version.rb +1 -1
- data/spec/unit/vsphere_resource_spec.rb +23 -3
- metadata +40 -15
data/lib/cloud/vsphere/cloud.rb
CHANGED
@@ -906,7 +906,7 @@ module VSphereCloud
|
|
906
906
|
def create_nic_config_spec(v_network_name, network, controller_key, dvs_index)
|
907
907
|
raise "Can't find network: #{v_network_name}" if network.nil?
|
908
908
|
if network.class == Vim::Dvs::DistributedVirtualPortgroup
|
909
|
-
portgroup_properties = client.get_properties(network, Vim::DistributedVirtualPortgroup,
|
909
|
+
portgroup_properties = client.get_properties(network, Vim::Dvs::DistributedVirtualPortgroup,
|
910
910
|
["config.key", "config.distributedVirtualSwitch"],
|
911
911
|
:ensure_all => true)
|
912
912
|
|
@@ -218,23 +218,35 @@ module VSphereCloud
|
|
218
218
|
|
219
219
|
return root_resource_pool if requested_resource_pool.nil?
|
220
220
|
|
221
|
-
|
222
|
-
|
221
|
+
return traverse_resource_pool(requested_resource_pool, root_resource_pool)
|
222
|
+
end
|
223
|
+
|
224
|
+
def traverse_resource_pool(requested_resource_pool, resource_pool)
|
225
|
+
# Get list of resource pools under this resource pool
|
226
|
+
properties = @client.get_properties(resource_pool, Vim::ResourcePool, ["resourcePool"])
|
227
|
+
|
223
228
|
if properties && properties["resourcePool"] && properties["resourcePool"].size != 0
|
224
229
|
|
225
|
-
# Get the name of each resource pool under this
|
230
|
+
# Get the name of each resource pool under this resource pool
|
226
231
|
child_properties = @client.get_properties(properties["resourcePool"], Vim::ResourcePool, ["name"])
|
227
232
|
if child_properties
|
228
233
|
child_properties.each_value do | resource_pool |
|
229
234
|
if resource_pool["name"] == requested_resource_pool
|
230
|
-
@logger.info("Found requested resource pool #{requested_resource_pool}
|
235
|
+
@logger.info("Found requested resource pool #{requested_resource_pool}")
|
231
236
|
return resource_pool[:obj]
|
232
237
|
end
|
233
238
|
end
|
239
|
+
|
240
|
+
child_properties.each_value do | resource_pool |
|
241
|
+
pool = traverse_resource_pool(requested_resource_pool, resource_pool[:obj])
|
242
|
+
return pool if pool != nil
|
243
|
+
end
|
234
244
|
end
|
245
|
+
|
246
|
+
return nil
|
235
247
|
end
|
236
|
-
|
237
|
-
nil
|
248
|
+
|
249
|
+
return nil
|
238
250
|
end
|
239
251
|
|
240
252
|
def fetch_datastores(datacenter, datastore_mobs, match_pattern)
|
@@ -326,14 +338,36 @@ module VSphereCloud
|
|
326
338
|
@datacenters
|
327
339
|
end
|
328
340
|
|
329
|
-
def filter_used_resources(memory, vm_disk_size, persistent_disks_size, cluster_affinity
|
341
|
+
def filter_used_resources(memory, vm_disk_size, persistent_disks_size, cluster_affinity,
|
342
|
+
report = nil)
|
330
343
|
resources = []
|
331
344
|
datacenters.each_value do |datacenter|
|
332
345
|
datacenter.clusters.each do |cluster|
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
346
|
+
|
347
|
+
unless cluster_affinity.nil? || cluster.mob == cluster_affinity.mob
|
348
|
+
report << "Skipping cluster #{cluster.name} because of affinity mismatch" if report
|
349
|
+
next
|
350
|
+
end
|
351
|
+
|
352
|
+
unless cluster.real_free_memory - memory > MEMORY_THRESHOLD
|
353
|
+
report << "Skipping cluster #{cluster.name} because of memory constraint. " +
|
354
|
+
"Free #{cluster.real_free_memory}, requested #{memory}, " +
|
355
|
+
"threshold #{MEMORY_THRESHOLD}" if report
|
356
|
+
next
|
357
|
+
end
|
358
|
+
|
359
|
+
if pick_datastore(cluster.persistent_datastores, persistent_disks_size, report).nil?
|
360
|
+
report << "Skipping cluster #{cluster.name} because of above persistent " +
|
361
|
+
"disk constraint failure." if report
|
362
|
+
next
|
363
|
+
end
|
364
|
+
|
365
|
+
if (datastore = pick_datastore(cluster.datastores, vm_disk_size, report)).nil?
|
366
|
+
report << "Skipping cluster #{cluster.name} because of above " +
|
367
|
+
"disk constraint failure." if report
|
368
|
+
next
|
369
|
+
end
|
370
|
+
|
337
371
|
resources << [cluster, datastore]
|
338
372
|
end
|
339
373
|
end
|
@@ -375,11 +409,14 @@ module VSphereCloud
|
|
375
409
|
datastore
|
376
410
|
end
|
377
411
|
|
378
|
-
def pick_datastore(datastores, disk_space)
|
412
|
+
def pick_datastore(datastores, disk_space, report = nil)
|
379
413
|
selected_datastores = {}
|
380
414
|
datastores.each { |ds|
|
381
415
|
if ds.real_free_space - disk_space > DISK_THRESHOLD
|
382
416
|
selected_datastores[ds] = score_datastore(ds, disk_space)
|
417
|
+
else
|
418
|
+
report << "Skipping datastore #{ds.name}. Free space #{ds.real_free_space}, " +
|
419
|
+
"requested #{disk_space}, threshold #{DISK_THRESHOLD}" if report
|
383
420
|
end
|
384
421
|
}
|
385
422
|
return nil if selected_datastores.empty?
|
@@ -411,7 +448,7 @@ module VSphereCloud
|
|
411
448
|
chosen_datastore
|
412
449
|
end
|
413
450
|
|
414
|
-
def find_resources(memory, disk_size, persistent_disks_size, cluster_affinity)
|
451
|
+
def find_resources(memory, disk_size, persistent_disks_size, cluster_affinity, report = nil)
|
415
452
|
cluster = nil
|
416
453
|
datastore = nil
|
417
454
|
|
@@ -419,7 +456,8 @@ module VSphereCloud
|
|
419
456
|
disk_size += memory
|
420
457
|
|
421
458
|
@lock.synchronize do
|
422
|
-
resources = filter_used_resources(memory, disk_size, persistent_disks_size,
|
459
|
+
resources = filter_used_resources(memory, disk_size, persistent_disks_size,
|
460
|
+
cluster_affinity, report)
|
423
461
|
break if resources.empty?
|
424
462
|
|
425
463
|
scored_resources = {}
|
@@ -486,8 +524,10 @@ module VSphereCloud
|
|
486
524
|
"#{persistent_disks.pretty_inspect}")
|
487
525
|
end
|
488
526
|
|
489
|
-
|
490
|
-
|
527
|
+
report = []
|
528
|
+
resources = find_resources(memory_size, non_persistent_disks_size,
|
529
|
+
persistent_disks_size, nil, report)
|
530
|
+
raise "No available resources as #{report.join("\n")}" if resources.empty?
|
491
531
|
resources
|
492
532
|
end
|
493
533
|
|
@@ -35,6 +35,12 @@ describe VSphereCloud::Resources do
|
|
35
35
|
datastore
|
36
36
|
end
|
37
37
|
|
38
|
+
def mark_clusters_full
|
39
|
+
@datacenters["dc"].clusters.each do |cluster|
|
40
|
+
cluster.free_memory = 0
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
38
44
|
def mark_datastore_full(cluster_index, datastore_index)
|
39
45
|
datastore = @datacenters["dc"].clusters[cluster_index].datastores[datastore_index]
|
40
46
|
datastore.free_space = 0
|
@@ -69,7 +75,7 @@ describe VSphereCloud::Resources do
|
|
69
75
|
begin
|
70
76
|
@resources.get_resources
|
71
77
|
rescue => e
|
72
|
-
if e.message
|
78
|
+
if e.message =~ /No available resources.*/
|
73
79
|
got_exception = true
|
74
80
|
end
|
75
81
|
end
|
@@ -214,6 +220,20 @@ describe VSphereCloud::Resources do
|
|
214
220
|
datastore.name.should match(/cluster2/)
|
215
221
|
end
|
216
222
|
|
223
|
+
it "should raise an exception if clusters are out of memory" do
|
224
|
+
mark_clusters_full
|
225
|
+
@resources.stub!(:datacenters).and_return(@datacenters)
|
226
|
+
got_exception = false
|
227
|
+
begin
|
228
|
+
cluster, datastore = @resources.get_resources
|
229
|
+
rescue => e
|
230
|
+
if e.message =~ /No available resources.*/ && e.message =~ /.*Skipping.*/
|
231
|
+
got_exception = true
|
232
|
+
end
|
233
|
+
end
|
234
|
+
got_exception.should be_true
|
235
|
+
end
|
236
|
+
|
217
237
|
it "should raise an exception if all persistent datastores are full" do
|
218
238
|
mark_persistent_datastore_full(0, 0)
|
219
239
|
mark_persistent_datastore_full(0, 1)
|
@@ -226,7 +246,7 @@ describe VSphereCloud::Resources do
|
|
226
246
|
begin
|
227
247
|
cluster, datastore = @resources.get_resources
|
228
248
|
rescue => e
|
229
|
-
if e.message
|
249
|
+
if e.message =~ /No available resources.*/ && e.message =~ /.*Skipping.*/
|
230
250
|
got_exception = true
|
231
251
|
end
|
232
252
|
end
|
@@ -245,7 +265,7 @@ describe VSphereCloud::Resources do
|
|
245
265
|
begin
|
246
266
|
cluster, datastore = @resources.get_resources
|
247
267
|
rescue => e
|
248
|
-
if e.message
|
268
|
+
if e.message =~ /No available resources.*/ && e.message =~ /.*Skipping.*/
|
249
269
|
got_exception = true
|
250
270
|
end
|
251
271
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bosh_vsphere_cpi
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.9
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-07-20 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bosh_common
|
16
|
-
requirement:
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,15 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements:
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
25
30
|
- !ruby/object:Gem::Dependency
|
26
31
|
name: bosh_cpi
|
27
|
-
requirement:
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
28
33
|
none: false
|
29
34
|
requirements:
|
30
35
|
- - ! '>='
|
@@ -32,10 +37,15 @@ dependencies:
|
|
32
37
|
version: 0.4.2
|
33
38
|
type: :runtime
|
34
39
|
prerelease: false
|
35
|
-
version_requirements:
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: 0.4.2
|
36
46
|
- !ruby/object:Gem::Dependency
|
37
47
|
name: ruby_vim_sdk
|
38
|
-
requirement:
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
39
49
|
none: false
|
40
50
|
requirements:
|
41
51
|
- - ! '>='
|
@@ -43,10 +53,15 @@ dependencies:
|
|
43
53
|
version: '0'
|
44
54
|
type: :runtime
|
45
55
|
prerelease: false
|
46
|
-
version_requirements:
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
47
62
|
- !ruby/object:Gem::Dependency
|
48
63
|
name: uuidtools
|
49
|
-
requirement:
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
50
65
|
none: false
|
51
66
|
requirements:
|
52
67
|
- - ! '>='
|
@@ -54,10 +69,15 @@ dependencies:
|
|
54
69
|
version: '0'
|
55
70
|
type: :runtime
|
56
71
|
prerelease: false
|
57
|
-
version_requirements:
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
58
78
|
- !ruby/object:Gem::Dependency
|
59
79
|
name: sequel
|
60
|
-
requirement:
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
61
81
|
none: false
|
62
82
|
requirements:
|
63
83
|
- - ! '>='
|
@@ -65,7 +85,12 @@ dependencies:
|
|
65
85
|
version: '0'
|
66
86
|
type: :runtime
|
67
87
|
prerelease: false
|
68
|
-
version_requirements:
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ! '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0'
|
69
94
|
description: BOSH VSphere CPI
|
70
95
|
email: support@vmware.com
|
71
96
|
executables: []
|
@@ -97,7 +122,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
97
122
|
version: '0'
|
98
123
|
segments:
|
99
124
|
- 0
|
100
|
-
hash:
|
125
|
+
hash: 3586558243084673783
|
101
126
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
102
127
|
none: false
|
103
128
|
requirements:
|
@@ -106,10 +131,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
106
131
|
version: '0'
|
107
132
|
segments:
|
108
133
|
- 0
|
109
|
-
hash:
|
134
|
+
hash: 3586558243084673783
|
110
135
|
requirements: []
|
111
136
|
rubyforge_project:
|
112
|
-
rubygems_version: 1.8.
|
137
|
+
rubygems_version: 1.8.24
|
113
138
|
signing_key:
|
114
139
|
specification_version: 3
|
115
140
|
summary: BOSH VSphere CPI
|