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.
@@ -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
- # Get list of resource pools under this cluster
222
- properties = @client.get_properties(root_resource_pool, Vim::ResourcePool, ["resourcePool"])
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 cluster
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} under cluster #{cluster_properties["name"]}")
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
- @logger.info("Could not find requested resource pool #{requested_resource_pool} under cluster #{cluster_properties["name"]}")
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
- next unless cluster_affinity.nil? || cluster.mob == cluster_affinity.mob
334
- next unless cluster.real_free_memory - memory > MEMORY_THRESHOLD
335
- next if pick_datastore(cluster.persistent_datastores, persistent_disks_size).nil?
336
- next if (datastore = pick_datastore(cluster.datastores, vm_disk_size)).nil?
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, cluster_affinity)
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
- resources = find_resources(memory_size, non_persistent_disks_size, persistent_disks_size, nil)
490
- raise "No available resources" if resources.empty?
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
 
@@ -1,7 +1,7 @@
1
1
  module Bosh
2
2
  module Clouds
3
3
  class VSphere
4
- VERSION = "0.4.8"
4
+ VERSION = "0.4.9"
5
5
  end
6
6
  end
7
7
  end
@@ -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 == "No available resources"
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 == "No available resources"
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 == "No available resources"
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.8
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-03-02 00:00:00.000000000Z
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: &70324495660600 !ruby/object:Gem::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: *70324495660600
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: &70324495659920 !ruby/object:Gem::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: *70324495659920
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: &70324495659280 !ruby/object:Gem::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: *70324495659280
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: &70324495658320 !ruby/object:Gem::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: *70324495658320
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: &70324495657720 !ruby/object:Gem::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: *70324495657720
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: 4503052860220546544
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: 4503052860220546544
134
+ hash: 3586558243084673783
110
135
  requirements: []
111
136
  rubyforge_project:
112
- rubygems_version: 1.8.12
137
+ rubygems_version: 1.8.24
113
138
  signing_key:
114
139
  specification_version: 3
115
140
  summary: BOSH VSphere CPI