beaker-puppet 1.29.0 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/dependabot.yml +9 -0
- data/.github/workflows/release.yml +2 -2
- data/.github/workflows/test.yml +28 -7
- data/.rubocop.yml +5 -0
- data/.rubocop_todo.yml +842 -0
- data/CHANGELOG.md +31 -0
- data/Gemfile +5 -20
- data/Rakefile +64 -169
- data/acceptance/config/acceptance-options.rb +3 -3
- data/acceptance/config/gem/acceptance-options.rb +8 -8
- data/acceptance/config/git/acceptance-options.rb +8 -8
- data/acceptance/config/pkg/acceptance-options.rb +7 -7
- data/acceptance/pre_suite/gem/install.rb +6 -6
- data/acceptance/pre_suite/git/install.rb +22 -22
- data/acceptance/pre_suite/pkg/install.rb +3 -3
- data/acceptance/tests/backwards_compatible.rb +6 -7
- data/acceptance/tests/clone_git_repo_on_test.rb +12 -13
- data/acceptance/tests/create_tmpdir_on_test.rb +13 -9
- data/acceptance/tests/install_smoke_test.rb +5 -4
- data/acceptance/tests/stub_host.rb +11 -10
- data/acceptance/tests/web_helpers_test.rb +11 -10
- data/beaker-puppet.gemspec +16 -23
- data/bin/beaker-puppet +2 -4
- data/lib/beaker-puppet/helpers/facter_helpers.rb +9 -7
- data/lib/beaker-puppet/helpers/host_helpers.rb +10 -7
- data/lib/beaker-puppet/helpers/puppet_helpers.rb +151 -160
- data/lib/beaker-puppet/helpers/rake_helpers.rb +1 -1
- data/lib/beaker-puppet/helpers/tk_helpers.rb +22 -28
- data/lib/beaker-puppet/install_utils/aio_defaults.rb +39 -43
- data/lib/beaker-puppet/install_utils/ezbake_utils.rb +34 -42
- data/lib/beaker-puppet/install_utils/foss_defaults.rb +134 -138
- data/lib/beaker-puppet/install_utils/foss_utils.rb +293 -320
- data/lib/beaker-puppet/install_utils/module_utils.rb +58 -70
- data/lib/beaker-puppet/install_utils/puppet5.rb +30 -35
- data/lib/beaker-puppet/install_utils/puppet_utils.rb +58 -68
- data/lib/beaker-puppet/install_utils/windows_utils.rb +34 -36
- data/lib/beaker-puppet/version.rb +1 -1
- data/lib/beaker-puppet/wrappers.rb +13 -14
- data/lib/beaker-puppet.rb +4 -5
- data/setup/aio/010_Install_Puppet_Agent.rb +5 -6
- data/setup/common/000-delete-puppet-when-none.rb +2 -4
- data/setup/common/003_solaris_cert_fix.rb +74 -70
- data/setup/common/005_redhat_subscription_fix.rb +3 -2
- data/setup/common/011_Install_Puppet_Server.rb +7 -9
- data/setup/common/012_Finalize_Installs.rb +5 -5
- data/setup/common/025_StopFirewall.rb +1 -1
- data/setup/common/030_StopSssd.rb +2 -2
- data/setup/common/040_ValidateSignCert.rb +10 -12
- data/setup/common/045_EnsureMasterStarted.rb +2 -2
- data/setup/gem/010_GemInstall.rb +5 -4
- data/setup/git/000_EnvSetup.rb +48 -48
- data/setup/git/010_TestSetup.rb +13 -12
- data/setup/git/020_PuppetUserAndGroup.rb +3 -2
- data/setup/git/060_InstallModules.rb +14 -14
- data/setup/git/070_InstallCACerts.rb +82 -82
- data/spec/beaker-puppet/helpers/facter_helpers_spec.rb +22 -24
- data/spec/beaker-puppet/helpers/host_helpers_spec.rb +10 -6
- data/spec/beaker-puppet/helpers/puppet_helpers_spec.rb +506 -517
- data/spec/beaker-puppet/helpers/tk_helpers_spec.rb +20 -24
- data/spec/beaker-puppet/install_utils/ezbake_utils_spec.rb +86 -90
- data/spec/beaker-puppet/install_utils/foss_utils_spec.rb +636 -599
- data/spec/beaker-puppet/install_utils/module_utils_spec.rb +125 -116
- data/spec/beaker-puppet/install_utils/puppet5_spec.rb +159 -165
- data/spec/beaker-puppet/install_utils/puppet_utils_spec.rb +92 -77
- data/spec/beaker-puppet/install_utils/windows_utils_spec.rb +101 -89
- data/spec/beaker-puppet/wrappers_spec.rb +10 -10
- data/spec/helpers.rb +85 -91
- data/tasks/ci.rake +171 -179
- metadata +33 -62
- data/setup/common/020_InstallCumulusModules.rb +0 -13
- data/setup/common/021_InstallAristaModuleMasters.rb +0 -12
- data/setup/common/022_InstallAristaModuleAgents.rb +0 -13
@@ -5,21 +5,20 @@ module Beaker
|
|
5
5
|
# This module contains methods useful for both foss and pe installs
|
6
6
|
#
|
7
7
|
module PuppetUtils
|
8
|
-
|
9
|
-
#
|
10
|
-
|
11
|
-
#@return [String] The normalized type
|
8
|
+
# Given a type return an understood host type
|
9
|
+
# @param [String] type The host type to be normalized
|
10
|
+
# @return [String] The normalized type
|
12
11
|
#
|
13
|
-
|
12
|
+
# @example
|
14
13
|
# normalize_type('pe-aio')
|
15
14
|
# 'pe'
|
16
|
-
|
15
|
+
# @example
|
17
16
|
# normalize_type('git')
|
18
17
|
# 'foss'
|
19
|
-
|
18
|
+
# @example
|
20
19
|
# normalize_type('foss-internal')
|
21
20
|
# 'foss'
|
22
|
-
def normalize_type
|
21
|
+
def normalize_type(type)
|
23
22
|
case type
|
24
23
|
when /(\A|-)foss(\Z|-)/
|
25
24
|
'foss'
|
@@ -27,44 +26,40 @@ module Beaker
|
|
27
26
|
'pe'
|
28
27
|
when /(\A|-)aio(\Z|-)/
|
29
28
|
'aio'
|
30
|
-
else
|
31
|
-
nil
|
32
29
|
end
|
33
30
|
end
|
34
31
|
|
35
|
-
#Given a host construct a PATH that includes puppetbindir, facterbindir and hierabindir
|
32
|
+
# Given a host construct a PATH that includes puppetbindir, facterbindir and hierabindir
|
36
33
|
# @param [Host] host A single host to construct pathing for
|
37
34
|
def construct_puppet_path(host)
|
38
|
-
path =
|
39
|
-
#get the PATH defaults
|
35
|
+
path = %w[puppetbindir facterbindir hierabindir privatebindir].compact.reject(&:empty?)
|
36
|
+
# get the PATH defaults
|
40
37
|
path.map! { |val| host[val] }
|
41
38
|
path = path.compact.reject(&:empty?)
|
42
|
-
#run the paths through echo to see if they have any subcommands that need processing
|
39
|
+
# run the paths through echo to see if they have any subcommands that need processing
|
43
40
|
path.map! { |val| echo_on(host, val) }
|
44
41
|
|
45
42
|
separator = host['pathseparator']
|
46
|
-
|
47
|
-
separator = ':'
|
48
|
-
end
|
43
|
+
separator = ':' unless host.is_powershell?
|
49
44
|
path.join(separator)
|
50
45
|
end
|
51
46
|
|
52
|
-
#Append puppetbindir, facterbindir and hierabindir to the PATH for each host
|
47
|
+
# Append puppetbindir, facterbindir and hierabindir to the PATH for each host
|
53
48
|
# @param [Host, Array<Host>, String, Symbol] hosts One or more hosts to act upon,
|
54
49
|
# or a role (String or Symbol) that identifies one or more hosts.
|
55
50
|
def add_puppet_paths_on(hosts)
|
56
|
-
block_on hosts do |
|
51
|
+
block_on hosts do |host|
|
57
52
|
puppet_path = construct_puppet_path(host)
|
58
53
|
host.add_env_var('PATH', puppet_path)
|
59
54
|
end
|
60
55
|
end
|
61
56
|
|
62
|
-
#Remove puppetbindir, facterbindir and hierabindir to the PATH for each host
|
57
|
+
# Remove puppetbindir, facterbindir and hierabindir to the PATH for each host
|
63
58
|
#
|
64
59
|
# @param [Host, Array<Host>, String, Symbol] hosts One or more hosts to act upon,
|
65
60
|
# or a role (String or Symbol) that identifies one or more hosts.
|
66
61
|
def remove_puppet_paths_on(hosts)
|
67
|
-
block_on hosts do |
|
62
|
+
block_on hosts do |host|
|
68
63
|
puppet_path = construct_puppet_path(host)
|
69
64
|
host.delete_env_var('PATH', puppet_path)
|
70
65
|
end
|
@@ -76,12 +71,12 @@ module Beaker
|
|
76
71
|
# @deprecated This method returns 'PC1' as the latest puppet collection;
|
77
72
|
# this is incorrect. Use {#puppet_collection_for} instead.
|
78
73
|
def get_puppet_collection(agent_version = 'latest')
|
79
|
-
collection =
|
74
|
+
collection = 'PC1'
|
80
75
|
if agent_version != 'latest'
|
81
|
-
if !
|
82
|
-
collection =
|
83
|
-
elsif !
|
84
|
-
collection =
|
76
|
+
if !version_is_less(agent_version, '5.5.4') and version_is_less(agent_version, '5.99')
|
77
|
+
collection = 'puppet5'
|
78
|
+
elsif !version_is_less(agent_version, '5.99')
|
79
|
+
collection = 'puppet6'
|
85
80
|
end
|
86
81
|
end
|
87
82
|
collection
|
@@ -98,15 +93,13 @@ module Beaker
|
|
98
93
|
# @param version [String] a version number or the string 'latest'
|
99
94
|
# @returns [String|nil] the name of the corresponding puppet collection, if any
|
100
95
|
def puppet_collection_for(package, version)
|
101
|
-
valid_packages = [
|
102
|
-
|
103
|
-
|
104
|
-
|
96
|
+
valid_packages = %i[
|
97
|
+
puppet_agent
|
98
|
+
puppet
|
99
|
+
puppetserver
|
105
100
|
]
|
106
101
|
|
107
|
-
unless valid_packages.include?(package)
|
108
|
-
raise "package must be one of #{valid_packages.join(', ')}"
|
109
|
-
end
|
102
|
+
raise "package must be one of #{valid_packages.join(', ')}" unless valid_packages.include?(package)
|
110
103
|
|
111
104
|
case package
|
112
105
|
when :puppet_agent, :puppet, :puppetserver
|
@@ -119,7 +112,7 @@ module Beaker
|
|
119
112
|
pc1_x = {
|
120
113
|
puppet: 4,
|
121
114
|
puppet_agent: 1,
|
122
|
-
puppetserver: 2
|
115
|
+
puppetserver: 2,
|
123
116
|
}
|
124
117
|
|
125
118
|
return 'pc1' if x == pc1_x[package]
|
@@ -136,9 +129,8 @@ module Beaker
|
|
136
129
|
# @returns [String|nil] The version of puppet-agent, or nil if puppet-agent is not installed
|
137
130
|
def puppet_agent_version_on(host)
|
138
131
|
result = on(host, facter('aio_agent_version'), accept_all_exit_codes: true)
|
139
|
-
if result.exit_code.zero?
|
140
|
-
|
141
|
-
end
|
132
|
+
return result.stdout.strip if result.exit_code.zero?
|
133
|
+
|
142
134
|
nil
|
143
135
|
end
|
144
136
|
|
@@ -149,36 +141,36 @@ module Beaker
|
|
149
141
|
def puppetserver_version_on(host)
|
150
142
|
result = on(host, 'puppetserver --version', accept_all_exit_codes: true)
|
151
143
|
if result.exit_code.zero?
|
152
|
-
matched = result.stdout.strip.scan(
|
144
|
+
matched = result.stdout.strip.scan(/\d+\.\d+\.\d+/)
|
153
145
|
return matched.first
|
154
146
|
end
|
155
147
|
nil
|
156
148
|
end
|
157
149
|
|
158
|
-
#Configure the provided hosts to be of the provided type (one of foss, aio, pe), if the host
|
159
|
-
#is already associated with a type then remove the previous settings for that type
|
150
|
+
# Configure the provided hosts to be of the provided type (one of foss, aio, pe), if the host
|
151
|
+
# is already associated with a type then remove the previous settings for that type
|
160
152
|
# @param [Host, Array<Host>, String, Symbol] hosts One or more hosts to act upon,
|
161
153
|
# or a role (String or Symbol) that identifies one or more hosts.
|
162
154
|
# @param [String] type One of 'aio', 'pe' or 'foss'
|
163
|
-
def configure_defaults_on(
|
155
|
+
def configure_defaults_on(hosts, type)
|
164
156
|
block_on hosts do |host|
|
165
|
-
|
166
157
|
# check to see if the host already has a type associated with it
|
167
158
|
remove_defaults_on(host)
|
168
159
|
|
169
160
|
add_method = "add_#{type}_defaults_on"
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
161
|
+
raise "cannot add defaults of type #{type} for host #{host.name} (#{add_method} not present)" unless respond_to?(
|
162
|
+
add_method, host
|
163
|
+
)
|
164
|
+
|
165
|
+
send(add_method, host)
|
166
|
+
|
175
167
|
# add pathing env
|
176
168
|
add_puppet_paths_on(host)
|
177
169
|
end
|
178
170
|
end
|
179
171
|
|
180
172
|
# Configure the provided hosts to be of their host[:type], it host[type] == nil do nothing
|
181
|
-
def configure_type_defaults_on(
|
173
|
+
def configure_type_defaults_on(hosts)
|
182
174
|
block_on hosts do |host|
|
183
175
|
has_defaults = false
|
184
176
|
if host[:type]
|
@@ -189,11 +181,12 @@ module Beaker
|
|
189
181
|
host_type = normalize_type(host_type)
|
190
182
|
if host_type and host_type !~ /aio/
|
191
183
|
add_method = "add_#{host_type}_defaults_on"
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
184
|
+
raise "cannot add defaults of type #{host_type} for host #{host.name} (#{add_method} not present)" unless respond_to?(
|
185
|
+
add_method, host
|
186
|
+
)
|
187
|
+
|
188
|
+
send(add_method, host)
|
189
|
+
|
197
190
|
has_defaults = true
|
198
191
|
end
|
199
192
|
end
|
@@ -202,18 +195,16 @@ module Beaker
|
|
202
195
|
has_defaults = true
|
203
196
|
end
|
204
197
|
# add pathing env
|
205
|
-
if has_defaults
|
206
|
-
add_puppet_paths_on(host)
|
207
|
-
end
|
198
|
+
add_puppet_paths_on(host) if has_defaults
|
208
199
|
end
|
209
200
|
end
|
210
|
-
|
211
|
-
|
201
|
+
alias configure_foss_defaults_on configure_type_defaults_on
|
202
|
+
alias configure_pe_defaults_on configure_type_defaults_on
|
212
203
|
|
213
|
-
#If the host is associated with a type remove all defaults and environment associated with that type.
|
204
|
+
# If the host is associated with a type remove all defaults and environment associated with that type.
|
214
205
|
# @param [Host, Array<Host>, String, Symbol] hosts One or more hosts to act upon,
|
215
206
|
# or a role (String or Symbol) that identifies one or more hosts.
|
216
|
-
def remove_defaults_on(
|
207
|
+
def remove_defaults_on(hosts)
|
217
208
|
block_on hosts do |host|
|
218
209
|
if host['type']
|
219
210
|
# clean up the naming conventions here (some teams use foss-package, git-whatever, we need
|
@@ -222,14 +213,13 @@ module Beaker
|
|
222
213
|
host_type = normalize_type(host['type'])
|
223
214
|
remove_puppet_paths_on(hosts)
|
224
215
|
remove_method = "remove_#{host_type}_defaults_on"
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
end
|
216
|
+
raise "cannot remove defaults of type #{host_type} associated with host #{host.name} (#{remove_method} not present)" unless respond_to?(
|
217
|
+
remove_method, host
|
218
|
+
)
|
219
|
+
|
220
|
+
send(remove_method, host)
|
221
|
+
|
222
|
+
remove_aio_defaults_on(host) if aio_version?(host)
|
233
223
|
end
|
234
224
|
end
|
235
225
|
end
|
@@ -13,7 +13,7 @@ module Beaker
|
|
13
13
|
def get_system_temp_path(host)
|
14
14
|
host.system_temp_path
|
15
15
|
end
|
16
|
-
|
16
|
+
alias get_temp_path get_system_temp_path
|
17
17
|
|
18
18
|
# Generates commands to be inserted into a Windows batch file to launch an MSI install
|
19
19
|
# @param [String] msi_path The path of the MSI - can be a local Windows style file path like
|
@@ -25,15 +25,15 @@ module Beaker
|
|
25
25
|
# @api private
|
26
26
|
def msi_install_script(msi_path, msi_opts, log_path)
|
27
27
|
# msiexec requires backslashes in file paths launched under cmd.exe start /w
|
28
|
-
url_pattern =
|
29
|
-
msi_path = msi_path.gsub(
|
28
|
+
url_pattern = %r{^(https?|file)://}
|
29
|
+
msi_path = msi_path.gsub(%r{/}, '\\') if msi_path !~ url_pattern
|
30
30
|
|
31
|
-
msi_params = msi_opts.map{|k, v| "#{k}=#{v}"}.join(' ')
|
31
|
+
msi_params = msi_opts.map { |k, v| "#{k}=#{v}" }.join(' ')
|
32
32
|
|
33
33
|
# msiexec requires quotes around paths with backslashes - c:\ or file://c:\
|
34
34
|
# not strictly needed for http:// but it simplifies this code
|
35
35
|
batch_contents = <<~BATCH
|
36
|
-
start /w msiexec.exe /i
|
36
|
+
start /w msiexec.exe /i "#{msi_path}" /qn /L*V #{log_path} #{msi_params}
|
37
37
|
exit /B %errorlevel%
|
38
38
|
BATCH
|
39
39
|
end
|
@@ -67,7 +67,7 @@ module Beaker
|
|
67
67
|
host.do_scp_to(tmp_file.path, batch_path, {})
|
68
68
|
end
|
69
69
|
|
70
|
-
|
70
|
+
[batch_path, log_path]
|
71
71
|
end
|
72
72
|
|
73
73
|
# Given hosts construct a PATH that includes puppetbindir, facterbindir and hierabindir
|
@@ -112,34 +112,31 @@ module Beaker
|
|
112
112
|
#
|
113
113
|
# @api private
|
114
114
|
def install_msi_on(hosts, msi_path, msi_opts = {}, opts = {})
|
115
|
-
block_on hosts do |
|
115
|
+
block_on hosts do |host|
|
116
116
|
msi_opts['PUPPET_AGENT_STARTUP_MODE'] ||= 'Manual'
|
117
117
|
batch_path, log_file = create_install_msi_batch_on(host, msi_path, msi_opts)
|
118
118
|
# Powershell command looses an escaped slash resulting in cygwin relative path
|
119
119
|
# See https://github.com/puppetlabs/beaker/pull/1626#issuecomment-621341555
|
120
|
-
log_file_escaped = log_file.gsub('\\','\\\\\\')
|
120
|
+
log_file_escaped = log_file.gsub('\\', '\\\\\\')
|
121
121
|
# begin / rescue here so that we can reuse existing error msg propagation
|
122
122
|
begin
|
123
123
|
# 1641 = ERROR_SUCCESS_REBOOT_INITIATED
|
124
124
|
# 3010 = ERROR_SUCCESS_REBOOT_REQUIRED
|
125
|
-
on host, Command.new("\"#{batch_path}\"", [], { :
|
126
|
-
rescue
|
125
|
+
on host, Command.new("\"#{batch_path}\"", [], { cmdexe: true }), acceptable_exit_codes: [0, 1641, 3010]
|
126
|
+
rescue StandardError
|
127
127
|
logger.info(file_contents_on(host, log_file_escaped))
|
128
128
|
raise
|
129
129
|
end
|
130
130
|
|
131
|
-
if opts[:debug]
|
132
|
-
logger.info(file_contents_on(host, log_file_escaped))
|
133
|
-
end
|
131
|
+
logger.info(file_contents_on(host, log_file_escaped)) if opts[:debug]
|
134
132
|
|
135
133
|
unless host.is_cygwin?
|
136
134
|
# Enable the PATH updates
|
137
135
|
host.close
|
138
136
|
|
139
137
|
# Some systems require a full reboot to trigger the enabled path
|
140
|
-
unless on(host, Command.new('puppet -h', [], { :
|
141
|
-
|
142
|
-
end
|
138
|
+
host.reboot unless on(host, Command.new('puppet -h', [], { cmdexe: true }),
|
139
|
+
accept_all_exit_codes: true).exit_code == 0
|
143
140
|
end
|
144
141
|
|
145
142
|
# verify service status post install
|
@@ -149,18 +146,18 @@ module Beaker
|
|
149
146
|
#
|
150
147
|
# We also take advantage of this output to verify the startup
|
151
148
|
# settings are honored as supplied to the MSI
|
152
|
-
on host, Command.new(
|
149
|
+
on host, Command.new('sc qc puppet || sc qc pe-puppet', [], { cmdexe: true }) do |result|
|
153
150
|
output = result.stdout
|
154
151
|
startup_mode = msi_opts['PUPPET_AGENT_STARTUP_MODE'].upcase
|
155
152
|
|
156
153
|
search = case startup_mode
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
154
|
+
when 'AUTOMATIC'
|
155
|
+
{ code: 2, name: 'AUTO_START' }
|
156
|
+
when 'MANUAL'
|
157
|
+
{ code: 3, name: 'DEMAND_START' }
|
158
|
+
when 'DISABLED'
|
159
|
+
{ code: 4, name: 'DISABLED' }
|
160
|
+
end
|
164
161
|
|
165
162
|
if output !~ /^\s+START_TYPE\s+:\s+#{search[:code]}\s+#{search[:name]}/
|
166
163
|
raise "puppet service startup mode did not match supplied MSI option '#{startup_mode}'"
|
@@ -169,10 +166,13 @@ module Beaker
|
|
169
166
|
|
170
167
|
# (PA-514) value for PUPPET_AGENT_STARTUP_MODE should be present in
|
171
168
|
# registry and honored after install/upgrade.
|
172
|
-
reg_key = host.is_x86_64?
|
173
|
-
|
174
|
-
|
175
|
-
|
169
|
+
reg_key = if host.is_x86_64?
|
170
|
+
'HKLM\\SOFTWARE\\Wow6432Node\\Puppet Labs\\PuppetInstaller'
|
171
|
+
else
|
172
|
+
'HKLM\\SOFTWARE\\Puppet Labs\\PuppetInstaller'
|
173
|
+
end
|
174
|
+
reg_query_command = %(reg query "#{reg_key}" /v "RememberedPuppetAgentStartupMode" | findstr #{msi_opts['PUPPET_AGENT_STARTUP_MODE']})
|
175
|
+
on host, Command.new(reg_query_command, [], { cmdexe: true })
|
176
176
|
|
177
177
|
# emit the misc/versions.txt file which contains component versions for
|
178
178
|
# puppet, facter, hiera, pxp-agent, packaging and vendored Ruby
|
@@ -180,7 +180,7 @@ module Beaker
|
|
180
180
|
"'%PROGRAMFILES%\\Puppet Labs\\puppet\\misc\\versions.txt'",
|
181
181
|
"'%PROGRAMFILES(X86)%\\Puppet Labs\\puppet\\misc\\versions.txt'",
|
182
182
|
].each do |path|
|
183
|
-
result = on(host, "cmd /c type #{path}", :
|
183
|
+
result = on(host, "cmd /c type #{path}", accept_all_exit_codes: true)
|
184
184
|
if result.exit_code == 0
|
185
185
|
logger.info(result.stdout)
|
186
186
|
break
|
@@ -203,25 +203,23 @@ module Beaker
|
|
203
203
|
#
|
204
204
|
# @api private
|
205
205
|
def generic_install_msi_on(hosts, msi_path, msi_opts = {}, opts = {})
|
206
|
-
block_on hosts do |
|
206
|
+
block_on hosts do |host|
|
207
207
|
batch_path, log_file = create_install_msi_batch_on(host, msi_path, msi_opts)
|
208
208
|
# Powershell command looses an escaped slash resulting in cygwin relative path
|
209
209
|
# See https://github.com/puppetlabs/beaker/pull/1626#issuecomment-621341555
|
210
|
-
log_file_escaped = log_file.gsub('\\','\\\\\\')
|
210
|
+
log_file_escaped = log_file.gsub('\\', '\\\\\\')
|
211
211
|
# begin / rescue here so that we can reuse existing error msg propagation
|
212
212
|
begin
|
213
213
|
# 1641 = ERROR_SUCCESS_REBOOT_INITIATED
|
214
214
|
# 3010 = ERROR_SUCCESS_REBOOT_REQUIRED
|
215
|
-
on host, Command.new("\"#{batch_path}\"", [], { :
|
216
|
-
rescue
|
215
|
+
on host, Command.new("\"#{batch_path}\"", [], { cmdexe: true }), acceptable_exit_codes: [0, 1641, 3010]
|
216
|
+
rescue StandardError
|
217
217
|
logger.info(file_contents_on(host, log_file_escaped))
|
218
218
|
|
219
219
|
raise
|
220
220
|
end
|
221
221
|
|
222
|
-
if opts[:debug]
|
223
|
-
logger.info(file_contents_on(host, log_file_escaped))
|
224
|
-
end
|
222
|
+
logger.info(file_contents_on(host, log_file_escaped)) if opts[:debug]
|
225
223
|
|
226
224
|
host.close unless host.is_cygwin?
|
227
225
|
end
|
@@ -1,7 +1,6 @@
|
|
1
1
|
module Beaker
|
2
2
|
module DSL
|
3
3
|
module Wrappers
|
4
|
-
|
5
4
|
# This is hairy and because of legacy code it will take a bit more
|
6
5
|
# work to disentangle all of the things that are being passed into
|
7
6
|
# this catchall param.
|
@@ -10,7 +9,7 @@ module Beaker
|
|
10
9
|
options = args.last.is_a?(Hash) ? args.pop : {}
|
11
10
|
options['ENV'] ||= {}
|
12
11
|
options[:cmdexe] = true
|
13
|
-
Command.new('facter', args, options
|
12
|
+
Command.new('facter', args, options)
|
14
13
|
end
|
15
14
|
|
16
15
|
# This is hairy and because of legacy code it will take a bit more
|
@@ -21,7 +20,7 @@ module Beaker
|
|
21
20
|
options = args.last.is_a?(Hash) ? args.pop : {}
|
22
21
|
options['ENV'] ||= {}
|
23
22
|
options[:cmdexe] = true
|
24
|
-
Command.new('cfacter', args, options
|
23
|
+
Command.new('cfacter', args, options)
|
25
24
|
end
|
26
25
|
|
27
26
|
# This is hairy and because of legacy code it will take a bit more
|
@@ -32,7 +31,7 @@ module Beaker
|
|
32
31
|
options = args.last.is_a?(Hash) ? args.pop : {}
|
33
32
|
options['ENV'] ||= {}
|
34
33
|
options[:cmdexe] = true
|
35
|
-
Command.new('hiera', args, options
|
34
|
+
Command.new('hiera', args, options)
|
36
35
|
end
|
37
36
|
|
38
37
|
# This is hairy and because of legacy code it will take a bit more
|
@@ -46,48 +45,48 @@ module Beaker
|
|
46
45
|
# we assume that an invocation with `puppet()` will have it's first argument
|
47
46
|
# a face or sub command
|
48
47
|
cmd = "puppet #{args.shift}"
|
49
|
-
Command.new(
|
48
|
+
Command.new(cmd, args, options)
|
50
49
|
end
|
51
50
|
|
52
51
|
# @!visibility private
|
53
52
|
def puppet_resource(*args)
|
54
|
-
puppet(
|
53
|
+
puppet('resource', *args)
|
55
54
|
end
|
56
55
|
|
57
56
|
# @!visibility private
|
58
57
|
def puppet_doc(*args)
|
59
|
-
puppet(
|
58
|
+
puppet('doc', *args)
|
60
59
|
end
|
61
60
|
|
62
61
|
# @!visibility private
|
63
62
|
def puppet_kick(*args)
|
64
|
-
puppet(
|
63
|
+
puppet('kick', *args)
|
65
64
|
end
|
66
65
|
|
67
66
|
# @!visibility private
|
68
67
|
def puppet_cert(*args)
|
69
|
-
puppet(
|
68
|
+
puppet('cert', *args)
|
70
69
|
end
|
71
70
|
|
72
71
|
# @!visibility private
|
73
72
|
def puppet_apply(*args)
|
74
|
-
puppet(
|
73
|
+
puppet('apply', *args)
|
75
74
|
end
|
76
75
|
|
77
76
|
# @!visibility private
|
78
77
|
def puppet_master(*args)
|
79
|
-
puppet(
|
78
|
+
puppet('master', *args)
|
80
79
|
end
|
81
80
|
|
82
81
|
# @!visibility private
|
83
82
|
def puppet_agent(*args)
|
84
|
-
puppet(
|
83
|
+
puppet('agent', *args)
|
85
84
|
end
|
86
85
|
|
87
86
|
# @!visibility private
|
88
87
|
def puppet_filebucket(*args)
|
89
|
-
puppet(
|
88
|
+
puppet('filebucket', *args)
|
90
89
|
end
|
91
90
|
end
|
92
91
|
end
|
93
|
-
end
|
92
|
+
end
|
data/lib/beaker-puppet.rb
CHANGED
@@ -6,19 +6,18 @@ require 'beaker-puppet/wrappers'
|
|
6
6
|
|
7
7
|
require 'beaker-puppet/helpers/rake_helpers'
|
8
8
|
|
9
|
-
[
|
9
|
+
%w[aio foss].each do |lib|
|
10
10
|
require "beaker-puppet/install_utils/#{lib}_defaults"
|
11
11
|
end
|
12
|
-
[
|
12
|
+
%w[windows foss puppet ezbake module].each do |lib|
|
13
13
|
require "beaker-puppet/install_utils/#{lib}_utils"
|
14
14
|
end
|
15
|
-
[
|
15
|
+
%w[tk facter puppet host].each do |lib|
|
16
16
|
require "beaker-puppet/helpers/#{lib}_helpers"
|
17
17
|
end
|
18
18
|
|
19
19
|
require 'beaker-puppet/install_utils/puppet5'
|
20
20
|
|
21
|
-
|
22
21
|
module BeakerPuppet
|
23
22
|
include Beaker::DSL::InstallUtils::FOSSDefaults
|
24
23
|
include Beaker::DSL::InstallUtils::AIODefaults
|
@@ -40,4 +39,4 @@ module BeakerPuppet
|
|
40
39
|
end
|
41
40
|
|
42
41
|
# Register the DSL extension
|
43
|
-
Beaker::DSL.register(
|
42
|
+
Beaker::DSL.register(BeakerPuppet)
|
@@ -1,10 +1,9 @@
|
|
1
|
-
test_name
|
2
|
-
|
1
|
+
test_name 'Install Puppet Agent Packages' do
|
3
2
|
opts = {
|
4
|
-
:
|
5
|
-
:
|
6
|
-
:
|
7
|
-
:
|
3
|
+
nightly_builds_url: ENV.fetch('NIGHTLY_BUILDS_URL', nil),
|
4
|
+
dev_builds_url: ENV.fetch('DEV_BUILDS_URL', nil),
|
5
|
+
puppet_agent_version: ENV.fetch('SHA', nil),
|
6
|
+
puppet_collection: ENV.fetch('RELEASE_STREAM', nil),
|
8
7
|
}
|
9
8
|
|
10
9
|
install_puppet_agent_on(hosts, opts)
|
@@ -1,11 +1,9 @@
|
|
1
|
-
test_name
|
1
|
+
test_name 'Expunge puppet bits if hypervisor is none'
|
2
2
|
|
3
3
|
# Ensure that the any previous installations of puppet
|
4
4
|
# are removed from the host if it is not managed by a
|
5
5
|
# provisioning hypervisor.
|
6
6
|
|
7
7
|
hosts.each do |host|
|
8
|
-
if host[:hypervisor] ==
|
9
|
-
remove_puppet_on(host)
|
10
|
-
end
|
8
|
+
remove_puppet_on(host) if host[:hypervisor] == 'none'
|
11
9
|
end
|