beaker 1.21.0 → 2.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 +8 -8
- data/.gitignore +1 -0
- data/.rspec +1 -0
- data/CONTRIBUTING.md +1 -0
- data/HISTORY.md +17288 -2
- data/Rakefile +6 -2
- data/beaker.gemspec +15 -19
- data/lib/beaker.rb +2 -5
- data/lib/beaker/answers.rb +2 -0
- data/lib/beaker/answers/version34.rb +37 -1
- data/lib/beaker/cli.rb +4 -0
- data/lib/beaker/command.rb +16 -84
- data/lib/beaker/command_factory.rb +13 -2
- data/lib/beaker/dsl/assertions.rb +25 -2
- data/lib/beaker/dsl/ezbake_utils.rb +2 -2
- data/lib/beaker/dsl/helpers.rb +66 -12
- data/lib/beaker/dsl/install_utils.rb +128 -66
- data/lib/beaker/dsl/wrappers.rb +41 -3
- data/lib/beaker/host.rb +42 -6
- data/lib/beaker/host/mac.rb +62 -0
- data/lib/beaker/host/mac/group.rb +96 -0
- data/lib/beaker/host/mac/user.rb +93 -0
- data/lib/beaker/host/unix/exec.rb +1 -1
- data/lib/beaker/host/unix/pkg.rb +11 -11
- data/lib/beaker/host/windows.rb +4 -4
- data/lib/beaker/host_prebuilt_steps.rb +194 -58
- data/lib/beaker/hypervisor.rb +16 -9
- data/lib/beaker/hypervisor/aws_sdk.rb +61 -17
- data/lib/beaker/hypervisor/docker.rb +14 -2
- data/lib/beaker/hypervisor/ec2_helper.rb +15 -3
- data/lib/beaker/hypervisor/vagrant.rb +22 -10
- data/lib/beaker/hypervisor/vagrant_libvirt.rb +11 -0
- data/lib/beaker/hypervisor/vagrant_virtualbox.rb +1 -1
- data/lib/beaker/hypervisor/vcloud_pooled.rb +8 -39
- data/lib/beaker/logger.rb +15 -9
- data/lib/beaker/network_manager.rb +2 -2
- data/lib/beaker/options/command_line_parser.rb +1 -1
- data/lib/beaker/options/parser.rb +1 -8
- data/lib/beaker/options/presets.rb +70 -45
- data/lib/beaker/perf.rb +3 -4
- data/lib/beaker/platform.rb +2 -1
- data/lib/beaker/result.rb +3 -9
- data/lib/beaker/ssh_connection.rb +2 -0
- data/lib/beaker/test_case.rb +2 -21
- data/lib/beaker/test_suite.rb +21 -25
- data/lib/beaker/version.rb +1 -1
- data/spec/beaker/answers_spec.rb +36 -0
- data/spec/beaker/cli_spec.rb +45 -45
- data/spec/beaker/command_spec.rb +25 -36
- data/spec/beaker/dsl/assertions_spec.rb +20 -27
- data/spec/beaker/dsl/ezbake_utils_spec.rb +5 -5
- data/spec/beaker/dsl/helpers_spec.rb +293 -208
- data/spec/beaker/dsl/install_utils_spec.rb +310 -189
- data/spec/beaker/dsl/outcomes_spec.rb +6 -6
- data/spec/beaker/dsl/roles_spec.rb +27 -18
- data/spec/beaker/dsl/structure_spec.rb +11 -11
- data/spec/beaker/dsl/wrappers_spec.rb +35 -11
- data/spec/beaker/host/mac/group_spec.rb +124 -0
- data/spec/beaker/host/mac/user_spec.rb +134 -0
- data/spec/beaker/host/unix/pkg_spec.rb +40 -24
- data/spec/beaker/host/windows/group_spec.rb +1 -1
- data/spec/beaker/host_prebuilt_steps_spec.rb +194 -68
- data/spec/beaker/host_spec.rb +145 -67
- data/spec/beaker/hypervisor/aixer_spec.rb +6 -6
- data/spec/beaker/hypervisor/aws_sdk_spec.rb +22 -7
- data/spec/beaker/hypervisor/docker_spec.rb +71 -50
- data/spec/beaker/hypervisor/ec2_helper_spec.rb +25 -4
- data/spec/beaker/hypervisor/fusion_spec.rb +2 -2
- data/spec/beaker/hypervisor/hypervisor_spec.rb +20 -27
- data/spec/beaker/hypervisor/hypervisor_spec.rb.orig +80 -0
- data/spec/beaker/hypervisor/solaris_spec.rb +8 -8
- data/spec/beaker/hypervisor/vagrant_fusion_spec.rb +6 -8
- data/spec/beaker/hypervisor/vagrant_libvirt_spec.rb +34 -0
- data/spec/beaker/hypervisor/vagrant_spec.rb +34 -33
- data/spec/beaker/hypervisor/vagrant_virtualbox_spec.rb +18 -8
- data/spec/beaker/hypervisor/vagrant_workstation_spec.rb +6 -8
- data/spec/beaker/hypervisor/vcloud_pooled_spec.rb +8 -8
- data/spec/beaker/hypervisor/vcloud_spec.rb +10 -10
- data/spec/beaker/hypervisor/vsphere_helper_spec.rb +8 -8
- data/spec/beaker/hypervisor/vsphere_spec.rb +1 -1
- data/spec/beaker/logger_spec.rb +45 -31
- data/spec/beaker/options/command_line_parser_spec.rb +10 -2
- data/spec/beaker/options/hosts_file_parser_spec.rb +9 -2
- data/spec/beaker/options/options_hash_spec.rb +2 -2
- data/spec/beaker/options/parser_spec.rb +2 -2
- data/spec/beaker/options/pe_version_scaper_spec.rb +6 -1
- data/spec/beaker/options/presets_spec.rb +11 -1
- data/spec/beaker/shared/error_handler_spec.rb +5 -5
- data/spec/beaker/shared/host_manager_spec.rb +3 -2
- data/spec/beaker/shared/repetition_spec.rb +18 -18
- data/spec/beaker/ssh_connection_spec.rb +33 -4
- data/spec/beaker/test_case_spec.rb +9 -9
- data/spec/beaker/test_suite_spec.rb +14 -14
- data/spec/helpers.rb +4 -4
- data/spec/matchers.rb +4 -4
- data/spec/mocks.rb +5 -1
- data/spec/spec_helper.rb +2 -8
- metadata +114 -80
- data/lib/beaker/hypervisor/blimper.rb +0 -108
- data/spec/beaker/hypervisor/blimper_spec.rb +0 -42
- data/spec/beaker/options/data/LATEST +0 -1
- data/spec/beaker/puppet_command_spec.rb +0 -161
- data/spec/mock_blimpy.rb +0 -48
data/Rakefile
CHANGED
|
@@ -19,11 +19,15 @@ task :travis do
|
|
|
19
19
|
end
|
|
20
20
|
|
|
21
21
|
namespace :test do
|
|
22
|
-
desc 'Run specs
|
|
22
|
+
desc 'Run specs and check for deprecation warnings'
|
|
23
23
|
task :spec do
|
|
24
24
|
original_dir = Dir.pwd
|
|
25
25
|
Dir.chdir( File.expand_path(File.dirname(__FILE__)) )
|
|
26
|
-
|
|
26
|
+
output = `export COVERAGE=true; bundle exec rspec`
|
|
27
|
+
puts output
|
|
28
|
+
if output =~ /Deprecation Warnings/
|
|
29
|
+
raise "Deprecation Warnings in spec generation, please fix!"
|
|
30
|
+
end
|
|
27
31
|
Dir.chdir( original_dir )
|
|
28
32
|
end
|
|
29
33
|
end
|
data/beaker.gemspec
CHANGED
|
@@ -18,39 +18,35 @@ Gem::Specification.new do |s|
|
|
|
18
18
|
s.require_paths = ["lib"]
|
|
19
19
|
|
|
20
20
|
# Testing dependencies
|
|
21
|
-
s.add_development_dependency '
|
|
22
|
-
s.add_development_dependency 'rspec'
|
|
23
|
-
s.add_development_dependency 'fakefs', '0.
|
|
24
|
-
s.add_development_dependency 'rake', '~> 10.1
|
|
25
|
-
s.add_development_dependency 'simplecov'
|
|
26
|
-
s.add_development_dependency 'pry', '~> 0.
|
|
21
|
+
s.add_development_dependency 'rspec', '~> 3.0'
|
|
22
|
+
s.add_development_dependency 'rspec-its'
|
|
23
|
+
s.add_development_dependency 'fakefs', '~> 0.6'
|
|
24
|
+
s.add_development_dependency 'rake', '~> 10.1'
|
|
25
|
+
s.add_development_dependency 'simplecov'
|
|
26
|
+
s.add_development_dependency 'pry', '~> 0.10'
|
|
27
27
|
|
|
28
28
|
# Documentation dependencies
|
|
29
29
|
s.add_development_dependency 'yard'
|
|
30
|
-
s.add_development_dependency 'markdown'
|
|
30
|
+
s.add_development_dependency 'markdown'
|
|
31
31
|
s.add_development_dependency 'thin'
|
|
32
32
|
s.add_development_dependency 'gitlab-grit'
|
|
33
33
|
|
|
34
34
|
# Run time dependencies
|
|
35
|
+
s.add_runtime_dependency 'minitest', '~> 5.4'
|
|
35
36
|
s.add_runtime_dependency 'json', '~> 1.8'
|
|
36
37
|
s.add_runtime_dependency 'hocon', '~> 0.0.4'
|
|
37
|
-
s.add_runtime_dependency 'net-ssh', '~> 2.
|
|
38
|
-
s.add_runtime_dependency 'net-scp', '~> 1.
|
|
38
|
+
s.add_runtime_dependency 'net-ssh', '~> 2.9'
|
|
39
|
+
s.add_runtime_dependency 'net-scp', '~> 1.2'
|
|
39
40
|
s.add_runtime_dependency 'inifile', '~> 2.0'
|
|
40
41
|
|
|
41
42
|
# Optional provisioner specific support
|
|
42
|
-
s.add_runtime_dependency 'rbvmomi', '1.8
|
|
43
|
-
s.add_runtime_dependency 'blimpy', '~> 0.6'
|
|
43
|
+
s.add_runtime_dependency 'rbvmomi', '~> 1.8'
|
|
44
44
|
s.add_runtime_dependency 'fission', '~> 0.4'
|
|
45
|
-
s.add_runtime_dependency 'google-api-client', '~> 0.7
|
|
46
|
-
s.add_runtime_dependency 'aws-sdk', '1.
|
|
47
|
-
s.add_runtime_dependency 'docker-api'
|
|
48
|
-
s.add_runtime_dependency 'fog', '~> 1.
|
|
45
|
+
s.add_runtime_dependency 'google-api-client', '~> 0.7'
|
|
46
|
+
s.add_runtime_dependency 'aws-sdk', '~> 1.57'
|
|
47
|
+
s.add_runtime_dependency 'docker-api'
|
|
48
|
+
s.add_runtime_dependency 'fog', '~> 1.25'
|
|
49
49
|
|
|
50
|
-
# These are transitive dependencies that we include or pin to because...
|
|
51
|
-
# Ruby 1.8 compatibility
|
|
52
|
-
s.add_runtime_dependency 'nokogiri', '~> 1.5.10'
|
|
53
|
-
s.add_runtime_dependency 'mime-types', '~> 1.25' # 2.0 won't install on 1.8
|
|
54
50
|
# So fog doesn't always complain of unmet AWS dependencies
|
|
55
51
|
s.add_runtime_dependency 'unf', '~> 0.1'
|
|
56
52
|
end
|
data/lib/beaker.rb
CHANGED
|
@@ -33,11 +33,8 @@ module Beaker
|
|
|
33
33
|
# Shared methods and helpers
|
|
34
34
|
require 'beaker/shared'
|
|
35
35
|
|
|
36
|
-
#
|
|
37
|
-
|
|
38
|
-
require 'jcode'
|
|
39
|
-
$KCODE="u"
|
|
40
|
-
end
|
|
36
|
+
# MiniTest, for including MiniTest::Assertions
|
|
37
|
+
require 'minitest/test'
|
|
41
38
|
|
|
42
39
|
# Add pry support when available
|
|
43
40
|
begin
|
data/lib/beaker/answers.rb
CHANGED
|
@@ -6,7 +6,43 @@ module Beaker
|
|
|
6
6
|
# @api private
|
|
7
7
|
class Version34 < Version32
|
|
8
8
|
def generate_answers
|
|
9
|
-
|
|
9
|
+
dashboard = only_host_with_role(@hosts, 'dashboard')
|
|
10
|
+
database = only_host_with_role(@hosts, 'database')
|
|
11
|
+
|
|
12
|
+
the_answers = super
|
|
13
|
+
|
|
14
|
+
classifier_database_user = answer_for(@options, :q_classifier_database_user, 'DFGhjlkj')
|
|
15
|
+
classifier_database_name = answer_for(@options, :q_database_name, 'pe-classifier')
|
|
16
|
+
classifier_database_password = "'#{@options[:answers][:q_classifier_database_password]}'"
|
|
17
|
+
activity_database_user = answer_for(@options, :q_activity_database_user, 'adsfglkj')
|
|
18
|
+
activity_database_name = answer_for(@options, :q_activity_database_name, 'pe-activity')
|
|
19
|
+
activity_database_password = "'#{@options[:answers][:q_activity_database_password]}'"
|
|
20
|
+
rbac_database_user = answer_for(@options, :q_rbac_database_user, 'RbhNBklm')
|
|
21
|
+
rbac_database_name = answer_for(@options, :q_rbac_database_name, 'pe-rbac')
|
|
22
|
+
rbac_database_password = "'#{@options[:answers][:q_rbac_database_password]}'"
|
|
23
|
+
|
|
24
|
+
console_services_hash = {
|
|
25
|
+
:q_classifier_database_user => classifier_database_user,
|
|
26
|
+
:q_classifier_database_name => classifier_database_name,
|
|
27
|
+
:q_classifier_database_password => classifier_database_password,
|
|
28
|
+
:q_activity_database_user => activity_database_user,
|
|
29
|
+
:q_activity_database_name => activity_database_name,
|
|
30
|
+
:q_activity_database_password => activity_database_password,
|
|
31
|
+
:q_rbac_database_user => rbac_database_user,
|
|
32
|
+
:q_rbac_database_name => rbac_database_name,
|
|
33
|
+
:q_rbac_database_password => rbac_database_password,
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
# If we're installing or upgrading from a non-RBAC version, set the 'admin' password
|
|
37
|
+
if @options[:type] == :upgrade && @options[:HOSTS][dashboard.name][:pe_ver] < "3.4.0"
|
|
38
|
+
dashboard_password = "'#{options[:answers][:q_puppet_enterpriseconsole_auth_password]}'"
|
|
39
|
+
the_answers[dashboard.name][:q_puppet_enterpriseconsole_auth_password] = dashboard_password
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
the_answers[dashboard.name].merge!(console_services_hash)
|
|
43
|
+
the_answers[database.name].merge!(console_services_hash)
|
|
44
|
+
|
|
45
|
+
return the_answers
|
|
10
46
|
end
|
|
11
47
|
end
|
|
12
48
|
end
|
data/lib/beaker/cli.rb
CHANGED
|
@@ -43,6 +43,9 @@ module Beaker
|
|
|
43
43
|
@options[:helper].each do |helper|
|
|
44
44
|
require File.expand_path(helper)
|
|
45
45
|
end
|
|
46
|
+
|
|
47
|
+
@options[:log_dated_dir] = Beaker::Logger.generate_dated_log_folder(@options[:log_dir], @timestamp)
|
|
48
|
+
@options[:xml_dated_dir] = Beaker::Logger.generate_dated_log_folder(@options[:xml_dir], @timestamp)
|
|
46
49
|
end
|
|
47
50
|
|
|
48
51
|
#Provision, validate and configure all hosts as defined in the hosts file
|
|
@@ -51,6 +54,7 @@ module Beaker
|
|
|
51
54
|
@hosts = []
|
|
52
55
|
@network_manager = Beaker::NetworkManager.new(@options, @logger)
|
|
53
56
|
@hosts = @network_manager.provision
|
|
57
|
+
@network_manager.proxy_package_manager
|
|
54
58
|
@network_manager.validate
|
|
55
59
|
@network_manager.configure
|
|
56
60
|
rescue => e
|
data/lib/beaker/command.rb
CHANGED
|
@@ -5,24 +5,6 @@ module Beaker
|
|
|
5
5
|
# @api public
|
|
6
6
|
class Command
|
|
7
7
|
|
|
8
|
-
DEFAULT_GIT_RUBYLIB = {
|
|
9
|
-
:default => [],
|
|
10
|
-
:host => %w(hieralibdir hierapuppetlibdir
|
|
11
|
-
pluginlibpath puppetlibdir
|
|
12
|
-
facterlibdir),
|
|
13
|
-
:opts => { :additive => true,
|
|
14
|
-
:separator => {:host => 'pathseparator' }
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
DEFAULT_GIT_PATH = {
|
|
19
|
-
:default => [],
|
|
20
|
-
:host => %w(puppetbindir facterbindir hierabindir),
|
|
21
|
-
:opts => { :additive => true, :separator => ':' }
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
DEFAULT_GIT_ENV = { :PATH => DEFAULT_GIT_PATH, :RUBYLIB => DEFAULT_GIT_RUBYLIB }
|
|
25
|
-
|
|
26
8
|
# A string representing the (possibly) incomplete command
|
|
27
9
|
attr_accessor :command
|
|
28
10
|
|
|
@@ -67,6 +49,7 @@ module Beaker
|
|
|
67
49
|
@options = options
|
|
68
50
|
@args = args
|
|
69
51
|
@environment = {}
|
|
52
|
+
@cmdexe = @options.delete(:cmdexe) || false
|
|
70
53
|
|
|
71
54
|
# this is deprecated and will not allow you to use a command line
|
|
72
55
|
# option of `--environment`, please use ENV instead.
|
|
@@ -87,8 +70,10 @@ module Beaker
|
|
|
87
70
|
def cmd_line host, cmd = @command, env = @environment
|
|
88
71
|
env_string = env.nil? ? '' : environment_string_for( host, env )
|
|
89
72
|
|
|
73
|
+
cygwin = ((host['platform'] =~ /windows/) and @cmdexe) ? 'cmd.exe /c' : nil
|
|
74
|
+
|
|
90
75
|
# This will cause things like `puppet -t -v agent` which is maybe bad.
|
|
91
|
-
|
|
76
|
+
[env_string, cygwin, cmd, options_string, args_string].compact.reject(&:empty?).join(' ')
|
|
92
77
|
end
|
|
93
78
|
|
|
94
79
|
# @param [Hash] opts These are the options that the command takes
|
|
@@ -133,7 +118,7 @@ module Beaker
|
|
|
133
118
|
args.flatten.compact.join(' ')
|
|
134
119
|
end
|
|
135
120
|
|
|
136
|
-
#
|
|
121
|
+
# Construct the environment string for this command
|
|
137
122
|
#
|
|
138
123
|
# @param [Host] host A Host object
|
|
139
124
|
# @param [Hash{String=>String}] env An optional Hash containing
|
|
@@ -152,75 +137,22 @@ module Beaker
|
|
|
152
137
|
# given a generic Command.
|
|
153
138
|
def environment_string_for host, env
|
|
154
139
|
return '' if env.empty?
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
env_array << cmd if cmd
|
|
161
|
-
|
|
162
|
-
environment_string = env_array.join(' ')
|
|
163
|
-
|
|
164
|
-
"env #{environment_string}"
|
|
165
|
-
end
|
|
166
|
-
|
|
167
|
-
# @!visibility private
|
|
168
|
-
def parse_env_hash_for( host, env = @environment )
|
|
169
|
-
# I needlessly love inject
|
|
170
|
-
env.inject([]) do |array_of_parsed_vars, key_and_value|
|
|
171
|
-
variable, val_in_unknown_format = *key_and_value
|
|
172
|
-
if val_in_unknown_format.is_a?(Hash)
|
|
173
|
-
value = val_in_unknown_format
|
|
174
|
-
elsif val_in_unknown_format.is_a?(Array)
|
|
175
|
-
value = { :default => val_in_unknown_format }
|
|
140
|
+
env_array = []
|
|
141
|
+
env.each_key do |key|
|
|
142
|
+
val = env[key]
|
|
143
|
+
if val.is_a?(Array)
|
|
144
|
+
val = val.join(':')
|
|
176
145
|
else
|
|
177
|
-
|
|
146
|
+
val = val.to_s
|
|
178
147
|
end
|
|
179
|
-
|
|
180
|
-
var_settings = ensure_correct_structure_for( value )
|
|
181
|
-
# any default array of variable values ( like [ '/bin', '/usr/bin' ] for PATH )
|
|
182
|
-
default_values = var_settings[:default]
|
|
183
|
-
|
|
184
|
-
# host specific values, ie :host => [ 'puppetlibdir' ] is evaluated to
|
|
185
|
-
# an array with whatever host['puppetlibdir'] is
|
|
186
|
-
host_values = var_settings[:host].map { |attr| host[attr] }
|
|
187
|
-
|
|
188
|
-
# the two arrays are combined with host specific values first
|
|
189
|
-
var_array = ( host_values + default_values ).compact
|
|
190
|
-
|
|
191
|
-
# This will add the name of the variable, so :PATH => { ... }
|
|
192
|
-
# gets '${PATH}' appended to it if the :additive opt is passed
|
|
193
|
-
var_array << "${#{variable}}" if var_settings[:opts][:additive]
|
|
194
|
-
|
|
195
|
-
# This is stupid, but because we're using cygwin we sometimes need to use
|
|
196
|
-
# ':' and sometimes ';' on windows as a separator
|
|
197
|
-
attr_string = join_env_vars_for( var_array, host, var_settings[:opts][:separator] )
|
|
198
|
-
var_string = attr_string.empty? ? nil : %Q[#{variable}="#{attr_string}"]
|
|
199
|
-
|
|
200
|
-
# Now we append this to our accumulator array ie [ 'RUBYLIB=....', 'PATH=....' ]
|
|
201
|
-
array_of_parsed_vars << var_string
|
|
202
|
-
|
|
203
|
-
array_of_parsed_vars
|
|
148
|
+
env_array << "#{key.to_s.upcase}=\"#{val}\""
|
|
204
149
|
end
|
|
205
|
-
end
|
|
206
150
|
|
|
207
|
-
|
|
208
|
-
def ensure_correct_structure_for( settings )
|
|
209
|
-
structure = { :default => [],
|
|
210
|
-
:host => [],
|
|
211
|
-
:opts => {}
|
|
212
|
-
}.merge( settings )
|
|
213
|
-
structure[:opts][:separator] ||= ':'
|
|
214
|
-
structure
|
|
215
|
-
end
|
|
151
|
+
environment_string = env_array.join(' ')
|
|
216
152
|
|
|
217
|
-
|
|
218
|
-
def join_env_vars_for( array_of_variables, host, separator = ':' )
|
|
219
|
-
if separator.is_a?( Hash )
|
|
220
|
-
separator = host[separator[:host]]
|
|
221
|
-
end
|
|
222
|
-
array_of_variables.join( separator )
|
|
153
|
+
"env #{environment_string}"
|
|
223
154
|
end
|
|
155
|
+
|
|
224
156
|
end
|
|
225
157
|
|
|
226
158
|
class PuppetCommand < Command
|
|
@@ -228,7 +160,7 @@ module Beaker
|
|
|
228
160
|
command = "puppet #{args.shift}"
|
|
229
161
|
opts = args.last.is_a?(Hash) ? args.pop : Hash.new
|
|
230
162
|
opts['ENV'] ||= Hash.new
|
|
231
|
-
opts[
|
|
163
|
+
opts[:cmdexe] = true
|
|
232
164
|
super( command, args, opts )
|
|
233
165
|
end
|
|
234
166
|
end
|
|
@@ -1,8 +1,19 @@
|
|
|
1
|
-
require 'test
|
|
1
|
+
require 'minitest/test'
|
|
2
2
|
|
|
3
3
|
module Beaker
|
|
4
4
|
module CommandFactory
|
|
5
|
-
include
|
|
5
|
+
include Minitest::Assertions
|
|
6
|
+
#Why do we need this accessor?
|
|
7
|
+
# https://github.com/seattlerb/minitest/blob/master/lib/minitest/assertions.rb#L8-L12
|
|
8
|
+
# Protocol: Nearly everything here boils up to +assert+, which
|
|
9
|
+
# expects to be able to increment an instance accessor named
|
|
10
|
+
# +assertions+. This is not provided by Assertions and must be
|
|
11
|
+
# provided by the thing including Assertions. See Minitest::Runnable
|
|
12
|
+
# for an example.
|
|
13
|
+
attr_accessor :assertions
|
|
14
|
+
def assertions
|
|
15
|
+
@assertions || 0
|
|
16
|
+
end
|
|
6
17
|
|
|
7
18
|
def execute(command, options={}, &block)
|
|
8
19
|
result = self.exec(Command.new(command), options)
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
require 'test
|
|
1
|
+
require 'minitest/test'
|
|
2
2
|
|
|
3
3
|
module Beaker
|
|
4
4
|
module DSL
|
|
@@ -15,7 +15,19 @@ module Beaker
|
|
|
15
15
|
# or direct object for asserting against into your assertion.
|
|
16
16
|
#
|
|
17
17
|
module Assertions
|
|
18
|
-
include
|
|
18
|
+
include Minitest::Assertions
|
|
19
|
+
|
|
20
|
+
#Why do we need this accessor?
|
|
21
|
+
# https://github.com/seattlerb/minitest/blob/master/lib/minitest/assertions.rb#L8-L12
|
|
22
|
+
# Protocol: Nearly everything here boils up to +assert+, which
|
|
23
|
+
# expects to be able to increment an instance accessor named
|
|
24
|
+
# +assertions+. This is not provided by Assertions and must be
|
|
25
|
+
# provided by the thing including Assertions. See Minitest::Runnable
|
|
26
|
+
# for an example.
|
|
27
|
+
attr_accessor :assertions
|
|
28
|
+
def assertions
|
|
29
|
+
@assertions || 0
|
|
30
|
+
end
|
|
19
31
|
|
|
20
32
|
# Make assertions about the content of console output.
|
|
21
33
|
#
|
|
@@ -82,6 +94,17 @@ module Beaker
|
|
|
82
94
|
assert_equal our_err, (result.nil? ? '' : result.stderr),
|
|
83
95
|
'The contents of STDERR did not match expectations'
|
|
84
96
|
end
|
|
97
|
+
|
|
98
|
+
# Assert that the provided string does not match the provided regular expression, can pass optional message
|
|
99
|
+
# @deprecated This is placed her for backwards compatability for tests that used Test::Unit::Assertions,
|
|
100
|
+
# http://apidock.com/ruby/Test/Unit/Assertions/assert_no_match
|
|
101
|
+
#
|
|
102
|
+
def assert_no_match(regexp, string, msg=nil)
|
|
103
|
+
assert_instance_of(Regexp, regexp, "The first argument to assert_no_match should be a Regexp.")
|
|
104
|
+
msg = message(msg) { "<#{mu_pp(regexp)}> expected to not match\n<#{mu_pp(string)}>" }
|
|
105
|
+
assert(regexp !~ string, msg)
|
|
106
|
+
end
|
|
107
|
+
|
|
85
108
|
end
|
|
86
109
|
end
|
|
87
110
|
end
|
|
@@ -106,7 +106,7 @@ module Beaker
|
|
|
106
106
|
install_package host, package_name, package_version
|
|
107
107
|
end
|
|
108
108
|
|
|
109
|
-
when /^(debian|ubuntu)$/
|
|
109
|
+
when /^(debian|ubuntu|cumulus)$/
|
|
110
110
|
dependency_list = ezbake[:debian][:additional_dependencies]
|
|
111
111
|
dependency_list.each do |dependency|
|
|
112
112
|
package_name, _, package_version = dependency.split
|
|
@@ -192,7 +192,7 @@ module Beaker
|
|
|
192
192
|
when /^(fedora|el|centos)$/
|
|
193
193
|
env += "defaultsdir=/etc/sysconfig "
|
|
194
194
|
on host, cd_to_package_dir + env + "make -e install-rpm-sysv-init"
|
|
195
|
-
when /^(debian|ubuntu)$/
|
|
195
|
+
when /^(debian|ubuntu|cumulus)$/
|
|
196
196
|
env += "defaultsdir=/etc/default "
|
|
197
197
|
on host, cd_to_package_dir + env + "make -e install-deb-sysv-init"
|
|
198
198
|
else
|
data/lib/beaker/dsl/helpers.rb
CHANGED
|
@@ -187,6 +187,8 @@ module Beaker
|
|
|
187
187
|
# @note If using {Beaker::Host} for the hosts *scp* is not
|
|
188
188
|
# required on the system as it uses Ruby's net/scp library. The
|
|
189
189
|
# net-scp gem however is required (and specified in the gemspec.
|
|
190
|
+
# When using SCP with Windows it will now auto expand path when
|
|
191
|
+
# using `cygpath instead of failing or requiring full path
|
|
190
192
|
#
|
|
191
193
|
# @param [Host, #do_scp_to] host One or more hosts (or some object
|
|
192
194
|
# that responds like
|
|
@@ -198,6 +200,10 @@ module Beaker
|
|
|
198
200
|
# @return [Result] Returns the result of the SCP operation
|
|
199
201
|
def scp_to host, from_path, to_path, opts = {}
|
|
200
202
|
block_on host do | host |
|
|
203
|
+
if host['platform'] =~ /windows/ && to_path.match('`cygpath')
|
|
204
|
+
result = on host, "echo #{to_path}"
|
|
205
|
+
to_path = result.raw_output.chomp
|
|
206
|
+
end
|
|
201
207
|
@result = host.do_scp_to(from_path, to_path, opts)
|
|
202
208
|
@result.log logger
|
|
203
209
|
@result
|
|
@@ -256,7 +262,7 @@ module Beaker
|
|
|
256
262
|
# @return [String] Returns the name of the newly-created file.
|
|
257
263
|
def create_tmpdir_for_user(host, name='/tmp/beaker', user=nil)
|
|
258
264
|
if not user
|
|
259
|
-
result = on
|
|
265
|
+
result = on host, puppet("master --configprint user")
|
|
260
266
|
if not result.exit_code == 0
|
|
261
267
|
raise "`puppet master --configprint` failed, check that puppet is installed on #{host} or explicitly pass in a user name."
|
|
262
268
|
end
|
|
@@ -674,7 +680,7 @@ module Beaker
|
|
|
674
680
|
def dump_puppet_log(host)
|
|
675
681
|
syslogfile = case host['platform']
|
|
676
682
|
when /fedora|centos|el|redhat|scientific/ then '/var/log/messages'
|
|
677
|
-
when /ubuntu|debian/ then '/var/log/syslog'
|
|
683
|
+
when /ubuntu|debian|cumulus/ then '/var/log/syslog'
|
|
678
684
|
else return
|
|
679
685
|
end
|
|
680
686
|
|
|
@@ -861,18 +867,25 @@ module Beaker
|
|
|
861
867
|
# path separator character. (The POSIX path separator
|
|
862
868
|
# is ‘:’, and the Windows path separator is ‘;’.)
|
|
863
869
|
#
|
|
870
|
+
# @option opts [String] :debug (false) If this option exists,
|
|
871
|
+
# the "--debug" command line parameter
|
|
872
|
+
# will be passed to the 'puppet apply' command.
|
|
873
|
+
#
|
|
864
874
|
# @param [Block] block This method will yield to a block of code passed
|
|
865
875
|
# by the caller; this can be used for additional
|
|
866
876
|
# validation, etc.
|
|
867
877
|
#
|
|
868
878
|
def apply_manifest_on(host, manifest, opts = {}, &block)
|
|
869
879
|
block_on host do | host |
|
|
870
|
-
|
|
871
880
|
on_options = {}
|
|
872
881
|
on_options[:acceptable_exit_codes] = Array(opts[:acceptable_exit_codes])
|
|
873
882
|
|
|
874
883
|
puppet_apply_opts = {}
|
|
875
|
-
|
|
884
|
+
if opts[:debug]
|
|
885
|
+
puppet_apply_opts[:debug] = nil
|
|
886
|
+
else
|
|
887
|
+
puppet_apply_opts[:verbose] = nil
|
|
888
|
+
end
|
|
876
889
|
puppet_apply_opts[:parseonly] = nil if opts[:parseonly]
|
|
877
890
|
puppet_apply_opts[:trace] = nil if opts[:trace]
|
|
878
891
|
puppet_apply_opts[:parser] = 'future' if opts[:future_parser]
|
|
@@ -1115,22 +1128,62 @@ module Beaker
|
|
|
1115
1128
|
host, "https://#{host.node_name}:8081", [35, 60])
|
|
1116
1129
|
end
|
|
1117
1130
|
|
|
1131
|
+
def sleep_until_puppetserver_started(host)
|
|
1132
|
+
curl_with_retries("start puppetserver (ssl)",
|
|
1133
|
+
host, "https://#{host.node_name}:8140", [35, 60])
|
|
1134
|
+
end
|
|
1135
|
+
|
|
1136
|
+
def sleep_until_nc_started(host)
|
|
1137
|
+
curl_with_retries("start nodeclassifier (ssl)",
|
|
1138
|
+
host, "https://#{host.node_name}:4433", [35, 60])
|
|
1139
|
+
end
|
|
1140
|
+
|
|
1118
1141
|
def curl_with_retries(desc, host, url, desired_exit_codes, max_retries = 60, retry_interval = 1)
|
|
1119
|
-
|
|
1142
|
+
opts = {
|
|
1143
|
+
:desired_exit_codes => desired_exit_codes,
|
|
1144
|
+
:max_retries => max_retries,
|
|
1145
|
+
:retry_interval => retry_interval
|
|
1146
|
+
}
|
|
1147
|
+
retry_on(host, "curl -m 1 #{url}", opts)
|
|
1120
1148
|
end
|
|
1121
1149
|
|
|
1122
|
-
|
|
1123
|
-
|
|
1150
|
+
# This command will execute repeatedly until success or it runs out with an error
|
|
1151
|
+
#
|
|
1152
|
+
# @param [Host, Array<Host>, String, Symbol] host One or more hosts to act upon,
|
|
1153
|
+
# or a role (String or Symbol) that identifies one or more hosts.
|
|
1154
|
+
# @param [String, Command] command The command to execute on *host*.
|
|
1155
|
+
# @param [Hash{Symbol=>String}] opts Options to alter execution.
|
|
1156
|
+
# @param [Proc] block Additional actions or assertions.
|
|
1157
|
+
#
|
|
1158
|
+
# @option opts [Array<Fixnum>, Fixnum] :desired_exit_codes (0) An array
|
|
1159
|
+
# or integer exit code(s) that should be considered
|
|
1160
|
+
# acceptable. An error will be thrown if the exit code never
|
|
1161
|
+
# matches one of the values in this list.
|
|
1162
|
+
# @option opts [Fixnum] :max_retries (60) number of times the
|
|
1163
|
+
# command will be tried before failing
|
|
1164
|
+
# @option opts [Float] :retry_interval (1) number of seconds
|
|
1165
|
+
# that we'll wait between tries
|
|
1166
|
+
# @option opts [Boolean] :verbose (false)
|
|
1167
|
+
def retry_on(host, command, opts = {}, &block)
|
|
1168
|
+
option_exit_codes = opts[:desired_exit_codes]
|
|
1169
|
+
option_max_retries = opts[:max_retries].to_i
|
|
1170
|
+
option_retry_interval = opts[:retry_interval].to_f
|
|
1171
|
+
desired_exit_codes = option_exit_codes ? [option_exit_codes].flatten : [0]
|
|
1172
|
+
desired_exit_codes = [0] if desired_exit_codes.empty?
|
|
1173
|
+
max_retries = option_max_retries == 0 ? 60 : option_max_retries # nil & "" both return 0
|
|
1174
|
+
retry_interval = option_retry_interval == 0 ? 1 : option_retry_interval
|
|
1175
|
+
verbose = true.to_s == opts[:verbose]
|
|
1176
|
+
|
|
1124
1177
|
log_prefix = host.log_prefix
|
|
1125
1178
|
logger.debug "\n#{log_prefix} #{Time.new.strftime('%H:%M:%S')}$ #{command}"
|
|
1126
1179
|
logger.debug " Trying command #{max_retries} times."
|
|
1127
1180
|
logger.debug ".", add_newline=false
|
|
1128
|
-
|
|
1129
|
-
result = on host, command, {:acceptable_exit_codes => (0...127), :silent => !verbose}
|
|
1181
|
+
|
|
1182
|
+
result = on host, command, {:acceptable_exit_codes => (0...127), :silent => !verbose}, &block
|
|
1130
1183
|
num_retries = 0
|
|
1131
1184
|
until desired_exit_codes.include?(result.exit_code)
|
|
1132
1185
|
sleep retry_interval
|
|
1133
|
-
result = on host, command, {:acceptable_exit_codes => (0...127), :silent => !verbose}
|
|
1186
|
+
result = on host, command, {:acceptable_exit_codes => (0...127), :silent => !verbose}, &block
|
|
1134
1187
|
num_retries += 1
|
|
1135
1188
|
logger.debug ".", add_newline=false
|
|
1136
1189
|
if (num_retries > max_retries)
|
|
@@ -1139,6 +1192,7 @@ module Beaker
|
|
|
1139
1192
|
end
|
|
1140
1193
|
end
|
|
1141
1194
|
logger.debug "\n#{log_prefix} #{Time.new.strftime('%H:%M:%S')}$ #{command} ostensibly successful."
|
|
1195
|
+
result
|
|
1142
1196
|
end
|
|
1143
1197
|
|
|
1144
1198
|
#Is semver-ish version a less than semver-ish version b
|
|
@@ -1219,7 +1273,7 @@ module Beaker
|
|
|
1219
1273
|
#wait for a given host to appear in the dashboard
|
|
1220
1274
|
def wait_for_host_in_dashboard(host)
|
|
1221
1275
|
hostname = host.node_name
|
|
1222
|
-
|
|
1276
|
+
retry_on(dashboard, "! curl --tlsv1 -k -I https://#{dashboard}/nodes/#{hostname} | grep '404 Not Found'")
|
|
1223
1277
|
end
|
|
1224
1278
|
|
|
1225
1279
|
# Ensure the host has requested a cert, then sign it
|
|
@@ -1245,7 +1299,7 @@ module Beaker
|
|
|
1245
1299
|
(0..10).each do |i|
|
|
1246
1300
|
fail_test("Failed to sign cert for #{hostname}") if i == 10
|
|
1247
1301
|
|
|
1248
|
-
on master, puppet("cert --sign --all"), :acceptable_exit_codes => [0,24]
|
|
1302
|
+
on master, puppet("cert --sign --all --allow-dns-alt-names"), :acceptable_exit_codes => [0,24]
|
|
1249
1303
|
break if on(master, puppet("cert --list --all")).stdout =~ /\+ "?#{hostname}"?/
|
|
1250
1304
|
sleep next_sleep
|
|
1251
1305
|
(last_sleep, next_sleep) = next_sleep, last_sleep+next_sleep
|