bosh_vsphere_cpi 0.4.8

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,254 @@
1
+ # Copyright (c) 2009-2012 VMware, Inc.
2
+
3
+ require File.expand_path("../../spec_helper", __FILE__)
4
+
5
+ describe VSphereCloud::Resources do
6
+
7
+ def create_datacenter(name)
8
+ datacenter = VSphereCloud::Resources::Datacenter.new
9
+ datacenter.name = name
10
+ datacenter.persistent_datastore_pattern = /.*/
11
+ datacenter.clusters = []
12
+ datacenter
13
+ end
14
+
15
+ def create_cluster(name)
16
+ cluster = VSphereCloud::Resources::Cluster.new
17
+ cluster.name = name
18
+ cluster.mob = name
19
+ cluster.total_memory = 2048
20
+ cluster.free_memory = 1024
21
+ cluster.unaccounted_memory = 0
22
+ cluster.mem_over_commit = 1
23
+ cluster.idle_cpu = 0.9
24
+ cluster.datastores = []
25
+ cluster.persistent_datastores = []
26
+ cluster
27
+ end
28
+
29
+ def create_datastore(name)
30
+ datastore = VSphereCloud::Resources::Datastore.new
31
+ datastore.name = name
32
+ datastore.total_space = 2048
33
+ datastore.free_space = 1024
34
+ datastore.unaccounted_space = 0
35
+ datastore
36
+ end
37
+
38
+ def mark_datastore_full(cluster_index, datastore_index)
39
+ datastore = @datacenters["dc"].clusters[cluster_index].datastores[datastore_index]
40
+ datastore.free_space = 0
41
+ end
42
+
43
+ def mark_persistent_datastore_full(cluster_index, datastore_index)
44
+ datastore = @datacenters["dc"].clusters[cluster_index].persistent_datastores[datastore_index]
45
+ datastore.free_space = 0
46
+ end
47
+
48
+ before(:each) do
49
+ @resources = VSphereCloud::Resources.new("client", "vcenter")
50
+ datacenter = create_datacenter("dc")
51
+ 3.times do |n|
52
+ cluster = create_cluster("cluster#{n}")
53
+ 2.times do |x|
54
+ cluster.datastores << create_datastore("#{cluster.name}-#{x}")
55
+ end
56
+ 2.times do |x|
57
+ cluster.persistent_datastores << create_datastore("#{cluster.name}-p-#{x}")
58
+ end
59
+ datacenter.clusters << cluster
60
+ end
61
+ @datacenters = {}
62
+ @datacenters[datacenter.name] = datacenter
63
+ end
64
+
65
+
66
+ it "should raise exception if no resources available" do
67
+ @resources.stub!(:find_resources).and_return([])
68
+ got_exception = false
69
+ begin
70
+ @resources.get_resources
71
+ rescue => e
72
+ if e.message == "No available resources"
73
+ got_exception = true
74
+ end
75
+ end
76
+ got_exception.should be_true
77
+ end
78
+
79
+ it "should match given persistent disk affinity" do
80
+ @resources.stub!(:datacenters).and_return(@datacenters)
81
+ disks = []
82
+ disks << {"size" => 100}
83
+ disks << {"persistent" => true, "datacenter" => "dc", "datastore" => "cluster0-p-0", "size" => 100}
84
+ cluster, datastore = @resources.get_resources(0, disks)
85
+ cluster.name.should == "cluster0"
86
+ datastore.name.should match(/cluster0*/)
87
+ end
88
+
89
+ it "should match expected datastore and cluster" do
90
+ mark_datastore_full(0, 0)
91
+ @resources.stub!(:datacenters).and_return(@datacenters)
92
+
93
+ disks = []
94
+ disks << {"size" => 100}
95
+ disks << {"persistent" => true, "datacenter" => "dc", "datastore" => "cluster0-p-0", "size" => 100}
96
+ cluster, datastore = @resources.get_resources(0, disks)
97
+ cluster.name.should == "cluster0"
98
+ datastore.name.should == "cluster0-1"
99
+ end
100
+
101
+ it "should match expected datastore and cluster" do
102
+ mark_datastore_full(0, 1)
103
+ @resources.stub!(:datacenters).and_return(@datacenters)
104
+
105
+ disks = []
106
+ disks << {"size" => 100}
107
+ disks << {"persistent" => true, "datacenter" => "dc", "datastore" => "cluster0-p-0", "size" => 100}
108
+ cluster, datastore = @resources.get_resources(0, disks)
109
+ cluster.name.should == "cluster0"
110
+ datastore.name.should == "cluster0-0"
111
+ end
112
+
113
+ it "should match next available datastore and cluster" do
114
+ mark_datastore_full(0, 0)
115
+ mark_datastore_full(0, 1)
116
+ @resources.stub!(:datacenters).and_return(@datacenters)
117
+
118
+ disks = []
119
+ disks << {"size" => 100}
120
+ disks << {"persistent" => true, "datacenter" => "dc", "datastore" => "cluster0-p-0", "size" => 100}
121
+ cluster, datastore = @resources.get_resources(0, disks)
122
+ cluster.name.should_not match(/cluster0/)
123
+ datastore.name.should_not match(/cluster0/)
124
+ end
125
+
126
+ it "should match given persistent datastore affinity" do
127
+ mark_persistent_datastore_full(0, 0)
128
+ @resources.stub!(:datacenters).and_return(@datacenters)
129
+
130
+ disks = []
131
+ disks << {"size" => 100}
132
+ disks << {"persistent" => true, "datacenter" => "dc", "datastore" => "cluster0-p-0", "size" => 100}
133
+ cluster, datastore = @resources.get_resources(0, disks)
134
+ cluster.name.should == "cluster0"
135
+ datastore.name.should match(/cluster0*/)
136
+ end
137
+
138
+ it "should match given persistent datastore affinity" do
139
+ mark_persistent_datastore_full(0, 1)
140
+ @resources.stub!(:datacenters).and_return(@datacenters)
141
+
142
+ disks = []
143
+ disks << {"size" => 100}
144
+ disks << {"persistent" => true, "datacenter" => "dc", "datastore" => "cluster0-p-0", "size" => 100}
145
+ cluster, datastore = @resources.get_resources(0, disks)
146
+ cluster.name.should == "cluster0"
147
+ datastore.name.should match(/cluster0*/)
148
+ end
149
+
150
+ it "should match next available datastore and cluster" do
151
+ mark_persistent_datastore_full(0, 0)
152
+ mark_persistent_datastore_full(0, 1)
153
+ @resources.stub!(:datacenters).and_return(@datacenters)
154
+
155
+ disks = []
156
+ disks << {"size" => 100}
157
+ disks << {"persistent" => true, "datacenter" => "dc", "datastore" => "cluster0-p-0", "size" => 100}
158
+ cluster, datastore = @resources.get_resources(0, disks)
159
+ cluster.name.should_not match(/cluster0/)
160
+ datastore.name.should_not match(/cluster0/)
161
+ end
162
+
163
+ it "should match the cluster with largest footprint" do
164
+ @resources.stub!(:datacenters).and_return(@datacenters)
165
+
166
+ disks = []
167
+ disks << {"size" => 100}
168
+ disks << {"persistent" => true, "datacenter" => "dc", "datastore" => "cluster0-p-0", "size" => 100}
169
+ disks << {"persistent" => true, "datacenter" => "dc", "datastore" => "cluster2-p-0", "size" => 512}
170
+ disks << {"persistent" => true, "datacenter" => "dc", "datastore" => "cluster0-p-1", "size" => 200}
171
+ cluster, datastore = @resources.get_resources(0, disks)
172
+ cluster.name.should == "cluster2"
173
+ datastore.name.should match(/cluster2/)
174
+ end
175
+
176
+ it "should match the cluster with largest cummulative footprint" do
177
+ @resources.stub!(:datacenters).and_return(@datacenters)
178
+
179
+ disks = []
180
+ disks << {"size" => 100}
181
+ disks << {"persistent" => true, "datacenter" => "dc", "datastore" => "cluster0-p-0", "size" => 200}
182
+ disks << {"persistent" => true, "datacenter" => "dc", "datastore" => "cluster2-p-0", "size" => 256}
183
+ disks << {"persistent" => true, "datacenter" => "dc", "datastore" => "cluster0-p-1", "size" => 200}
184
+ cluster, datastore = @resources.get_resources(0, disks)
185
+ cluster.name.should == "cluster0"
186
+ datastore.name.should match(/cluster0/)
187
+ end
188
+
189
+ it "should match any available datastore and cluster" do
190
+ @resources.stub!(:datacenters).and_return(@datacenters)
191
+
192
+ disks = []
193
+ disks << {"size" => 100}
194
+ cluster, datastore = @resources.get_resources(0, disks)
195
+ cluster.name.should_not be_nil
196
+ datastore.name.should_not be_nil
197
+ end
198
+
199
+ it "should match any available datastore and cluster" do
200
+ @resources.stub!(:datacenters).and_return(@datacenters)
201
+ cluster, datastore = @resources.get_resources
202
+ cluster.name.should_not be_nil
203
+ datastore.name.should_not be_nil
204
+ end
205
+
206
+ it "should match the exact expected datastore and cluster" do
207
+ mark_persistent_datastore_full(0, 0)
208
+ mark_persistent_datastore_full(0, 1)
209
+ mark_persistent_datastore_full(1, 0)
210
+ mark_persistent_datastore_full(1, 1)
211
+ @resources.stub!(:datacenters).and_return(@datacenters)
212
+ cluster, datastore = @resources.get_resources
213
+ cluster.name.should == "cluster2"
214
+ datastore.name.should match(/cluster2/)
215
+ end
216
+
217
+ it "should raise an exception if all persistent datastores are full" do
218
+ mark_persistent_datastore_full(0, 0)
219
+ mark_persistent_datastore_full(0, 1)
220
+ mark_persistent_datastore_full(1, 0)
221
+ mark_persistent_datastore_full(1, 1)
222
+ mark_persistent_datastore_full(2, 0)
223
+ mark_persistent_datastore_full(2, 1)
224
+ @resources.stub!(:datacenters).and_return(@datacenters)
225
+ got_exception = false
226
+ begin
227
+ cluster, datastore = @resources.get_resources
228
+ rescue => e
229
+ if e.message == "No available resources"
230
+ got_exception = true
231
+ end
232
+ end
233
+ got_exception.should be_true
234
+ end
235
+
236
+ it "should raise an exception if all nonpersistent datastores are full" do
237
+ mark_datastore_full(0, 0)
238
+ mark_datastore_full(0, 1)
239
+ mark_datastore_full(1, 0)
240
+ mark_datastore_full(1, 1)
241
+ mark_datastore_full(2, 0)
242
+ mark_datastore_full(2, 1)
243
+ @resources.stub!(:datacenters).and_return(@datacenters)
244
+ got_exception = false
245
+ begin
246
+ cluster, datastore = @resources.get_resources
247
+ rescue => e
248
+ if e.message == "No available resources"
249
+ got_exception = true
250
+ end
251
+ end
252
+ got_exception.should be_true
253
+ end
254
+ end
metadata ADDED
@@ -0,0 +1,118 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: bosh_vsphere_cpi
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.4.8
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - VMware
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-03-02 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: bosh_common
16
+ requirement: &70324495660600 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *70324495660600
25
+ - !ruby/object:Gem::Dependency
26
+ name: bosh_cpi
27
+ requirement: &70324495659920 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: 0.4.2
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: *70324495659920
36
+ - !ruby/object:Gem::Dependency
37
+ name: ruby_vim_sdk
38
+ requirement: &70324495659280 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ type: :runtime
45
+ prerelease: false
46
+ version_requirements: *70324495659280
47
+ - !ruby/object:Gem::Dependency
48
+ name: uuidtools
49
+ requirement: &70324495658320 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ type: :runtime
56
+ prerelease: false
57
+ version_requirements: *70324495658320
58
+ - !ruby/object:Gem::Dependency
59
+ name: sequel
60
+ requirement: &70324495657720 !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ! '>='
64
+ - !ruby/object:Gem::Version
65
+ version: '0'
66
+ type: :runtime
67
+ prerelease: false
68
+ version_requirements: *70324495657720
69
+ description: BOSH VSphere CPI
70
+ email: support@vmware.com
71
+ executables: []
72
+ extensions: []
73
+ extra_rdoc_files: []
74
+ files:
75
+ - lib/cloud/vsphere.rb
76
+ - lib/cloud/vsphere/client.rb
77
+ - lib/cloud/vsphere/cloud.rb
78
+ - lib/cloud/vsphere/lease_updater.rb
79
+ - lib/cloud/vsphere/models/disk.rb
80
+ - lib/cloud/vsphere/resources.rb
81
+ - lib/cloud/vsphere/version.rb
82
+ - README
83
+ - Rakefile
84
+ - spec/spec_helper.rb
85
+ - spec/unit/vsphere_resource_spec.rb
86
+ homepage: http://www.vmware.com
87
+ licenses: []
88
+ post_install_message:
89
+ rdoc_options: []
90
+ require_paths:
91
+ - lib
92
+ required_ruby_version: !ruby/object:Gem::Requirement
93
+ none: false
94
+ requirements:
95
+ - - ! '>='
96
+ - !ruby/object:Gem::Version
97
+ version: '0'
98
+ segments:
99
+ - 0
100
+ hash: 4503052860220546544
101
+ required_rubygems_version: !ruby/object:Gem::Requirement
102
+ none: false
103
+ requirements:
104
+ - - ! '>='
105
+ - !ruby/object:Gem::Version
106
+ version: '0'
107
+ segments:
108
+ - 0
109
+ hash: 4503052860220546544
110
+ requirements: []
111
+ rubyforge_project:
112
+ rubygems_version: 1.8.12
113
+ signing_key:
114
+ specification_version: 3
115
+ summary: BOSH VSphere CPI
116
+ test_files:
117
+ - spec/spec_helper.rb
118
+ - spec/unit/vsphere_resource_spec.rb