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.
- checksums.yaml +8 -8
- data/acceptance/tests/base/dsl/install_utils/clone_git_repo_on_test.rb +2 -0
- data/acceptance/tests/base/host/host_test.rb +2 -2
- data/beaker.gemspec +1 -1
- data/docs/concepts/beaker_libraries.md +1 -0
- data/docs/how_to/hypervisors/README.md +15 -10
- data/docs/how_to/hypervisors/aws.md +3 -0
- data/docs/how_to/hypervisors/vsphere.md +1 -1
- data/lib/beaker/command.rb +5 -1
- data/lib/beaker/host/unix/exec.rb +1 -1
- data/lib/beaker/hypervisor.rb +17 -9
- data/lib/beaker/hypervisor/aws_sdk.rb +12 -0
- data/lib/beaker/hypervisor/vagrant.rb +18 -1
- data/lib/beaker/version.rb +1 -1
- data/spec/beaker/host_prebuilt_steps_spec.rb +9 -1
- data/spec/beaker/hypervisor/hypervisor_spec.rb +4 -14
- data/spec/beaker/hypervisor/vagrant_spec.rb +7 -0
- metadata +16 -21
- data/docs/how_to/hypervisors/vmpooler.md +0 -45
- data/lib/beaker/hypervisor/vcloud.rb +0 -229
- data/lib/beaker/hypervisor/vmpooler.rb +0 -354
- data/spec/beaker/hypervisor/vcloud_spec.rb +0 -72
- data/spec/beaker/hypervisor/vmpooler_spec.rb +0 -276
@@ -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
|