beaker 4.41.2 → 5.0.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 +4 -4
- data/.github/dependabot.yml +9 -0
- data/.github/workflows/release.yml +2 -2
- data/.github/workflows/test.yml +26 -13
- data/.rubocop.yml +23 -10
- data/.rubocop_todo.yml +34 -10
- data/CHANGELOG.md +16 -52
- data/Gemfile +12 -7
- data/HISTORY.md +605 -0
- data/Rakefile +99 -111
- data/acceptance/config/acceptance-options.rb +1 -1
- data/acceptance/config/base/acceptance-options.rb +2 -2
- data/acceptance/config/hypervisor/acceptance-options.rb +2 -2
- data/acceptance/config/subcommands/acceptance-options.rb +2 -2
- data/acceptance/fixtures/module/Rakefile +1 -1
- data/acceptance/fixtures/module/spec/acceptance/demo_spec.rb +8 -12
- data/acceptance/fixtures/module/spec/classes/init_spec.rb +0 -1
- data/acceptance/fixtures/module/spec/spec_helper_acceptance.rb +3 -5
- data/acceptance/lib/helpers/test_helper.rb +6 -5
- data/acceptance/pre_suite/subcommands/05_install_ruby.rb +2 -3
- data/acceptance/pre_suite/subcommands/08_install_beaker.rb +1 -2
- data/acceptance/tests/base/dsl/helpers/configuration_test.rb +4 -4
- data/acceptance/tests/base/dsl/helpers/hocon_helpers_test.rb +1 -2
- data/acceptance/tests/base/dsl/helpers/host_helpers/add_system32_hosts_entry_test.rb +0 -3
- data/acceptance/tests/base/dsl/helpers/host_helpers/archive_file_from_test.rb +3 -1
- data/acceptance/tests/base/dsl/helpers/host_helpers/backup_the_file_test.rb +9 -9
- data/acceptance/tests/base/dsl/helpers/host_helpers/check_for_package_test.rb +0 -4
- data/acceptance/tests/base/dsl/helpers/host_helpers/create_remote_file_test.rb +19 -26
- data/acceptance/tests/base/dsl/helpers/host_helpers/curl_on_test.rb +2 -2
- data/acceptance/tests/base/dsl/helpers/host_helpers/curl_with_retries_test.rb +0 -1
- data/acceptance/tests/base/dsl/helpers/host_helpers/on_test.rb +18 -13
- data/acceptance/tests/base/dsl/helpers/host_helpers/retry_on_test.rb +3 -3
- data/acceptance/tests/base/dsl/helpers/host_helpers/rsync_to_test.rb +22 -27
- data/acceptance/tests/base/dsl/helpers/host_helpers/run_cron_on_test.rb +12 -16
- data/acceptance/tests/base/dsl/helpers/host_helpers/run_script_on_test.rb +3 -4
- data/acceptance/tests/base/dsl/helpers/host_helpers/run_script_test.rb +3 -3
- data/acceptance/tests/base/dsl/helpers/host_helpers/scp_from_test.rb +4 -4
- data/acceptance/tests/base/dsl/helpers/host_helpers/scp_to_test.rb +3 -4
- data/acceptance/tests/base/dsl/helpers/host_helpers/shell_test.rb +5 -5
- data/acceptance/tests/base/dsl/helpers/host_helpers/upgrade_package_test.rb +3 -5
- data/acceptance/tests/base/dsl/platform_tag_confiner_test.rb +14 -17
- data/acceptance/tests/base/dsl/structure_test.rb +5 -11
- data/acceptance/tests/base/host/file_test.rb +2 -2
- data/acceptance/tests/base/host/group_test.rb +0 -1
- data/acceptance/tests/base/host/host_test.rb +66 -63
- data/acceptance/tests/base/host/packages.rb +1 -2
- data/acceptance/tests/base/host/packages_unix.rb +0 -55
- data/acceptance/tests/base/host/user_test.rb +0 -1
- data/acceptance/tests/base/host_prebuilt_steps/ssh_environment_test.rb +1 -2
- data/acceptance/tests/base/test_suite/export.rb +6 -9
- data/acceptance/tests/install/from_file.rb +2 -4
- data/acceptance/tests/load_path_bootstrap.rb +1 -1
- data/acceptance/tests/subcommands/destroy.rb +19 -21
- data/acceptance/tests/subcommands/exec.rb +0 -1
- data/acceptance/tests/subcommands/init.rb +2 -3
- data/acceptance/tests/subcommands/provision.rb +0 -1
- data/beaker.gemspec +4 -7
- data/docs/concepts/argument_processing_and_precedence.md +1 -10
- data/docs/how_to/debug_beaker_tests.md +12 -12
- data/docs/how_to/hosts/eos.md +2 -12
- data/docs/how_to/install_puppet.md +0 -18
- data/docs/how_to/the_beaker_dsl.md +0 -2
- data/lib/beaker/cli.rb +59 -68
- data/lib/beaker/command.rb +20 -28
- data/lib/beaker/command_factory.rb +3 -2
- data/lib/beaker/dsl/assertions.rb +6 -18
- data/lib/beaker/dsl/helpers/hocon_helpers.rb +3 -7
- data/lib/beaker/dsl/helpers/host_helpers.rb +62 -123
- data/lib/beaker/dsl/helpers/test_helpers.rb +3 -5
- data/lib/beaker/dsl/helpers/web_helpers.rb +19 -39
- data/lib/beaker/dsl/helpers.rb +2 -4
- data/lib/beaker/dsl/outcomes.rb +13 -15
- data/lib/beaker/dsl/patterns.rb +1 -3
- data/lib/beaker/dsl/roles.rb +17 -20
- data/lib/beaker/dsl/structure.rb +53 -65
- data/lib/beaker/dsl/test_tagging.rb +7 -10
- data/lib/beaker/dsl/wrappers.rb +15 -16
- data/lib/beaker/dsl.rb +2 -3
- data/lib/beaker/host/aix/exec.rb +1 -1
- data/lib/beaker/host/aix/file.rb +0 -1
- data/lib/beaker/host/aix/group.rb +1 -1
- data/lib/beaker/host/aix/user.rb +1 -1
- data/lib/beaker/host/aix.rb +3 -4
- data/lib/beaker/host/cisco.rb +27 -39
- data/lib/beaker/host/eos.rb +4 -30
- data/lib/beaker/host/freebsd/exec.rb +1 -1
- data/lib/beaker/host/freebsd/pkg.rb +3 -3
- data/lib/beaker/host/freebsd.rb +9 -12
- data/lib/beaker/host/mac/exec.rb +4 -4
- data/lib/beaker/host/mac/group.rb +7 -7
- data/lib/beaker/host/mac/pkg.rb +3 -106
- data/lib/beaker/host/mac/user.rb +2 -2
- data/lib/beaker/host/mac.rb +8 -9
- data/lib/beaker/host/pswindows/exec.rb +66 -70
- data/lib/beaker/host/pswindows/file.rb +3 -5
- data/lib/beaker/host/pswindows/group.rb +3 -3
- data/lib/beaker/host/pswindows/pkg.rb +12 -12
- data/lib/beaker/host/pswindows/user.rb +3 -3
- data/lib/beaker/host/pswindows.rb +4 -3
- data/lib/beaker/host/unix/exec.rb +81 -83
- data/lib/beaker/host/unix/file.rb +40 -45
- data/lib/beaker/host/unix/group.rb +1 -1
- data/lib/beaker/host/unix/pkg.rb +138 -401
- data/lib/beaker/host/unix/user.rb +2 -2
- data/lib/beaker/host/unix.rb +8 -11
- data/lib/beaker/host/windows/exec.rb +17 -17
- data/lib/beaker/host/windows/file.rb +3 -3
- data/lib/beaker/host/windows/group.rb +3 -3
- data/lib/beaker/host/windows/pkg.rb +3 -54
- data/lib/beaker/host/windows/user.rb +3 -3
- data/lib/beaker/host/windows.rb +12 -12
- data/lib/beaker/host.rb +76 -133
- data/lib/beaker/host_prebuilt_steps.rb +88 -196
- data/lib/beaker/hypervisor/noop.rb +2 -4
- data/lib/beaker/hypervisor.rb +44 -61
- data/lib/beaker/local_connection.rb +2 -4
- data/lib/beaker/logger.rb +68 -76
- data/lib/beaker/logger_junit.rb +21 -25
- data/lib/beaker/network_manager.rb +39 -42
- data/lib/beaker/options/command_line_parser.rb +12 -23
- data/lib/beaker/options/hosts_file_parser.rb +16 -25
- data/lib/beaker/options/options_file_parser.rb +3 -6
- data/lib/beaker/options/options_hash.rb +2 -7
- data/lib/beaker/options/parser.rb +86 -102
- data/lib/beaker/options/presets.rb +114 -123
- data/lib/beaker/options/subcommand_options_file_parser.rb +3 -6
- data/lib/beaker/options/validator.rb +26 -31
- data/lib/beaker/perf.rb +25 -30
- data/lib/beaker/platform.rb +26 -37
- data/lib/beaker/result.rb +7 -6
- data/lib/beaker/shared/error_handler.rb +8 -10
- data/lib/beaker/shared/fog_credentials.rb +5 -9
- data/lib/beaker/shared/host_manager.rb +36 -41
- data/lib/beaker/shared/options_resolver.rb +3 -7
- data/lib/beaker/shared/repetition.rb +2 -4
- data/lib/beaker/shared/semvar.rb +37 -41
- data/lib/beaker/shared/timed.rb +0 -3
- data/lib/beaker/shared.rb +1 -1
- data/lib/beaker/ssh_connection.rb +38 -47
- data/lib/beaker/subcommand.rb +17 -24
- data/lib/beaker/subcommands/subcommand_util.rb +4 -4
- data/lib/beaker/tasks/quick_start.rb +4 -9
- data/lib/beaker/tasks/rake_task.rb +25 -27
- data/lib/beaker/tasks/test.rb +4 -4
- data/lib/beaker/test_case.rb +16 -28
- data/lib/beaker/test_suite.rb +35 -39
- data/lib/beaker/test_suite_result.rb +45 -47
- data/lib/beaker/version.rb +1 -1
- data/lib/beaker.rb +6 -7
- data/spec/beaker/cli_spec.rb +121 -142
- data/spec/beaker/command_spec.rb +55 -59
- data/spec/beaker/dsl/assertions_spec.rb +36 -36
- data/spec/beaker/dsl/helpers/host_helpers_spec.rb +110 -131
- data/spec/beaker/dsl/helpers/test_helpers_spec.rb +9 -10
- data/spec/beaker/dsl/helpers/web_helpers_spec.rb +22 -31
- data/spec/beaker/dsl/outcomes_spec.rb +14 -14
- data/spec/beaker/dsl/roles_spec.rb +125 -130
- data/spec/beaker/dsl/structure_spec.rb +172 -161
- data/spec/beaker/dsl/test_tagging_spec.rb +89 -90
- data/spec/beaker/dsl/wrappers_spec.rb +32 -33
- data/spec/beaker/host/aix_spec.rb +14 -14
- data/spec/beaker/host/cisco_spec.rb +84 -94
- data/spec/beaker/host/eos_spec.rb +15 -36
- data/spec/beaker/host/freebsd/exec_spec.rb +3 -6
- data/spec/beaker/host/freebsd/pkg_spec.rb +24 -27
- data/spec/beaker/host/mac/exec_spec.rb +2 -3
- data/spec/beaker/host/mac/group_spec.rb +48 -57
- data/spec/beaker/host/mac/user_spec.rb +54 -63
- data/spec/beaker/host/pswindows/exec_spec.rb +30 -32
- data/spec/beaker/host/pswindows/file_spec.rb +16 -16
- data/spec/beaker/host/pswindows/user_spec.rb +17 -23
- data/spec/beaker/host/pswindows_spec.rb +13 -13
- data/spec/beaker/host/unix/exec_spec.rb +75 -80
- data/spec/beaker/host/unix/file_spec.rb +66 -71
- data/spec/beaker/host/unix/pkg_spec.rb +150 -411
- data/spec/beaker/host/unix_spec.rb +11 -207
- data/spec/beaker/host/windows/exec_spec.rb +30 -32
- data/spec/beaker/host/windows/file_spec.rb +18 -19
- data/spec/beaker/host/windows/group_spec.rb +10 -12
- data/spec/beaker/host/windows/pkg_spec.rb +6 -9
- data/spec/beaker/host/windows/user_spec.rb +17 -23
- data/spec/beaker/host/windows_spec.rb +39 -39
- data/spec/beaker/host_prebuilt_steps_spec.rb +168 -349
- data/spec/beaker/host_spec.rb +204 -284
- data/spec/beaker/hypervisor/hypervisor_spec.rb +36 -61
- data/spec/beaker/localhost_connection_spec.rb +10 -11
- data/spec/beaker/logger_junit_spec.rb +19 -30
- data/spec/beaker/logger_spec.rb +153 -136
- data/spec/beaker/network_manager_spec.rb +23 -23
- data/spec/beaker/options/command_line_parser_spec.rb +20 -23
- data/spec/beaker/options/hosts_file_parser_spec.rb +30 -32
- data/spec/beaker/options/options_file_parser_spec.rb +4 -7
- data/spec/beaker/options/options_hash_spec.rb +4 -6
- data/spec/beaker/options/parser_spec.rb +167 -167
- data/spec/beaker/options/presets_spec.rb +7 -9
- data/spec/beaker/options/subcommand_options_parser_spec.rb +13 -14
- data/spec/beaker/options/validator_spec.rb +10 -11
- data/spec/beaker/perf_spec.rb +18 -21
- data/spec/beaker/platform_spec.rb +25 -50
- data/spec/beaker/shared/error_handler_spec.rb +7 -16
- data/spec/beaker/shared/fog_credentials_spec.rb +29 -29
- data/spec/beaker/shared/host_manager_spec.rb +50 -84
- data/spec/beaker/shared/options_resolver_spec.rb +9 -12
- data/spec/beaker/shared/repetition_spec.rb +17 -24
- data/spec/beaker/shared/semvar_spec.rb +21 -26
- data/spec/beaker/ssh_connection_spec.rb +76 -83
- data/spec/beaker/subcommand/subcommand_util_spec.rb +31 -33
- data/spec/beaker/subcommand_spec.rb +75 -77
- data/spec/beaker/test_case_spec.rb +25 -50
- data/spec/beaker/test_suite_spec.rb +147 -154
- data/spec/helpers.rb +39 -45
- data/spec/matchers.rb +8 -7
- data/spec/mocks.rb +1 -6
- data/spec/spec_helper.rb +0 -1
- metadata +8 -24
- data/acceptance/tests/base/dsl/helpers/host_helpers/deploy_package_repo_test.rb +0 -142
- data/acceptance/tests/base/external_resources_test.rb +0 -31
- data/spec/beaker/host/mac_spec.rb +0 -113
data/lib/beaker/hypervisor.rb
CHANGED
|
@@ -1,36 +1,36 @@
|
|
|
1
|
-
[
|
|
1
|
+
['host_prebuilt_steps'].each do |lib|
|
|
2
2
|
require "beaker/#{lib}"
|
|
3
3
|
end
|
|
4
4
|
|
|
5
5
|
module Beaker
|
|
6
|
-
#The Beaker class that interacts to all the supported hypervisors
|
|
6
|
+
# The Beaker class that interacts to all the supported hypervisors
|
|
7
7
|
class Hypervisor
|
|
8
8
|
include HostPrebuiltSteps
|
|
9
9
|
|
|
10
|
-
#Generates an array with all letters a thru z and numbers 0 thru 9
|
|
10
|
+
# Generates an array with all letters a thru z and numbers 0 thru 9
|
|
11
11
|
CHARMAP = ('a'..'z').to_a + ('0'..'9').to_a
|
|
12
12
|
|
|
13
|
-
#Hypervisor creator method. Creates the appropriate hypervisor class object based upon
|
|
14
|
-
#the provided hypervisor type selected, then provisions hosts with hypervisor.
|
|
15
|
-
|
|
13
|
+
# Hypervisor creator method. Creates the appropriate hypervisor class object based upon
|
|
14
|
+
# the provided hypervisor type selected, then provisions hosts with hypervisor.
|
|
15
|
+
# @param [String] type The type of hypervisor to create - one of aix, solaris, vsphere, fusion,
|
|
16
16
|
# blimpy, vcloud or vagrant
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
17
|
+
# @param [Array<Host>] hosts_to_provision The hosts to be provisioned with the selected hypervisor
|
|
18
|
+
# @param [Hash] options options Options to alter execution
|
|
19
|
+
# @option options [String] :host_name_prefix (nil) Prefix host name if set
|
|
20
20
|
def self.create(type, hosts_to_provision, options)
|
|
21
21
|
@logger = options[:logger]
|
|
22
22
|
@logger.notify("Beaker::Hypervisor, found some #{type} boxes to create")
|
|
23
23
|
|
|
24
24
|
hyper_class = case type
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
25
|
+
when /^noop$/
|
|
26
|
+
Beaker::Noop
|
|
27
|
+
when /^(default)|(none)$/
|
|
28
|
+
Beaker::Hypervisor
|
|
29
|
+
else
|
|
30
|
+
# Custom hypervisor
|
|
31
|
+
require "beaker/hypervisor/#{type}"
|
|
32
|
+
Beaker.const_get(type.split('_').collect(&:capitalize).join)
|
|
33
|
+
end
|
|
34
34
|
|
|
35
35
|
hypervisor = hyper_class.new(hosts_to_provision, options)
|
|
36
36
|
self.set_ssh_connection_preference(hosts_to_provision, hypervisor)
|
|
@@ -44,17 +44,17 @@ module Beaker
|
|
|
44
44
|
@options = options
|
|
45
45
|
end
|
|
46
46
|
|
|
47
|
-
#Provisioning steps for be run for a given hypervisor. Default is nil.
|
|
47
|
+
# Provisioning steps for be run for a given hypervisor. Default is nil.
|
|
48
48
|
def provision
|
|
49
49
|
nil
|
|
50
50
|
end
|
|
51
51
|
|
|
52
|
-
#Cleanup steps to be run for a given hypervisor. Default is nil.
|
|
52
|
+
# Cleanup steps to be run for a given hypervisor. Default is nil.
|
|
53
53
|
def cleanup
|
|
54
54
|
nil
|
|
55
55
|
end
|
|
56
56
|
|
|
57
|
-
DEFAULT_CONNECTION_PREFERENCE = [
|
|
57
|
+
DEFAULT_CONNECTION_PREFERENCE = %i[ip vmhostname hostname]
|
|
58
58
|
# SSH connection method preference. Can be overwritten by hypervisor to change the order
|
|
59
59
|
def connection_preference(_host)
|
|
60
60
|
DEFAULT_CONNECTION_PREFERENCE
|
|
@@ -72,65 +72,48 @@ module Beaker
|
|
|
72
72
|
end
|
|
73
73
|
end
|
|
74
74
|
|
|
75
|
-
#Proxy package managers on tests hosts created by this hypervisor, runs before validation and configuration.
|
|
75
|
+
# Proxy package managers on tests hosts created by this hypervisor, runs before validation and configuration.
|
|
76
76
|
def proxy_package_manager
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
77
|
+
return unless @options[:package_proxy]
|
|
78
|
+
|
|
79
|
+
package_proxy(@hosts, @options)
|
|
80
80
|
end
|
|
81
81
|
|
|
82
|
-
#Default configuration steps to be run for a given hypervisor. Any additional configuration to be done
|
|
83
|
-
#to the provided SUT for test execution to be successful.
|
|
82
|
+
# Default configuration steps to be run for a given hypervisor. Any additional configuration to be done
|
|
83
|
+
# to the provided SUT for test execution to be successful.
|
|
84
84
|
def configure(opts = {})
|
|
85
85
|
begin
|
|
86
86
|
return unless @options[:configure]
|
|
87
|
+
|
|
87
88
|
run_in_parallel = run_in_parallel? opts, @options, 'configure'
|
|
88
|
-
block_on @hosts, { :run_in_parallel => run_in_parallel} do |host|
|
|
89
|
-
if host[:timesync]
|
|
90
|
-
timesync(host, @options)
|
|
91
|
-
end
|
|
92
|
-
end
|
|
93
|
-
if @options[:root_keys]
|
|
94
|
-
sync_root_keys(@hosts, @options)
|
|
95
|
-
end
|
|
96
|
-
if @options[:add_el_extras]
|
|
97
|
-
add_el_extras(@hosts, @options)
|
|
98
|
-
end
|
|
99
|
-
if @options[:disable_iptables]
|
|
100
|
-
disable_iptables @hosts, @options
|
|
101
|
-
end
|
|
102
|
-
if @options[:set_env]
|
|
103
|
-
set_env(@hosts, @options)
|
|
104
|
-
end
|
|
105
|
-
if @options[:disable_updates]
|
|
106
|
-
disable_updates(@hosts, @options)
|
|
89
|
+
block_on @hosts, { :run_in_parallel => run_in_parallel } do |host|
|
|
90
|
+
timesync(host, @options) if host[:timesync]
|
|
107
91
|
end
|
|
92
|
+
sync_root_keys(@hosts, @options) if @options[:root_keys]
|
|
93
|
+
set_env(@hosts, @options) if @options[:set_env]
|
|
94
|
+
disable_updates(@hosts, @options) if @options[:disable_updates]
|
|
108
95
|
rescue SignalException => e
|
|
109
|
-
if e.signo == 15 #SIGTERM
|
|
110
|
-
report_and_raise(@logger, e, "configure")
|
|
111
|
-
end
|
|
96
|
+
report_and_raise(@logger, e, "configure") if e.signo == 15 # SIGTERM
|
|
112
97
|
raise
|
|
113
98
|
end
|
|
114
99
|
end
|
|
115
100
|
|
|
116
|
-
#Default validation steps to be run for a given hypervisor. Ensures that SUTs meet requirements to be
|
|
117
|
-
#beaker test nodes.
|
|
101
|
+
# Default validation steps to be run for a given hypervisor. Ensures that SUTs meet requirements to be
|
|
102
|
+
# beaker test nodes.
|
|
118
103
|
def validate
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
104
|
+
return unless @options[:validate]
|
|
105
|
+
|
|
106
|
+
validate_host(@hosts, @options)
|
|
122
107
|
end
|
|
123
108
|
|
|
124
|
-
#Generate a random string composted of letter and numbers
|
|
125
|
-
#prefixed with value of {Beaker::Hypervisor::create} option :host_name_prefix
|
|
109
|
+
# Generate a random string composted of letter and numbers
|
|
110
|
+
# prefixed with value of {Beaker::Hypervisor::create} option :host_name_prefix
|
|
126
111
|
def generate_host_name
|
|
127
|
-
n = CHARMAP[rand(25)] + (0...14).map{CHARMAP[rand(CHARMAP.length)]}.join
|
|
128
|
-
if @options[:host_name_prefix]
|
|
129
|
-
|
|
130
|
-
end
|
|
112
|
+
n = CHARMAP[rand(25)] + (0...14).map { CHARMAP[rand(CHARMAP.length)] }.join
|
|
113
|
+
return @options[:host_name_prefix] + n if @options[:host_name_prefix]
|
|
114
|
+
|
|
131
115
|
n
|
|
132
116
|
end
|
|
133
|
-
|
|
134
117
|
end
|
|
135
118
|
end
|
|
136
119
|
|
|
@@ -2,7 +2,6 @@ require 'open3'
|
|
|
2
2
|
|
|
3
3
|
module Beaker
|
|
4
4
|
class LocalConnection
|
|
5
|
-
|
|
6
5
|
attr_accessor :logger, :hostname, :ip
|
|
7
6
|
|
|
8
7
|
def initialize options = {}
|
|
@@ -46,7 +45,7 @@ module Beaker
|
|
|
46
45
|
end
|
|
47
46
|
|
|
48
47
|
begin
|
|
49
|
-
clean_env = ENV.reject{ |k| /^BUNDLE|^RUBY|^GEM/.match?(k) }
|
|
48
|
+
clean_env = ENV.reject { |k| /^BUNDLE|^RUBY|^GEM/.match?(k) }
|
|
50
49
|
|
|
51
50
|
with_env(clean_env) do
|
|
52
51
|
std_out, std_err, status = Open3.capture3(envs, command)
|
|
@@ -68,13 +67,12 @@ module Beaker
|
|
|
68
67
|
end
|
|
69
68
|
|
|
70
69
|
def scp_to(source, target, _options = {})
|
|
71
|
-
|
|
72
70
|
result = Result.new(@hostname, [source, target])
|
|
73
71
|
begin
|
|
74
72
|
FileUtils.cp_r source, target
|
|
75
73
|
rescue Errno::ENOENT => e
|
|
76
74
|
@logger.warn "#{e.class} error in cp'ing. Forcing the connection to close, which should " \
|
|
77
|
-
|
|
75
|
+
"raise an error."
|
|
78
76
|
end
|
|
79
77
|
|
|
80
78
|
result.stdout << " CP'ed file #{source} to #{target}"
|
data/lib/beaker/logger.rb
CHANGED
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
module Beaker
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
2
|
+
# The Beaker Logger class
|
|
3
|
+
# This class handles message reporting for Beaker, it reports based upon a provided log level
|
|
4
|
+
# to a given destination (be it a string or file)
|
|
5
|
+
#
|
|
6
6
|
class Logger
|
|
7
|
-
|
|
8
|
-
#The results of the most recently run command
|
|
7
|
+
# The results of the most recently run command
|
|
9
8
|
attr_accessor :last_result
|
|
10
9
|
|
|
11
|
-
#Determines the spacing that happens before an output line
|
|
10
|
+
# Determines the spacing that happens before an output line
|
|
12
11
|
attr_accessor :line_prefix
|
|
13
12
|
|
|
14
13
|
NORMAL = "\e[00;00m"
|
|
@@ -21,7 +20,7 @@ module Beaker
|
|
|
21
20
|
MAGENTA = "\e[00;35m"
|
|
22
21
|
CYAN = "\e[00;36m"
|
|
23
22
|
WHITE = "\e[00;37m"
|
|
24
|
-
GREY = "\e[00;00m"
|
|
23
|
+
GREY = "\e[00;00m" # Some terms can't handle grey, use normal
|
|
25
24
|
BRIGHT_RED = "\e[01;31m"
|
|
26
25
|
BRIGHT_GREEN = "\e[01;32m"
|
|
27
26
|
BRIGHT_YELLOW = "\e[01;33m"
|
|
@@ -32,13 +31,13 @@ module Beaker
|
|
|
32
31
|
NONE = ""
|
|
33
32
|
|
|
34
33
|
# The defined log levels. Each log level also reports messages at levels lower than itself
|
|
35
|
-
LOG_LEVELS
|
|
36
|
-
:trace
|
|
37
|
-
:debug
|
|
34
|
+
LOG_LEVELS = {
|
|
35
|
+
:trace => 6,
|
|
36
|
+
:debug => 5,
|
|
38
37
|
:verbose => 3,
|
|
39
|
-
:info
|
|
40
|
-
:notify
|
|
41
|
-
:warn
|
|
38
|
+
:info => 2,
|
|
39
|
+
:notify => 1,
|
|
40
|
+
:warn => 0,
|
|
42
41
|
}
|
|
43
42
|
|
|
44
43
|
attr_accessor :color, :log_level, :destinations, :log_colors
|
|
@@ -60,27 +59,27 @@ module Beaker
|
|
|
60
59
|
options = args.last.is_a?(Hash) ? args.pop : {}
|
|
61
60
|
@color = options[:color]
|
|
62
61
|
@sublog = nil
|
|
63
|
-
case options[:log_level]
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
62
|
+
@log_level = case options[:log_level]
|
|
63
|
+
when /trace/i, :trace
|
|
64
|
+
:trace
|
|
65
|
+
when /debug/i, :debug
|
|
66
|
+
:debug
|
|
67
|
+
when /info/i, :info
|
|
68
|
+
:info
|
|
69
|
+
when /notify/i, :notify
|
|
70
|
+
:notify
|
|
71
|
+
when /warn/i, :warn
|
|
72
|
+
:warn
|
|
73
|
+
else
|
|
74
|
+
:verbose
|
|
75
|
+
end
|
|
77
76
|
|
|
78
77
|
@last_result = nil
|
|
79
78
|
@line_prefix = ''
|
|
80
79
|
|
|
81
80
|
@destinations = []
|
|
82
81
|
|
|
83
|
-
@log_colors =
|
|
82
|
+
@log_colors = {
|
|
84
83
|
:error => RED,
|
|
85
84
|
:warn => BRIGHT_RED,
|
|
86
85
|
:success => MAGENTA,
|
|
@@ -89,7 +88,7 @@ module Beaker
|
|
|
89
88
|
:debug => WHITE,
|
|
90
89
|
:trace => BRIGHT_YELLOW,
|
|
91
90
|
:perf => BRIGHT_MAGENTA,
|
|
92
|
-
:host => YELLOW
|
|
91
|
+
:host => YELLOW,
|
|
93
92
|
}
|
|
94
93
|
|
|
95
94
|
@log_colors.merge!(options[:log_colors]) if options[:log_colors]
|
|
@@ -112,16 +111,16 @@ module Beaker
|
|
|
112
111
|
dests = args
|
|
113
112
|
dests << STDOUT unless options[:quiet]
|
|
114
113
|
dests.uniq!
|
|
115
|
-
dests.each {|dest| add_destination(dest)}
|
|
114
|
+
dests.each { |dest| add_destination(dest) }
|
|
116
115
|
end
|
|
117
116
|
|
|
118
117
|
# Turn on/off STDOUT logging
|
|
119
118
|
# @param [Boolean] off If true, disable STDOUT logging, if false enable STDOUT logging
|
|
120
119
|
def quiet(off = true)
|
|
121
120
|
if off
|
|
122
|
-
remove_destination(STDOUT) #turn off the noise!
|
|
121
|
+
remove_destination(STDOUT) # turn off the noise!
|
|
123
122
|
else
|
|
124
|
-
remove_destination(STDOUT) #in case we are calling this in error and we are already noisy
|
|
123
|
+
remove_destination(STDOUT) # in case we are calling this in error and we are already noisy
|
|
125
124
|
add_destination(STDOUT)
|
|
126
125
|
end
|
|
127
126
|
end
|
|
@@ -146,7 +145,7 @@ module Beaker
|
|
|
146
145
|
when IO, StringIO
|
|
147
146
|
@destinations.delete(dest)
|
|
148
147
|
when String
|
|
149
|
-
@destinations.delete_if {|d| d.respond_to?(:path) and d.path == dest}
|
|
148
|
+
@destinations.delete_if { |d| d.respond_to?(:path) and d.path == dest }
|
|
150
149
|
else
|
|
151
150
|
raise "Unsuitable log destination #{dest.inspect}"
|
|
152
151
|
end
|
|
@@ -191,14 +190,14 @@ module Beaker
|
|
|
191
190
|
# Remove invalid UTF-8 codes from provided string(s)
|
|
192
191
|
# @param [String, Array<String>] string The string(s) to remove invalid codes from
|
|
193
192
|
def convert string
|
|
194
|
-
if string.
|
|
193
|
+
if string.is_a?(Array)
|
|
195
194
|
string.map do |s|
|
|
196
195
|
convert s
|
|
197
196
|
end
|
|
198
197
|
else
|
|
199
198
|
# Remove invalid and undefined UTF-8 character encodings
|
|
200
199
|
string = string.to_s.dup.force_encoding('UTF-8')
|
|
201
|
-
return string.to_s.chars.select{|i| i.valid_encoding?}.join
|
|
200
|
+
return string.to_s.chars.select { |i| i.valid_encoding? }.join
|
|
202
201
|
end
|
|
203
202
|
end
|
|
204
203
|
|
|
@@ -209,7 +208,7 @@ module Beaker
|
|
|
209
208
|
#
|
|
210
209
|
# @return [String] the prefixed line
|
|
211
210
|
def prefix_log_line line
|
|
212
|
-
if line.
|
|
211
|
+
if line.is_a?(Array)
|
|
213
212
|
line.map do |s|
|
|
214
213
|
prefix_log_line s
|
|
215
214
|
end
|
|
@@ -227,7 +226,7 @@ module Beaker
|
|
|
227
226
|
end
|
|
228
227
|
|
|
229
228
|
# Indent the step level for the duration of block.
|
|
230
|
-
def with_indent
|
|
229
|
+
def with_indent
|
|
231
230
|
old_line_prefix = self.line_prefix.dup
|
|
232
231
|
self.line_prefix << ' '
|
|
233
232
|
yield
|
|
@@ -235,28 +234,13 @@ module Beaker
|
|
|
235
234
|
self.line_prefix = old_line_prefix
|
|
236
235
|
end
|
|
237
236
|
|
|
238
|
-
# Sets the step level appropriately for logging to be indented correctly
|
|
239
|
-
#
|
|
240
|
-
# @return nil
|
|
241
|
-
# @deprecated use {Logger#with_indent}
|
|
242
|
-
def step_in
|
|
243
|
-
self.line_prefix = self.line_prefix + ' '
|
|
244
|
-
end
|
|
245
|
-
|
|
246
|
-
# Sets the step level appropriately for logging to be indented correctly
|
|
247
|
-
#
|
|
248
|
-
# @return nil
|
|
249
|
-
# @deprecated use {Logger#with_indent}
|
|
250
|
-
def step_out
|
|
251
|
-
self.line_prefix = self.line_prefix.chop.chop
|
|
252
|
-
end
|
|
253
|
-
|
|
254
237
|
# Custom reporting for messages generated by host SUTs.
|
|
255
238
|
# Will not print unless we are at {LOG_LEVELS} 'verbose' or higher.
|
|
256
239
|
# Strips any color codes already in the provided messages, then adds logger color codes before reporting
|
|
257
240
|
# @param args[Array<String>] Strings to be reported
|
|
258
241
|
def host_output *args
|
|
259
242
|
return unless is_verbose?
|
|
243
|
+
|
|
260
244
|
strings = strip_colors_from args
|
|
261
245
|
string = strings.join
|
|
262
246
|
optionally_color @log_colors[:host], string, false
|
|
@@ -268,6 +252,7 @@ module Beaker
|
|
|
268
252
|
# @param args[Array<String>] Strings to be reported
|
|
269
253
|
def color_host_output *args
|
|
270
254
|
return unless is_verbose?
|
|
255
|
+
|
|
271
256
|
string = args.join
|
|
272
257
|
optionally_color NONE, string, false
|
|
273
258
|
end
|
|
@@ -277,6 +262,7 @@ module Beaker
|
|
|
277
262
|
# @param args[Array<String>] Strings to be reported
|
|
278
263
|
def perf_output *args
|
|
279
264
|
return unless is_debug?
|
|
265
|
+
|
|
280
266
|
optionally_color @log_colors[:perf], *args
|
|
281
267
|
end
|
|
282
268
|
|
|
@@ -285,6 +271,7 @@ module Beaker
|
|
|
285
271
|
# @param args[Array<String>] Strings to be reported
|
|
286
272
|
def trace *args
|
|
287
273
|
return unless is_trace?
|
|
274
|
+
|
|
288
275
|
optionally_color @log_colors[:trace], *args
|
|
289
276
|
end
|
|
290
277
|
|
|
@@ -293,6 +280,7 @@ module Beaker
|
|
|
293
280
|
# @param args[Array<String>] Strings to be reported
|
|
294
281
|
def debug *args
|
|
295
282
|
return unless is_verbose?
|
|
283
|
+
|
|
296
284
|
optionally_color @log_colors[:debug], *args
|
|
297
285
|
end
|
|
298
286
|
|
|
@@ -302,7 +290,8 @@ module Beaker
|
|
|
302
290
|
# @param args[Array<String>] Strings to be reported
|
|
303
291
|
def warn *args
|
|
304
292
|
return unless is_warn?
|
|
305
|
-
|
|
293
|
+
|
|
294
|
+
strings = args.map { |msg| "Warning: #{msg}" }
|
|
306
295
|
optionally_color @log_colors[:warn], strings
|
|
307
296
|
end
|
|
308
297
|
|
|
@@ -311,6 +300,7 @@ module Beaker
|
|
|
311
300
|
# @param args[Array<String>] Strings to be reported
|
|
312
301
|
def info *args
|
|
313
302
|
return unless is_info?
|
|
303
|
+
|
|
314
304
|
optionally_color @log_colors[:info], *args
|
|
315
305
|
end
|
|
316
306
|
|
|
@@ -326,6 +316,7 @@ module Beaker
|
|
|
326
316
|
# @param args[Array<String>] Strings to be reported
|
|
327
317
|
def notify *args
|
|
328
318
|
return unless is_notify?
|
|
319
|
+
|
|
329
320
|
optionally_color @log_colors[:notify], *args
|
|
330
321
|
end
|
|
331
322
|
|
|
@@ -340,7 +331,7 @@ module Beaker
|
|
|
340
331
|
# @param [String] lines A single or array of lines to removed color codes from
|
|
341
332
|
# @return [Array<String>] An array of strings that do not have color codes
|
|
342
333
|
def strip_colors_from lines
|
|
343
|
-
Array(
|
|
334
|
+
Array(lines).map do |line|
|
|
344
335
|
Logger.strip_color_codes(convert(line))
|
|
345
336
|
end
|
|
346
337
|
end
|
|
@@ -356,7 +347,9 @@ module Beaker
|
|
|
356
347
|
@destinations.each do |to|
|
|
357
348
|
to.print color_code if @color
|
|
358
349
|
to.send print_statement, msg
|
|
359
|
-
|
|
350
|
+
unless color_code == NONE
|
|
351
|
+
to.print NORMAL if @color
|
|
352
|
+
end
|
|
360
353
|
to.flush
|
|
361
354
|
end
|
|
362
355
|
end
|
|
@@ -368,15 +361,13 @@ module Beaker
|
|
|
368
361
|
# @param [String] backtrace (caller(1)) The backtrace to format
|
|
369
362
|
# @return [String] The formatted backtrace
|
|
370
363
|
def pretty_backtrace backtrace = caller(1)
|
|
371
|
-
trace = is_debug? ? backtrace : purge_harness_files_from(
|
|
372
|
-
expand_symlinks(
|
|
364
|
+
trace = is_debug? ? backtrace : purge_harness_files_from(backtrace)
|
|
365
|
+
expand_symlinks(trace).join "\n"
|
|
373
366
|
end
|
|
374
367
|
|
|
375
368
|
# Create a new StringIO log to track the current output
|
|
376
369
|
def start_sublog
|
|
377
|
-
if @sublog
|
|
378
|
-
remove_destination(@sublog)
|
|
379
|
-
end
|
|
370
|
+
remove_destination(@sublog) if @sublog
|
|
380
371
|
@sublog = StringIO.new
|
|
381
372
|
add_destination(@sublog)
|
|
382
373
|
end
|
|
@@ -399,28 +390,29 @@ module Beaker
|
|
|
399
390
|
# @note since this uses 'mkdir -p', log_prefix can be a number of nested directories
|
|
400
391
|
#
|
|
401
392
|
# @return [String] the path of the dated log folder generated
|
|
402
|
-
def
|
|
393
|
+
def self.generate_dated_log_folder(base_dir, log_prefix, timestamp)
|
|
403
394
|
log_dir = File.join(base_dir, log_prefix, timestamp.strftime("%F_%H_%M_%S"))
|
|
404
395
|
FileUtils.mkdir_p(log_dir) unless File.directory?(log_dir)
|
|
405
396
|
log_dir
|
|
406
397
|
end
|
|
407
398
|
|
|
408
|
-
#Remove color codes from provided string. Color codes are of the format /(\e\[\d\d;\d\dm)+/.
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
def
|
|
399
|
+
# Remove color codes from provided string. Color codes are of the format /(\e\[\d\d;\d\dm)+/.
|
|
400
|
+
# @param [String] text The string to remove color codes from
|
|
401
|
+
# @return [String] The text without color codes
|
|
402
|
+
def self.strip_color_codes(text)
|
|
412
403
|
text.gsub(/(\e|\^\[)\[(\d*;)*\d*m/, '')
|
|
413
404
|
end
|
|
414
405
|
|
|
415
406
|
private
|
|
407
|
+
|
|
416
408
|
# Expand each symlink found to its full path
|
|
417
409
|
# Lines are assumed to be in the format "String : Integer"
|
|
418
410
|
# @param [String] backtrace The string to search and expand symlinks in
|
|
419
411
|
# @return [String] The backtrace with symlinks expanded
|
|
420
412
|
def expand_symlinks backtrace
|
|
421
413
|
backtrace.collect do |line|
|
|
422
|
-
file_path, line_num = line.split(
|
|
423
|
-
expanded_path = expand_symlink File.expand_path(
|
|
414
|
+
file_path, line_num = line.split(":")
|
|
415
|
+
expanded_path = expand_symlink File.expand_path(file_path)
|
|
424
416
|
expanded_path.to_s + ":" + line_num.to_s
|
|
425
417
|
end
|
|
426
418
|
end
|
|
@@ -438,7 +430,7 @@ module Beaker
|
|
|
438
430
|
end
|
|
439
431
|
|
|
440
432
|
# And remove lines that contain our program name in them
|
|
441
|
-
mostly_purged.reject {|line| line.include? $0 }
|
|
433
|
+
mostly_purged.reject { |line| line.include? $0 }
|
|
442
434
|
end
|
|
443
435
|
|
|
444
436
|
# Utility method that takes a path as input, checks each component
|
|
@@ -447,16 +439,16 @@ module Beaker
|
|
|
447
439
|
# @param [String] file_path The path to be examined
|
|
448
440
|
# @return [String] The fully expanded file_path
|
|
449
441
|
def expand_symlink file_path
|
|
450
|
-
file_path.split(
|
|
442
|
+
file_path.split("/").inject do |full_path, next_dir|
|
|
451
443
|
next_path = full_path + "/" + next_dir
|
|
452
444
|
if File.symlink? next_path
|
|
453
445
|
link = File.readlink next_path
|
|
454
446
|
next_path =
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
447
|
+
case link
|
|
448
|
+
when /^\// then link
|
|
449
|
+
else
|
|
450
|
+
File.expand_path(full_path + "/" + link)
|
|
451
|
+
end
|
|
460
452
|
end
|
|
461
453
|
next_path
|
|
462
454
|
end
|
data/lib/beaker/logger_junit.rb
CHANGED
|
@@ -7,7 +7,6 @@ module Beaker
|
|
|
7
7
|
# Here's a list of example usages:
|
|
8
8
|
# - {Beaker::TestSuiteResult#write_junit_xml}
|
|
9
9
|
module LoggerJunit
|
|
10
|
-
|
|
11
10
|
# writes the xml created in the block to the xml file given
|
|
12
11
|
#
|
|
13
12
|
# Note: Error Recovery should take place in the caller of this
|
|
@@ -68,9 +67,9 @@ module Beaker
|
|
|
68
67
|
#
|
|
69
68
|
# @return nil
|
|
70
69
|
def self.copy_stylesheet_into_xml_dir(stylesheet, xml_file)
|
|
71
|
-
if
|
|
72
|
-
|
|
73
|
-
|
|
70
|
+
return if File.file?(File.join(File.dirname(xml_file), File.basename(stylesheet)))
|
|
71
|
+
|
|
72
|
+
FileUtils.copy(stylesheet, File.join(File.dirname(xml_file), File.basename(stylesheet)))
|
|
74
73
|
end
|
|
75
74
|
|
|
76
75
|
# sets up doc & gives us the suites for the testsuite named
|
|
@@ -81,14 +80,12 @@ module Beaker
|
|
|
81
80
|
#
|
|
82
81
|
# @return [Rexml::Element] testsuites
|
|
83
82
|
def self.get_testsuites_from_doc(doc, name, already_existed)
|
|
84
|
-
#check to see if an output file already exists, if it does add or replace test suite data
|
|
83
|
+
# check to see if an output file already exists, if it does add or replace test suite data
|
|
85
84
|
if already_existed
|
|
86
85
|
suites = REXML::XPath.first(doc, "testsuites")
|
|
87
|
-
#remove old data
|
|
86
|
+
# remove old data
|
|
88
87
|
suites.elements.each("testsuite") do |e|
|
|
89
|
-
if /#{name}/.match?(e.name)
|
|
90
|
-
suites.delete_element e
|
|
91
|
-
end
|
|
88
|
+
suites.delete_element e if /#{name}/.match?(e.name)
|
|
92
89
|
end
|
|
93
90
|
else
|
|
94
91
|
suites = doc.add_element(REXML::Element.new('testsuites'))
|
|
@@ -105,13 +102,13 @@ module Beaker
|
|
|
105
102
|
# @return [REXML::Document] Doc that you want to write in
|
|
106
103
|
def self.get_doc_for_filename(filename, stylesheet, already_exists)
|
|
107
104
|
if already_exists
|
|
108
|
-
doc
|
|
105
|
+
doc = REXML::Document.new File.open(filename)
|
|
109
106
|
else
|
|
110
|
-
#no existing file, create a new one
|
|
111
|
-
doc
|
|
112
|
-
doc << REXML::XMLDecl.new(version="1.0", encoding="UTF-8")
|
|
107
|
+
# no existing file, create a new one
|
|
108
|
+
doc = REXML::Document.new
|
|
109
|
+
doc << REXML::XMLDecl.new(version = "1.0", encoding = "UTF-8")
|
|
113
110
|
instruction_content = "type='text/xsl' href='#{File.basename(stylesheet)}'"
|
|
114
|
-
doc << REXML::Instruction.new(target="xml-stylesheet", content=instruction_content)
|
|
111
|
+
doc << REXML::Instruction.new(target = "xml-stylesheet", content = instruction_content)
|
|
115
112
|
end
|
|
116
113
|
return doc
|
|
117
114
|
end
|
|
@@ -131,11 +128,11 @@ module Beaker
|
|
|
131
128
|
escaped_string = ""
|
|
132
129
|
string.chars.each do |i|
|
|
133
130
|
char_as_codestring = i.unpack("U*").join
|
|
134
|
-
if self.is_valid_xml(char_as_codestring.to_i)
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
131
|
+
escaped_string << if self.is_valid_xml(char_as_codestring.to_i)
|
|
132
|
+
i
|
|
133
|
+
else
|
|
134
|
+
"\\#{char_as_codestring}"
|
|
135
|
+
end
|
|
139
136
|
end
|
|
140
137
|
escaped_string
|
|
141
138
|
end
|
|
@@ -145,13 +142,12 @@ module Beaker
|
|
|
145
142
|
# @param [Integer] int The number to check against
|
|
146
143
|
# @return [Boolean] True, if the number corresponds to a valid xml unicode character, otherwise false
|
|
147
144
|
def self.is_valid_xml(int)
|
|
148
|
-
return (
|
|
145
|
+
return (int == 0x9 or
|
|
149
146
|
int == 0xA or
|
|
150
|
-
(
|
|
151
|
-
(
|
|
152
|
-
(
|
|
153
|
-
|
|
147
|
+
(int >= 0x0020 and int <= 0xD7FF) or
|
|
148
|
+
(int >= 0xE000 and int <= 0xFFFD) or
|
|
149
|
+
(int >= 0x100000 and int <= 0x10FFFF)
|
|
150
|
+
)
|
|
154
151
|
end
|
|
155
|
-
|
|
156
152
|
end
|
|
157
153
|
end
|