beaker 4.27.0 → 4.27.1

This diff has not been reviewed by any users.
Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b7bc325aade2e41145790de7c1c5d8c3f07b054dc22999762cbbe812f81deeca
4
- data.tar.gz: 403bc79d97df6b8b30d59a5caa8ef26434e1adfc6420025cc15d3267c149aaef
3
+ metadata.gz: f1708680196db2be9b63b514162605faa19df47fb2b8f13bfd336af02b464118
4
+ data.tar.gz: 8ea244f5c438736aa003db09aa4d6f8bd7b96f3f99988c5bad0f6302a88f598c
5
5
  SHA512:
6
- metadata.gz: fe7a3e52bc3db292ae174f97f2c93b2455e032693956931b60e6bc5cc1c0caf84be93f92d877d9bcdb7698f77e3367c08e0781e2e858b5c9a5d335d99d6b059f
7
- data.tar.gz: 6616a6a1bb3399a30defc9536b64b67d7f742d67dddf09f8dad70604a0df9b9c4460c414080e70f42001495bdb47e1dcab8a9354210fb67348453ea065933707
6
+ metadata.gz: f3811e71f7e592d024150b6470610df72dbc466cc8bdfeea50e9eb4cd57227892d6bd005e071a710516992a4dc94e5a2c0009970674a8bc0ffd998f494ada76f
7
+ data.tar.gz: cce923c69673ab3e5aea1a7022a2b94ee9e5205b700885cf389b5734f71b60d78c617d4b44214ea8a3fc93614ff1be3f4d580d61e8381afe03d01dcb462d8c15
data/.rspec CHANGED
@@ -1,3 +1,4 @@
1
1
  --format documentation
2
2
  --color
3
3
  --tty
4
+ --fail-fast
@@ -22,6 +22,19 @@ The headers used in [Keep a Changelog](http://keepachangelog.com) are:
22
22
 
23
23
  # [Unreleased](https://github.com/puppetlabs/beaker/compare/4.27.0...master)
24
24
 
25
+ # [4.27.1](https://github.com/puppetlabs/beaker/compare/4.27.0...4.27.1) - 09-29-2020
26
+
27
+ ### Changed
28
+
29
+ - Update net-scp requirement from "~> 1.2" to ">= 1.2, < 4.0"
30
+
31
+ ### Fixed
32
+
33
+ - Handle systems going back in time after reboot
34
+ - Enhanced error handling during the reboot sequence
35
+ - Fixed time check logic during reboot
36
+ - Wrap paths around "" on pswindows
37
+
25
38
  # [4.27.0](https://github.com/puppetlabs/beaker/compare/4.26.0...4.27.0) - 07-24-2020
26
39
 
27
40
  ### Changed
@@ -23,9 +23,9 @@ Gem::Specification.new do |s|
23
23
  # Testing dependencies
24
24
  s.add_development_dependency 'rspec', '~> 3.0'
25
25
  s.add_development_dependency 'rspec-its'
26
- s.add_development_dependency 'fakefs', '~> 0.6', '< 0.14.0'
26
+ s.add_development_dependency 'fakefs', '~> 1.2', '< 1.3.0'
27
27
  s.add_development_dependency 'simplecov'
28
- s.add_development_dependency 'rake', '~> 12.0'
28
+ s.add_development_dependency 'rake', '~> 13.0'
29
29
 
30
30
  # Provisioner dependencies - needed for acceptance tests
31
31
  # TODO: figure out how to remove these
@@ -45,7 +45,7 @@ Gem::Specification.new do |s|
45
45
 
46
46
  s.add_runtime_dependency 'hocon', '~> 1.0'
47
47
  s.add_runtime_dependency 'net-ssh', '>= 5.0'
48
- s.add_runtime_dependency 'net-scp', '~> 1.2'
48
+ s.add_runtime_dependency 'net-scp', '>= 1.2', '< 4.0'
49
49
  s.add_runtime_dependency 'inifile', '~> 3.0'
50
50
 
51
51
  s.add_runtime_dependency 'rsync', '~> 1.0.9'
@@ -19,6 +19,7 @@ module Beaker
19
19
 
20
20
  class CommandFailure < StandardError; end
21
21
  class RebootFailure < CommandFailure; end
22
+ class RebootWarning < StandardError; end
22
23
 
23
24
  # This class provides array syntax for using puppet --configprint on a host
24
25
  class PuppetConfigReader
@@ -22,7 +22,7 @@ module PSWindows::Exec
22
22
  def rm_rf path
23
23
  # ensure that we have the right slashes for windows
24
24
  path = path.gsub(/\//, '\\')
25
- execute("del /s /q #{path}")
25
+ execute(%(del /s /q "#{path}"))
26
26
  end
27
27
 
28
28
  # Move the origin to destination. The destination is removed prior to moving.
@@ -16,66 +16,99 @@ module Unix::Exec
16
16
 
17
17
  attempts = 0
18
18
 
19
+ # Some systems don't support 'last -F reboot' but it has second granularity
20
+ boot_time_cmd = 'last -F reboot || who -b'
21
+
22
+ # Try to match all of the common formats for 'last' and 'who'
23
+ current_year = Time.now.strftime("%Y")
24
+ boot_time_regex = Regexp.new(%{((?:#{(Date::ABBR_DAYNAMES + Date::ABBR_MONTHNAMES).compact.join('|')}|#{current_year}).+?(\\d+:\\d+)+?(?::(\\d+).+?#{current_year})?)})
25
+
19
26
  original_boot_time_str = nil
20
27
  original_boot_time_line = nil
21
28
  begin
22
- original_boot_time_str = exec(Beaker::Command.new('who -b'), {:max_connection_tries => max_connection_tries, :silent => true}).stdout
29
+ attempts += 1
30
+ # Number of seconds to sleep before rebooting.
31
+ reboot_sleep = 1
32
+
33
+ original_boot_time_str = exec(Beaker::Command.new(boot_time_cmd), {:max_connection_tries => max_connection_tries, :silent => true}).stdout
23
34
  original_boot_time_line = original_boot_time_str.lines.grep(/boot/).first
24
35
 
25
- raise Beaker::Host::RebootFailure, "Could not find system boot time using 'who -b': '#{original_boot_time_str}'" unless original_boot_time_line
36
+ raise Beaker::Host::RebootWarning, "Could not find system boot time using '#{boot_time_cmd}': '#{original_boot_time_str}'" unless original_boot_time_line
26
37
 
27
- original_boot_time = Time.parse(original_boot_time_line)
38
+ original_boot_time_matches = original_boot_time_line.scan(boot_time_regex).last
28
39
 
29
- exec(Beaker::Command.new('/bin/systemctl reboot -i || reboot || /sbin/shutdown -r now'), :expect_connection_failure => true)
30
- rescue Beaker::Host::RebootFailure => e
31
- attempts += 1
32
- if attempts < uptime_retries
33
- @logger.debug("Could not get initial boot time. Will retry #{uptime_retries - attempts} more times.")
34
- retry
35
- else
36
- raise
40
+ raise Beaker::Host::RebootWarning, "Found no valid times in '#{original_boot_time_line}'" unless original_boot_time_matches
41
+
42
+ original_boot_time = Time.parse(original_boot_time_matches.first)
43
+
44
+ unless original_boot_time_matches.last
45
+ reboot_sleep = (61 - Time.now.strftime("%S").to_i)
37
46
  end
38
- rescue Beaker::Host::CommandFailure => e
39
- raise Beaker::Host::RebootFailure, "Command failed when attempting to reboot: #{e.message}"
40
- rescue RuntimeError => e
41
- raise Beaker::Host::RebootFailure, "Unexpected exception in reboot: #{e.message}"
47
+
48
+ @logger.notify("Sleeping #{reboot_sleep} seconds before rebooting")
49
+
50
+ sleep(reboot_sleep)
51
+
52
+ exec(Beaker::Command.new('/bin/systemctl reboot -i || reboot || /sbin/shutdown -r now'), :expect_connection_failure => true)
42
53
  rescue ArgumentError => e
43
54
  raise Beaker::Host::RebootFailure, "Unable to parse time: #{e.message}"
55
+ rescue Beaker::Host::RebootWarning => e
56
+ raise if attempts > uptime_retries
57
+ @logger.warn(e.message)
58
+ @logger.warn("Retrying #{uptime_retries - attempts} more times.")
59
+ retry
60
+ rescue StandardError => e
61
+ raise if attempts > uptime_retries
62
+ @logger.warn("Unexpected Exception: #{e.message}")
63
+ @logger.warn("Retrying #{uptime_retries - attempts} more times.")
64
+ @logger.warn(e.backtrace[0,3].join("\n"))
65
+ @logger.debug(e.backtrace.join("\n"))
66
+ retry
44
67
  end
45
68
 
46
69
  attempts = 0
47
70
  begin
71
+ attempts += 1
72
+
48
73
  # give the host a little time to shutdown
49
74
  @logger.debug("Waiting #{wait_time} for host to shut down.")
50
75
  sleep wait_time
51
76
 
52
- current_boot_time_str = exec(Beaker::Command.new('who -b'), {:max_connection_tries => max_connection_tries, :silent => true}).stdout
77
+ # Accept all exit codes because this may fail due to the parallel nature of systemd
78
+ current_boot_time_str = exec(Beaker::Command.new(boot_time_cmd), {:max_connection_tries => max_connection_tries, :silent => true, :accept_all_exit_codes => true}).stdout
53
79
  current_boot_time_line = current_boot_time_str.lines.grep(/boot/).first
54
80
 
55
- raise Beaker::Host::RebootFailure, "Could not find system boot time using 'who -b': '#{current_boot_time_str}'" unless current_boot_time_line
81
+ raise Beaker::Host::RebootWarning, "Could not find system boot time using '#{boot_time_cmd}': '#{current_boot_time_str}'" unless current_boot_time_line
82
+
83
+ current_boot_time_matches = current_boot_time_line.scan(boot_time_regex).last
84
+
85
+ raise Beaker::Host::RebootWarning, "Found no valid times in '#{current_boot_time_line}'" unless current_boot_time_matches
56
86
 
57
- current_boot_time = Time.parse(current_boot_time_line)
87
+ current_boot_time = Time.parse(current_boot_time_matches.first)
58
88
 
59
89
  @logger.debug("Original Boot Time: #{original_boot_time}")
60
90
  @logger.debug("Current Boot Time: #{current_boot_time}")
61
91
 
62
- unless current_boot_time > original_boot_time
92
+ # If this is *exactly* the same then there is really no good way to detect a reboot
93
+ if current_boot_time == original_boot_time
63
94
  raise Beaker::Host::RebootFailure, "Boot time did not reset. Reboot appears to have failed."
64
95
  end
65
- rescue Beaker::Host::RebootFailure => e
66
- attempts += 1
67
- if attempts < uptime_retries
68
- @logger.debug("Boot time did not reset. Will retry #{uptime_retries - attempts} more times.")
69
- retry
70
- else
71
- raise
72
- end
73
- rescue Beaker::Host::CommandFailure => e
74
- raise Beaker::Host::RebootFailure, "Command failed when attempting to reboot: #{e.message}"
75
- rescue RuntimeError => e
76
- raise Beaker::Host::RebootFailure, "Unexpected exception in reboot: #{e.message}"
77
96
  rescue ArgumentError => e
78
97
  raise Beaker::Host::RebootFailure, "Unable to parse time: #{e.message}"
98
+ rescue Beaker::Host::RebootFailure => e
99
+ raise
100
+ rescue Beaker::Host::RebootWarning => e
101
+ raise if attempts > uptime_retries
102
+ @logger.warn(e.message)
103
+ @logger.warn("Retrying #{uptime_retries - attempts} more times.")
104
+ retry
105
+ rescue StandardError => e
106
+ raise if attempts > uptime_retries
107
+ @logger.warn("Unexpected Exception: #{e.message}")
108
+ @logger.warn("Retrying #{uptime_retries - attempts} more times.")
109
+ @logger.warn(e.backtrace[0,3].join("\n"))
110
+ @logger.debug(e.backtrace.join("\n"))
111
+ retry
79
112
  end
80
113
  end
81
114
 
@@ -1,5 +1,5 @@
1
1
  module Beaker
2
2
  module Version
3
- STRING = '4.27.0'
3
+ STRING = '4.27.1'
4
4
  end
5
5
  end
@@ -29,8 +29,8 @@ module Beaker
29
29
  it "deletes" do
30
30
  path = '/path/to/delete'
31
31
  corrected_path = '\\path\\to\\delete'
32
- expect( instance ).to receive(:execute).with("del /s /q #{corrected_path}").and_return(0)
33
- expect( instance.rm_rf(path) ).to be === 0
32
+ expect(instance).to receive(:execute).with(%(del /s /q "#{corrected_path}")).and_return(0)
33
+ expect(instance.rm_rf(path)).to eq(0)
34
34
  end
35
35
  end
36
36
 
@@ -39,10 +39,9 @@ module Beaker
39
39
  let(:destination) { '/destination/path/of/content' }
40
40
 
41
41
  it 'rm first' do
42
- expect( instance ).to receive(:execute).with("del /s /q #{destination.gsub(/\//, '\\')}").and_return(0)
43
- expect( instance ).to receive(:execute).with("move /y #{origin.gsub(/\//, '\\')} #{destination.gsub(/\//, '\\')}").and_return(0)
44
- expect( instance.mv(origin, destination) ).to be === 0
45
-
42
+ expect(instance).to receive(:execute).with("del /s /q \"\\destination\\path\\of\\content\"").and_return(0)
43
+ expect(instance).to receive(:execute).with("move /y #{origin.gsub(/\//, '\\')} #{destination.gsub(/\//, '\\')}").and_return(0)
44
+ expect(instance.mv(origin, destination)).to eq(0)
46
45
  end
47
46
 
48
47
  it 'does not rm' do
@@ -169,6 +169,64 @@ module Beaker
169
169
  end
170
170
 
171
171
  describe '#reboot' do
172
+ check_cmd_output = {
173
+ :centos6 => {
174
+ :who => {
175
+ :initial => ' system boot 2020-05-13 03:51',
176
+ :success => ' system boot 2020-05-13 03:52',
177
+ },
178
+ :last => {
179
+ :initial => <<~LAST_F,
180
+ reboot system boot 2.6.32-754.29.1. Tue May 5 17:34:52 2020 - Tue May 5 17:52:48 2020 (00:17)
181
+ reboot system boot 2.6.32-754.29.1. Mon May 4 18:45:43 2020 - Mon May 5 05:35:44 2020 (4+01:50)
182
+ LAST_F
183
+ :success => <<~LAST_F,
184
+ reboot system boot 2.6.32-754.29.1. Tue May 5 17:52:48 2020 - Tue May 5 17:52:49 2020 (00:17)
185
+ reboot system boot 2.6.32-754.29.1. Mon May 4 18:45:43 2020 - Mon May 5 05:35:44 2020 (4+01:50)
186
+ LAST_F
187
+ },
188
+ },
189
+ :centos7 => {
190
+ :who => {
191
+ :initial => ' system boot 2020-05-13 03:51',
192
+ :success => ' system boot 2020-05-13 03:52',
193
+ },
194
+ :last => {
195
+ :initial => <<~LAST_F,
196
+ reboot system boot 3.10.0-1127.el7. Tue May 5 17:34:52 2020 - Tue May 5 17:52:48 2020 (00:17)
197
+ reboot system boot 3.10.0-1127.el7. Mon May 4 18:45:43 2020 - Mon May 5 05:35:44 2020 (4+01:50)
198
+ LAST_F
199
+ :success => <<~LAST_F,
200
+ reboot system boot 3.10.0-1127.el7. Tue May 5 17:52:48 2020 - Tue May 5 17:52:49 2020 (00:17)
201
+ reboot system boot 3.10.0-1127.el7. Mon May 4 18:45:43 2020 - Mon May 5 05:35:44 2020 (4+01:50)
202
+ LAST_F
203
+ },
204
+ },
205
+ :centos8 => {
206
+ :who => {
207
+ :initial => ' system boot 2020-05-13 03:51',
208
+ :success => ' system boot 2020-05-13 03:52',
209
+ },
210
+ :last => {
211
+ :initial => <<~LAST_F,
212
+ reboot system boot 4.18.0-147.8.1.e Tue May 5 17:34:52 2020 still running
213
+ reboot system boot 4.18.0-147.8.1.e Mon May 4 17:41:27 2020 - Tue May 5 17:00:00 2020 (5+00:11)
214
+ LAST_F
215
+ :success => <<~LAST_F,
216
+ reboot system boot 4.18.0-147.8.1.e Tue May 5 17:34:53 2020 still running
217
+ reboot system boot 4.18.0-147.8.1.e Mon May 4 17:41:27 2020 - Tue May 5 17:00:00 2020 (5+00:11)
218
+ LAST_F
219
+ },
220
+ },
221
+ :freebsd => {
222
+ # last -F doesn't work on freebsd so no output will be returned
223
+ :who => {
224
+ :initial => ' system boot May 13 03:51',
225
+ :success => ' system boot May 13 03:52',
226
+ }
227
+ },
228
+ }
229
+
172
230
  # no-op response
173
231
  let (:response) { double( 'response' ) }
174
232
  let (:boot_time_initial_response) { double( 'response' ) }
@@ -179,7 +237,7 @@ module Beaker
179
237
  before :each do
180
238
  # stubs enough to survive the first boot_time call & output parsing
181
239
  # note: just stubs input-chain between calls, parsing methods still run
182
- allow(Beaker::Command).to receive(:new).with('who -b').and_return(:boot_time_command_stub)
240
+ allow(Beaker::Command).to receive(:new).with('last -F reboot || who -b').and_return(:boot_time_command_stub)
183
241
 
184
242
  allow(boot_time_initial_response).to receive(:stdout).and_return(boot_time_initial_stdout)
185
243
  allow(boot_time_success_response).to receive(:stdout).and_return(boot_time_success_stdout)
@@ -190,116 +248,128 @@ module Beaker
190
248
  end
191
249
 
192
250
  context 'new boot time greater than old boot time' do
193
- let (:boot_time_initial_stdout) { ' system boot 2020-05-13 03:51' }
194
- let (:boot_time_success_stdout) { ' system boot 2020-05-13 03:52' }
195
-
196
- it 'passes with defaults' do
197
- expect(instance).to receive(:sleep).with(sleep_time)
198
- # bypass shutdown command itself
199
- expect(instance).to receive( :exec ).with(:shutdown_command_stub, anything).and_return(response)
200
- # allow the second boot_time and the hash arguments in exec
201
- expect(instance).to receive( :exec ).with(:boot_time_command_stub, anything).and_return(boot_time_initial_response).once
202
- expect(instance).to receive( :exec ).with(:boot_time_command_stub, anything).and_return(boot_time_success_response).once
203
-
204
- expect(instance.reboot).to be(nil)
205
- end
251
+ check_cmd_output.each do |check_os, cmd_opts|
252
+ cmd_opts.each do |cmd_name, cmd_outputs|
253
+ context "on '#{check_os}' with the '#{cmd_name}' command" do
254
+ let (:boot_time_initial_stdout) { cmd_outputs[:initial] }
255
+ let (:boot_time_success_stdout) { cmd_outputs[:success] }
256
+
257
+ it 'passes with defaults' do
258
+ expect(instance).to receive(:sleep).with(sleep_time)
259
+ # bypass shutdown command itself
260
+ expect(instance).to receive( :exec ).with(:shutdown_command_stub, anything).and_return(response)
261
+ # allow the second boot_time and the hash arguments in exec
262
+ expect(instance).to receive( :exec ).with(:boot_time_command_stub, anything).and_return(boot_time_initial_response).once
263
+ expect(instance).to receive( :exec ).with(:boot_time_command_stub, anything).and_return(boot_time_success_response).once
206
264
 
207
- it 'passes with wait_time_parameter' do
208
- expect(instance).to receive(:sleep).with(10)
209
- # bypass shutdown command itself
210
- expect(instance).to receive( :exec ).with(:shutdown_command_stub, anything).and_return(response).once
211
- expect(instance).to receive( :exec ).with(:boot_time_command_stub, anything).and_return(boot_time_initial_response).once
212
- # allow the second boot_time and the hash arguments in exec
213
- expect(instance).to receive( :exec ).with(:boot_time_command_stub, anything).and_return(boot_time_success_response).once
265
+ expect(instance.reboot).to be(nil)
266
+ end
214
267
 
215
- expect(instance.reboot(10)).to be(nil)
216
- end
268
+ it 'passes with wait_time_parameter' do
269
+ expect(instance).to receive(:sleep).with(10)
270
+ # bypass shutdown command itself
271
+ expect(instance).to receive( :exec ).with(:shutdown_command_stub, anything).and_return(response).once
272
+ expect(instance).to receive( :exec ).with(:boot_time_command_stub, anything).and_return(boot_time_initial_response).once
273
+ # allow the second boot_time and the hash arguments in exec
274
+ expect(instance).to receive( :exec ).with(:boot_time_command_stub, anything).and_return(boot_time_success_response).once
217
275
 
218
- it 'passes with max_connection_tries parameter' do
219
- expect(instance).to receive(:sleep).with(sleep_time)
220
- # bypass shutdown command itself
221
- expect(instance).to receive( :exec ).with(:shutdown_command_stub, anything).and_return(response).once
222
- expect(instance).to receive( :exec ).with(:boot_time_command_stub, anything).and_return(boot_time_initial_response).once
223
- # allow the second boot_time and the hash arguments in exec
224
- expect(instance).to receive( :exec ).with(:boot_time_command_stub, hash_including(:max_connection_tries => 20)).and_return(boot_time_success_response).once
276
+ expect(instance.reboot(10)).to be(nil)
277
+ end
225
278
 
226
- expect(instance.reboot(sleep_time, 20)).to be(nil)
227
- end
279
+ it 'passes with max_connection_tries parameter' do
280
+ expect(instance).to receive(:sleep).with(sleep_time)
281
+ # bypass shutdown command itself
282
+ expect(instance).to receive( :exec ).with(:shutdown_command_stub, anything).and_return(response).once
283
+ expect(instance).to receive( :exec ).with(:boot_time_command_stub, anything).and_return(boot_time_initial_response).once
284
+ # allow the second boot_time and the hash arguments in exec
285
+ expect(instance).to receive( :exec ).with(:boot_time_command_stub, hash_including(:max_connection_tries => 20)).and_return(boot_time_success_response).once
228
286
 
229
- context 'command errors' do
230
- before :each do
231
- allow(instance).to receive( :exec ).with(:boot_time_command_stub, anything).and_return(boot_time_initial_response).once
232
- end
287
+ expect(instance.reboot(sleep_time, 20)).to be(nil)
288
+ end
233
289
 
234
- it 'raises a reboot failure when command fails' do
235
- expect(instance).not_to receive(:sleep)
236
- expect(instance).to receive(:exec).with(:shutdown_command_stub, anything).and_raise(Host::CommandFailure).once
290
+ context 'command errors' do
291
+ before :each do
292
+ allow(instance).to receive( :exec ).with(:boot_time_command_stub, anything).and_return(boot_time_initial_response).at_least(:once)
293
+ end
237
294
 
238
- expect{ instance.reboot }.to raise_error(Beaker::Host::RebootFailure, /Command failed when attempting to reboot: .*/)
239
- end
295
+ it 'raises a reboot failure when command fails' do
296
+ expect(instance).to receive(:sleep).at_least(:once)
297
+ expect(instance).to receive(:exec).with(:shutdown_command_stub, anything).and_raise(Host::CommandFailure).at_least(:once)
240
298
 
241
- it 'raises a reboot failure when we receive an unexpected error' do
242
- expect(instance).not_to receive(:sleep)
243
- expect(instance).to receive(:exec).with(:shutdown_command_stub, anything).and_raise(Net::SSH::HostKeyError).once
299
+ expect{ instance.reboot }.to raise_error(Beaker::Host::CommandFailure)
300
+ end
244
301
 
245
- expect { instance.reboot }.to raise_error(Beaker::Host::RebootFailure, /Unexpected exception in reboot: .*/)
246
- end
302
+ it 'raises a reboot failure when we receive an unexpected error' do
303
+ expect(instance).to receive(:sleep).at_least(:once)
304
+ expect(instance).to receive(:exec).with(:shutdown_command_stub, anything).and_raise(Net::SSH::HostKeyError).at_least(:once)
247
305
 
248
- context 'incorrect time string' do
249
- context 'original time' do
250
- let (:boot_time_initial_stdout) { 'boot bad' }
306
+ expect { instance.reboot }.to raise_error(Net::SSH::HostKeyError)
307
+ end
251
308
 
252
- it 'raises a reboot failure' do
253
- expect(instance).not_to receive(:sleep)
309
+ context 'incorrect time string' do
310
+ context 'original time' do
311
+ let (:boot_time_initial_stdout) { 'boot bad' }
254
312
 
255
- expect { instance.reboot }.to raise_error(Beaker::Host::RebootFailure, /Unable to parse time: .*/)
256
- end
257
- end
313
+ it 'raises a reboot failure' do
314
+ # Handle the 'retry'
315
+ allow(instance).to receive( :exec ).with(:boot_time_command_stub, anything).and_return(boot_time_initial_response).at_least(:once)
258
316
 
259
- context 'current time' do
260
- let (:boot_time_success_stdout) { 'boot bad' }
317
+ expect(instance).not_to receive(:sleep)
261
318
 
262
- it 'raises a reboot failure' do
263
- expect(instance).to receive(:exec).with(:shutdown_command_stub, anything).and_return(response).once
264
- expect(instance).to receive( :exec ).with(:boot_time_command_stub, anything).and_return(boot_time_initial_response).once
265
- # allow the second boot_time and the hash arguments in exec, repeated 10 times by default
266
- expect(instance).to receive( :exec ).with(:boot_time_command_stub, anything).and_return(boot_time_success_response).once
319
+ expect { instance.reboot }.to raise_error(Beaker::Host::RebootWarning, /Found no valid times in .*/)
320
+ end
321
+ end
322
+
323
+ context 'current time' do
324
+ let (:boot_time_success_stdout) { 'boot bad' }
267
325
 
268
- expect { instance.reboot }.to raise_error(Beaker::Host::RebootFailure, /Unable to parse time: .*/)
326
+ it 'raises a reboot failure' do
327
+ expect(instance).to receive(:exec).with(:shutdown_command_stub, anything).and_return(response).once
328
+ expect(instance).to receive( :exec ).with(:boot_time_command_stub, anything).and_return(boot_time_initial_response).once
329
+ # allow the second boot_time and the hash arguments in exec, repeated 10 times by default
330
+ expect(instance).to receive( :exec ).with(:boot_time_command_stub, anything).and_return(boot_time_success_response).at_least(:once)
331
+
332
+ expect { instance.reboot(10,9,1) }.to raise_error(Beaker::Host::RebootWarning, /Found no valid times in .*/)
333
+ end
334
+ end
335
+ end
269
336
  end
270
337
  end
271
338
  end
272
339
  end
273
340
  end
274
341
 
275
- context 'new boot time less than old boot time' do
276
- let (:boot_time_initial_stdout) { ' system boot 2020-05-13 03:51' }
277
- let (:boot_time_success_stdout) { ' system boot 2020-05-13 03:50' }
342
+ context 'system did not reboot' do
343
+ check_cmd_output.each do |check_os, cmd_opts|
344
+ cmd_opts.each do |cmd_name, cmd_outputs|
345
+ context "on '#{check_os}' with the '#{cmd_name}' command" do
346
+ let (:boot_time_initial_stdout) { cmd_outputs[:initial] }
347
+ let (:boot_time_success_stdout) { cmd_outputs[:initial] }
278
348
 
279
- it 'raises RebootFailure' do
280
- expect(instance).to receive(:sleep).with(sleep_time)
281
- # bypass shutdown command itself
282
- expect(instance).to receive( :exec ).with(:shutdown_command_stub, anything).and_return(response).once
349
+ it 'raises RebootFailure' do
350
+ expect(instance).to receive(:sleep).with(sleep_time)
351
+ # bypass shutdown command itself
352
+ expect(instance).to receive( :exec ).with(:shutdown_command_stub, anything).and_return(response).once
283
353
 
284
- expect(instance).to receive( :exec ).with(:boot_time_command_stub, anything).and_return(boot_time_initial_response).once
285
- # allow the second boot_time and the hash arguments in exec, repeated 18 times by default in order to replicate the previous behavior of the ping based Host.down?
286
- expect(instance).to receive( :exec ).with(:boot_time_command_stub, anything).and_return(boot_time_success_response).exactly(18).times
354
+ expect(instance).to receive( :exec ).with(:boot_time_command_stub, anything).and_return(boot_time_initial_response).once
355
+ expect(instance).to receive( :exec ).with(:boot_time_command_stub, anything).and_return(boot_time_success_response).once
287
356
 
288
- expect { instance.reboot }.to raise_error(Beaker::Host::RebootFailure, /Boot time did not reset/)
289
- end
357
+ expect { instance.reboot }.to raise_error(Beaker::Host::RebootFailure, /Boot time did not reset/)
358
+ end
290
359
 
291
- it 'raises RebootFailure if the number of retries is changed' do
292
- expect(instance).to receive(:sleep).with(sleep_time)
293
- # bypass shutdown command itself
294
- expect(instance).to receive( :exec ).with(:shutdown_command_stub, anything).and_return(response).once
295
- expect(instance).to receive( :exec ).with(:boot_time_command_stub, anything).and_return(boot_time_initial_response).once
296
- # allow the second boot_time and the hash arguments in exec, repeated 10 times by default
297
- expect(instance).to receive( :exec ).with(:boot_time_command_stub, anything).and_return(boot_time_success_response).exactly(10).times
360
+ it 'raises RebootFailure if the number of retries is changed' do
361
+ expect(instance).to receive(:sleep).with(sleep_time)
362
+ # bypass shutdown command itself
363
+ expect(instance).to receive( :exec ).with(:shutdown_command_stub, anything).and_return(response).once
364
+ expect(instance).to receive( :exec ).with(:boot_time_command_stub, anything).and_return(boot_time_initial_response).once
365
+ expect(instance).to receive( :exec ).with(:boot_time_command_stub, anything).and_return(boot_time_success_response).once
298
366
 
299
- expect { instance.reboot(wait_time=sleep_time, max_connection_tries=9, boot_time_retries=10) }.to raise_error(Beaker::Host::RebootFailure, /Boot time did not reset/)
367
+ expect { instance.reboot(wait_time=sleep_time, max_connection_tries=9, boot_time_retries=10) }.to raise_error(Beaker::Host::RebootFailure, /Boot time did not reset/)
368
+ end
369
+ end
370
+ end
300
371
  end
301
372
  end
302
-
303
373
  end
304
374
 
305
375
  describe '#enable_remote_rsyslog' do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: beaker
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.27.0
4
+ version: 4.27.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Puppet
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-07-24 00:00:00.000000000 Z
11
+ date: 2020-09-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -44,20 +44,20 @@ dependencies:
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '0.6'
47
+ version: '1.2'
48
48
  - - "<"
49
49
  - !ruby/object:Gem::Version
50
- version: 0.14.0
50
+ version: 1.3.0
51
51
  type: :development
52
52
  prerelease: false
53
53
  version_requirements: !ruby/object:Gem::Requirement
54
54
  requirements:
55
55
  - - "~>"
56
56
  - !ruby/object:Gem::Version
57
- version: '0.6'
57
+ version: '1.2'
58
58
  - - "<"
59
59
  - !ruby/object:Gem::Version
60
- version: 0.14.0
60
+ version: 1.3.0
61
61
  - !ruby/object:Gem::Dependency
62
62
  name: simplecov
63
63
  requirement: !ruby/object:Gem::Requirement
@@ -78,14 +78,14 @@ dependencies:
78
78
  requirements:
79
79
  - - "~>"
80
80
  - !ruby/object:Gem::Version
81
- version: '12.0'
81
+ version: '13.0'
82
82
  type: :development
83
83
  prerelease: false
84
84
  version_requirements: !ruby/object:Gem::Requirement
85
85
  requirements:
86
86
  - - "~>"
87
87
  - !ruby/object:Gem::Version
88
- version: '12.0'
88
+ version: '13.0'
89
89
  - !ruby/object:Gem::Dependency
90
90
  name: beaker-aws
91
91
  requirement: !ruby/object:Gem::Requirement
@@ -230,16 +230,22 @@ dependencies:
230
230
  name: net-scp
231
231
  requirement: !ruby/object:Gem::Requirement
232
232
  requirements:
233
- - - "~>"
233
+ - - ">="
234
234
  - !ruby/object:Gem::Version
235
235
  version: '1.2'
236
+ - - "<"
237
+ - !ruby/object:Gem::Version
238
+ version: '4.0'
236
239
  type: :runtime
237
240
  prerelease: false
238
241
  version_requirements: !ruby/object:Gem::Requirement
239
242
  requirements:
240
- - - "~>"
243
+ - - ">="
241
244
  - !ruby/object:Gem::Version
242
245
  version: '1.2'
246
+ - - "<"
247
+ - !ruby/object:Gem::Version
248
+ version: '4.0'
243
249
  - !ruby/object:Gem::Dependency
244
250
  name: inifile
245
251
  requirement: !ruby/object:Gem::Requirement
@@ -702,7 +708,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
702
708
  - !ruby/object:Gem::Version
703
709
  version: '0'
704
710
  requirements: []
705
- rubygems_version: 3.0.8
711
+ rubygems_version: 3.0.6
706
712
  signing_key:
707
713
  specification_version: 4
708
714
  summary: Let's test Puppet!