beaker 3.10.0 → 3.11.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/Rakefile +8 -0
- data/acceptance/config/subcommands/acceptance-options.rb +4 -0
- data/acceptance/fixtures/files/{sles-11-x86_64.repo.txt → sles-11-x86_64.repo} +0 -0
- data/acceptance/fixtures/files/{sles-12-x86_64.repo.txt → sles-12-x86_64.repo} +0 -0
- data/acceptance/lib/helpers/test_helper.rb +2 -2
- data/acceptance/pre_suite/README.md +1 -0
- data/acceptance/pre_suite/subcommands/05_install_ruby.rb +32 -0
- data/acceptance/pre_suite/subcommands/08_install_beaker.rb +22 -0
- data/acceptance/tests/base/host/host_test.rb +14 -0
- data/acceptance/tests/subcommands/init.rb +47 -0
- data/beaker.gemspec +1 -1
- data/docs/concepts/masterless_puppet.md +1 -1
- data/docs/how_to/hypervisors/openstack.md +29 -0
- data/docs/how_to/preserve_hosts.md +5 -5
- data/lib/beaker/dsl/helpers/puppet_helpers.rb +11 -7
- data/lib/beaker/host_prebuilt_steps.rb +7 -3
- data/lib/beaker/hypervisor/aws_sdk.rb +12 -1
- data/lib/beaker/hypervisor/openstack.rb +53 -9
- data/lib/beaker/hypervisor/vagrant_libvirt.rb +7 -0
- data/lib/beaker/tasks/quick_start.rb +6 -4
- data/lib/beaker/version.rb +1 -1
- data/spec/beaker/dsl/helpers/puppet_helpers_spec.rb +3 -3
- data/spec/beaker/host_prebuilt_steps_spec.rb +31 -5
- data/spec/beaker/hypervisor/aws_sdk_spec.rb +3 -2
- data/spec/beaker/hypervisor/openstack_spec.rb +52 -0
- data/spec/beaker/hypervisor/vagrant_libvirt_spec.rb +5 -1
- metadata +12 -8
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
ZTYxNmZjMGE0NTRhOGYxZWQ0YjI2MWI3MjgwMmU3YmI2YzE5YzRkMg==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
ODljNWVjNDQ1YzExNTU3Y2YwNWM3N2EwZTkwNWE2YTYxZGY1Mzg3YQ==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
ZWFiZGJhNTI2M2VmYTBiNWRjODllYmVmYjViYWYwNGI1NDQyY2Q3YTA2OTlh
|
10
|
+
NDIyMzE4MDU3MDE3YTg0OTEzYzIyZDEwMjk3ODdlZWUwZTM0OTJkNzg1ZTA1
|
11
|
+
OTkwZWVhYjBmNzIwODFjNGZkOGNjNTUwYzkwNTFiZDQ0MTliZDM=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
NjBjOGMzODJmMjVkZTZkOGU4MDVjMzkzNTI0MGUwNGVhNTU0NjViM2IzMjVk
|
14
|
+
NzNlMzVjNTUzOTBlMTNjZWE0MDdiOGQxZjJjZDJmMDcxZjg1ZTg1NTc0YzE2
|
15
|
+
NDNmNDQzYTFjZmYzOGRiOGM1ZTY3N2M1OWU5ZTZhNDQ5NzVhZjM=
|
data/Rakefile
CHANGED
@@ -176,6 +176,14 @@ Run the base beaker acceptance tests
|
|
176
176
|
beaker_test(:base)
|
177
177
|
end
|
178
178
|
|
179
|
+
desc <<-EOS
|
180
|
+
Run the subcommand beaker acceptance tests
|
181
|
+
#{USAGE}
|
182
|
+
EOS
|
183
|
+
task :subcommands => 'gen_hosts' do
|
184
|
+
beaker_test(:subcommands)
|
185
|
+
end
|
186
|
+
|
179
187
|
desc <<-EOS
|
180
188
|
Run the hypervisor beaker acceptance tests
|
181
189
|
#{USAGE}
|
File without changes
|
File without changes
|
@@ -44,8 +44,8 @@ end
|
|
44
44
|
|
45
45
|
# Returns the contents of a named fixture file, to be found in `fixture_path`.
|
46
46
|
def fixture_contents(fixture)
|
47
|
-
fixture_file =
|
48
|
-
File.read(fixture_file)
|
47
|
+
fixture_file = Dir.entries(fixture_path).find { |e| /^#{fixture}$|#{fixture}\.[a-z]/ =~ e }
|
48
|
+
File.read("#{fixture_path}/#{fixture_file}")
|
49
49
|
end
|
50
50
|
|
51
51
|
# Create a file on `host` in the `remote_path` with file name `filename`,
|
@@ -0,0 +1,32 @@
|
|
1
|
+
test_name 'Install and configure Ruby 2.2.5 on the SUT' do
|
2
|
+
|
3
|
+
step 'Ensure that the default system is an el-based system' do
|
4
|
+
# The pre-suite currently only supports el systems, and we should
|
5
|
+
#fail early if the default platform is not a supported platform
|
6
|
+
assert(default.platform.variant == 'el',
|
7
|
+
"Expected the platform variant to be 'el', not #{default.platform.variant}")
|
8
|
+
end
|
9
|
+
|
10
|
+
step 'clean out current ruby and its dependencies' do
|
11
|
+
on default, 'yum remove ruby ruby-devel -y'
|
12
|
+
end
|
13
|
+
|
14
|
+
# These steps install git, openssl, and wget
|
15
|
+
step 'install development dependencies' do
|
16
|
+
on default, 'yum groupinstall "Development Tools" -y'
|
17
|
+
on default, 'yum install openssl-devel -y'
|
18
|
+
on default, 'yum install wget -y'
|
19
|
+
end
|
20
|
+
|
21
|
+
step 'download and install ruby 2.2.5' do
|
22
|
+
on default, 'wget http://cache.ruby-lang.org/pub/ruby/2.2/ruby-2.2.5.tar.gz'
|
23
|
+
on default, 'tar xvfz ruby-2.2.5.tar.gz'
|
24
|
+
on default, 'cd ruby-2.2.5;./configure'
|
25
|
+
on default, 'cd ruby-2.2.5;make'
|
26
|
+
on default, 'cd ruby-2.2.5;make install'
|
27
|
+
end
|
28
|
+
|
29
|
+
step 'update gem on the SUT and install bundler' do
|
30
|
+
on default, 'gem update --system;gem install bundler'
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
test_name 'Install beaker and checkout branch if necessary' do
|
2
|
+
|
3
|
+
step 'Download the beaker git repo' do
|
4
|
+
on default, 'git clone https://github.com/puppetlabs/beaker.git /opt/beaker/'
|
5
|
+
end
|
6
|
+
|
7
|
+
step 'Detect if checking out branch for testing and checkout' do
|
8
|
+
if ENV['BEAKER_PULL_ID']
|
9
|
+
logger.notify "Pull Request detected, checking out PR branch"
|
10
|
+
on(default, 'cd /opt/beaker/;git -c core.askpass=true fetch --tags --progress https://github.com/puppetlabs/beaker.git +refs/pull/*:refs/remotes/origin/pr/*')
|
11
|
+
on(default, "cd /opt/beaker/;git merge origin/pr/#{ENV['BEAKER_PULL_ID']}/head --no-edit")
|
12
|
+
else
|
13
|
+
logger.notify 'No PR branch detected, building from master'
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
step 'Build the gem and install it on the local system' do
|
18
|
+
build_output = on(default, 'cd /opt/beaker/;gem build beaker.gemspec').stdout
|
19
|
+
version = build_output.match(/^ File: (.+)$/)[1]
|
20
|
+
on(default, "cd /opt/beaker/;gem install #{version} --no-rdoc --no-ri")
|
21
|
+
end
|
22
|
+
end
|
@@ -316,3 +316,17 @@ step "Ensure scp errors close the ssh connection" do
|
|
316
316
|
on default, 'true'
|
317
317
|
end
|
318
318
|
end
|
319
|
+
|
320
|
+
step 'Ensure that a long 128+ character string with UTF-8 characters does not break net-ssh' do
|
321
|
+
long_string = 'a' * 128 + "\u06FF"
|
322
|
+
on(default, "mkdir /tmp/#{long_string}")
|
323
|
+
result = on(default, 'ls /tmp')
|
324
|
+
assert(result.stdout.include?(long_string), 'Error in folder creation with long string + UTF-8 characters')
|
325
|
+
|
326
|
+
# remove the folder
|
327
|
+
on(default, "rm -rf /tmp/#{long_string}")
|
328
|
+
result = on(default, 'ls /tmp')
|
329
|
+
assert(!result.stdout.include?(long_string), 'Error in folder deletion with long string + UTF-8 characters')
|
330
|
+
|
331
|
+
end
|
332
|
+
|
@@ -0,0 +1,47 @@
|
|
1
|
+
test_name 'use the init subcommand' do
|
2
|
+
|
3
|
+
def delete_root_folder_contents
|
4
|
+
on default, 'rm -rf /root/*'
|
5
|
+
end
|
6
|
+
|
7
|
+
step 'ensure that `beaker init` fails correctly when not provided a hypervisor' do
|
8
|
+
expect_failure('it should return a non-zero code when it fails') do
|
9
|
+
result = on(default, 'beaker init', :accept_all_exit_codes => true)
|
10
|
+
refute_equal(0, result.exit_code, '`beaker init` without a hypervisor argument should return a non-zero exit code')
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
step 'ensure that `beaker help init` works' do
|
15
|
+
result = on(default, 'beaker help init')
|
16
|
+
assert_equal(0, result.exit_code, '`beaker help init` should return a zero exit code')
|
17
|
+
end
|
18
|
+
|
19
|
+
step 'ensure that `beaker init` accepts both vmpooler and vagrant hypervisor arguments' do
|
20
|
+
|
21
|
+
['vmpooler', 'vagrant'].each do |hypervisor|
|
22
|
+
result = on(default, "beaker init --hypervisor=#{hypervisor}")
|
23
|
+
assert_match(/Writing default host config/, result.stdout)
|
24
|
+
assert_equal(0, result.exit_code, "`beaker init --hypervisor=#{hypervisor}` should return a zero exit code")
|
25
|
+
step 'ensure that the Rakefile is present' do
|
26
|
+
on(default, '[ -e "Rakefile" ]')
|
27
|
+
end
|
28
|
+
delete_root_folder_contents
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
|
33
|
+
step 'ensure that a Rakefile is not overwritten if it does exist prior' do
|
34
|
+
delete_root_folder_contents
|
35
|
+
on(default, "beaker init --hypervisor=vmpooler")
|
36
|
+
prepended_rakefile = on(default, 'cat Rakefile').stdout
|
37
|
+
delete_root_folder_contents
|
38
|
+
on(default, 'echo "require \'tempfile\'" >> Rakefile')
|
39
|
+
on(default, 'beaker init --hypervisor=vmpooler', :accept_all_exit_codes => true)
|
40
|
+
rakefile = on(default, 'cat Rakefile')
|
41
|
+
|
42
|
+
# Assert that the Rakefile contents includes the original and inserted requirements
|
43
|
+
assert(result.stdout.include?(prepended_rakefile), 'Rakefile should not contain prepended require')
|
44
|
+
assert(result.stdout.include?("require 'tempfile'"), 'Rakefile should not contain prepended require')
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
data/beaker.gemspec
CHANGED
@@ -34,7 +34,7 @@ Gem::Specification.new do |s|
|
|
34
34
|
s.add_runtime_dependency 'minitar', '~> 0.5.4'
|
35
35
|
|
36
36
|
s.add_runtime_dependency 'hocon', '~> 1.0'
|
37
|
-
s.add_runtime_dependency 'net-ssh', '
|
37
|
+
s.add_runtime_dependency 'net-ssh', '~> 4.0'
|
38
38
|
s.add_runtime_dependency 'net-scp', '~> 1.2'
|
39
39
|
s.add_runtime_dependency 'inifile', '~> 2.0'
|
40
40
|
## inifile: keep <3.0, breaks puppet_helpers.rb:puppet_conf_for when updated
|
@@ -23,7 +23,7 @@ In order to have Beaker support a masterless Puppet setup, you have to do a few
|
|
23
23
|
|
24
24
|
## What is Beaker Doing by Default?
|
25
25
|
|
26
|
-
|
26
|
+
By default (without the masterless flag), when someone calls for a host of a particular role, using the `Beaker::DSL::Roles` module's methods (ie. `master`, `dashboard`, etc), Beaker checks to verify that a host was given with that role.
|
27
27
|
|
28
28
|
If no host was given with this role, then Beaker throws a `DSL::Outcomes::FailTest` Error, which causes that test case to fail.
|
29
29
|
|
@@ -123,3 +123,32 @@ user their own pool. It's used in allocating new IPs. It's an options
|
|
123
123
|
parameter in the CONFIG section of the host file:
|
124
124
|
|
125
125
|
floating_ip_pool: 'my_pool_name'
|
126
|
+
|
127
|
+
### Volumes
|
128
|
+
|
129
|
+
Attaching volumes to a VM is supported via the Cinder service. All versions are transparently
|
130
|
+
supported to cater for differences in the APIs. To create and attach volumes simply add hash
|
131
|
+
called 'volumes' to a host in the HOSTS section. Each key is the name given to the volume upon
|
132
|
+
resource creation. The value is a hash with a single integer parameter 'size' which defines the
|
133
|
+
volume size in MB.
|
134
|
+
|
135
|
+
**Example OpenStack hosts file with volumes**
|
136
|
+
|
137
|
+
HOSTS:
|
138
|
+
ceph:
|
139
|
+
roles:
|
140
|
+
- master
|
141
|
+
platform: ubuntu-16.04-amd64
|
142
|
+
hypervisor: openstack
|
143
|
+
flavor: m1.large
|
144
|
+
image: xenial-server-cloudimg-amd64-scsi
|
145
|
+
user: ubuntu
|
146
|
+
volumes:
|
147
|
+
osd0:
|
148
|
+
size: 10000
|
149
|
+
osd1:
|
150
|
+
size: 10000
|
151
|
+
osd2:
|
152
|
+
size: 10000
|
153
|
+
journal:
|
154
|
+
size: 1000
|
@@ -29,7 +29,7 @@ what files you might need from your SUTs, and exploration might be necessary.
|
|
29
29
|
|
30
30
|
Note that where you decide to use this option will affect its precedence. You
|
31
31
|
can learn more about this in our
|
32
|
-
[argument processing & precedence doc](../
|
32
|
+
[argument processing & precedence doc](../concepts/argument_processing_and_precedence.md).
|
33
33
|
|
34
34
|
### Command-Line Option
|
35
35
|
|
@@ -54,11 +54,11 @@ You can also provide a value for this option wherever you can provide a value
|
|
54
54
|
that gets merged into beaker's global options hash. The two ways to do this are
|
55
55
|
to provide it in a local options file, or in the global `CONFIG` section of your
|
56
56
|
hosts file. To learn more about how to set these options, check out the
|
57
|
-
[Options File Values](../
|
57
|
+
[Options File Values](../concepts/argument_processing_and_precedence.md#options-file-values)
|
58
58
|
and the
|
59
|
-
[`CONFIG` Section of a Hosts File](../
|
59
|
+
[`CONFIG` Section of a Hosts File](../concepts/argument_processing_and_precedence.md#config-section-of-hosts-file)
|
60
60
|
sections of the
|
61
|
-
[argument processing & precedence doc](../
|
61
|
+
[argument processing & precedence doc](../concepts/argument_processing_and_precedence.md).
|
62
62
|
|
63
63
|
Either way, the underlying property name that you will have to set if you use
|
64
64
|
these options is `:preserve_hosts`.
|
@@ -94,5 +94,5 @@ symlink, as mentioned at the beginning of this section.
|
|
94
94
|
For subsequent runs, if you want to set something, you'll have to pay attention
|
95
95
|
to the precedence of your arguments, to be sure that you are overriding what is
|
96
96
|
set in the preserved hosts file. Checkout the
|
97
|
-
[argument processing & precedence doc](../
|
97
|
+
[argument processing & precedence doc](../concepts/argument_processing_and_precedence.md)
|
98
98
|
for more details on the precedence order of options parsing.
|
@@ -676,7 +676,10 @@ module Beaker
|
|
676
676
|
def sleep_until_puppetdb_started(host, nonssl_port = nil, ssl_port = nil)
|
677
677
|
nonssl_port = options[:puppetdb_port_nonssl] if nonssl_port.nil?
|
678
678
|
ssl_port = options[:puppetdb_port_ssl] if ssl_port.nil?
|
679
|
-
|
679
|
+
endpoint = 'status/v1/services/puppetdb-status'
|
680
|
+
retry_on(host,
|
681
|
+
"curl -m 1 http://localhost:#{nonssl_port}/#{endpoint} | grep '\"state\":\"running\"'",
|
682
|
+
{:max_retries => 120})
|
680
683
|
curl_with_retries("start puppetdb (ssl)",
|
681
684
|
host, "https://#{host.node_name}:#{ssl_port}", [35, 60])
|
682
685
|
end
|
@@ -754,14 +757,15 @@ module Beaker
|
|
754
757
|
end
|
755
758
|
|
756
759
|
#wait for a given host to appear in the dashboard
|
760
|
+
# @deprecated this method should be removed in the next release since we don't believe the check is necessary.
|
757
761
|
def wait_for_host_in_dashboard(host)
|
762
|
+
|
758
763
|
hostname = host.node_name
|
759
|
-
|
760
|
-
|
761
|
-
|
762
|
-
|
763
|
-
|
764
|
-
retry_on(dashboard, "! curl #{curl_opts} https://#{dashboard}/nodes/#{hostname} | grep '404 Not Found'")
|
764
|
+
hostcert = dashboard.puppet['hostcert']
|
765
|
+
key = dashboard.puppet['hostprivkey']
|
766
|
+
cacert = dashboard.puppet['localcacert']
|
767
|
+
retry_on(dashboard, "curl --cert #{hostcert} --key #{key} --cacert #{cacert}\
|
768
|
+
https://#{dashboard}:4433/classifier-api/v1/nodes | grep '\"name\":\"#{hostname}\"'")
|
765
769
|
end
|
766
770
|
|
767
771
|
# Ensure the host has requested a cert, then sign it
|
@@ -409,10 +409,14 @@ module Beaker
|
|
409
409
|
def enable_root_login host, opts
|
410
410
|
logger = opts[:logger]
|
411
411
|
block_on host do |host|
|
412
|
-
logger.debug "Update
|
412
|
+
logger.debug "Update sshd_config to allow root login"
|
413
413
|
if host['platform'] =~ /osx/
|
414
|
-
|
415
|
-
|
414
|
+
# If osx > 10.10 use '/private/etc/ssh/sshd_config', else use '/etc/sshd_config'
|
415
|
+
ssh_config_file = '/private/etc/ssh/sshd_config'
|
416
|
+
ssh_config_file = '/etc/sshd_config' if host['platform'] =~ /^osx-10\.(9|10)/i
|
417
|
+
|
418
|
+
host.exec(Command.new("sudo sed -i '' 's/#PermitRootLogin no/PermitRootLogin Yes/g' #{ssh_config_file}"))
|
419
|
+
host.exec(Command.new("sudo sed -i '' 's/#PermitRootLogin yes/PermitRootLogin Yes/g' #{ssh_config_file}"))
|
416
420
|
elsif host['platform'] =~ /freebsd/
|
417
421
|
host.exec(Command.new("sudo sed -i -e 's/#PermitRootLogin no/PermitRootLogin yes/g' /etc/ssh/sshd_config"), {:pty => true} )
|
418
422
|
elsif host['platform'] =~ /openbsd/
|
@@ -811,7 +811,18 @@ module Beaker
|
|
811
811
|
ssh_string = public_key()
|
812
812
|
region.key_pairs.import(pair_name, ssh_string)
|
813
813
|
kp = region.key_pairs[pair_name]
|
814
|
-
|
814
|
+
|
815
|
+
exists = false
|
816
|
+
for tries in 1..5
|
817
|
+
if kp.exists?
|
818
|
+
exists = true
|
819
|
+
break
|
820
|
+
end
|
821
|
+
@logger.debug("AWS key pair doesn't appear to exist yet, sleeping before retry ")
|
822
|
+
backoff_sleep(tries)
|
823
|
+
end
|
824
|
+
|
825
|
+
if exists
|
815
826
|
@logger.debug("aws-sdk: key pair #{pair_name} imported")
|
816
827
|
kp
|
817
828
|
else
|
@@ -122,6 +122,22 @@ module Beaker
|
|
122
122
|
end
|
123
123
|
end
|
124
124
|
|
125
|
+
# Get a hash of volumes from the host
|
126
|
+
def get_volumes host
|
127
|
+
return host['volumes'] if host['volumes']
|
128
|
+
{}
|
129
|
+
end
|
130
|
+
|
131
|
+
# Get the API version
|
132
|
+
def get_volume_api_version
|
133
|
+
case @volume_client
|
134
|
+
when Fog::Volume::OpenStack::V1
|
135
|
+
1
|
136
|
+
else
|
137
|
+
-1
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
125
141
|
# Create and attach dynamic volumes
|
126
142
|
#
|
127
143
|
# Creates an array of volumes and attaches them to the current host.
|
@@ -133,23 +149,34 @@ module Beaker
|
|
133
149
|
# @param host [Hash] thet current host defined in the nodeset
|
134
150
|
# @param vm [Fog::Compute::OpenStack::Server] the server to attach to
|
135
151
|
def provision_storage host, vm
|
136
|
-
|
152
|
+
volumes = get_volumes(host)
|
153
|
+
if !volumes.empty?
|
137
154
|
# Lazily create the volume client if needed
|
138
155
|
volume_client_create
|
139
|
-
|
156
|
+
volumes.keys.each_with_index do |volume, index|
|
140
157
|
@logger.debug "Creating volume #{volume} for OpenStack host #{host.name}"
|
141
158
|
|
142
159
|
# The node defintion file defines volume sizes in MB (due to precedent
|
143
160
|
# with the vagrant virtualbox implementation) however OpenStack requires
|
144
161
|
# this translating into GB
|
145
|
-
openstack_size =
|
162
|
+
openstack_size = volumes[volume]['size'].to_i / 1000
|
163
|
+
|
164
|
+
# Set up the volume creation arguments
|
165
|
+
args = {
|
166
|
+
:size => openstack_size,
|
167
|
+
:description => "Beaker volume: host=#{host.name} volume=#{volume}",
|
168
|
+
}
|
169
|
+
|
170
|
+
# Between version 1 and subsequent versions the API was updated to
|
171
|
+
# rename 'display_name' to just 'name' for better consistency
|
172
|
+
if get_volume_api_version == 1
|
173
|
+
args[:display_name] = volume
|
174
|
+
else
|
175
|
+
args[:name] = volume
|
176
|
+
end
|
146
177
|
|
147
178
|
# Create the volume and wait for it to become available
|
148
|
-
vol = @volume_client.volumes.create(
|
149
|
-
:size => openstack_size,
|
150
|
-
:display_name => volume,
|
151
|
-
:description => "Beaker volume: host=#{host.name} volume=#{volume}",
|
152
|
-
)
|
179
|
+
vol = @volume_client.volumes.create(**args)
|
153
180
|
vol.wait_for { ready? }
|
154
181
|
|
155
182
|
# Fog needs a device name to attach as, so invent one. The guest
|
@@ -309,7 +336,24 @@ module Beaker
|
|
309
336
|
@options[:openstack_keyname]
|
310
337
|
else
|
311
338
|
@logger.debug "Generate a new rsa key"
|
312
|
-
|
339
|
+
|
340
|
+
# There is apparently an error that can occur when generating RSA keys, probably
|
341
|
+
# due to some timing issue, probably similar to the issue described here:
|
342
|
+
# https://github.com/negativecode/vines/issues/34
|
343
|
+
# In order to mitigate this error, we will simply try again up to three times, and
|
344
|
+
# then fail if we continue to error out.
|
345
|
+
begin
|
346
|
+
retries ||= 0
|
347
|
+
key = OpenSSL::PKey::RSA.new 2048
|
348
|
+
rescue OpenSSL::PKey::RSAError => e
|
349
|
+
retries += 1
|
350
|
+
if retries > 2
|
351
|
+
@logger.notify "error generating RSA key #{retries} times, exiting"
|
352
|
+
raise e
|
353
|
+
end
|
354
|
+
retry
|
355
|
+
end
|
356
|
+
|
313
357
|
type = key.ssh_type
|
314
358
|
data = [ key.to_blob ].pack('m0')
|
315
359
|
@logger.debug "Creating Openstack keypair for public key '#{type} #{data}'"
|
@@ -8,6 +8,13 @@ class Beaker::VagrantLibvirt < Beaker::Vagrant
|
|
8
8
|
attr_reader :memory
|
9
9
|
end
|
10
10
|
|
11
|
+
# Return a random mac address with colons
|
12
|
+
#
|
13
|
+
# @return [String] a random mac address
|
14
|
+
def randmac
|
15
|
+
"08:00:27:" + (1..3).map{"%0.2X"%rand(256)}.join(':')
|
16
|
+
end
|
17
|
+
|
11
18
|
def provision(provider = 'libvirt')
|
12
19
|
super
|
13
20
|
end
|
@@ -1,5 +1,7 @@
|
|
1
1
|
require 'beaker-hostgenerator'
|
2
2
|
|
3
|
+
CONFIG_DIR = '.beaker/acceptance/config'
|
4
|
+
|
3
5
|
VAGRANT = ['ubuntu1404-64default.mdcal-ubuntu1404-64af', '--hypervisor=vagrant',
|
4
6
|
'--global-config={box_url=https://vagrantcloud.com/puppetlabs/boxes/ubuntu-14.04-64-nocm,box=puppetlabs/ubuntu-14.04-64-nocm}']
|
5
7
|
|
@@ -9,17 +11,17 @@ namespace :beaker_quickstart do
|
|
9
11
|
|
10
12
|
desc 'Generate Default Beaker Host Config File, valid options are: vmpooler or vagrant.'
|
11
13
|
task :gen_hosts, [:hypervisor] do |t, args|
|
12
|
-
hosts_file = "
|
14
|
+
hosts_file = "#{CONFIG_DIR}/default_#{args[:hypervisor]}_hosts.yaml"
|
13
15
|
if args[:hypervisor] == 'vagrant'
|
14
16
|
cli = VAGRANT
|
15
17
|
elsif args[:hypervisor] == 'vmpooler'
|
16
18
|
cli = VMPOOLER
|
17
19
|
else
|
18
20
|
puts "No hypervisor provided, defaulting to vagrant."
|
19
|
-
hosts_file = "
|
21
|
+
hosts_file = "#{CONFIG_DIR}/default_vagrant_hosts.yaml"
|
20
22
|
cli = VAGRANT
|
21
23
|
end
|
22
|
-
FileUtils.mkdir_p(
|
24
|
+
FileUtils.mkdir_p("#{CONFIG_DIR}") # -p creates intermediate directories as required
|
23
25
|
puts "About to run - beaker-hostgenerator #{cli.to_s.delete!('[]"')}"
|
24
26
|
if !File.exist?(hosts_file) then
|
25
27
|
puts "Writing default host config to file - #{hosts_file}"
|
@@ -90,4 +92,4 @@ def beaker_command(system_args)
|
|
90
92
|
cmd_parts << "--pre-suite #{system_args[:pre_suite]}"
|
91
93
|
cmd_parts << "--tests #{system_args[:tests]}"
|
92
94
|
cmd_parts.flatten.join(" ")
|
93
|
-
end
|
95
|
+
end
|
data/lib/beaker/version.rb
CHANGED
@@ -1096,14 +1096,14 @@ describe ClassMixedWithDSLHelpers do
|
|
1096
1096
|
|
1097
1097
|
it 'uses the default ports if none given' do
|
1098
1098
|
host = hosts[0]
|
1099
|
-
expect( subject ).to receive( :
|
1099
|
+
expect( subject ).to receive( :retry_on ).with( anything(), /8080/, anything() ).once.ordered
|
1100
1100
|
expect( subject ).to receive( :curl_with_retries ).with( anything(), anything(), /8081/, anything() ).once.ordered
|
1101
1101
|
subject.sleep_until_puppetdb_started( host )
|
1102
1102
|
end
|
1103
1103
|
|
1104
1104
|
it 'allows setting the nonssl_port' do
|
1105
1105
|
host = hosts[0]
|
1106
|
-
expect( subject ).to receive( :
|
1106
|
+
expect( subject ).to receive( :retry_on ).with( anything(), /8084/, anything() ).once.ordered
|
1107
1107
|
expect( subject ).to receive( :curl_with_retries ).with( anything(), anything(), /8081/, anything() ).once.ordered
|
1108
1108
|
subject.sleep_until_puppetdb_started( host, 8084 )
|
1109
1109
|
|
@@ -1111,7 +1111,7 @@ describe ClassMixedWithDSLHelpers do
|
|
1111
1111
|
|
1112
1112
|
it 'allows setting the ssl_port' do
|
1113
1113
|
host = hosts[0]
|
1114
|
-
expect( subject ).to receive( :
|
1114
|
+
expect( subject ).to receive( :retry_on ).with( anything(), /8080/, anything() ).once.ordered
|
1115
1115
|
expect( subject ).to receive( :curl_with_retries ).with( anything(), anything(), /8085/, anything() ).once.ordered
|
1116
1116
|
subject.sleep_until_puppetdb_started( host, nil, 8085 )
|
1117
1117
|
end
|
@@ -51,11 +51,21 @@ describe Beaker do
|
|
51
51
|
"sudo su -c \"sed -ri 's/^#?PermitRootLogin no|^#?PermitRootLogin yes/PermitRootLogin yes/' /etc/ssh/sshd_config\""
|
52
52
|
], true
|
53
53
|
|
54
|
-
it_should_behave_like 'enables_root_login', 'osx', [
|
54
|
+
it_should_behave_like 'enables_root_login', 'osx-10.10', [
|
55
55
|
"sudo sed -i '' 's/#PermitRootLogin yes/PermitRootLogin Yes/g' /etc/sshd_config",
|
56
56
|
"sudo sed -i '' 's/#PermitRootLogin no/PermitRootLogin Yes/g' /etc/sshd_config"
|
57
57
|
]
|
58
58
|
|
59
|
+
it_should_behave_like 'enables_root_login', 'osx-10.11', [
|
60
|
+
"sudo sed -i '' 's/#PermitRootLogin yes/PermitRootLogin Yes/g' /private/etc/ssh/sshd_config",
|
61
|
+
"sudo sed -i '' 's/#PermitRootLogin no/PermitRootLogin Yes/g' /private/etc/ssh/sshd_config"
|
62
|
+
]
|
63
|
+
|
64
|
+
it_should_behave_like 'enables_root_login', 'osx-10.12', [
|
65
|
+
"sudo sed -i '' 's/#PermitRootLogin yes/PermitRootLogin Yes/g' /private/etc/ssh/sshd_config",
|
66
|
+
"sudo sed -i '' 's/#PermitRootLogin no/PermitRootLogin Yes/g' /private/etc/ssh/sshd_config"
|
67
|
+
]
|
68
|
+
|
59
69
|
# Solaris
|
60
70
|
it_should_behave_like 'enables_root_login', 'solaris-10', [
|
61
71
|
"sudo -E svcadm restart network/ssh",
|
@@ -538,8 +548,16 @@ describe Beaker do
|
|
538
548
|
context "set_env" do
|
539
549
|
subject { dummy_class.new }
|
540
550
|
|
541
|
-
it "permits user environments on an OS X host" do
|
542
|
-
test_host_ssh_permit_user_environment('osx')
|
551
|
+
it "permits user environments on an OS X 10.10 host" do
|
552
|
+
test_host_ssh_permit_user_environment('osx-10.10')
|
553
|
+
end
|
554
|
+
|
555
|
+
it "permits user environments on an OS X 10.11 host" do
|
556
|
+
test_host_ssh_permit_user_environment('osx-10.11')
|
557
|
+
end
|
558
|
+
|
559
|
+
it "permits user environments on an OS X 10.12 host" do
|
560
|
+
test_host_ssh_permit_user_environment('osx-10.12')
|
543
561
|
end
|
544
562
|
|
545
563
|
it "permits user environments on an ssh-based linux host" do
|
@@ -571,8 +589,16 @@ describe Beaker do
|
|
571
589
|
end
|
572
590
|
|
573
591
|
|
574
|
-
it "sets user ssh environment on an OS X host" do
|
575
|
-
test_host_ssh_set_user_environment('osx')
|
592
|
+
it "sets user ssh environment on an OS X 10.10 host" do
|
593
|
+
test_host_ssh_set_user_environment('osx-10.10')
|
594
|
+
end
|
595
|
+
|
596
|
+
it "sets user ssh environment on an OS X 10.11 host" do
|
597
|
+
test_host_ssh_set_user_environment('osx-10.11')
|
598
|
+
end
|
599
|
+
|
600
|
+
it "sets user ssh environment on an OS X 10.12 host" do
|
601
|
+
test_host_ssh_set_user_environment('osx-10.12')
|
576
602
|
end
|
577
603
|
|
578
604
|
it "sets user ssh environment on an ssh-based linux host" do
|
@@ -839,12 +839,13 @@ module Beaker
|
|
839
839
|
end
|
840
840
|
|
841
841
|
it 'imports the key given from public_key' do
|
842
|
-
expect(pair).to receive(:exists?).and_return
|
842
|
+
expect(pair).to receive(:exists?).and_return(true)
|
843
843
|
aws.create_new_key_pair(region, pair_name)
|
844
844
|
end
|
845
845
|
|
846
846
|
it 'raises an exception if subsequent keypair check is false' do
|
847
|
-
expect(pair).to receive(:exists?).and_return
|
847
|
+
expect(pair).to receive(:exists?).and_return(false).exactly(5).times
|
848
|
+
expect(aws).to receive(:backoff_sleep).exactly(5).times
|
848
849
|
expect { aws.create_new_key_pair(region, pair_name) }.
|
849
850
|
to raise_error(RuntimeError,
|
850
851
|
"AWS key pair #{pair_name} can not be queried, even after import")
|
@@ -104,5 +104,57 @@ module Beaker
|
|
104
104
|
(1..3).each { openstack.get_ip }
|
105
105
|
end
|
106
106
|
|
107
|
+
it 'creates volumes with cinder v1' do
|
108
|
+
# Mock a volume
|
109
|
+
allow(openstack).to receive(:get_volumes).and_return({'volume1' => {'size' => 1000000 }})
|
110
|
+
|
111
|
+
# Stub out the call to create the client and hard code the return value
|
112
|
+
allow(openstack).to receive(:volume_client_create).and_return(nil)
|
113
|
+
client = double().as_null_object
|
114
|
+
openstack.instance_variable_set(:@volume_client, client)
|
115
|
+
allow(openstack).to receive(:get_volume_api_version).and_return(1)
|
116
|
+
|
117
|
+
# Check the parameters are valid, correct 'name' parameter and correct size conversion
|
118
|
+
mock_volume = double().as_null_object
|
119
|
+
expect(client).to receive(:create).with(:display_name => 'volume1', :description => 'Beaker volume: host=alan volume=volume1', :size => 1000).and_return(mock_volume)
|
120
|
+
allow(mock_volume).to receive(:wait_for).and_return(nil)
|
121
|
+
|
122
|
+
# Perform the test!
|
123
|
+
mock_vm = double().as_null_object
|
124
|
+
allow(mock_volume).to receive(:id).and_return('Fake ID')
|
125
|
+
expect(mock_vm).to receive(:attach_volume).with('Fake ID', '/dev/vdb')
|
126
|
+
|
127
|
+
mock_host = double().as_null_object
|
128
|
+
allow(mock_host).to receive(:name).and_return('alan')
|
129
|
+
|
130
|
+
openstack.provision_storage mock_host, mock_vm
|
131
|
+
end
|
132
|
+
|
133
|
+
it 'creates volumes with cinder v2' do
|
134
|
+
# Mock a volume
|
135
|
+
allow(openstack).to receive(:get_volumes).and_return({'volume1' => {'size' => 1000000 }})
|
136
|
+
|
137
|
+
# Stub out the call to create the client and hard code the return value
|
138
|
+
allow(openstack).to receive(:volume_client_create).and_return(nil)
|
139
|
+
client = double().as_null_object
|
140
|
+
openstack.instance_variable_set(:@volume_client, client)
|
141
|
+
allow(openstack).to receive(:get_volume_api_version).and_return(-1)
|
142
|
+
|
143
|
+
# Check the parameters are valid, correct 'name' parameter and correct size conversion
|
144
|
+
mock_volume = double().as_null_object
|
145
|
+
expect(client).to receive(:create).with(:name => 'volume1', :description => 'Beaker volume: host=alan volume=volume1', :size => 1000).and_return(mock_volume)
|
146
|
+
allow(mock_volume).to receive(:wait_for).and_return(nil)
|
147
|
+
|
148
|
+
# Perform the test!
|
149
|
+
mock_vm = double().as_null_object
|
150
|
+
allow(mock_volume).to receive(:id).and_return('Fake ID')
|
151
|
+
expect(mock_vm).to receive(:attach_volume).with('Fake ID', '/dev/vdb')
|
152
|
+
|
153
|
+
mock_host = double().as_null_object
|
154
|
+
allow(mock_host).to receive(:name).and_return('alan')
|
155
|
+
|
156
|
+
openstack.provision_storage mock_host, mock_vm
|
157
|
+
end
|
158
|
+
|
107
159
|
end
|
108
160
|
end
|
@@ -29,7 +29,6 @@ describe Beaker::VagrantLibvirt do
|
|
29
29
|
before(:each) do
|
30
30
|
FakeFS.activate!
|
31
31
|
path = vagrant.instance_variable_get( :@vagrant_path )
|
32
|
-
allow( vagrant ).to receive( :randmac ).and_return( "0123456789" )
|
33
32
|
|
34
33
|
vagrant.make_vfile( @hosts, options )
|
35
34
|
@vagrantfile = File.read( File.expand_path( File.join( path, "Vagrantfile")))
|
@@ -53,5 +52,10 @@ describe Beaker::VagrantLibvirt do
|
|
53
52
|
expect( @vagrantfile.split("\n").map(&:strip) )
|
54
53
|
.to include("node.uri = 'qemu+ssh://root@host/system'")
|
55
54
|
end
|
55
|
+
|
56
|
+
it "has a mac address in the proper format" do
|
57
|
+
expect( @vagrantfile.split("\n").map(&:strip) )
|
58
|
+
.to include(/:mac => "08:00:27:\h{2}:\h{2}:\h{2}"/)
|
59
|
+
end
|
56
60
|
end
|
57
61
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: beaker
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.11.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Puppetlabs
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-02-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|
@@ -140,16 +140,16 @@ dependencies:
|
|
140
140
|
name: net-ssh
|
141
141
|
requirement: !ruby/object:Gem::Requirement
|
142
142
|
requirements:
|
143
|
-
- -
|
143
|
+
- - ~>
|
144
144
|
- !ruby/object:Gem::Version
|
145
|
-
version:
|
145
|
+
version: '4.0'
|
146
146
|
type: :runtime
|
147
147
|
prerelease: false
|
148
148
|
version_requirements: !ruby/object:Gem::Requirement
|
149
149
|
requirements:
|
150
|
-
- -
|
150
|
+
- - ~>
|
151
151
|
- !ruby/object:Gem::Version
|
152
|
-
version:
|
152
|
+
version: '4.0'
|
153
153
|
- !ruby/object:Gem::Dependency
|
154
154
|
name: net-scp
|
155
155
|
requirement: !ruby/object:Gem::Requirement
|
@@ -416,13 +416,14 @@ files:
|
|
416
416
|
- acceptance/config/puppetgit/acceptance-options.rb
|
417
417
|
- acceptance/config/puppetpe/acceptance-options.rb
|
418
418
|
- acceptance/config/puppetpkg/acceptance-options.rb
|
419
|
+
- acceptance/config/subcommands/acceptance-options.rb
|
419
420
|
- acceptance/fixtures/README.md
|
420
421
|
- acceptance/fixtures/files/failing_shell_script.txt
|
421
422
|
- acceptance/fixtures/files/retry_script.txt
|
422
423
|
- acceptance/fixtures/files/shell_script_with_output.txt
|
423
424
|
- acceptance/fixtures/files/simple_text_file.txt
|
424
|
-
- acceptance/fixtures/files/sles-11-x86_64.repo
|
425
|
-
- acceptance/fixtures/files/sles-12-x86_64.repo
|
425
|
+
- acceptance/fixtures/files/sles-11-x86_64.repo
|
426
|
+
- acceptance/fixtures/files/sles-12-x86_64.repo
|
426
427
|
- acceptance/fixtures/module/Gemfile
|
427
428
|
- acceptance/fixtures/module/README.md
|
428
429
|
- acceptance/fixtures/module/Rakefile
|
@@ -476,6 +477,8 @@ files:
|
|
476
477
|
- acceptance/pre_suite/puppet_gem/install.rb
|
477
478
|
- acceptance/pre_suite/puppet_git/install.rb
|
478
479
|
- acceptance/pre_suite/puppet_pkg/install.rb
|
480
|
+
- acceptance/pre_suite/subcommands/05_install_ruby.rb
|
481
|
+
- acceptance/pre_suite/subcommands/08_install_beaker.rb
|
479
482
|
- acceptance/tests/base/README.md
|
480
483
|
- acceptance/tests/base/dsl/helpers/configuration_test.rb
|
481
484
|
- acceptance/tests/base/dsl/helpers/hocon_helpers_test.rb
|
@@ -520,6 +523,7 @@ files:
|
|
520
523
|
- acceptance/tests/puppet/stub_host.rb
|
521
524
|
- acceptance/tests/puppet/web_helpers_test.rb
|
522
525
|
- acceptance/tests/puppet/with_puppet_running_on.rb
|
526
|
+
- acceptance/tests/subcommands/init.rb
|
523
527
|
- beaker.gemspec
|
524
528
|
- bin/beaker
|
525
529
|
- docs/README.md
|