beaker 3.19.0 → 3.20.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.
@@ -1,72 +0,0 @@
1
- require 'spec_helper'
2
-
3
- module Beaker
4
- describe Vcloud do
5
-
6
- before :each do
7
- MockVsphereHelper.set_config( fog_file_contents )
8
- MockVsphereHelper.set_vms( make_hosts() )
9
- stub_const( "VsphereHelper", MockVsphereHelper )
10
- stub_const( "Net", MockNet )
11
- json = double( 'json' )
12
- allow( json ).to receive( :parse ) do |arg|
13
- arg
14
- end
15
- stub_const( "JSON", json )
16
- allow( Socket ).to receive( :getaddrinfo ).and_return( true )
17
- end
18
-
19
- describe "#provision" do
20
-
21
- it 'provisions hosts and add them to the pool' do
22
- MockVsphereHelper.powerOff
23
-
24
- opts = make_opts
25
- opts[:pooling_api] = nil
26
- opts[:datacenter] = 'testdc'
27
-
28
- vcloud = Beaker::Vcloud.new( make_hosts, opts )
29
- allow( vcloud ).to receive( :require ).and_return( true )
30
- allow( vcloud ).to receive( :sleep ).and_return( true )
31
- vcloud.provision
32
-
33
- hosts = vcloud.instance_variable_get( :@hosts )
34
- hosts.each do | host |
35
- name = host['vmhostname']
36
- vm = MockVsphereHelper.find_vm( name )
37
- expect( vm.toolsRunningStatus ).to be === "guestToolsRunning"
38
- end
39
-
40
- end
41
-
42
- end
43
-
44
- describe "#cleanup" do
45
-
46
- it "cleans up hosts not in the pool" do
47
- MockVsphereHelper.powerOn
48
-
49
- opts = make_opts
50
- opts[:pooling_api] = nil
51
- opts[:datacenter] = 'testdc'
52
-
53
- vcloud = Beaker::Vcloud.new( make_hosts, opts )
54
- allow( vcloud ).to receive( :require ).and_return( true )
55
- allow( vcloud ).to receive( :sleep ).and_return( true )
56
- vcloud.provision
57
- vcloud.cleanup
58
-
59
- hosts = vcloud.instance_variable_get( :@hosts )
60
- vm_names = hosts.map {|h| h['vmhostname'] }.compact
61
- vm_names.each do | name |
62
- vm = MockVsphereHelper.find_vm( name )
63
- expect( vm.runtime.powerState ).to be === "poweredOff"
64
- end
65
-
66
- end
67
-
68
- end
69
-
70
- end
71
-
72
- end
@@ -1,276 +0,0 @@
1
- require 'spec_helper'
2
-
3
- module Beaker
4
- describe Vmpooler do
5
-
6
- before :each do
7
- vms = make_hosts()
8
- MockVsphereHelper.set_config( fog_file_contents )
9
- MockVsphereHelper.set_vms( vms )
10
- stub_const( "VsphereHelper", MockVsphereHelper )
11
- stub_const( "Net", MockNet )
12
- allow( JSON ).to receive( :parse ) do |arg|
13
- arg
14
- end
15
- allow( Socket ).to receive( :getaddrinfo ).and_return( true )
16
- allow_any_instance_of( Beaker::Vmpooler ).to \
17
- receive(:load_credentials).and_return(fog_file_contents)
18
- end
19
-
20
- describe '#get_template_url' do
21
-
22
- it 'works returns the valid url when passed valid pooling_api and template name' do
23
- vmpooler = Beaker::Vmpooler.new( make_hosts, make_opts )
24
- uri = vmpooler.get_template_url("http://pooling.com", "template")
25
- expect( uri ).to be === "http://pooling.com/vm/template"
26
- end
27
-
28
- it 'adds a missing scheme to a given URL' do
29
- vmpooler = Beaker::Vmpooler.new( make_hosts, make_opts )
30
- uri = vmpooler.get_template_url("pooling.com", "template")
31
- expect( URI.parse(uri).scheme ).to_not be === nil
32
- end
33
-
34
- it 'raises an error on an invalid pooling api url' do
35
- vmpooler = Beaker::Vmpooler.new( make_hosts, make_opts )
36
- expect{ vmpooler.get_template_url("pooling### ", "template")}.to raise_error ArgumentError
37
- end
38
-
39
- it 'raises an error on an invalide template name' do
40
- vmpooler = Beaker::Vmpooler.new( make_hosts, make_opts )
41
- expect{ vmpooler.get_template_url("pooling.com", "t!e&m*p(l\\a/t e")}.to raise_error ArgumentError
42
- end
43
- end
44
-
45
- describe '#add_tags' do
46
- let(:vmpooler) { Beaker::Vmpooler.new(make_hosts({:host_tags => {'test_tag' => 'test_value'}}), make_opts) }
47
-
48
- it 'merges tags correctly' do
49
- vmpooler.instance_eval {
50
- @options = @options.merge({:project => 'vmpooler-spec'})
51
- }
52
- host = vmpooler.instance_variable_get(:@hosts)[0]
53
- merged_tags = vmpooler.add_tags(host)
54
- expected_hash = {
55
- test_tag: 'test_value',
56
- beaker_version: Beaker::Version::STRING,
57
- project: 'vmpooler-spec'
58
- }
59
- expect(merged_tags).to include(expected_hash)
60
- end
61
- end
62
-
63
- describe '#disk_added?' do
64
- let(:vmpooler) { Beaker::Vmpooler.new(make_hosts, make_opts) }
65
- let(:response_hash_no_disk) {
66
- {
67
- "ok" => "true",
68
- "hostname" => {
69
- "template"=>"redhat-7-x86_64",
70
- "domain"=>"delivery.puppetlabs.net"
71
- }
72
- }
73
- }
74
- let(:response_hash_disk) {
75
- {
76
- "ok" => "true",
77
- "hostname" => {
78
- "disk" => [
79
- '+16gb',
80
- '+8gb'
81
- ],
82
- "template"=>"redhat-7-x86_64",
83
- "domain"=>"delivery.puppetlabs.net"
84
- }
85
- }
86
- }
87
- it 'returns false when there is no disk' do
88
- host = response_hash_no_disk['hostname']
89
- expect(vmpooler.disk_added?(host, "8", 0)).to be(false)
90
- end
91
-
92
- it 'returns true when there is a disk' do
93
- host = response_hash_disk["hostname"]
94
- expect(vmpooler.disk_added?(host, "16", 0)).to be(true)
95
- expect(vmpooler.disk_added?(host, "8", 1)).to be(true)
96
- end
97
- end
98
-
99
- describe "#provision" do
100
-
101
- it 'provisions hosts from the pool' do
102
- vmpooler = Beaker::Vmpooler.new( make_hosts, make_opts )
103
- allow( vmpooler ).to receive( :require ).and_return( true )
104
- allow( vmpooler ).to receive( :sleep ).and_return( true )
105
- vmpooler.provision
106
-
107
- hosts = vmpooler.instance_variable_get( :@hosts )
108
- hosts.each do | host |
109
- expect( host['vmhostname'] ).to be === 'pool'
110
- end
111
- end
112
-
113
- it 'raises an error when a host template is not found in returned json' do
114
- vmpooler = Beaker::Vmpooler.new( make_hosts, make_opts )
115
-
116
- allow( vmpooler ).to receive( :require ).and_return( true )
117
- allow( vmpooler ).to receive( :sleep ).and_return( true )
118
- allow( vmpooler ).to receive( :get_host_info ).and_return( nil )
119
-
120
- expect {
121
- vmpooler.provision
122
- }.to raise_error( RuntimeError,
123
- /Vmpooler\.provision - requested VM templates \[.*\,.*\,.*\] not available/
124
- )
125
- end
126
-
127
- it 'repeats asking only for failed hosts' do
128
- vmpooler = Beaker::Vmpooler.new( make_hosts, make_opts )
129
-
130
- allow( vmpooler ).to receive( :require ).and_return( true )
131
- allow( vmpooler ).to receive( :sleep ).and_return( true )
132
- allow( vmpooler ).to receive( :get_host_info ).with(
133
- anything, "vm1_has_a_template" ).and_return( nil )
134
- allow( vmpooler ).to receive( :get_host_info ).with(
135
- anything, "vm2_has_a_template" ).and_return( 'y' )
136
- allow( vmpooler ).to receive( :get_host_info ).with(
137
- anything, "vm3_has_a_template" ).and_return( 'y' )
138
-
139
- expect {
140
- vmpooler.provision
141
- }.to raise_error( RuntimeError,
142
- /Vmpooler\.provision - requested VM templates \[[^\,]*\] not available/
143
- ) # should be only one item in the list, no commas
144
- end
145
- end
146
-
147
- describe "#cleanup" do
148
-
149
- it "cleans up hosts in the pool" do
150
- MockVsphereHelper.powerOn
151
-
152
- vmpooler = Beaker::Vmpooler.new( make_hosts, make_opts )
153
- allow( vmpooler ).to receive( :require ).and_return( true )
154
- allow( vmpooler ).to receive( :sleep ).and_return( true )
155
- vmpooler.provision
156
- vmpooler.cleanup
157
-
158
- hosts = vmpooler.instance_variable_get( :@hosts )
159
- hosts.each do | host |
160
- name = host.name
161
- vm = MockVsphereHelper.find_vm( name )
162
- expect( vm.runtime.powerState ).to be === "poweredOn" #handed back to the pool, stays on
163
- end
164
- end
165
- end
166
- end
167
-
168
- describe Vmpooler do
169
-
170
- before :each do
171
- vms = make_hosts()
172
- MockVsphereHelper.set_config( fog_file_contents )
173
- MockVsphereHelper.set_vms( vms )
174
- stub_const( "VsphereHelper", MockVsphereHelper )
175
- stub_const( "Net", MockNet )
176
- allow( JSON ).to receive( :parse ) do |arg|
177
- arg
178
- end
179
- allow( Socket ).to receive( :getaddrinfo ).and_return( true )
180
- end
181
-
182
- describe "#load_credentials" do
183
-
184
- it 'continues without credentials when fog file is missing' do
185
- allow_any_instance_of( Beaker::Vmpooler ).to \
186
- receive(:read_fog_file).and_raise(Errno::ENOENT.new)
187
-
188
- vmpooler = Beaker::Vmpooler.new( make_hosts, make_opts )
189
- expect( vmpooler.credentials ).to be == {}
190
- end
191
-
192
- it 'continues without credentials when fog file is empty' do
193
- allow_any_instance_of( Beaker::Vmpooler ).to \
194
- receive(:read_fog_file).and_return(false)
195
-
196
- vmpooler = Beaker::Vmpooler.new( make_hosts, make_opts )
197
- expect( vmpooler.credentials ).to be == {}
198
- end
199
-
200
- it 'continues without credentials when fog file contains no :default section' do
201
- data = { :some => { :other => :data } }
202
-
203
- allow_any_instance_of( Beaker::Vmpooler ).to \
204
- receive(:read_fog_file).and_return(data)
205
-
206
- vmpooler = Beaker::Vmpooler.new( make_hosts, make_opts )
207
- expect( vmpooler.credentials ).to be == { }
208
- end
209
-
210
- it 'continues without credentials when fog file :default section has no :vmpooler_token' do
211
- data = { :default => { :something_else => "TOKEN" } }
212
-
213
- allow_any_instance_of( Beaker::Vmpooler ).to \
214
- receive(:read_fog_file).and_return(data)
215
-
216
- vmpooler = Beaker::Vmpooler.new( make_hosts, make_opts )
217
- expect( vmpooler.credentials ).to be == { }
218
- end
219
-
220
- it 'continues without credentials when there are formatting errors in the fog file' do
221
- data = { "'default'" => { :vmpooler_token => "b2wl8prqe6ddoii70md" } }
222
-
223
- allow_any_instance_of( Beaker::Vmpooler ).to \
224
- receive(:read_fog_file).and_return(data)
225
-
226
- logger = double('logger')
227
-
228
- expect(logger).to receive(:warn).with(/is missing a :default section with a :vmpooler_token value/)
229
- make_opts = {:logger => logger}
230
-
231
- vmpooler = Beaker::Vmpooler.new( make_hosts, make_opts )
232
- expect( vmpooler.credentials ).to be == { }
233
- end
234
-
235
- it 'throws a TypeError and continues without credentials when there are syntax errors in the fog file' do
236
- data = "'default'\n :vmpooler_token: z2wl8prqe0ddoii70ad"
237
-
238
- allow( File ).to receive( :open ).and_yield( StringIO.new(data) )
239
- logger = double('logger')
240
-
241
- expect(logger).to receive(:warn).with(/TypeError: .* has invalid syntax/)
242
- make_opts = {:logger => logger}
243
-
244
- vmpooler = Beaker::Vmpooler.new( make_hosts, make_opts )
245
-
246
- expect( vmpooler.credentials ).to be == { }
247
- end
248
-
249
- it 'throws a Psych::SyntaxError and continues without credentials when there are syntax errors in the fog file' do
250
-
251
- data = ";default;\n :vmpooler_token: z2wl8prqe0ddoii707d"
252
-
253
- allow( File ).to receive( :open ).and_yield( StringIO.new(data) )
254
-
255
- logger = double('logger')
256
-
257
- expect(logger).to receive(:warn).with(/Psych::SyntaxError: .* invalid syntax/)
258
- make_opts = {:logger => logger}
259
-
260
- vmpooler = Beaker::Vmpooler.new( make_hosts, make_opts )
261
-
262
- expect( vmpooler.credentials ).to be == { }
263
- end
264
-
265
- it 'stores vmpooler token when found in fog file' do
266
- data = { :default => { :vmpooler_token => "TOKEN" } }
267
-
268
- allow_any_instance_of( Beaker::Vmpooler ).to \
269
- receive(:read_fog_file).and_return(data)
270
-
271
- vmpooler = Beaker::Vmpooler.new( make_hosts, make_opts )
272
- expect( vmpooler.credentials ).to be == { :vmpooler_token => "TOKEN" }
273
- end
274
- end
275
- end
276
- end