beaker 4.23.2 → 4.24.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/CHANGELOG.md +12 -1
- data/lib/beaker/host/pswindows/exec.rb +18 -3
- data/lib/beaker/host/pswindows/file.rb +3 -3
- data/lib/beaker/host/unix/exec.rb +15 -36
- data/lib/beaker/version.rb +1 -1
- data/spec/beaker/host/pswindows/exec_spec.rb +54 -0
- data/spec/beaker/host/pswindows/file_spec.rb +23 -4
- data/spec/beaker/host/unix/exec_spec.rb +22 -30
- data/spec/beaker/host_spec.rb +7 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a564a311561c124625926ad527bf42a3fe0681e3a0a1c8f7780217a6b00f82dc
|
4
|
+
data.tar.gz: 27c0f8cbae1a3f30226cb1dbc08db0cb4464e9e6340114b2b49d13b66e79d587
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2f5c86fd2c82c44dd258d952d404741281a502dc2a2f987014795e940aa7e1f5f56937b628fe62a3fba8105a9f12866bd6a1a1367859f6ab9acbf6b7224d8d42
|
7
|
+
data.tar.gz: 095358374f8ff2dfe5c0d95c41d5ff6ac621f69ef95a58580c7151d8f7d13bdbd89e0afa5b70be25ce0f3e14121b56c668765c78705bfe9868233cee37feb687
|
data/CHANGELOG.md
CHANGED
@@ -22,11 +22,22 @@ The headers used in [Keep a Changelog](http://keepachangelog.com) are:
|
|
22
22
|
|
23
23
|
# [Unreleased](https://github.com/puppetlabs/beaker/compare/4.23.2...master)
|
24
24
|
|
25
|
+
# [4.24.0](https://github.com/puppetlabs/beaker/compare/4.23.0...4.24.0) - 2020-06-05
|
26
|
+
|
27
|
+
### Added
|
28
|
+
|
29
|
+
- Host method which ([#1651](https://github.com/puppetlabs/beaker/pull/1651))
|
30
|
+
|
31
|
+
### Fixed
|
32
|
+
|
33
|
+
- Fixed implementation for cat and file_exists? host methods for PSWindows ([#1654](https://github.com/puppetlabs/beaker/pull/1654))
|
34
|
+
- Fixed implementation for mkdir_p host method for PSWindows ([#1657](https://github.com/puppetlabs/beaker/pull/1657))
|
35
|
+
|
25
36
|
# [4.23.2](https://github.com/puppetlabs/beaker/compare/4.23.1...4.23.2)
|
26
37
|
|
27
38
|
### Fixed
|
28
39
|
|
29
|
-
- Fixed Beaker's behavior when the `strict_host_key_checking` option is
|
40
|
+
- Fixed Beaker's behavior when the `strict_host_key_checking` option is
|
30
41
|
provided in the SSH config and Net-SSH > 5 is specified. (#1652)
|
31
42
|
|
32
43
|
# [4.23.1](https://github.com/puppetlabs/beaker/compare/4.23.0...4.23.1)
|
@@ -104,9 +104,9 @@ module PSWindows::Exec
|
|
104
104
|
# @param [String] dir The directory structure to create on the host
|
105
105
|
# @return [Boolean] True, if directory construction succeeded, otherwise False
|
106
106
|
def mkdir_p dir
|
107
|
-
|
108
|
-
|
109
|
-
|
107
|
+
normalized_path = dir.gsub('/','\\')
|
108
|
+
result = exec(powershell("New-Item -Path '#{normalized_path}' -ItemType 'directory'"),
|
109
|
+
:acceptable_exit_codes => [0, 1])
|
110
110
|
result.exit_code == 0
|
111
111
|
end
|
112
112
|
|
@@ -237,4 +237,19 @@ module PSWindows::Exec
|
|
237
237
|
end
|
238
238
|
end
|
239
239
|
|
240
|
+
#First path it finds for the command executable
|
241
|
+
#@param [String] command The command executable to search for
|
242
|
+
#
|
243
|
+
# @return [String] Path to the searched executable or empty string if not found
|
244
|
+
#
|
245
|
+
#@example
|
246
|
+
# host.which('ruby')
|
247
|
+
def which(command)
|
248
|
+
where_command = "cmd /C \"where #{command}\""
|
249
|
+
|
250
|
+
result = execute(where_command, :accept_all_exit_codes => true)
|
251
|
+
return '' if result.empty?
|
252
|
+
|
253
|
+
result
|
254
|
+
end
|
240
255
|
end
|
@@ -21,11 +21,11 @@ module PSWindows::File
|
|
21
21
|
end
|
22
22
|
|
23
23
|
def cat(path)
|
24
|
-
exec(powershell("type #{path}"))
|
24
|
+
exec(powershell("type #{path}")).stdout
|
25
25
|
end
|
26
26
|
|
27
27
|
def file_exist?(path)
|
28
|
-
result = exec(Beaker::Command.new("if exist #{path} echo true"), :
|
29
|
-
result.stdout
|
28
|
+
result = exec(Beaker::Command.new("if exist #{path} echo true"), accept_all_exit_codes: true)
|
29
|
+
result.stdout.strip == 'true'
|
30
30
|
end
|
31
31
|
end
|
@@ -63,42 +63,6 @@ module Unix::Exec
|
|
63
63
|
end
|
64
64
|
end
|
65
65
|
|
66
|
-
def uptime_int(uptime_str)
|
67
|
-
time_array = uptime_str.split(", ")
|
68
|
-
accumulated_mins = 0
|
69
|
-
time_array.each do |time_segment|
|
70
|
-
value, unit = time_segment.split
|
71
|
-
if unit.nil?
|
72
|
-
# 20:47 case: hours & mins
|
73
|
-
hours, mins = value.split(":")
|
74
|
-
accumulated_mins += (hours.to_i * 60 + mins.to_i)
|
75
|
-
elsif unit =~ /day(s)?/
|
76
|
-
accumulated_mins += (value.to_i * 1440) # 60 * 24 = 1440
|
77
|
-
elsif unit =~ /min(s)?/
|
78
|
-
accumulated_mins += value.to_i
|
79
|
-
else
|
80
|
-
raise ArgumentError, "can't parse uptime segment: #{time_segment}"
|
81
|
-
end
|
82
|
-
end
|
83
|
-
|
84
|
-
accumulated_mins
|
85
|
-
end
|
86
|
-
|
87
|
-
def parse_uptime(uptime)
|
88
|
-
# get String from up to users
|
89
|
-
# eg 19:52 up 14 mins, 2 users, load averages: 2.95 4.19 4.31
|
90
|
-
# 8:03 up 52 days, 20:47, 3 users, load averages: 1.36 1.42 1.40
|
91
|
-
# 22:19 up 54 days, 1 min, 4 users, load averages: 2.08 2.06 2.27
|
92
|
-
regexp = /.*up (.*)[[:space:]]+[[:digit:]]+ user.*/
|
93
|
-
result = uptime.match regexp
|
94
|
-
if self['platform'] =~ /solaris-/ && result[1].empty?
|
95
|
-
return "0 min"
|
96
|
-
end
|
97
|
-
raise "Couldn't parse uptime: #{uptime}" if result.nil?
|
98
|
-
|
99
|
-
result[1].strip.chomp(",")
|
100
|
-
end
|
101
|
-
|
102
66
|
def echo(msg, abs=true)
|
103
67
|
(abs ? '/bin/echo' : 'echo') + " #{msg}"
|
104
68
|
end
|
@@ -435,4 +399,19 @@ module Unix::Exec
|
|
435
399
|
true
|
436
400
|
end
|
437
401
|
|
402
|
+
#First path it finds for the command executable
|
403
|
+
#@param [String] command The command executable to search for
|
404
|
+
#
|
405
|
+
# @return [String] Path to the searched executable or empty string if not found
|
406
|
+
#
|
407
|
+
#@example
|
408
|
+
# host.which('ruby')
|
409
|
+
def which(command)
|
410
|
+
which_command = "which #{command}"
|
411
|
+
|
412
|
+
result = execute(which_command, :accept_all_exit_codes => true)
|
413
|
+
return '' if result.empty?
|
414
|
+
|
415
|
+
result
|
416
|
+
end
|
438
417
|
end
|
data/lib/beaker/version.rb
CHANGED
@@ -99,5 +99,59 @@ module Beaker
|
|
99
99
|
to be == "set \"LD_PATH=/:/tmp\" && "
|
100
100
|
end
|
101
101
|
end
|
102
|
+
|
103
|
+
describe '#which' do
|
104
|
+
before do
|
105
|
+
allow(instance).to receive(:execute)
|
106
|
+
.with(where_command, :accept_all_exit_codes => true).and_return(result)
|
107
|
+
end
|
108
|
+
let(:where_command) { "cmd /C \"where ruby\"" }
|
109
|
+
|
110
|
+
context 'when only the environment variable PATH is used' do
|
111
|
+
let(:result) { "C:\\Ruby26-x64\\bin\\ruby.exe" }
|
112
|
+
|
113
|
+
it 'returns the correct path' do
|
114
|
+
response = instance.which('ruby')
|
115
|
+
|
116
|
+
expect(response).to eq(result)
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
context 'when command is not found' do
|
121
|
+
let(:where_command) { "cmd /C \"where unknown\"" }
|
122
|
+
let(:result) { '' }
|
123
|
+
|
124
|
+
it 'return empty string if command is not found' do
|
125
|
+
response = instance.which('unknown')
|
126
|
+
|
127
|
+
expect(response).to eq(result)
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
describe '#mkdir_p' do
|
133
|
+
let(:dir_path) { "C:\\tmpdir\\my_dir" }
|
134
|
+
let(:beaker_command) { instance_spy(Beaker::Command) }
|
135
|
+
let(:command) {"-Command New-Item -Path '#{dir_path}' -ItemType 'directory'"}
|
136
|
+
let(:result) { instance_spy(Beaker::Result) }
|
137
|
+
|
138
|
+
before do
|
139
|
+
allow(Beaker::Command).to receive(:new).
|
140
|
+
with('powershell.exe', array_including(command)).and_return(beaker_command)
|
141
|
+
allow(instance).to receive(:exec).with(beaker_command, :acceptable_exit_codes => [0, 1]).and_return(result)
|
142
|
+
end
|
143
|
+
|
144
|
+
it 'returns true and creates folder structure' do
|
145
|
+
allow(result).to receive(:exit_code).and_return(0)
|
146
|
+
|
147
|
+
expect(instance.mkdir_p(dir_path)).to be(true)
|
148
|
+
end
|
149
|
+
|
150
|
+
it 'returns false if failed to create directory structure' do
|
151
|
+
allow(result).to receive(:exit_code).and_return(1)
|
152
|
+
|
153
|
+
expect(instance.mkdir_p(dir_path)).to be(false)
|
154
|
+
end
|
155
|
+
end
|
102
156
|
end
|
103
157
|
end
|
@@ -25,11 +25,31 @@ module Beaker
|
|
25
25
|
let (:instance) { PSWindowsFileTest.new(opts, logger) }
|
26
26
|
|
27
27
|
describe '#cat' do
|
28
|
+
let(:path) { '/path/to/cat' }
|
29
|
+
let(:content) { 'file content' }
|
28
30
|
it 'reads output for file' do
|
29
|
-
|
30
|
-
expect(instance).to receive(:exec)
|
31
|
+
expect(instance).to receive(:exec).and_return(double(stdout: content))
|
31
32
|
expect(Beaker::Command).to receive(:new).with('powershell.exe', array_including("-Command type #{path}"))
|
32
|
-
instance.cat(path)
|
33
|
+
expect(instance.cat(path)).to eq(content)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe '#file_exist?' do
|
38
|
+
let(:path) { '/path/to/test/file.txt' }
|
39
|
+
context 'file exists' do
|
40
|
+
it 'returns true' do
|
41
|
+
expect(instance).to receive(:exec).and_return(double(stdout: "true\n"))
|
42
|
+
expect(Beaker::Command).to receive(:new).with("if exist #{path} echo true")
|
43
|
+
expect(instance.file_exist?(path)).to eq(true)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
context 'file does not exist' do
|
48
|
+
it 'returns false' do
|
49
|
+
expect(instance).to receive(:exec).and_return(double(stdout: ""))
|
50
|
+
expect(Beaker::Command).to receive(:new).with("if exist #{path} echo true")
|
51
|
+
expect(instance.file_exist?(path)).to eq(false)
|
52
|
+
end
|
33
53
|
end
|
34
54
|
end
|
35
55
|
|
@@ -39,7 +59,6 @@ module Beaker
|
|
39
59
|
|
40
60
|
before do
|
41
61
|
allow(instance).to receive(:execute).with(anything)
|
42
|
-
|
43
62
|
end
|
44
63
|
|
45
64
|
context 'with dirname sent' do
|
@@ -313,40 +313,32 @@ module Beaker
|
|
313
313
|
|
314
314
|
end
|
315
315
|
|
316
|
-
describe '#
|
317
|
-
|
318
|
-
|
316
|
+
describe '#which' do
|
317
|
+
before do
|
318
|
+
allow(instance).to receive(:execute)
|
319
|
+
.with(where_command, :accept_all_exit_codes => true).and_return(result)
|
319
320
|
end
|
320
|
-
it 'parses variation 2 of uptime string' do
|
321
|
-
expect(instance.parse_uptime("8:03 up 52 days, 20:47, 3 users, load averages: 1.36 1.42 1.40")).to be == "52 days, 20:47"
|
322
|
-
end
|
323
|
-
it 'parses variation 3 of uptime string' do
|
324
|
-
expect(instance.parse_uptime("22:19 up 54 days, 1 min, 4 users, load averages: 2.08 2.06 2.27")).to be == "54 days, 1 min"
|
325
|
-
end
|
326
|
-
it 'parses variation 4 of uptime string' do
|
327
|
-
expect(instance.parse_uptime("18:44:45 up 5 min, 0 users, load average: 0.14, 0.11, 0.05")).to be == "5 min"
|
328
|
-
end
|
329
|
-
it 'parses solaris\'s "just up" without time message' do
|
330
|
-
opts['platform'] = 'solaris-11-x86_64'
|
331
|
-
expect(instance.parse_uptime("10:05am up 0 users, load average: 0.66, 0.14, 0.05")).to be == "0 min"
|
332
|
-
end
|
333
|
-
end
|
334
321
|
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
expect(instance.uptime_int("54 days, 1 min")).to be == 77761
|
322
|
+
context 'when only the environment variable PATH is used' do
|
323
|
+
let(:where_command) { "which ruby" }
|
324
|
+
let(:result) { "/usr/bin/ruby.exe" }
|
325
|
+
|
326
|
+
it 'returns the correct path' do
|
327
|
+
response = instance.which('ruby')
|
328
|
+
|
329
|
+
expect(response).to eq(result)
|
344
330
|
end
|
345
|
-
it 'parses time segment variation 4 into a minute value' do
|
346
|
-
expect(instance.uptime_int("54 days")).to be == 77760
|
347
331
|
end
|
348
|
-
|
349
|
-
|
332
|
+
|
333
|
+
context 'when command is not found' do
|
334
|
+
let(:where_command) { "which unknown" }
|
335
|
+
let(:result) { '' }
|
336
|
+
|
337
|
+
it 'return empty string if command is not found' do
|
338
|
+
response = instance.which('unknown')
|
339
|
+
|
340
|
+
expect(response).to eq(result)
|
341
|
+
end
|
350
342
|
end
|
351
343
|
end
|
352
344
|
end
|
data/spec/beaker/host_spec.rb
CHANGED
@@ -349,7 +349,13 @@ module Beaker
|
|
349
349
|
allow( result ).to receive( :exit_code ).and_return( 0 )
|
350
350
|
allow( host ).to receive( :exec ).and_return( result )
|
351
351
|
|
352
|
-
expect( Beaker::Command ).to receive(:new).
|
352
|
+
expect( Beaker::Command ).to receive(:new).
|
353
|
+
with("powershell.exe", ["-ExecutionPolicy Bypass",
|
354
|
+
"-InputFormat None",
|
355
|
+
"-NoLogo",
|
356
|
+
"-NoProfile",
|
357
|
+
"-NonInteractive",
|
358
|
+
"-Command New-Item -Path 'test\\test\\test' -ItemType 'directory'"])
|
353
359
|
expect( host.mkdir_p('test/test/test') ).to be == true
|
354
360
|
|
355
361
|
end
|
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.
|
4
|
+
version: 4.24.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Puppet
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-05
|
11
|
+
date: 2020-06-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|