beaker 2.27.0 → 2.28.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/HISTORY.md +378 -2
- data/README.md +1 -3
- data/acceptance/config/acceptance-options.rb +3 -0
- data/acceptance/fixtures/files/failing_shell_script.txt +3 -0
- data/acceptance/fixtures/files/retry_script.txt +14 -0
- data/acceptance/fixtures/files/shell_script_with_output.txt +3 -0
- data/acceptance/fixtures/files/simple_text_file.txt +3 -0
- data/acceptance/fixtures/files/sles-11-x86_64.repo +5 -0
- data/acceptance/lib/helpers/test_helper.rb +111 -0
- data/acceptance/tests/base/dsl/helpers/configuration_test.rb +17 -0
- data/acceptance/tests/base/dsl/helpers/host_helpers/add_system32_hosts_entry_test.rb +50 -0
- data/acceptance/tests/base/dsl/helpers/host_helpers/backup_the_file_test.rb +64 -0
- data/acceptance/tests/base/dsl/helpers/host_helpers/check_for_package_test.rb +100 -0
- data/acceptance/tests/base/dsl/helpers/host_helpers/create_remote_file_test.rb +201 -0
- data/acceptance/tests/base/dsl/helpers/host_helpers/create_tmpdir_on_test.rb +68 -0
- data/acceptance/tests/base/dsl/helpers/host_helpers/curl_on_test.rb +48 -0
- data/acceptance/tests/base/dsl/helpers/host_helpers/curl_with_retries_test.rb +28 -0
- data/acceptance/tests/base/dsl/helpers/host_helpers/deploy_package_repo_test.rb +142 -0
- data/acceptance/tests/base/dsl/helpers/host_helpers/echo_on_test.rb +13 -0
- data/acceptance/tests/base/dsl/helpers/host_helpers/install_package_test.rb +67 -0
- data/acceptance/tests/base/dsl/helpers/host_helpers/on_test.rb +109 -0
- data/acceptance/tests/base/dsl/helpers/host_helpers/retry_on_test.rb +42 -0
- data/acceptance/tests/base/dsl/helpers/host_helpers/rsync_to_test.rb +143 -0
- data/acceptance/tests/base/dsl/helpers/host_helpers/run_cron_on_test.rb +242 -0
- data/acceptance/tests/base/dsl/helpers/host_helpers/run_script_on_test.rb +69 -0
- data/acceptance/tests/base/dsl/helpers/host_helpers/run_script_test.rb +53 -0
- data/acceptance/tests/base/dsl/helpers/host_helpers/scp_from_test.rb +53 -0
- data/acceptance/tests/base/dsl/helpers/host_helpers/scp_to_test.rb +54 -0
- data/acceptance/tests/base/dsl/helpers/host_helpers/shell_test.rb +51 -0
- data/acceptance/tests/base/dsl/helpers/host_helpers/upgrade_package_test.rb +92 -0
- data/acceptance/tests/base/dsl/install_utils/clone_git_repo_on_test.rb +47 -0
- data/acceptance/tests/base/{host.rb → host_test.rb} +2 -0
- data/acceptance/tests/hypervisor/{communication.rb → communication_test.rb} +0 -0
- data/acceptance/tests/load_path_bootstrap.rb +10 -0
- data/acceptance/tests/puppet/{install_smoke.rb → install_smoke_test.rb} +0 -0
- data/beaker.gemspec +1 -1
- data/docs/Access-the-Live-Test-Console-with-Pry.md +305 -0
- data/docs/Argument-Processing-and-Precedence.md +325 -0
- data/docs/Beaker-Installation.md +59 -0
- data/docs/Beaker-Owners-and-Reviewers.md +16 -0
- data/docs/Beaker-Test-Tagging.md +76 -0
- data/docs/Beaker-with-Masterless-Puppet.md +42 -0
- data/docs/Creating-A-Test-Environment.md +91 -0
- data/docs/Docker-Support.md +129 -0
- data/docs/EC2-Support.md +77 -0
- data/docs/Example-Vagrant-Hosts-Files.md +66 -0
- data/docs/File-a-Beaker-Bug.md +3 -0
- data/docs/Google-Compute-Engine-Support.md +41 -0
- data/docs/How-To-Beaker.md +7 -0
- data/docs/How-To-Use-User-Password-Authentication-with-Beaker.md +53 -0
- data/docs/How-to-Write-a-Beaker-Test-for-a-Module.md +145 -0
- data/docs/Lets-Write-a-Test.md +73 -0
- data/docs/Openstack-Support.md +32 -0
- data/docs/Overview.md +31 -0
- data/docs/README.md +43 -0
- data/docs/Roles-What-Are-They.md +44 -0
- data/docs/Shared-Options-for-Executing-Beaker-Commands.md +43 -0
- data/docs/Solaris-Support.md +10 -0
- data/docs/The-Beaker-DSL.md +283 -0
- data/docs/The-Command-Line.md +24 -0
- data/docs/Types,-Puppet-4,-and-the-All-In-One-Agent.md +13 -0
- data/docs/VMWare-Fusion-Support.md +36 -0
- data/docs/Vagrant-Support.md +47 -0
- data/docs/beaker-vs.-beaker-rspec.md +87 -0
- data/docs/hosts/README.md +8 -0
- data/docs/hosts/eos.md +30 -0
- data/docs/hypervisors/README.md +8 -0
- data/docs/hypervisors/aws.md +143 -0
- data/docs/vSphere-Support.md +46 -0
- data/lib/beaker/dsl/helpers/host_helpers.rb +2 -4
- data/lib/beaker/dsl/helpers/puppet_helpers.rb +45 -11
- data/lib/beaker/dsl/install_utils/foss_utils.rb +20 -23
- data/lib/beaker/dsl/install_utils/module_utils.rb +4 -0
- data/lib/beaker/dsl/install_utils/pe_utils.rb +2 -6
- data/lib/beaker/dsl/patterns.rb +1 -1
- data/lib/beaker/host.rb +3 -0
- data/lib/beaker/host/eos.rb +56 -0
- data/lib/beaker/host/mac/pkg.rb +1 -1
- data/lib/beaker/host/unix/pkg.rb +36 -0
- data/lib/beaker/hypervisor/aws_sdk.rb +1 -1
- data/lib/beaker/hypervisor/vagrant.rb +3 -3
- data/lib/beaker/logger.rb +1 -0
- data/lib/beaker/options/presets.rb +5 -0
- data/lib/beaker/shared/host_manager.rb +7 -4
- data/lib/beaker/version.rb +1 -1
- data/spec/beaker/dsl/helpers/puppet_helpers_spec.rb +87 -0
- data/spec/beaker/dsl/install_utils/foss_utils_spec.rb +53 -20
- data/spec/beaker/dsl/install_utils/module_utils_spec.rb +1 -1
- data/spec/beaker/dsl/install_utils/pe_utils_spec.rb +7 -14
- data/spec/beaker/host/eos_spec.rb +65 -0
- data/spec/beaker/host/unix/pkg_spec.rb +42 -0
- data/spec/beaker/hypervisor/aws_sdk_spec.rb +17 -56
- data/spec/beaker/hypervisor/vagrant_spec.rb +1 -1
- data/spec/beaker/logger_spec.rb +1 -1
- data/spec/mocks.rb +0 -13
- metadata +76 -6
- data/acceptance/tests/dsl/install_utils/clone_git_repo_on.rb +0 -50
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
require "helpers/test_helper"
|
|
2
|
+
|
|
3
|
+
test_name "dsl::helpers::host_helpers #run_script" do
|
|
4
|
+
step "#run_script fails when the local script cannot be found" do
|
|
5
|
+
assert_raises IOError do
|
|
6
|
+
run_script "/non/existent/testfile.sh"
|
|
7
|
+
end
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
step "#run_script fails when there is an error running the remote script" do
|
|
11
|
+
Dir.mktmpdir do |local_dir|
|
|
12
|
+
local_filename = File.join(local_dir, "testfile.sh")
|
|
13
|
+
local_filename, contents = create_local_file_from_fixture("failing_shell_script", local_dir, "testfile.sh", "a+x")
|
|
14
|
+
|
|
15
|
+
assert_raises Beaker::Host::CommandFailure do
|
|
16
|
+
run_script local_filename
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
step "#run_script passes along options when running the remote command" do
|
|
22
|
+
Dir.mktmpdir do |local_dir|
|
|
23
|
+
local_filename = File.join(local_dir, "testfile.sh")
|
|
24
|
+
local_filename, contents = create_local_file_from_fixture("failing_shell_script", local_dir, "testfile.sh", "a+x")
|
|
25
|
+
|
|
26
|
+
result = run_script local_filename, { :accept_all_exit_codes => true }
|
|
27
|
+
assert_equal 1, result.exit_code
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
step "#run_script runs the script on the remote host" do
|
|
32
|
+
Dir.mktmpdir do |local_dir|
|
|
33
|
+
local_filename = File.join(local_dir, "testfile.sh")
|
|
34
|
+
local_filename, contents = create_local_file_from_fixture("shell_script_with_output", local_dir, "testfile.sh", "a+x")
|
|
35
|
+
|
|
36
|
+
results = run_script local_filename
|
|
37
|
+
assert_equal 0, results.exit_code
|
|
38
|
+
assert_equal "output\n", results.stdout
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
step "#run_script allows assertions in an optional block" do
|
|
43
|
+
Dir.mktmpdir do |local_dir|
|
|
44
|
+
local_filename = File.join(local_dir, "testfile.sh")
|
|
45
|
+
local_filename, contents = create_local_file_from_fixture("shell_script_with_output", local_dir, "testfile.sh", "a+x")
|
|
46
|
+
|
|
47
|
+
results = run_script local_filename do
|
|
48
|
+
assert_equal 0, exit_code
|
|
49
|
+
assert_equal "output\n", stdout
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
require "helpers/test_helper"
|
|
2
|
+
|
|
3
|
+
test_name "dsl::helpers::host_helpers #scp_from" do
|
|
4
|
+
if test_scp_error_on_close?
|
|
5
|
+
step "#scp_from fails if the local path cannot be found" do
|
|
6
|
+
remote_tmpdir = tmpdir_on default
|
|
7
|
+
remote_filename, contents = create_remote_file_from_fixture("simple_text_file", default, remote_tmpdir, "testfile.txt")
|
|
8
|
+
|
|
9
|
+
assert_raises Beaker::Host::CommandFailure do
|
|
10
|
+
scp_from default, remote_filename, "/non/existent/file.txt"
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
step "#scp_from fails if the remote file cannot be found" do
|
|
15
|
+
Dir.mktmpdir do |local_dir|
|
|
16
|
+
assert_raises Beaker::Host::CommandFailure do
|
|
17
|
+
scp_from default, "/non/existent/remote/file.txt", local_dir
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
step "#scp_from creates the file on the local system" do
|
|
24
|
+
Dir.mktmpdir do |local_dir|
|
|
25
|
+
remote_tmpdir = tmpdir_on default
|
|
26
|
+
remote_filename, contents = create_remote_file_from_fixture("simple_text_file", default, remote_tmpdir, "testfile.txt")
|
|
27
|
+
|
|
28
|
+
scp_from default, remote_filename, local_dir
|
|
29
|
+
|
|
30
|
+
local_filename = File.join(local_dir, "testfile.txt")
|
|
31
|
+
assert_equal contents, File.read(local_filename)
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
step "#scp_from CURRENTLY creates and repeatedly overwrites the file on the local system when given a hosts array" do
|
|
36
|
+
# NOTE: expect this behavior to be well-documented, or for overwriting a
|
|
37
|
+
# file repeatedly to generate an error
|
|
38
|
+
|
|
39
|
+
Dir.mktmpdir do |local_dir|
|
|
40
|
+
remote_tmpdir = tmpdir_on default
|
|
41
|
+
remote_filename = File.join(remote_tmpdir, "testfile.txt")
|
|
42
|
+
on hosts, "mkdir -p #{remote_tmpdir}"
|
|
43
|
+
results = on hosts, %Q{echo "${RANDOM}:${RANDOM}:${RANDOM}" > #{remote_filename}}
|
|
44
|
+
|
|
45
|
+
scp_from hosts, remote_filename, local_dir
|
|
46
|
+
remote_contents = on(hosts.last, "cat #{remote_filename}").stdout
|
|
47
|
+
|
|
48
|
+
local_filename = File.join(local_dir, "testfile.txt")
|
|
49
|
+
local_contents = File.read(local_filename)
|
|
50
|
+
assert_equal remote_contents, local_contents
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
require "helpers/test_helper"
|
|
2
|
+
|
|
3
|
+
test_name "dsl::helpers::host_helpers #scp_to" do
|
|
4
|
+
step "#scp_to fails if the local file cannot be found" do
|
|
5
|
+
remote_tmpdir = tmpdir_on default
|
|
6
|
+
assert_raises IOError do
|
|
7
|
+
scp_to default, "/non/existent/file.txt", remote_tmpdir
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
if test_scp_error_on_close?
|
|
12
|
+
step "#scp_to fails if the remote path cannot be found" do
|
|
13
|
+
Dir.mktmpdir do |local_dir|
|
|
14
|
+
local_filename, contents = create_local_file_from_fixture("simple_text_file", local_dir, "testfile.txt")
|
|
15
|
+
|
|
16
|
+
# assert_raises Beaker::Host::CommandFailure do
|
|
17
|
+
assert_raises RuntimeError do
|
|
18
|
+
scp_to default, local_filename, "/non/existent/remote/file.txt"
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
step "#scp_to creates the file on the remote system" do
|
|
25
|
+
Dir.mktmpdir do |local_dir|
|
|
26
|
+
local_filename, contents = create_local_file_from_fixture("simple_text_file", local_dir, "testfile.txt")
|
|
27
|
+
remote_tmpdir = tmpdir_on default
|
|
28
|
+
|
|
29
|
+
scp_to default, local_filename, remote_tmpdir
|
|
30
|
+
|
|
31
|
+
remote_filename = File.join(remote_tmpdir, "testfile.txt")
|
|
32
|
+
remote_contents = on(default, "cat #{remote_filename}").stdout
|
|
33
|
+
assert_equal contents, remote_contents
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
step "#scp_to creates the file on all remote systems when a host array is provided" do
|
|
38
|
+
Dir.mktmpdir do |local_dir|
|
|
39
|
+
local_filename, contents = create_local_file_from_fixture("simple_text_file", local_dir, "testfile.txt")
|
|
40
|
+
|
|
41
|
+
remote_tmpdir = tmpdir_on default
|
|
42
|
+
on hosts, "mkdir -p #{remote_tmpdir}"
|
|
43
|
+
remote_filename = File.join(remote_tmpdir, "testfile.txt")
|
|
44
|
+
|
|
45
|
+
scp_to hosts, local_filename, remote_tmpdir
|
|
46
|
+
|
|
47
|
+
hosts.each do |host|
|
|
48
|
+
remote_contents = on(host, "cat #{remote_filename}").stdout
|
|
49
|
+
assert_equal contents, remote_contents
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
end
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
require "helpers/test_helper"
|
|
2
|
+
|
|
3
|
+
test_name "dsl::helpers::host_helpers #shell" do
|
|
4
|
+
step "#shell raises an exception when remote command fails" do
|
|
5
|
+
assert_raises(Beaker::Host::CommandFailure) do
|
|
6
|
+
shell "/bin/nonexistent-command"
|
|
7
|
+
end
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
step "#shell makes command output available via `.stdout` on success" do
|
|
11
|
+
output = shell(%Q{echo "echo via on"}).stdout
|
|
12
|
+
assert_equal "echo via on\n", output
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
step "#shell makes command error output available via `.stderr` on success" do
|
|
16
|
+
output = shell("/bin/nonexistent-command", :acceptable_exit_codes => [0, 127]).stderr
|
|
17
|
+
assert_match /No such file/, output
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
step "#shell makes exit status available via `.exit_code`" do
|
|
21
|
+
status = shell(%Q{echo "echo via on"}).exit_code
|
|
22
|
+
assert_equal 0, status
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
step "#shell with :acceptable_exit_codes will not fail for named exit codes" do
|
|
26
|
+
result = shell "/bin/nonexistent-command", :acceptable_exit_codes => [0, 127]
|
|
27
|
+
output = result.stderr
|
|
28
|
+
assert_match /No such file/, output
|
|
29
|
+
status = result.exit_code
|
|
30
|
+
assert_equal 127, status
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
step "#shell with :acceptable_exit_codes will fail for other exit codes" do
|
|
34
|
+
assert_raises(Beaker::Host::CommandFailure) do
|
|
35
|
+
shell %Q{echo "echo via on"}, :acceptable_exit_codes => [127]
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
step "#shell will pass :environment options to the remote host as ENV settings" do
|
|
40
|
+
result = shell "env", { :environment => { 'FOO' => 'bar' } }
|
|
41
|
+
output = result.stdout
|
|
42
|
+
|
|
43
|
+
assert_match /\bFOO=bar\b/, output
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
step "#shell allows assertions to be used in the optional block" do
|
|
47
|
+
shell %Q{echo "${RANDOM}:${RANDOM}"} do
|
|
48
|
+
assert_match /\d+:\d+/, stdout
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
require "helpers/test_helper"
|
|
2
|
+
|
|
3
|
+
test_name "dsl::helpers::host_helpers #upgrade_package" do
|
|
4
|
+
# NOTE: vivid packages are not ready on nightlies.puppetlabs.com,
|
|
5
|
+
# see: https://tickets.puppetlabs.com/browse/CPR-173
|
|
6
|
+
# also: https://tickets.puppetlabs.com/browse/BKR-513
|
|
7
|
+
confine :except, :platform => /ubuntu.*15/
|
|
8
|
+
|
|
9
|
+
# NOTE: there does not appear to be a way to confine just to cygwin hosts
|
|
10
|
+
confine_block :to, :platform => /windows/ do
|
|
11
|
+
|
|
12
|
+
# NOTE: check_for_package on windows currently fails as follows:
|
|
13
|
+
#
|
|
14
|
+
# ArgumentError: wrong number of arguments (3 for 1..2)
|
|
15
|
+
#
|
|
16
|
+
# Would expect this to be documented better, and to fail with Beaker::Host::CommandFailure
|
|
17
|
+
|
|
18
|
+
step "#upgrade_package CURRENTLY fails on windows platforms with a RuntimeError" do
|
|
19
|
+
# NOTE: this is not a supported platform but would expect a Beaker::Host::CommandFailure
|
|
20
|
+
assert_raises RuntimeError do
|
|
21
|
+
upgrade_package default, "bash"
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
confine_block :to, :platform => /osx/ do
|
|
27
|
+
|
|
28
|
+
step "#upgrade_package CURRENTLY fails with a RuntimeError on OS X" do
|
|
29
|
+
# NOTE: documentation could be better on this method
|
|
30
|
+
assert_raises RuntimeError do
|
|
31
|
+
upgrade_package default, "bash"
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
confine_block :to, :platform => /solaris/ do
|
|
37
|
+
|
|
38
|
+
step "#upgrade_package CURRENTLY fails on solaris platforms" do
|
|
39
|
+
# NOTE: pkgutil doesn't appear to be installed by default -- documentation
|
|
40
|
+
# could be better here.
|
|
41
|
+
assert_raises Beaker::Host::CommandFailure do
|
|
42
|
+
upgrade_package default, "bash"
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
confine_block :except, :platform => /windows|solaris|osx/ do
|
|
48
|
+
confine_block :to, :platform => /centos|el-\d/ do
|
|
49
|
+
|
|
50
|
+
step "#upgrade_package CURRENTLY does not fail on CentOS if unknown package is specified" do
|
|
51
|
+
# NOTE: I would expect this to fail with an Beaker::Host::CommandFailure,
|
|
52
|
+
# but maybe it's because yum doesn't really care:
|
|
53
|
+
#
|
|
54
|
+
# > Loaded plugins: fastestmirror
|
|
55
|
+
# > Loading mirror speeds from cached hostfile
|
|
56
|
+
# > Setting up Update Process
|
|
57
|
+
# > No package non-existent-package-name available.
|
|
58
|
+
# > No Packages marked for Update
|
|
59
|
+
|
|
60
|
+
result = upgrade_package default, "non-existent-package-name"
|
|
61
|
+
assert_match /No Packages marked for Update/i, result
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
confine_block :except, :platform => /centos|el-\d/ do
|
|
66
|
+
|
|
67
|
+
step "#upgrade_package fails if package is not already installed" do
|
|
68
|
+
assert_raises Beaker::Host::CommandFailure do
|
|
69
|
+
upgrade_package default, "non-existent-package-name"
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
step "#upgrade_package succeeds if package is installed" do
|
|
75
|
+
# TODO: anyone have any bright ideas on how to portably install an old
|
|
76
|
+
# version of a package, to really test an upgrade?
|
|
77
|
+
|
|
78
|
+
install_package default, "rsync"
|
|
79
|
+
upgrade_package default, "rsync"
|
|
80
|
+
assert check_for_package(default, "rsync"), "package was not successfully installed/upgraded"
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
step "#upgrade_package CURRENTLY fails when given a host array" do
|
|
84
|
+
# NOTE: would expect this to work across hosts, or to be better documented,
|
|
85
|
+
# if not support, should raise Beaker::Host::CommandFailure
|
|
86
|
+
|
|
87
|
+
assert_raises NoMethodError do
|
|
88
|
+
upgrade_package hosts, "rsync"
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
end
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
begin
|
|
2
|
+
$LOAD_PATH << File.expand_path(File.join(File.dirname(__FILE__), '..', '..', '..', '..', 'lib'))
|
|
3
|
+
|
|
4
|
+
require 'helpers/test_helper'
|
|
5
|
+
|
|
6
|
+
require 'beaker/acceptance/install_utils'
|
|
7
|
+
extend Beaker::Acceptance::InstallUtils
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
test_name 'Clone from git' do
|
|
11
|
+
|
|
12
|
+
PACKAGES = {
|
|
13
|
+
:redhat => [
|
|
14
|
+
'git',
|
|
15
|
+
],
|
|
16
|
+
:debian => [
|
|
17
|
+
['git', 'git-core'],
|
|
18
|
+
],
|
|
19
|
+
:solaris_11 => [
|
|
20
|
+
['git', 'developer/versioning/git'],
|
|
21
|
+
],
|
|
22
|
+
:solaris_10 => [
|
|
23
|
+
'coreutils',
|
|
24
|
+
'curl', # update curl to fix "CURLOPT_SSL_VERIFYHOST no longer supports 1 as value!" issue
|
|
25
|
+
'git',
|
|
26
|
+
],
|
|
27
|
+
:windows => [
|
|
28
|
+
'git',
|
|
29
|
+
],
|
|
30
|
+
:sles => [
|
|
31
|
+
'git-core',
|
|
32
|
+
]
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
install_packages_on(hosts, PACKAGES, :check_if_exists => true)
|
|
36
|
+
|
|
37
|
+
# implicitly tests build_giturl() and lookup_in_env()
|
|
38
|
+
hosts.each do |host|
|
|
39
|
+
on host, "echo #{GitHubSig} >> $HOME/.ssh/known_hosts"
|
|
40
|
+
testdir = tmpdir_on(host, File.basename(__FILE__))
|
|
41
|
+
|
|
42
|
+
step 'should be able to successfully clone a git repo' do
|
|
43
|
+
results = clone_git_repo_on(host, "#{testdir}", extract_repo_info_from(build_git_url('hiera')))
|
|
44
|
+
assert_match( %r{From.*github\.com[:/]puppetlabs/hiera}, result.output, 'Did not find clone')
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
File without changes
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
# Ensure that `$LOAD_PATH` is set up properly, in cases where the entire
|
|
2
|
+
# acceptance suite is being run, but the options file
|
|
3
|
+
# `acceptance/config/acceptance_options.rb` was not specified via the
|
|
4
|
+
# `--options-file` command-line argument.
|
|
5
|
+
begin
|
|
6
|
+
require 'helpers/test_helper'
|
|
7
|
+
rescue LoadError
|
|
8
|
+
$LOAD_PATH << File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib'))
|
|
9
|
+
require 'helpers/test_helper'
|
|
10
|
+
end
|
|
File without changes
|
data/beaker.gemspec
CHANGED
|
@@ -52,7 +52,7 @@ Gem::Specification.new do |s|
|
|
|
52
52
|
s.add_runtime_dependency 'aws-sdk', '~> 1.57'
|
|
53
53
|
s.add_runtime_dependency 'docker-api'
|
|
54
54
|
s.add_runtime_dependency 'fog-google', '~> 0.0.9' # dropped ruby 1.9 support in 0.1
|
|
55
|
-
s.add_runtime_dependency 'fog', '~> 1.25'
|
|
55
|
+
s.add_runtime_dependency 'fog', ['~> 1.25', '< 1.35.0']
|
|
56
56
|
|
|
57
57
|
# So fog doesn't always complain of unmet AWS dependencies
|
|
58
58
|
s.add_runtime_dependency 'unf', '~> 0.1'
|
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
## What's Pry?
|
|
2
|
+
|
|
3
|
+
[Pry](http://pryrepl.org/) is a powerful Ruby editing and debugging tool. Beaker uses Pry runtime invocation to create a developer console.
|
|
4
|
+
|
|
5
|
+
## Set it up!
|
|
6
|
+
|
|
7
|
+
Pry is included in the Beaker 1.13+ development gems and is available by default.
|
|
8
|
+
|
|
9
|
+
Pre-1.13.0 add Pry with `gem install pry`, then add Pry to individual tests by adding `require 'pry'` as the first line in the Ruby test file.
|
|
10
|
+
|
|
11
|
+
## Invoke the Developer Console
|
|
12
|
+
|
|
13
|
+
In a Beaker test file call `binding.pry` to invoke the console. Place it where you want access to the full, current Beaker environment.
|
|
14
|
+
|
|
15
|
+
## Example
|
|
16
|
+
### Example test trypry.rb
|
|
17
|
+
Here's a test file that exercises different ways of running commands on Beaker hosts. At the end of the main `hosts.each` loop I've included `binding.pry` to invoke the console.
|
|
18
|
+
|
|
19
|
+
```
|
|
20
|
+
hosts.each do |h|
|
|
21
|
+
on h, "echo hello"
|
|
22
|
+
if h['platform'] =~ /windows/
|
|
23
|
+
scp_to h, "beaker.gemspec", "/cygdrive/c/Documents\ and\ Settings/All\ Users/Application\ Data/"
|
|
24
|
+
end
|
|
25
|
+
on(h, "echo test block") do |result|
|
|
26
|
+
puts "block result.stdout: #{result.stdout}"
|
|
27
|
+
puts "block result.raw_stdout: #{result.raw_stdout}"
|
|
28
|
+
end
|
|
29
|
+
on(h, "echo test block, built in functions") do
|
|
30
|
+
puts "built in function stdout: #{stdout}"
|
|
31
|
+
puts "built in function stderr: #{stderr}"
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
result = on(h, "echo no block")
|
|
35
|
+
puts "return var result.stdout: #{result.stdout}"
|
|
36
|
+
puts "return var result.raw_stdout: #{result.raw_stdout}"
|
|
37
|
+
|
|
38
|
+
binding.pry
|
|
39
|
+
|
|
40
|
+
end
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### Sample output to the first `binding.pry` call:
|
|
44
|
+
```
|
|
45
|
+
$ bundle exec beaker --debug --tests tests/trypry.rb --hosts configs/fusion/winfusion.cfg --no-provi
|
|
46
|
+
sion
|
|
47
|
+
{
|
|
48
|
+
"project": "Beaker",
|
|
49
|
+
"department": "anode",
|
|
50
|
+
"validate": true,
|
|
51
|
+
"jenkins_build_url": null,
|
|
52
|
+
"forge_host": "vulcan-acceptance.delivery.puppetlabs.net",
|
|
53
|
+
"log_level": "debug",
|
|
54
|
+
"trace_limit": 10,
|
|
55
|
+
"hosts_file": "configs/fusion/winfusion.cfg",
|
|
56
|
+
"options_file": null,
|
|
57
|
+
"type": "pe",
|
|
58
|
+
"provision": false,
|
|
59
|
+
"preserve_hosts": "never",
|
|
60
|
+
"root_keys": false,
|
|
61
|
+
"quiet": false,
|
|
62
|
+
"xml": false,
|
|
63
|
+
"color": true,
|
|
64
|
+
"dry_run": false,
|
|
65
|
+
"timeout": 300,
|
|
66
|
+
"fail_mode": "slow",
|
|
67
|
+
"timesync": false,
|
|
68
|
+
"repo_proxy": false,
|
|
69
|
+
"add_el_extras": false,
|
|
70
|
+
"add_master_entry": false,
|
|
71
|
+
"consoleport": 443,
|
|
72
|
+
"pe_dir": "http://neptune.puppetlabs.lan/3.2/ci-ready/",
|
|
73
|
+
"pe_version_file": "LATEST",
|
|
74
|
+
"pe_version_file_win": "LATEST-win",
|
|
75
|
+
"dot_fog": "/Users/anode/.fog",
|
|
76
|
+
"ec2_yaml": "config/image_templates/ec2.yaml",
|
|
77
|
+
"help": false,
|
|
78
|
+
"ssh": {
|
|
79
|
+
"config": false,
|
|
80
|
+
"paranoid": false,
|
|
81
|
+
"timeout": 300,
|
|
82
|
+
"auth_methods": [
|
|
83
|
+
"publickey"
|
|
84
|
+
],
|
|
85
|
+
"port": 22,
|
|
86
|
+
"forward_agent": true,
|
|
87
|
+
"keys": [
|
|
88
|
+
"/Users/anode/.ssh/id_rsa"
|
|
89
|
+
],
|
|
90
|
+
"user_known_hosts_file": "/Users/anode/.ssh/known_hosts"
|
|
91
|
+
},
|
|
92
|
+
"tests": [
|
|
93
|
+
"tests/trypry.rb"
|
|
94
|
+
],
|
|
95
|
+
"command_line": "/Users/anode/beaker/.bundle/gems/bin/beaker --debug --tests tests/trypry.rb --hosts configs/fusion/winfusion.cfg --no-provision",
|
|
96
|
+
"HOSTS": {
|
|
97
|
+
"pe-centos6": {
|
|
98
|
+
"roles": [
|
|
99
|
+
"master",
|
|
100
|
+
"agent",
|
|
101
|
+
"dashboard",
|
|
102
|
+
"database"
|
|
103
|
+
],
|
|
104
|
+
"platform": "el-6-i386",
|
|
105
|
+
"snapshot": "clean-w-keys",
|
|
106
|
+
"hypervisor": "fusion"
|
|
107
|
+
},
|
|
108
|
+
"w2k8r2": {
|
|
109
|
+
"roles": [
|
|
110
|
+
"agent"
|
|
111
|
+
],
|
|
112
|
+
"platform": "windows-2008r2-x86_64",
|
|
113
|
+
"snapshot": "clean-w-keys",
|
|
114
|
+
"hypervisor": "fusion"
|
|
115
|
+
},
|
|
116
|
+
"w2k3r2": {
|
|
117
|
+
"roles": [
|
|
118
|
+
"agent"
|
|
119
|
+
],
|
|
120
|
+
"platform": "windows-2003r2-x86_64",
|
|
121
|
+
"hypervisor": "fusion",
|
|
122
|
+
"snapshot": "clean-w-keys"
|
|
123
|
+
}
|
|
124
|
+
},
|
|
125
|
+
"nfs_server": "none",
|
|
126
|
+
"pe_ver": "3.2.2-6-gd1cae98",
|
|
127
|
+
"home": "/Users/anode",
|
|
128
|
+
"answers": {
|
|
129
|
+
"q_puppet_enterpriseconsole_auth_user_email": "admin@example.com",
|
|
130
|
+
"q_puppet_enterpriseconsole_auth_password": "~!@#$%^*-/ aZ",
|
|
131
|
+
"q_puppet_enterpriseconsole_smtp_host": null,
|
|
132
|
+
"q_puppet_enterpriseconsole_smtp_port": 25,
|
|
133
|
+
"q_puppet_enterpriseconsole_smtp_username": null,
|
|
134
|
+
"q_puppet_enterpriseconsole_smtp_password": null,
|
|
135
|
+
"q_puppet_enterpriseconsole_smtp_use_tls": "n",
|
|
136
|
+
"q_verify_packages": "y",
|
|
137
|
+
"q_puppetdb_password": "~!@#$%^*-/ aZ"
|
|
138
|
+
},
|
|
139
|
+
"helper": [],
|
|
140
|
+
"load_path": [],
|
|
141
|
+
"pre_suite": [],
|
|
142
|
+
"post_suite": [],
|
|
143
|
+
"install": [],
|
|
144
|
+
"modules": [],
|
|
145
|
+
"logger": "#<Beaker::Logger:0x007f925a6b4218>"
|
|
146
|
+
}
|
|
147
|
+
Hypervisor for pe-centos6 is none
|
|
148
|
+
Hypervisor for w2k8r2 is none
|
|
149
|
+
Hypervisor for w2k3r2 is none
|
|
150
|
+
Beaker::Hypervisor, found some none boxes to create
|
|
151
|
+
|
|
152
|
+
pe-centos6 10:55:27$ which curl
|
|
153
|
+
/usr/bin/curl
|
|
154
|
+
|
|
155
|
+
pe-centos6 executed in 0.14 seconds
|
|
156
|
+
|
|
157
|
+
pe-centos6 10:55:27$ which ntpdate
|
|
158
|
+
/usr/sbin/ntpdate
|
|
159
|
+
|
|
160
|
+
pe-centos6 executed in 0.01 seconds
|
|
161
|
+
|
|
162
|
+
w2k8r2 10:55:27$ which curl
|
|
163
|
+
/bin/curl
|
|
164
|
+
|
|
165
|
+
w2k8r2 executed in 0.42 seconds
|
|
166
|
+
|
|
167
|
+
w2k3r2 10:55:27$ which curl
|
|
168
|
+
/bin/curl
|
|
169
|
+
|
|
170
|
+
w2k3r2 executed in 0.29 seconds
|
|
171
|
+
No tests to run for suite 'pre_suite'
|
|
172
|
+
Begin tests/trypry.rb
|
|
173
|
+
|
|
174
|
+
pe-centos6 10:55:28$ echo hello
|
|
175
|
+
hello
|
|
176
|
+
|
|
177
|
+
pe-centos6 executed in 0.01 seconds
|
|
178
|
+
|
|
179
|
+
pe-centos6 10:55:28$ echo test block
|
|
180
|
+
test block
|
|
181
|
+
|
|
182
|
+
pe-centos6 executed in 0.01 seconds
|
|
183
|
+
block result.stdout: test block
|
|
184
|
+
block result.raw_stdout: test block
|
|
185
|
+
|
|
186
|
+
pe-centos6 10:55:28$ echo test block, built in functions
|
|
187
|
+
test block, built in functions
|
|
188
|
+
|
|
189
|
+
pe-centos6 executed in 0.00 seconds
|
|
190
|
+
built in function stdout: test block, built in functions
|
|
191
|
+
built in function stderr:
|
|
192
|
+
|
|
193
|
+
pe-centos6 10:55:28$ echo no block
|
|
194
|
+
no block
|
|
195
|
+
|
|
196
|
+
pe-centos6 executed in 0.00 seconds
|
|
197
|
+
return var result.stdout: no block
|
|
198
|
+
return var result.raw_stdout: no block
|
|
199
|
+
|
|
200
|
+
From: /Users/anode/beaker/tests/trypry.rb @ line 19 self.run_test:
|
|
201
|
+
|
|
202
|
+
14:
|
|
203
|
+
15: result = on(h, "echo no block")
|
|
204
|
+
16: puts "return var result.stdout: #{result.stdout}"
|
|
205
|
+
17: puts "return var result.raw_stdout: #{result.raw_stdout}"
|
|
206
|
+
18:
|
|
207
|
+
=> 19: binding.pry
|
|
208
|
+
20:
|
|
209
|
+
21: end
|
|
210
|
+
|
|
211
|
+
[1] pry(#<Beaker::TestCase>)>
|
|
212
|
+
```
|
|
213
|
+
### Using the console
|
|
214
|
+
At this point I have access to the console. I have full access to Beaker hosts, the Beaker DSL and Ruby.
|
|
215
|
+
|
|
216
|
+
Here's some sample console calls:
|
|
217
|
+
```
|
|
218
|
+
[1] pry(#<Beaker::TestCase>)> hosts
|
|
219
|
+
=> [pe-centos6, w2k8r2, w2k3r2]
|
|
220
|
+
[2] pry(#<Beaker::TestCase>)> on hosts[1], 'echo hello'
|
|
221
|
+
|
|
222
|
+
w2k8r2 10:54:11$ echo hello
|
|
223
|
+
hello
|
|
224
|
+
|
|
225
|
+
w2k8r2 executed in 0.07 seconds
|
|
226
|
+
=> #<Beaker::Result:0x007f9f6b7a3408
|
|
227
|
+
@cmd=" echo hello ",
|
|
228
|
+
@exit_code=0,
|
|
229
|
+
@host="w2k8r2",
|
|
230
|
+
@output="hello\n",
|
|
231
|
+
@raw_output="hello\n",
|
|
232
|
+
@raw_stderr="",
|
|
233
|
+
@raw_stdout="hello\n",
|
|
234
|
+
@stderr="",
|
|
235
|
+
@stdout="hello\n">
|
|
236
|
+
[3] pry(#<Beaker::TestCase>)> on hosts[1], 'ls /cygdrive/c/Documents\ and\ Settings/All\ Users/Application\ Data/'
|
|
237
|
+
|
|
238
|
+
w2k8r2 10:56:15$ ls /cygdrive/c/Documents\ and\ Settings/All\ Users/Application\ Data/
|
|
239
|
+
Application Data
|
|
240
|
+
Desktop
|
|
241
|
+
Documents
|
|
242
|
+
Favorites
|
|
243
|
+
Microsoft
|
|
244
|
+
Package Cache
|
|
245
|
+
Start Menu
|
|
246
|
+
Templates
|
|
247
|
+
VMware
|
|
248
|
+
beaker.gemspec
|
|
249
|
+
ntuser.pol
|
|
250
|
+
|
|
251
|
+
w2k8r2 executed in 0.09 seconds
|
|
252
|
+
=> #<Beaker::Result:0x007f925b227898
|
|
253
|
+
@cmd=
|
|
254
|
+
" ls /cygdrive/c/Documents\\ and\\ Settings/All\\ Users/Application\\ Data/ ",
|
|
255
|
+
@exit_code=0,
|
|
256
|
+
@host="w2k8r2",
|
|
257
|
+
@output=
|
|
258
|
+
"Application Data\nDesktop\nDocuments\nFavorites\nMicrosoft\nPackage Cache\nStart Menu\nTemplates\nVMware\nbeaker.gemspec\nntuser.pol\n",
|
|
259
|
+
@raw_output=
|
|
260
|
+
"Application Data\nDesktop\nDocuments\nFavorites\nMicrosoft\nPackage Cache\nStart Menu\nTemplates\nVMware\nbeaker.gemspec\nntuser.pol\n",
|
|
261
|
+
@raw_stderr="",
|
|
262
|
+
@raw_stdout=
|
|
263
|
+
"Application Data\nDesktop\nDocuments\nFavorites\nMicrosoft\nPackage Cache\nStart Menu\nTemplates\nVMware\nbeaker.gemspec\nntuser.pol\n",
|
|
264
|
+
@stderr="",
|
|
265
|
+
@stdout=
|
|
266
|
+
"Application Data\nDesktop\nDocuments\nFavorites\nMicrosoft\nPackage Cache\nStart Menu\nTemplates\nVMware\nbeaker.gemspec\nntuser.pol\n">
|
|
267
|
+
[4] pry(#<Beaker::TestCase>)> result = on hosts[1], 'ls /cygdrive/c/Documents\ and\ Settings/All\ Users/Application\ Data/'
|
|
268
|
+
|
|
269
|
+
w2k8r2 10:56:34$ ls /cygdrive/c/Documents\ and\ Settings/All\ Users/Application\ Data/
|
|
270
|
+
Application Data
|
|
271
|
+
Desktop
|
|
272
|
+
Documents
|
|
273
|
+
Favorites
|
|
274
|
+
Microsoft
|
|
275
|
+
Package Cache
|
|
276
|
+
Start Menu
|
|
277
|
+
Templates
|
|
278
|
+
VMware
|
|
279
|
+
beaker.gemspec
|
|
280
|
+
ntuser.pol
|
|
281
|
+
|
|
282
|
+
w2k8r2 executed in 0.08 seconds
|
|
283
|
+
=> #<Beaker::Result:0x007f925a387018
|
|
284
|
+
@cmd=
|
|
285
|
+
" ls /cygdrive/c/Documents\\ and\\ Settings/All\\ Users/Application\\ Data/ ",
|
|
286
|
+
@exit_code=0,
|
|
287
|
+
@host="w2k8r2",
|
|
288
|
+
@output=
|
|
289
|
+
"Application Data\nDesktop\nDocuments\nFavorites\nMicrosoft\nPackage Cache\nStart Menu\nTemplates\nVMware\nbeaker.gemspec\nntuser.pol\n",
|
|
290
|
+
@raw_output=
|
|
291
|
+
"Application Data\nDesktop\nDocuments\nFavorites\nMicrosoft\nPackage Cache\nStart Menu\nTemplates\nVMware\nbeaker.gemspec\nntuser.pol\n",
|
|
292
|
+
@raw_stderr="",
|
|
293
|
+
@raw_stdout=
|
|
294
|
+
"Application Data\nDesktop\nDocuments\nFavorites\nMicrosoft\nPackage Cache\nStart Menu\nTemplates\nVMware\nbeaker.gemspec\nntuser.pol\n",
|
|
295
|
+
@stderr="",
|
|
296
|
+
@stdout=
|
|
297
|
+
"Application Data\nDesktop\nDocuments\nFavorites\nMicrosoft\nPackage Cache\nStart Menu\nTemplates\nVMware\nbeaker.gemspec\nntuser.pol\n">
|
|
298
|
+
[5] pry(#<Beaker::TestCase>)> result.stdout.chomp
|
|
299
|
+
=> "Application Data\nDesktop\nDocuments\nFavorites\nMicrosoft\nPackage Cache\nStart Menu\nTemplates\nVMware\nbeaker.gemspec\nntuser.pol"
|
|
300
|
+
```
|
|
301
|
+
### Continue regular test execution
|
|
302
|
+
Simply `exit` the console.
|
|
303
|
+
```
|
|
304
|
+
[6] pry(#<Beaker::TestCase>)> exit
|
|
305
|
+
```
|