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/spec/beaker/command_spec.rb
CHANGED
|
@@ -42,53 +42,42 @@ module Beaker
|
|
|
42
42
|
end
|
|
43
43
|
|
|
44
44
|
describe '#environment_string_for' do
|
|
45
|
+
let(:host) { {'pathseparator' => ':'} }
|
|
46
|
+
|
|
45
47
|
it 'returns a blank string if theres no env' do
|
|
46
|
-
expect( subject.environment_string_for(
|
|
48
|
+
expect( subject.environment_string_for(host, {}) ).to be == ''
|
|
47
49
|
end
|
|
48
50
|
|
|
49
51
|
it 'takes an env hash with var_name/value pairs' do
|
|
50
|
-
expect( subject.environment_string_for(
|
|
51
|
-
to be ==
|
|
52
|
+
expect( subject.environment_string_for(host, {:HOME => '/'}) ).
|
|
53
|
+
to be == "env HOME=\"/\""
|
|
52
54
|
end
|
|
53
55
|
|
|
54
56
|
it 'takes an env hash with var_name/value[Array] pairs' do
|
|
55
|
-
expect( subject.environment_string_for(
|
|
56
|
-
to be ==
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
it 'takes var_names where there is an array of default values' do
|
|
60
|
-
env = {:PATH => { :default => [ '/bin', '/usr/bin' ] } }
|
|
61
|
-
expect( subject.environment_string_for({}, env) ).
|
|
62
|
-
to be == 'env PATH="/bin:/usr/bin"'
|
|
63
|
-
|
|
57
|
+
expect( subject.environment_string_for(host, {:LD_PATH => ['/', '/tmp']}) ).
|
|
58
|
+
to be == "env LD_PATH=\"/:/tmp\""
|
|
64
59
|
end
|
|
60
|
+
end
|
|
65
61
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
62
|
+
end
|
|
63
|
+
describe HostCommand do
|
|
64
|
+
let(:command) { @command || '/bin/ls' }
|
|
65
|
+
let(:args) { @args || Array.new }
|
|
66
|
+
let(:options) { @options || Hash.new }
|
|
67
|
+
subject(:cmd) { HostCommand.new( command, args, options ) }
|
|
68
|
+
let(:host) { Hash.new }
|
|
71
69
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
env = {
|
|
76
|
-
:WHOOSITS => {
|
|
77
|
-
:default => [ 'whatsits', 'wonkers' ],
|
|
78
|
-
:opts => {:separator => {:host => 'whoosits_separator' } }
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
expect( subject.environment_string_for( host, env ) ).
|
|
82
|
-
to be == 'env WHOOSITS="whatsits **sparkles** wonkers"'
|
|
83
|
-
end
|
|
70
|
+
it 'returns a simple string passed in' do
|
|
71
|
+
@command = "pants"
|
|
72
|
+
expect( cmd.cmd_line host ).to be === @command
|
|
84
73
|
end
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
74
|
+
it 'returns single quoted string correctly' do
|
|
75
|
+
@command = "str_p = 'pants'; str_p"
|
|
76
|
+
expect( cmd.cmd_line host ).to be === @command
|
|
77
|
+
end
|
|
78
|
+
it 'returns empty strings when given the escaped version of the same' do
|
|
79
|
+
@command = "\"\""
|
|
80
|
+
expect( cmd.cmd_line host ).to be === ""
|
|
92
81
|
end
|
|
93
82
|
end
|
|
94
83
|
end
|
|
@@ -20,12 +20,12 @@ CONSOLE
|
|
|
20
20
|
CONSOLE
|
|
21
21
|
|
|
22
22
|
result = double
|
|
23
|
-
result.
|
|
24
|
-
result.
|
|
25
|
-
result.
|
|
26
|
-
result.
|
|
23
|
+
expect( result ).to receive( :nil? ).at_least( :once ).and_return( false )
|
|
24
|
+
expect( result ).to receive( :stdout ).and_return( stdout )
|
|
25
|
+
expect( result ).to receive( :output ).and_return( stdout )
|
|
26
|
+
expect( result ).to receive( :stderr ).and_return( '' )
|
|
27
27
|
|
|
28
|
-
subject.
|
|
28
|
+
expect( subject ).to receive( :result ).at_least( :once ).and_return( result )
|
|
29
29
|
expect { subject.assert_output expectation }.to_not raise_error
|
|
30
30
|
end
|
|
31
31
|
|
|
@@ -52,51 +52,44 @@ STDERR
|
|
|
52
52
|
EXPECT
|
|
53
53
|
|
|
54
54
|
result = double
|
|
55
|
-
result.
|
|
56
|
-
result.
|
|
57
|
-
result.
|
|
58
|
-
result.
|
|
55
|
+
expect( result ).to receive( :nil? ).at_least( :once ).and_return( false )
|
|
56
|
+
expect( result ).to receive( :stdout ).and_return( stdout )
|
|
57
|
+
expect( result ).to receive( :output ).and_return( output )
|
|
58
|
+
expect( result ).to receive( :stderr ).and_return( stderr )
|
|
59
59
|
|
|
60
|
-
subject.
|
|
60
|
+
expect( subject ).to receive( :result ).at_least( :once ).and_return( result )
|
|
61
61
|
expect { subject.assert_output expectation }.to_not raise_error
|
|
62
62
|
end
|
|
63
63
|
|
|
64
64
|
it 'raises an approriate error when output does not match expectations' do
|
|
65
|
-
|
|
65
|
+
FakeFS.without do
|
|
66
|
+
output = <<OUTPUT
|
|
66
67
|
This is on stdout
|
|
67
68
|
Holy Crap, what HAPPENED!?!?!?
|
|
68
69
|
And THIS is again on stdout
|
|
69
70
|
OUTPUT
|
|
70
71
|
|
|
71
|
-
|
|
72
|
+
stdout = <<STDOUT
|
|
72
73
|
This is on stdout
|
|
73
74
|
And THIS is again on stdout
|
|
74
75
|
STDOUT
|
|
75
76
|
|
|
76
|
-
|
|
77
|
+
stderr = <<STDERR
|
|
77
78
|
Holy Crap, what HAPPENED!?!?!?
|
|
78
79
|
STDERR
|
|
79
80
|
|
|
80
|
-
|
|
81
|
+
expectation = <<EXPECT
|
|
81
82
|
STDOUT> This is on stdout
|
|
82
83
|
STDERR> While this is on stderr
|
|
83
84
|
STDOUT> And THIS is again on stdout
|
|
84
85
|
EXPECT
|
|
86
|
+
result = double
|
|
87
|
+
expect( result ).to receive( :nil? ).at_least( :once ).and_return( false )
|
|
88
|
+
expect( result ).to receive( :output ).and_return( output )
|
|
85
89
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
if ruby_conf['MINOR'].to_i == 8
|
|
89
|
-
exception = Test::Unit::AssertionFailedError
|
|
90
|
-
else
|
|
91
|
-
exception = MiniTest::Assertion
|
|
90
|
+
expect( subject ).to receive( :result ).at_least( :once ).and_return( result )
|
|
91
|
+
expect { subject.assert_output expectation }.to raise_error( MiniTest::Assertion )
|
|
92
92
|
end
|
|
93
|
-
|
|
94
|
-
result = double
|
|
95
|
-
result.should_receive( :nil? ).at_least( :once ).and_return( false )
|
|
96
|
-
result.should_receive( :output ).and_return( output )
|
|
97
|
-
|
|
98
|
-
subject.should_receive( :result ).at_least( :once ).and_return( result )
|
|
99
|
-
expect { subject.assert_output expectation }.to raise_error( exception )
|
|
100
93
|
end
|
|
101
94
|
end
|
|
102
95
|
end
|
|
@@ -25,7 +25,7 @@ class ClassMixedWithEZBakeUtils
|
|
|
25
25
|
end
|
|
26
26
|
|
|
27
27
|
def logger
|
|
28
|
-
@logger ||= RSpec::Mocks::
|
|
28
|
+
@logger ||= RSpec::Mocks::Double.new('logger').as_null_object
|
|
29
29
|
end
|
|
30
30
|
end
|
|
31
31
|
|
|
@@ -107,7 +107,7 @@ describe ClassMixedWithEZBakeUtils do
|
|
|
107
107
|
end
|
|
108
108
|
|
|
109
109
|
it "initializes EZBakeUtils.config" do
|
|
110
|
-
Dir.
|
|
110
|
+
allow( Dir ).to receive( :chdir ).and_yield()
|
|
111
111
|
allow(subject).to receive(:conditionally_clone) { true }
|
|
112
112
|
|
|
113
113
|
expect(subject).to receive(:`).with(/^lein.*/).ordered
|
|
@@ -191,7 +191,7 @@ describe ClassMixedWithEZBakeUtils do
|
|
|
191
191
|
end
|
|
192
192
|
|
|
193
193
|
it "raises an exception for unsupported *nix-like platforms" do
|
|
194
|
-
Dir.
|
|
194
|
+
allow( Dir ).to receive( :chdir ).and_yield()
|
|
195
195
|
install_from_ezbake_common_expects
|
|
196
196
|
expect{
|
|
197
197
|
subject.install_from_ezbake host, "blah", "blah"
|
|
@@ -201,7 +201,7 @@ describe ClassMixedWithEZBakeUtils do
|
|
|
201
201
|
context "When Beaker::DSL::EZBakeUtils.config is nil" do
|
|
202
202
|
let( :platform ) { Beaker::Platform.new('el-7-i386') }
|
|
203
203
|
before do
|
|
204
|
-
Dir.
|
|
204
|
+
allow( Dir ).to receive( :chdir ).and_yield()
|
|
205
205
|
subject.wipe_out_ezbake_config
|
|
206
206
|
end
|
|
207
207
|
|
|
@@ -220,7 +220,7 @@ describe ClassMixedWithEZBakeUtils do
|
|
|
220
220
|
context "When Beaker::DSL::EZBakeUtils.config is a hash" do
|
|
221
221
|
let( :platform ) { Beaker::Platform.new('el-7-i386') }
|
|
222
222
|
before do
|
|
223
|
-
Dir.
|
|
223
|
+
allow( Dir ).to receive( :chdir ).and_yield()
|
|
224
224
|
subject.initialize_ezbake_config
|
|
225
225
|
end
|
|
226
226
|
|
|
@@ -7,14 +7,15 @@ class ClassMixedWithDSLHelpers
|
|
|
7
7
|
include Beaker::DSL::Patterns
|
|
8
8
|
|
|
9
9
|
def logger
|
|
10
|
-
|
|
10
|
+
RSpec::Mocks::Double.new('logger').as_null_object
|
|
11
11
|
end
|
|
12
|
+
|
|
12
13
|
end
|
|
13
14
|
|
|
14
15
|
describe ClassMixedWithDSLHelpers do
|
|
15
|
-
let( :opts )
|
|
16
|
-
let( :command )
|
|
17
|
-
let( :host )
|
|
16
|
+
let( :opts ) { Beaker::Options::Presets.env_vars }
|
|
17
|
+
let( :command ){ 'ls' }
|
|
18
|
+
let( :host ) { double.as_null_object }
|
|
18
19
|
let( :result ) { Beaker::Result.new( host, command ) }
|
|
19
20
|
|
|
20
21
|
let( :master ) { make_host( 'master', :roles => %w( master agent default) ) }
|
|
@@ -22,7 +23,7 @@ describe ClassMixedWithDSLHelpers do
|
|
|
22
23
|
let( :custom ) { make_host( 'custom', :roles => %w( custom agent ) ) }
|
|
23
24
|
let( :dash ) { make_host( 'console', :roles => %w( dashboard agent ) ) }
|
|
24
25
|
let( :db ) { make_host( 'db', :roles => %w( database agent ) ) }
|
|
25
|
-
let( :hosts )
|
|
26
|
+
let( :hosts ) { [ master, agent, dash, db, custom ] }
|
|
26
27
|
|
|
27
28
|
describe '#on' do
|
|
28
29
|
|
|
@@ -33,38 +34,38 @@ describe ClassMixedWithDSLHelpers do
|
|
|
33
34
|
end
|
|
34
35
|
|
|
35
36
|
it 'allows the environment the command is run within to be specified' do
|
|
36
|
-
subject.
|
|
37
|
+
allow( subject ).to receive( :hosts ).and_return( hosts )
|
|
37
38
|
|
|
38
|
-
Beaker::Command.
|
|
39
|
+
expect( Beaker::Command ).to receive( :new ).
|
|
39
40
|
with( 'ls ~/.bin', [], {'ENV' => { :HOME => '/tmp/test_home' }} )
|
|
40
41
|
|
|
41
42
|
subject.on( host, 'ls ~/.bin', :environment => {:HOME => '/tmp/test_home' } )
|
|
42
43
|
end
|
|
43
44
|
|
|
44
45
|
it 'if the host is a String Object, finds the matching hosts with that String as role' do
|
|
45
|
-
subject.
|
|
46
|
+
allow( subject ).to receive( :hosts ).and_return( hosts )
|
|
46
47
|
|
|
47
|
-
master.
|
|
48
|
+
expect( master ).to receive( :exec ).once
|
|
48
49
|
|
|
49
50
|
subject.on( 'master', 'echo hello')
|
|
50
51
|
|
|
51
52
|
end
|
|
52
53
|
|
|
53
54
|
it 'if the host is a Symbol Object, finds the matching hsots with that Symbol as role' do
|
|
54
|
-
subject.
|
|
55
|
+
allow( subject ).to receive( :hosts ).and_return( hosts )
|
|
55
56
|
|
|
56
|
-
master.
|
|
57
|
+
expect( master ).to receive( :exec ).once
|
|
57
58
|
|
|
58
59
|
subject.on( :master, 'echo hello')
|
|
59
60
|
|
|
60
61
|
end
|
|
61
62
|
|
|
62
63
|
it 'delegates to itself for each host passed' do
|
|
63
|
-
subject.
|
|
64
|
+
allow( subject ).to receive( :hosts ).and_return( hosts )
|
|
64
65
|
expected = []
|
|
65
66
|
hosts.each_with_index do |host, i|
|
|
66
67
|
expected << i
|
|
67
|
-
host.
|
|
68
|
+
expect( host ).to receive( :exec ).and_return( i )
|
|
68
69
|
end
|
|
69
70
|
|
|
70
71
|
results = subject.on( hosts, command )
|
|
@@ -73,8 +74,8 @@ describe ClassMixedWithDSLHelpers do
|
|
|
73
74
|
|
|
74
75
|
context 'upon command completion' do
|
|
75
76
|
before :each do
|
|
76
|
-
subject.
|
|
77
|
-
host.
|
|
77
|
+
allow( subject ).to receive( :hosts ).and_return( hosts )
|
|
78
|
+
expect( host ).to receive( :exec ).and_return( result )
|
|
78
79
|
@res = subject.on( host, command )
|
|
79
80
|
end
|
|
80
81
|
|
|
@@ -97,8 +98,8 @@ describe ClassMixedWithDSLHelpers do
|
|
|
97
98
|
|
|
98
99
|
context 'when passed a block with arity of 1' do
|
|
99
100
|
before :each do
|
|
100
|
-
subject.
|
|
101
|
-
host.
|
|
101
|
+
allow( subject ).to receive( :hosts ).and_return( hosts )
|
|
102
|
+
expect( host ).to receive( :exec ).and_return( result )
|
|
102
103
|
end
|
|
103
104
|
|
|
104
105
|
it 'yields result' do
|
|
@@ -129,8 +130,8 @@ describe ClassMixedWithDSLHelpers do
|
|
|
129
130
|
|
|
130
131
|
context 'when passed a block with arity of 0' do
|
|
131
132
|
before :each do
|
|
132
|
-
subject.
|
|
133
|
-
host.
|
|
133
|
+
allow( subject ).to receive( :hosts ).and_return( hosts )
|
|
134
|
+
expect( host ).to receive( :exec ).and_return( result )
|
|
134
135
|
end
|
|
135
136
|
|
|
136
137
|
it 'yields self' do
|
|
@@ -161,11 +162,69 @@ describe ClassMixedWithDSLHelpers do
|
|
|
161
162
|
|
|
162
163
|
end
|
|
163
164
|
|
|
165
|
+
describe "#retry_on" do
|
|
166
|
+
it 'fails correctly when command never succeeds' do
|
|
167
|
+
result.stdout = 'stdout'
|
|
168
|
+
result.stderr = 'stderr'
|
|
169
|
+
result.exit_code = 1
|
|
170
|
+
|
|
171
|
+
retries = 5
|
|
172
|
+
|
|
173
|
+
opts = {
|
|
174
|
+
:max_retries => retries,
|
|
175
|
+
:retry_interval => 0.0001,
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
allow( subject ).to receive(:on).and_return(result)
|
|
179
|
+
expect( subject ).to receive(:on).exactly(retries+2)
|
|
180
|
+
expect { subject.retry_on(host, command, opts) }.to raise_error(RuntimeError)
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
it 'will return success correctly if it succeeds the first time' do
|
|
184
|
+
result.stdout = 'stdout'
|
|
185
|
+
result.stderr = 'stderr'
|
|
186
|
+
result.exit_code = 0
|
|
187
|
+
|
|
188
|
+
opts = {
|
|
189
|
+
:max_retries => 5,
|
|
190
|
+
:retry_interval => 0.0001,
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
allow( subject ).to receive(:on).and_return(result)
|
|
194
|
+
expect( subject ).to receive(:on).once
|
|
195
|
+
|
|
196
|
+
result_given = subject.retry_on(host, command, opts)
|
|
197
|
+
expect(result_given.exit_code).to be === 0
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
it 'will return success correctly if it succeeds after failing a few times' do
|
|
201
|
+
result.stdout = 'stdout'
|
|
202
|
+
result.stderr = 'stderr'
|
|
203
|
+
|
|
204
|
+
opts = {
|
|
205
|
+
:max_retries => 10,
|
|
206
|
+
:retry_interval => 0.1,
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
reps_num = 4
|
|
210
|
+
count = 0
|
|
211
|
+
allow( subject ).to receive(:on) do
|
|
212
|
+
result.exit_code = count > reps_num ? 0 : 1
|
|
213
|
+
count += 1
|
|
214
|
+
result
|
|
215
|
+
end
|
|
216
|
+
expect( subject ).to receive(:on).exactly(reps_num + 2)
|
|
217
|
+
|
|
218
|
+
result_given = subject.retry_on(host, command, opts)
|
|
219
|
+
expect(result_given.exit_code).to be === 0
|
|
220
|
+
end
|
|
221
|
+
end
|
|
222
|
+
|
|
164
223
|
describe "shell" do
|
|
165
224
|
it 'delegates to #on with the default host' do
|
|
166
|
-
subject.
|
|
225
|
+
allow( subject ).to receive( :hosts ).and_return( hosts )
|
|
167
226
|
|
|
168
|
-
subject.
|
|
227
|
+
expect( subject ).to receive( :on ).with( master, "echo hello", {}).once
|
|
169
228
|
|
|
170
229
|
subject.shell( "echo hello" )
|
|
171
230
|
end
|
|
@@ -173,12 +232,12 @@ describe ClassMixedWithDSLHelpers do
|
|
|
173
232
|
|
|
174
233
|
describe '#scp_from' do
|
|
175
234
|
it 'delegates to the host' do
|
|
176
|
-
subject.
|
|
177
|
-
subject.
|
|
178
|
-
result.
|
|
235
|
+
allow( subject ).to receive( :hosts ).and_return( hosts )
|
|
236
|
+
expect( subject ).to receive( :logger ).exactly( hosts.length ).times
|
|
237
|
+
expect( result ).to receive( :log ).exactly( hosts.length ).times
|
|
179
238
|
|
|
180
239
|
hosts.each do |host|
|
|
181
|
-
host.
|
|
240
|
+
expect( host ).to receive( :do_scp_from ).and_return( result )
|
|
182
241
|
end
|
|
183
242
|
|
|
184
243
|
subject.scp_from( hosts, '/var/log/my.log', 'log/my.log' )
|
|
@@ -187,12 +246,12 @@ describe ClassMixedWithDSLHelpers do
|
|
|
187
246
|
|
|
188
247
|
describe '#scp_to' do
|
|
189
248
|
it 'delegates to the host' do
|
|
190
|
-
subject.
|
|
191
|
-
subject.
|
|
192
|
-
result.
|
|
249
|
+
allow( subject ).to receive( :hosts ).and_return( hosts )
|
|
250
|
+
expect( subject ).to receive( :logger ).exactly( hosts.length ).times
|
|
251
|
+
expect( result ).to receive( :log ).exactly( hosts.length ).times
|
|
193
252
|
|
|
194
253
|
hosts.each do |host|
|
|
195
|
-
host.
|
|
254
|
+
expect( host ).to receive( :do_scp_to ).and_return( result )
|
|
196
255
|
end
|
|
197
256
|
|
|
198
257
|
subject.scp_to( hosts, '/var/log/my.log', 'log/my.log' )
|
|
@@ -204,14 +263,14 @@ describe ClassMixedWithDSLHelpers do
|
|
|
204
263
|
my_opts = { :silent => true }
|
|
205
264
|
tmpfile = double
|
|
206
265
|
|
|
207
|
-
tmpfile.
|
|
266
|
+
expect( tmpfile ).to receive( :path ).exactly( 2 ).times.
|
|
208
267
|
and_return( '/local/path/to/blah' )
|
|
209
268
|
|
|
210
|
-
Tempfile.
|
|
269
|
+
expect( Tempfile ).to receive( :open ).and_yield( tmpfile )
|
|
211
270
|
|
|
212
|
-
File.
|
|
271
|
+
expect( File ).to receive( :open )
|
|
213
272
|
|
|
214
|
-
subject.
|
|
273
|
+
expect( subject ).to receive( :scp_to ).
|
|
215
274
|
with( hosts, '/local/path/to/blah', '/remote/path', my_opts )
|
|
216
275
|
|
|
217
276
|
subject.create_remote_file( hosts, '/remote/path', 'blah', my_opts )
|
|
@@ -219,7 +278,7 @@ describe ClassMixedWithDSLHelpers do
|
|
|
219
278
|
end
|
|
220
279
|
|
|
221
280
|
describe '#create_tmpdir_for_user' do
|
|
222
|
-
let(:host) {
|
|
281
|
+
let(:host) { {} }
|
|
223
282
|
let(:result) { double.as_null_object }
|
|
224
283
|
|
|
225
284
|
before :each do
|
|
@@ -233,9 +292,10 @@ describe ClassMixedWithDSLHelpers do
|
|
|
233
292
|
context 'with no path name argument' do
|
|
234
293
|
context 'without puppet installed on host' do
|
|
235
294
|
it 'raises an error' do
|
|
236
|
-
|
|
295
|
+
cmd = "the command"
|
|
237
296
|
allow(result).to receive(:exit_code).and_return(1)
|
|
238
|
-
expect(
|
|
297
|
+
expect(Beaker::Command).to receive(:new).with(/puppet master --configprint user/, [], {"ENV"=>{}, :cmdexe=>true}).and_return(cmd)
|
|
298
|
+
expect(subject).to receive(:on).with(host, cmd).and_return(result)
|
|
239
299
|
expect{
|
|
240
300
|
subject.create_tmpdir_for_user host
|
|
241
301
|
}.to raise_error(RuntimeError, /`puppet master --configprint` failed,/)
|
|
@@ -243,7 +303,9 @@ describe ClassMixedWithDSLHelpers do
|
|
|
243
303
|
end
|
|
244
304
|
context 'with puppet installed on host' do
|
|
245
305
|
it 'executes chown once' do
|
|
246
|
-
|
|
306
|
+
cmd = "the command"
|
|
307
|
+
expect(Beaker::Command).to receive(:new).with(/puppet master --configprint user/, [], {"ENV"=>{}, :cmdexe=>true}).and_return(cmd)
|
|
308
|
+
expect(subject).to receive(:on).with(host, cmd).and_return(result)
|
|
247
309
|
expect(subject).to receive(:on).with(host, /^getent passwd puppet/).and_return(result)
|
|
248
310
|
expect(host).to receive(:tmpdir).with(/\/tmp\/beaker.*/)
|
|
249
311
|
expect(subject).to receive(:on).with(host, /chown puppet.puppet.*/)
|
|
@@ -254,7 +316,9 @@ describe ClassMixedWithDSLHelpers do
|
|
|
254
316
|
|
|
255
317
|
context 'with path name argument' do
|
|
256
318
|
it 'executes chown once' do
|
|
257
|
-
|
|
319
|
+
cmd = "the command"
|
|
320
|
+
expect(Beaker::Command).to receive(:new).with(/puppet master --configprint user/, [], {"ENV"=>{}, :cmdexe=>true}).and_return(cmd)
|
|
321
|
+
expect(subject).to receive(:on).with(host, cmd).and_return(result)
|
|
258
322
|
expect(subject).to receive(:on).with(host, /^getent passwd puppet/).and_return(result)
|
|
259
323
|
expect(host).to receive(:tmpdir).with(/\/tmp\/bogus.*/).and_return("/tmp/bogus")
|
|
260
324
|
expect(subject).to receive(:on).with(host, /chown puppet.puppet \/tmp\/bogus.*/)
|
|
@@ -288,17 +352,17 @@ describe ClassMixedWithDSLHelpers do
|
|
|
288
352
|
|
|
289
353
|
describe '#run_script_on' do
|
|
290
354
|
it 'scps the script to a tmpdir and executes it on host(s)' do
|
|
291
|
-
subject.
|
|
292
|
-
subject.
|
|
355
|
+
expect( subject ).to receive( :scp_to )
|
|
356
|
+
expect( subject ).to receive( :on )
|
|
293
357
|
subject.run_script_on( 'host', '~/.bin/make-enterprisy' )
|
|
294
358
|
end
|
|
295
359
|
end
|
|
296
360
|
|
|
297
361
|
describe '#run_script' do
|
|
298
362
|
it 'delegates to #run_script_on with the default host' do
|
|
299
|
-
subject.
|
|
363
|
+
allow( subject ).to receive( :hosts ).and_return( hosts )
|
|
300
364
|
|
|
301
|
-
subject.
|
|
365
|
+
expect( subject ).to receive( :run_script_on ).with( master, "/tmp/test.sh", {}).once
|
|
302
366
|
|
|
303
367
|
subject.run_script( '/tmp/test.sh' )
|
|
304
368
|
end
|
|
@@ -307,22 +371,22 @@ describe ClassMixedWithDSLHelpers do
|
|
|
307
371
|
describe 'confine' do
|
|
308
372
|
let(:logger) { double.as_null_object }
|
|
309
373
|
before do
|
|
310
|
-
subject.
|
|
374
|
+
allow( subject ).to receive( :logger ).and_return( logger )
|
|
311
375
|
end
|
|
312
376
|
|
|
313
377
|
it 'skips the test if there are no applicable hosts' do
|
|
314
|
-
subject.
|
|
315
|
-
subject.
|
|
316
|
-
logger.
|
|
317
|
-
subject.
|
|
378
|
+
allow( subject ).to receive( :hosts ).and_return( [] )
|
|
379
|
+
allow( subject ).to receive( :hosts= )
|
|
380
|
+
expect( logger ).to receive( :warn )
|
|
381
|
+
expect( subject ).to receive( :skip_test ).
|
|
318
382
|
with( 'No suitable hosts found' )
|
|
319
383
|
|
|
320
384
|
subject.confine( :to, {} )
|
|
321
385
|
end
|
|
322
386
|
|
|
323
387
|
it 'raises when given mode is not :to or :except' do
|
|
324
|
-
subject.
|
|
325
|
-
subject.
|
|
388
|
+
allow( subject ).to receive( :hosts )
|
|
389
|
+
allow( subject ).to receive( :hosts= )
|
|
326
390
|
|
|
327
391
|
expect {
|
|
328
392
|
subject.confine( :regardless, {:thing => 'value'} )
|
|
@@ -332,8 +396,8 @@ describe ClassMixedWithDSLHelpers do
|
|
|
332
396
|
it 'rejects hosts that do not meet simple hash criteria' do
|
|
333
397
|
hosts = [ {'thing' => 'foo'}, {'thing' => 'bar'} ]
|
|
334
398
|
|
|
335
|
-
subject.
|
|
336
|
-
subject.
|
|
399
|
+
expect( subject ).to receive( :hosts ).and_return( hosts )
|
|
400
|
+
expect( subject ).to receive( :hosts= ).
|
|
337
401
|
with( [ {'thing' => 'foo'} ] )
|
|
338
402
|
|
|
339
403
|
subject.confine :to, :thing => 'foo'
|
|
@@ -342,8 +406,8 @@ describe ClassMixedWithDSLHelpers do
|
|
|
342
406
|
it 'rejects hosts that match a list of criteria' do
|
|
343
407
|
hosts = [ {'thing' => 'foo'}, {'thing' => 'bar'}, {'thing' => 'baz'} ]
|
|
344
408
|
|
|
345
|
-
subject.
|
|
346
|
-
subject.
|
|
409
|
+
expect( subject ).to receive( :hosts ).and_return( hosts )
|
|
410
|
+
expect( subject ).to receive( :hosts= ).
|
|
347
411
|
with( [ {'thing' => 'bar'} ] )
|
|
348
412
|
|
|
349
413
|
subject.confine :except, :thing => ['foo', 'baz']
|
|
@@ -357,15 +421,15 @@ describe ClassMixedWithDSLHelpers do
|
|
|
357
421
|
ret2 = (Struct.new('Result2', :stdout)).new('a_zone')
|
|
358
422
|
hosts = [ host1, host2, host3 ]
|
|
359
423
|
|
|
360
|
-
subject.
|
|
361
|
-
subject.
|
|
424
|
+
expect( subject ).to receive( :hosts ).and_return( hosts )
|
|
425
|
+
expect( subject ).to receive( :on ).
|
|
362
426
|
with( host1, '/sbin/zonename' ).
|
|
363
427
|
and_return( ret1 )
|
|
364
|
-
subject.
|
|
428
|
+
expect( subject ).to receive( :on ).
|
|
365
429
|
with( host1, '/sbin/zonename' ).
|
|
366
430
|
and_return( ret2 )
|
|
367
431
|
|
|
368
|
-
subject.
|
|
432
|
+
expect( subject ).to receive( :hosts= ).with( [ host1 ] )
|
|
369
433
|
|
|
370
434
|
subject.confine :to, :platform => 'solaris' do |host|
|
|
371
435
|
subject.on( host, '/sbin/zonename' ).stdout =~ /:global/
|
|
@@ -376,7 +440,7 @@ describe ClassMixedWithDSLHelpers do
|
|
|
376
440
|
describe '#select_hosts' do
|
|
377
441
|
let(:logger) { double.as_null_object }
|
|
378
442
|
before do
|
|
379
|
-
subject.
|
|
443
|
+
allow( subject ).to receive( :logger ).and_return( logger )
|
|
380
444
|
end
|
|
381
445
|
|
|
382
446
|
it 'it returns an empty array if there are no applicable hosts' do
|
|
@@ -395,13 +459,15 @@ describe ClassMixedWithDSLHelpers do
|
|
|
395
459
|
host1 = {'platform' => 'solaris1'}
|
|
396
460
|
host2 = {'platform' => 'solaris2'}
|
|
397
461
|
host3 = {'platform' => 'windows'}
|
|
398
|
-
ret1 = (
|
|
399
|
-
|
|
462
|
+
ret1 = double('result1')
|
|
463
|
+
allow( ret1 ).to receive( :stdout ).and_return(':global')
|
|
464
|
+
ret2 = double('result2')
|
|
465
|
+
allow( ret2 ).to receive( :stdout ).and_return('a_zone')
|
|
400
466
|
hosts = [ host1, host2, host3 ]
|
|
401
|
-
subject.
|
|
467
|
+
expect( subject ).to receive( :hosts ).and_return( hosts )
|
|
402
468
|
|
|
403
|
-
subject.
|
|
404
|
-
subject.
|
|
469
|
+
expect( subject ).to receive( :on ).with( host1, '/sbin/zonename' ).once.and_return( ret1 )
|
|
470
|
+
expect( subject ).to receive( :on ).with( host2, '/sbin/zonename' ).once.and_return( ret2 )
|
|
405
471
|
|
|
406
472
|
selected_hosts = subject.select_hosts 'platform' => 'solaris' do |host|
|
|
407
473
|
subject.on(host, '/sbin/zonename').stdout =~ /:global/
|
|
@@ -412,13 +478,13 @@ describe ClassMixedWithDSLHelpers do
|
|
|
412
478
|
|
|
413
479
|
describe '#apply_manifest_on' do
|
|
414
480
|
it 'calls puppet' do
|
|
415
|
-
subject.
|
|
416
|
-
subject.
|
|
417
|
-
subject.
|
|
481
|
+
allow( subject ).to receive( :hosts ).and_return( hosts )
|
|
482
|
+
expect( subject ).to receive( :create_remote_file ).and_return( true )
|
|
483
|
+
expect( subject ).to receive( :puppet ).
|
|
418
484
|
# with( 'apply', '--verbose', 'agent' ).
|
|
419
485
|
and_return( 'puppet_command' )
|
|
420
486
|
|
|
421
|
-
subject.
|
|
487
|
+
expect( subject ).to receive( :on ).
|
|
422
488
|
with( agent, 'puppet_command',
|
|
423
489
|
:acceptable_exit_codes => [0] )
|
|
424
490
|
|
|
@@ -426,29 +492,29 @@ describe ClassMixedWithDSLHelpers do
|
|
|
426
492
|
end
|
|
427
493
|
|
|
428
494
|
it 'operates on an array of hosts' do
|
|
429
|
-
subject.
|
|
495
|
+
allow( subject ).to receive( :hosts ).and_return( hosts )
|
|
430
496
|
the_hosts = [master, agent]
|
|
431
497
|
|
|
432
|
-
subject.
|
|
498
|
+
expect( subject ).to receive( :create_remote_file ).twice.and_return( true )
|
|
433
499
|
the_hosts.each do |host|
|
|
434
|
-
subject.
|
|
500
|
+
expect( subject ).to receive( :puppet ).
|
|
435
501
|
and_return( 'puppet_command' )
|
|
436
502
|
|
|
437
|
-
subject.
|
|
503
|
+
expect( subject ).to receive( :on ).
|
|
438
504
|
with( host, 'puppet_command', :acceptable_exit_codes => [0] )
|
|
439
505
|
end
|
|
440
506
|
|
|
441
507
|
result = subject.apply_manifest_on( the_hosts, 'include foobar' )
|
|
442
|
-
result.
|
|
508
|
+
expect(result).to be_an(Array)
|
|
443
509
|
end
|
|
444
510
|
|
|
445
511
|
it 'adds acceptable exit codes with :catch_failures' do
|
|
446
|
-
subject.
|
|
447
|
-
subject.
|
|
448
|
-
subject.
|
|
512
|
+
allow( subject ).to receive( :hosts ).and_return( hosts )
|
|
513
|
+
expect( subject ).to receive( :create_remote_file ).and_return( true )
|
|
514
|
+
expect( subject ).to receive( :puppet ).
|
|
449
515
|
and_return( 'puppet_command' )
|
|
450
516
|
|
|
451
|
-
subject.
|
|
517
|
+
expect( subject ).to receive( :on ).
|
|
452
518
|
with( agent, 'puppet_command',
|
|
453
519
|
:acceptable_exit_codes => [0,2] )
|
|
454
520
|
|
|
@@ -457,12 +523,12 @@ describe ClassMixedWithDSLHelpers do
|
|
|
457
523
|
:catch_failures => true )
|
|
458
524
|
end
|
|
459
525
|
it 'allows acceptable exit codes through :catch_failures' do
|
|
460
|
-
subject.
|
|
461
|
-
subject.
|
|
462
|
-
subject.
|
|
526
|
+
allow( subject ).to receive( :hosts ).and_return( hosts )
|
|
527
|
+
expect( subject ).to receive( :create_remote_file ).and_return( true )
|
|
528
|
+
expect( subject ).to receive( :puppet ).
|
|
463
529
|
and_return( 'puppet_command' )
|
|
464
530
|
|
|
465
|
-
subject.
|
|
531
|
+
expect( subject ).to receive( :on ).
|
|
466
532
|
with( agent, 'puppet_command',
|
|
467
533
|
:acceptable_exit_codes => [4,0,2] )
|
|
468
534
|
|
|
@@ -472,12 +538,12 @@ describe ClassMixedWithDSLHelpers do
|
|
|
472
538
|
:catch_failures => true )
|
|
473
539
|
end
|
|
474
540
|
it 'enforces a 0 exit code through :catch_changes' do
|
|
475
|
-
subject.
|
|
476
|
-
subject.
|
|
477
|
-
subject.
|
|
541
|
+
allow( subject ).to receive( :hosts ).and_return( hosts )
|
|
542
|
+
expect( subject ).to receive( :create_remote_file ).and_return( true )
|
|
543
|
+
expect( subject ).to receive( :puppet ).
|
|
478
544
|
and_return( 'puppet_command' )
|
|
479
545
|
|
|
480
|
-
subject.
|
|
546
|
+
expect( subject ).to receive( :on ).with(
|
|
481
547
|
agent,
|
|
482
548
|
'puppet_command',
|
|
483
549
|
:acceptable_exit_codes => [0]
|
|
@@ -490,12 +556,12 @@ describe ClassMixedWithDSLHelpers do
|
|
|
490
556
|
)
|
|
491
557
|
end
|
|
492
558
|
it 'enforces a 2 exit code through :expect_changes' do
|
|
493
|
-
subject.
|
|
494
|
-
subject.
|
|
495
|
-
subject.
|
|
559
|
+
allow( subject ).to receive( :hosts ).and_return( hosts )
|
|
560
|
+
expect( subject ).to receive( :create_remote_file ).and_return( true )
|
|
561
|
+
expect( subject ).to receive( :puppet ).
|
|
496
562
|
and_return( 'puppet_command' )
|
|
497
563
|
|
|
498
|
-
subject.
|
|
564
|
+
expect( subject ).to receive( :on ).with(
|
|
499
565
|
agent,
|
|
500
566
|
'puppet_command',
|
|
501
567
|
:acceptable_exit_codes => [2]
|
|
@@ -508,12 +574,12 @@ describe ClassMixedWithDSLHelpers do
|
|
|
508
574
|
)
|
|
509
575
|
end
|
|
510
576
|
it 'enforces exit codes through :expect_failures' do
|
|
511
|
-
subject.
|
|
512
|
-
subject.
|
|
513
|
-
subject.
|
|
577
|
+
allow( subject ).to receive( :hosts ).and_return( hosts )
|
|
578
|
+
expect( subject ).to receive( :create_remote_file ).and_return( true )
|
|
579
|
+
expect( subject ).to receive( :puppet ).
|
|
514
580
|
and_return( 'puppet_command' )
|
|
515
581
|
|
|
516
|
-
subject.
|
|
582
|
+
expect( subject ).to receive( :on ).with(
|
|
517
583
|
agent,
|
|
518
584
|
'puppet_command',
|
|
519
585
|
:acceptable_exit_codes => [1,4,6]
|
|
@@ -526,7 +592,7 @@ describe ClassMixedWithDSLHelpers do
|
|
|
526
592
|
)
|
|
527
593
|
end
|
|
528
594
|
it 'enforces exit codes through :expect_failures' do
|
|
529
|
-
subject.
|
|
595
|
+
allow( subject ).to receive( :hosts ).and_return( hosts )
|
|
530
596
|
expect {
|
|
531
597
|
subject.apply_manifest_on(
|
|
532
598
|
agent,
|
|
@@ -537,12 +603,12 @@ describe ClassMixedWithDSLHelpers do
|
|
|
537
603
|
}.to raise_error ArgumentError, /catch_failures.+expect_failures/
|
|
538
604
|
end
|
|
539
605
|
it 'enforces added exit codes through :expect_failures' do
|
|
540
|
-
subject.
|
|
541
|
-
subject.
|
|
542
|
-
subject.
|
|
606
|
+
allow( subject ).to receive( :hosts ).and_return( hosts )
|
|
607
|
+
expect( subject ).to receive( :create_remote_file ).and_return( true )
|
|
608
|
+
expect( subject ).to receive( :puppet ).
|
|
543
609
|
and_return( 'puppet_command' )
|
|
544
610
|
|
|
545
|
-
subject.
|
|
611
|
+
expect( subject ).to receive( :on ).with(
|
|
546
612
|
agent,
|
|
547
613
|
'puppet_command',
|
|
548
614
|
:acceptable_exit_codes => [1,2,3,4,5,6]
|
|
@@ -557,17 +623,17 @@ describe ClassMixedWithDSLHelpers do
|
|
|
557
623
|
end
|
|
558
624
|
|
|
559
625
|
it 'can set the --parser future flag' do
|
|
560
|
-
subject.
|
|
561
|
-
subject.
|
|
626
|
+
allow( subject ).to receive( :hosts ).and_return( hosts )
|
|
627
|
+
expect( subject ).to receive( :create_remote_file ).and_return( true )
|
|
562
628
|
|
|
563
|
-
expect( subject ).to receive( :on )
|
|
629
|
+
expect( subject ).to receive( :on ) do |h, command, opts|
|
|
564
630
|
cmdline = command.cmd_line( h )
|
|
565
631
|
expect( h ).to be == agent
|
|
566
632
|
expect( cmdline ).to include('puppet apply')
|
|
567
633
|
expect( cmdline ).to include('--parser=future')
|
|
568
634
|
expect( cmdline ).to include('--detailed-exitcodes')
|
|
569
635
|
expect( cmdline ).to include('--verbose')
|
|
570
|
-
|
|
636
|
+
end
|
|
571
637
|
|
|
572
638
|
subject.apply_manifest_on(
|
|
573
639
|
agent,
|
|
@@ -579,16 +645,16 @@ describe ClassMixedWithDSLHelpers do
|
|
|
579
645
|
end
|
|
580
646
|
|
|
581
647
|
it 'can set the --noops flag' do
|
|
582
|
-
subject.
|
|
583
|
-
subject.
|
|
584
|
-
expect( subject ).to receive( :on )
|
|
648
|
+
allow( subject ).to receive( :hosts ).and_return( hosts )
|
|
649
|
+
expect( subject ).to receive( :create_remote_file ).and_return( true )
|
|
650
|
+
expect( subject ).to receive( :on ) do |h, command, opts|
|
|
585
651
|
cmdline = command.cmd_line( h )
|
|
586
652
|
expect( h ).to be == agent
|
|
587
653
|
expect( cmdline ).to include('puppet apply')
|
|
588
654
|
expect( cmdline ).to include('--detailed-exitcodes')
|
|
589
655
|
expect( cmdline ).to include('--verbose')
|
|
590
656
|
expect( cmdline ).to include('--noop')
|
|
591
|
-
|
|
657
|
+
end
|
|
592
658
|
subject.apply_manifest_on(
|
|
593
659
|
agent,
|
|
594
660
|
'class { "boo": }',
|
|
@@ -599,11 +665,28 @@ describe ClassMixedWithDSLHelpers do
|
|
|
599
665
|
end
|
|
600
666
|
end
|
|
601
667
|
|
|
668
|
+
it 'can set the --debug flag' do
|
|
669
|
+
allow( subject ).to receive( :hosts ).and_return( hosts )
|
|
670
|
+
allow( subject ).to receive( :create_remote_file ).and_return( true )
|
|
671
|
+
expect( subject ).to receive( :on ) do |h, command, opts|
|
|
672
|
+
cmdline = command.cmd_line( h )
|
|
673
|
+
expect( h ).to be == agent
|
|
674
|
+
expect( cmdline ).to include('puppet apply')
|
|
675
|
+
expect( cmdline ).not_to include('--verbose')
|
|
676
|
+
expect( cmdline ).to include('--debug')
|
|
677
|
+
end
|
|
678
|
+
subject.apply_manifest_on(
|
|
679
|
+
agent,
|
|
680
|
+
'class { "boo": }',
|
|
681
|
+
:debug => true,
|
|
682
|
+
)
|
|
683
|
+
end
|
|
684
|
+
|
|
602
685
|
describe "#apply_manifest" do
|
|
603
686
|
it "delegates to #apply_manifest_on with the default host" do
|
|
604
|
-
subject.
|
|
687
|
+
allow( subject ).to receive( :hosts ).and_return( hosts )
|
|
605
688
|
|
|
606
|
-
subject.
|
|
689
|
+
expect( subject ).to receive( :apply_manifest_on ).with( master, 'manifest', {:opt => 'value'}).once
|
|
607
690
|
|
|
608
691
|
subject.apply_manifest( 'manifest', {:opt => 'value'} )
|
|
609
692
|
|
|
@@ -612,17 +695,17 @@ describe ClassMixedWithDSLHelpers do
|
|
|
612
695
|
|
|
613
696
|
describe '#stub_hosts_on' do
|
|
614
697
|
it 'executes puppet on the host passed and ensures it is reverted' do
|
|
615
|
-
subject.
|
|
698
|
+
allow( subject ).to receive( :hosts ).and_return( hosts )
|
|
616
699
|
logger = double.as_null_object
|
|
617
700
|
|
|
618
|
-
subject.
|
|
619
|
-
subject.
|
|
620
|
-
subject.
|
|
621
|
-
subject.
|
|
701
|
+
allow( subject ).to receive( :logger ).and_return( logger )
|
|
702
|
+
expect( subject ).to receive( :on ).twice
|
|
703
|
+
expect( subject ).to receive( :teardown ).and_yield
|
|
704
|
+
expect( subject ).to receive( :puppet ).once.
|
|
622
705
|
with( 'resource', 'host',
|
|
623
706
|
'puppetlabs.com',
|
|
624
707
|
'ensure=present', 'ip=127.0.0.1' )
|
|
625
|
-
subject.
|
|
708
|
+
expect( subject ).to receive( :puppet ).once.
|
|
626
709
|
with( 'resource', 'host',
|
|
627
710
|
'puppetlabs.com',
|
|
628
711
|
'ensure=absent' )
|
|
@@ -632,10 +715,10 @@ describe ClassMixedWithDSLHelpers do
|
|
|
632
715
|
end
|
|
633
716
|
|
|
634
717
|
describe "#stub_hosts" do
|
|
635
|
-
it "delegates to
|
|
636
|
-
subject.
|
|
718
|
+
it "delegates to stub_hosts_on with the default host" do
|
|
719
|
+
allow( subject ).to receive( :hosts ).and_return( hosts )
|
|
637
720
|
|
|
638
|
-
subject.
|
|
721
|
+
expect( subject ).to receive( :stub_hosts_on ).with( master, 'ipspec' ).once
|
|
639
722
|
|
|
640
723
|
subject.stub_hosts( 'ipspec' )
|
|
641
724
|
|
|
@@ -644,13 +727,13 @@ describe ClassMixedWithDSLHelpers do
|
|
|
644
727
|
|
|
645
728
|
describe '#stub_forge_on' do
|
|
646
729
|
it 'stubs forge.puppetlabs.com with the value of `forge`' do
|
|
647
|
-
subject.
|
|
730
|
+
allow( subject ).to receive( :hosts ).and_return( hosts )
|
|
648
731
|
host = make_host('my_host', {})
|
|
649
|
-
Resolv.
|
|
732
|
+
expect( Resolv ).to receive( :getaddress ).
|
|
650
733
|
with( 'my_forge.example.com' ).and_return( '127.0.0.1' )
|
|
651
|
-
subject.
|
|
734
|
+
expect( subject ).to receive( :stub_hosts_on ).
|
|
652
735
|
with( host, 'forge.puppetlabs.com' => '127.0.0.1' )
|
|
653
|
-
subject.
|
|
736
|
+
expect( subject ).to receive( :stub_hosts_on ).
|
|
654
737
|
with( host, 'forgeapi.puppetlabs.com' => '127.0.0.1' )
|
|
655
738
|
|
|
656
739
|
subject.stub_forge_on( host, 'my_forge.example.com' )
|
|
@@ -658,11 +741,11 @@ describe ClassMixedWithDSLHelpers do
|
|
|
658
741
|
end
|
|
659
742
|
|
|
660
743
|
describe "#stub_forge" do
|
|
661
|
-
it "delegates to
|
|
662
|
-
subject.
|
|
663
|
-
subject.
|
|
744
|
+
it "delegates to stub_forge_on with the default host" do
|
|
745
|
+
allow( subject ).to receive( :options ).and_return( {} )
|
|
746
|
+
allow( subject ).to receive( :hosts ).and_return( hosts )
|
|
664
747
|
|
|
665
|
-
subject.
|
|
748
|
+
expect( subject ).to receive( :stub_forge_on ).with( master, nil ).once
|
|
666
749
|
|
|
667
750
|
subject.stub_forge( )
|
|
668
751
|
|
|
@@ -700,7 +783,7 @@ describe ClassMixedWithDSLHelpers do
|
|
|
700
783
|
let( :result_fail ) { Beaker::Result.new( [], "" ) }
|
|
701
784
|
let( :result_pass ) { Beaker::Result.new( [], "" ) }
|
|
702
785
|
before :each do
|
|
703
|
-
subject.
|
|
786
|
+
allow( subject ).to receive( :sleep ).and_return( true )
|
|
704
787
|
result_fail.stdout = 'stdout'
|
|
705
788
|
result_fail.stderr = 'stderr'
|
|
706
789
|
result_fail.exit_code = 1
|
|
@@ -712,13 +795,13 @@ describe ClassMixedWithDSLHelpers do
|
|
|
712
795
|
it 'runs the pe-puppet on a system without pe-puppet-agent' do
|
|
713
796
|
vardir = '/var'
|
|
714
797
|
deb_agent = make_host( 'deb', :platform => 'debian-7-amd64' )
|
|
715
|
-
deb_agent.
|
|
798
|
+
allow( deb_agent ).to receive( :puppet ).and_return( { 'vardir' => vardir } )
|
|
716
799
|
|
|
717
|
-
subject.
|
|
718
|
-
subject.
|
|
719
|
-
subject.
|
|
720
|
-
subject.
|
|
721
|
-
subject.
|
|
800
|
+
allow( subject ).to receive( :hosts ).and_return( hosts )
|
|
801
|
+
expect( subject ).to receive( :on ).with( deb_agent, "[ -e '#{vardir}/state/agent_catalog_run.lock' ]", :acceptable_exit_codes => [0,1] ).once.and_return( result_fail )
|
|
802
|
+
expect( subject ).to receive( :on ).with( deb_agent, "[ -e /etc/init.d/pe-puppet-agent ]", :acceptable_exit_codes => [0,1] ).once.and_return( result_fail )
|
|
803
|
+
expect( subject ).to receive( :puppet_resource ).with( "service", "pe-puppet", "ensure=stopped").once
|
|
804
|
+
expect( subject ).to receive( :on ).once
|
|
722
805
|
|
|
723
806
|
subject.stop_agent_on( deb_agent )
|
|
724
807
|
|
|
@@ -727,13 +810,13 @@ describe ClassMixedWithDSLHelpers do
|
|
|
727
810
|
it 'runs the pe-puppet-agent on a unix system with pe-puppet-agent' do
|
|
728
811
|
vardir = '/var'
|
|
729
812
|
el_agent = make_host( 'el', :platform => 'el-5-x86_64' )
|
|
730
|
-
el_agent.
|
|
813
|
+
allow( el_agent ).to receive( :puppet ).and_return( { 'vardir' => vardir } )
|
|
731
814
|
|
|
732
|
-
subject.
|
|
733
|
-
subject.
|
|
734
|
-
subject.
|
|
735
|
-
subject.
|
|
736
|
-
subject.
|
|
815
|
+
allow( subject ).to receive( :hosts ).and_return( hosts )
|
|
816
|
+
expect( subject ).to receive( :on ).with( el_agent, "[ -e '#{vardir}/state/agent_catalog_run.lock' ]", :acceptable_exit_codes => [0,1] ).once.and_return( result_fail )
|
|
817
|
+
expect( subject ).to receive( :on ).with( el_agent, "[ -e /etc/init.d/pe-puppet-agent ]", :acceptable_exit_codes => [0,1] ).once.and_return( result_pass )
|
|
818
|
+
expect( subject ).to receive( :puppet_resource ).with("service", "pe-puppet-agent", "ensure=stopped").once
|
|
819
|
+
expect( subject ).to receive( :on ).once
|
|
737
820
|
|
|
738
821
|
subject.stop_agent_on( el_agent )
|
|
739
822
|
end
|
|
@@ -742,9 +825,9 @@ describe ClassMixedWithDSLHelpers do
|
|
|
742
825
|
|
|
743
826
|
describe "#stop_agent" do
|
|
744
827
|
it 'delegates to #stop_agent_on with default host' do
|
|
745
|
-
subject.
|
|
828
|
+
allow( subject ).to receive( :hosts ).and_return( hosts )
|
|
746
829
|
|
|
747
|
-
subject.
|
|
830
|
+
expect( subject ).to receive( :stop_agent_on ).with( master ).once
|
|
748
831
|
|
|
749
832
|
subject.stop_agent( )
|
|
750
833
|
|
|
@@ -753,35 +836,34 @@ describe ClassMixedWithDSLHelpers do
|
|
|
753
836
|
|
|
754
837
|
describe "#sign_certificate_for" do
|
|
755
838
|
it 'signs certs' do
|
|
756
|
-
subject.
|
|
839
|
+
allow( subject ).to receive( :sleep ).and_return( true )
|
|
757
840
|
|
|
758
841
|
result.stdout = "+ \"#{agent}\""
|
|
759
|
-
subject.
|
|
842
|
+
allow( subject ).to receive( :hosts ).and_return( hosts )
|
|
760
843
|
|
|
761
|
-
subject.
|
|
844
|
+
allow( subject ).to receive( :puppet ) do |arg|
|
|
762
845
|
arg
|
|
763
846
|
end
|
|
764
847
|
|
|
765
|
-
subject.
|
|
766
|
-
subject.
|
|
767
|
-
|
|
848
|
+
expect( subject ).to receive( :on ).with( master, "cert --sign --all --allow-dns-alt-names", :acceptable_exit_codes => [0,24]).once
|
|
849
|
+
expect( subject ).to receive( :on ).with( master, "cert --list --all").once.and_return( result )
|
|
768
850
|
|
|
769
851
|
subject.sign_certificate_for( agent )
|
|
770
852
|
end
|
|
771
853
|
|
|
772
854
|
it 'retries 11 times before quitting' do
|
|
773
|
-
subject.
|
|
855
|
+
allow( subject ).to receive( :sleep ).and_return( true )
|
|
774
856
|
|
|
775
857
|
result.stdout = " \"#{agent}\""
|
|
776
|
-
subject.
|
|
858
|
+
allow( subject ).to receive( :hosts ).and_return( hosts )
|
|
777
859
|
|
|
778
|
-
subject.
|
|
860
|
+
allow( subject ).to receive( :puppet ) do |arg|
|
|
779
861
|
arg
|
|
780
862
|
end
|
|
781
863
|
|
|
782
|
-
subject.
|
|
783
|
-
subject.
|
|
784
|
-
subject.
|
|
864
|
+
expect( subject ).to receive( :on ).with( master, "cert --sign --all --allow-dns-alt-names", :acceptable_exit_codes => [0,24]).exactly( 11 ).times
|
|
865
|
+
expect( subject ).to receive( :on ).with( master, "cert --list --all").exactly( 11 ).times.and_return( result )
|
|
866
|
+
expect( subject ).to receive( :fail_test ).once
|
|
785
867
|
|
|
786
868
|
subject.sign_certificate_for( agent )
|
|
787
869
|
end
|
|
@@ -790,9 +872,9 @@ describe ClassMixedWithDSLHelpers do
|
|
|
790
872
|
|
|
791
873
|
describe "#sign_certificate" do
|
|
792
874
|
it 'delegates to #sign_certificate_for with the default host' do
|
|
793
|
-
subject.
|
|
875
|
+
allow( subject ).to receive( :hosts ).and_return( hosts )
|
|
794
876
|
|
|
795
|
-
subject.
|
|
877
|
+
expect( subject ).to receive( :sign_certificate_for ).with( master ).once
|
|
796
878
|
|
|
797
879
|
subject.sign_certificate( )
|
|
798
880
|
end
|
|
@@ -813,14 +895,14 @@ describe ClassMixedWithDSLHelpers do
|
|
|
813
895
|
|
|
814
896
|
def stub_host_and_subject_to_allow_the_default_testdir_argument_to_be_created
|
|
815
897
|
subject.instance_variable_set(:@path, test_case_path)
|
|
816
|
-
host.
|
|
817
|
-
host.
|
|
818
|
-
subject.
|
|
898
|
+
allow( host ).to receive(:tmpdir).and_return(tmpdir_path)
|
|
899
|
+
allow( host ).to receive(:file_exist?).and_return(true)
|
|
900
|
+
allow( subject ).to receive( :options ).and_return( {} )
|
|
819
901
|
end
|
|
820
902
|
|
|
821
903
|
before do
|
|
822
904
|
stub_host_and_subject_to_allow_the_default_testdir_argument_to_be_created
|
|
823
|
-
subject.
|
|
905
|
+
allow( subject ).to receive(:curl_with_retries)
|
|
824
906
|
end
|
|
825
907
|
|
|
826
908
|
it "raises an ArgumentError if you try to submit a String instead of a Hash of options" do
|
|
@@ -828,7 +910,7 @@ describe ClassMixedWithDSLHelpers do
|
|
|
828
910
|
end
|
|
829
911
|
|
|
830
912
|
it 'raises the early_exception if backup_the_file fails' do
|
|
831
|
-
subject.
|
|
913
|
+
expect( subject ).to receive(:backup_the_file).and_raise(RuntimeError.new('puppet conf backup failed'))
|
|
832
914
|
expect {
|
|
833
915
|
subject.with_puppet_running_on(host, {})
|
|
834
916
|
}.to raise_error(RuntimeError, /puppet conf backup failed/)
|
|
@@ -859,30 +941,30 @@ describe ClassMixedWithDSLHelpers do
|
|
|
859
941
|
let(:logger) { double }
|
|
860
942
|
|
|
861
943
|
def stub_post_setup
|
|
862
|
-
subject.
|
|
863
|
-
subject.
|
|
864
|
-
subject.
|
|
865
|
-
subject.
|
|
866
|
-
subject.
|
|
867
|
-
subject.
|
|
868
|
-
subject.
|
|
869
|
-
subject.
|
|
870
|
-
subject.
|
|
871
|
-
logger.
|
|
872
|
-
logger.
|
|
944
|
+
allow( subject ).to receive( :restore_puppet_conf_from_backup)
|
|
945
|
+
allow( subject ).to receive( :bounce_service)
|
|
946
|
+
allow( subject ).to receive( :stop_puppet_from_source_on)
|
|
947
|
+
allow( subject ).to receive( :dump_puppet_log)
|
|
948
|
+
allow( subject ).to receive( :restore_puppet_conf_from_backup)
|
|
949
|
+
allow( subject ).to receive( :puppet_master_started)
|
|
950
|
+
allow( subject ).to receive( :start_puppet_from_source_on!)
|
|
951
|
+
allow( subject ).to receive( :lay_down_new_puppet_conf)
|
|
952
|
+
allow( subject ).to receive( :logger) .and_return( logger )
|
|
953
|
+
allow( logger ).to receive( :error)
|
|
954
|
+
allow( logger ).to receive( :debug)
|
|
873
955
|
end
|
|
874
956
|
|
|
875
957
|
before do
|
|
876
958
|
stub_post_setup
|
|
877
|
-
subject.
|
|
878
|
-
subject.
|
|
879
|
-
host.
|
|
959
|
+
allow( subject ).to receive( :options) .and_return( {:is_puppetserver => true})
|
|
960
|
+
allow( subject ).to receive( :modify_tk_config)
|
|
961
|
+
allow( host ).to receive(:puppet).with('master') .and_return({'confdir' => default_confdir,
|
|
880
962
|
'vardir' => default_vardir})
|
|
881
963
|
end
|
|
882
964
|
|
|
883
965
|
describe 'and command line args passed' do
|
|
884
966
|
it 'modifies SUT trapperkeeper configuration w/ command line args' do
|
|
885
|
-
subject.
|
|
967
|
+
expect( subject ).to receive( :modify_tk_config).with(host, puppetserver_conf,
|
|
886
968
|
custom_puppetserver_opts)
|
|
887
969
|
subject.with_puppet_running_on(host, conf_opts)
|
|
888
970
|
end
|
|
@@ -891,7 +973,7 @@ describe ClassMixedWithDSLHelpers do
|
|
|
891
973
|
describe 'and no command line args passed' do
|
|
892
974
|
let(:command_line_args) { nil }
|
|
893
975
|
it 'modifies SUT trapperkeeper configuration w/ puppet defaults' do
|
|
894
|
-
subject.
|
|
976
|
+
expect( subject ).to receive( :modify_tk_config).with(host, puppetserver_conf,
|
|
895
977
|
default_puppetserver_opts)
|
|
896
978
|
subject.with_puppet_running_on(host, conf_opts)
|
|
897
979
|
end
|
|
@@ -900,7 +982,7 @@ describe ClassMixedWithDSLHelpers do
|
|
|
900
982
|
|
|
901
983
|
describe "with valid arguments" do
|
|
902
984
|
before do
|
|
903
|
-
Tempfile.
|
|
985
|
+
expect( Tempfile ).to receive(:open).with('beaker')
|
|
904
986
|
end
|
|
905
987
|
|
|
906
988
|
context 'for pe hosts' do
|
|
@@ -915,7 +997,7 @@ describe ClassMixedWithDSLHelpers do
|
|
|
915
997
|
|
|
916
998
|
it 'yields to a block after bouncing service' do
|
|
917
999
|
execution = 0
|
|
918
|
-
subject.
|
|
1000
|
+
allow( subject ).to receive(:curl_with_retries)
|
|
919
1001
|
expect do
|
|
920
1002
|
subject.with_puppet_running_on(host, {}) do
|
|
921
1003
|
expect(host).to execute_commands_matching(/puppet resource service #{host['puppetservice']}.*ensure=running/).exactly(1).times
|
|
@@ -934,14 +1016,14 @@ describe ClassMixedWithDSLHelpers do
|
|
|
934
1016
|
end
|
|
935
1017
|
|
|
936
1018
|
it 'bounces puppet twice' do
|
|
937
|
-
subject.
|
|
1019
|
+
allow( subject ).to receive(:curl_with_retries)
|
|
938
1020
|
subject.with_puppet_running_on(host, {})
|
|
939
1021
|
expect(host).to execute_commands_matching(/apache2ctl graceful/).exactly(2).times
|
|
940
1022
|
end
|
|
941
1023
|
|
|
942
1024
|
it 'yields to a block after bouncing service' do
|
|
943
1025
|
execution = 0
|
|
944
|
-
subject.
|
|
1026
|
+
allow( subject ).to receive(:curl_with_retries)
|
|
945
1027
|
expect do
|
|
946
1028
|
subject.with_puppet_running_on(host, {}) do
|
|
947
1029
|
expect(host).to execute_commands_matching(/apache2ctl graceful/).once
|
|
@@ -956,7 +1038,7 @@ describe ClassMixedWithDSLHelpers do
|
|
|
956
1038
|
let(:use_service) { true }
|
|
957
1039
|
|
|
958
1040
|
it 'stops and starts master using service scripts' do
|
|
959
|
-
subject.
|
|
1041
|
+
allow( subject ).to receive(:curl_with_retries)
|
|
960
1042
|
subject.with_puppet_running_on(host, {})
|
|
961
1043
|
expect(host).to execute_commands_matching(/puppet resource service #{host['puppetservice']}.*ensure=running/).exactly(2).times
|
|
962
1044
|
expect(host).to execute_commands_matching(/puppet resource service #{host['puppetservice']}.*ensure=stopped/).exactly(2).times
|
|
@@ -980,15 +1062,15 @@ describe ClassMixedWithDSLHelpers do
|
|
|
980
1062
|
let('use-service') { false }
|
|
981
1063
|
|
|
982
1064
|
it 'does not try to stop if not started' do
|
|
983
|
-
subject.
|
|
984
|
-
subject.
|
|
1065
|
+
expect( subject ).to receive(:start_puppet_from_source_on!).and_return false
|
|
1066
|
+
expect( subject ).to_not receive(:stop_puppet_from_source_on)
|
|
985
1067
|
|
|
986
1068
|
subject.with_puppet_running_on(host, {})
|
|
987
1069
|
end
|
|
988
1070
|
|
|
989
1071
|
context 'successfully' do
|
|
990
1072
|
before do
|
|
991
|
-
host.
|
|
1073
|
+
expect( host ).to receive(:port_open?).with(8140).and_return(true)
|
|
992
1074
|
end
|
|
993
1075
|
|
|
994
1076
|
it 'starts puppet from source' do
|
|
@@ -1044,7 +1126,7 @@ describe ClassMixedWithDSLHelpers do
|
|
|
1044
1126
|
|
|
1045
1127
|
context 'when a puppetservice is not used' do
|
|
1046
1128
|
before do
|
|
1047
|
-
host.
|
|
1129
|
+
expect( host ).to receive(:port_open?).with(8140).and_return(true)
|
|
1048
1130
|
end
|
|
1049
1131
|
|
|
1050
1132
|
it 'backs up puppet.conf' do
|
|
@@ -1060,7 +1142,7 @@ describe ClassMixedWithDSLHelpers do
|
|
|
1060
1142
|
end
|
|
1061
1143
|
|
|
1062
1144
|
it "doesn't restore a non-existent file" do
|
|
1063
|
-
subject.
|
|
1145
|
+
allow( subject ).to receive(:backup_the_file)
|
|
1064
1146
|
subject.with_puppet_running_on(host, {})
|
|
1065
1147
|
expect(host).to execute_commands_matching(/rm -f '#{original_location}'/)
|
|
1066
1148
|
end
|
|
@@ -1068,14 +1150,17 @@ describe ClassMixedWithDSLHelpers do
|
|
|
1068
1150
|
end
|
|
1069
1151
|
|
|
1070
1152
|
describe 'handling failures' do
|
|
1153
|
+
|
|
1154
|
+
let(:logger) { double.as_null_object }
|
|
1071
1155
|
before do
|
|
1072
|
-
subject.
|
|
1156
|
+
allow( subject ).to receive( :logger ).and_return( logger )
|
|
1157
|
+
expect( subject ).to receive(:stop_puppet_from_source_on).and_raise(RuntimeError.new('Also failed in teardown.'))
|
|
1073
1158
|
end
|
|
1074
1159
|
|
|
1075
1160
|
it 'does not swallow an exception raised from within test block if ensure block also fails' do
|
|
1076
|
-
host.
|
|
1161
|
+
expect( host ).to receive(:port_open?).with(8140).and_return(true)
|
|
1077
1162
|
|
|
1078
|
-
subject.logger.
|
|
1163
|
+
expect( subject.logger ).to receive(:error).with(/Raised during attempt to teardown.*Also failed in teardown/)
|
|
1079
1164
|
|
|
1080
1165
|
expect do
|
|
1081
1166
|
subject.with_puppet_running_on(host, {}) { raise 'Failed while yielding.' }
|
|
@@ -1083,9 +1168,9 @@ describe ClassMixedWithDSLHelpers do
|
|
|
1083
1168
|
end
|
|
1084
1169
|
|
|
1085
1170
|
it 'dumps the puppet logs if there is an error in the teardown' do
|
|
1086
|
-
host.
|
|
1171
|
+
expect( host ).to receive(:port_open?).with(8140).and_return(true)
|
|
1087
1172
|
|
|
1088
|
-
subject.logger.
|
|
1173
|
+
expect( subject.logger ).to receive(:notify).with(/Dumping master log/)
|
|
1089
1174
|
|
|
1090
1175
|
expect do
|
|
1091
1176
|
subject.with_puppet_running_on(host, {})
|
|
@@ -1093,9 +1178,9 @@ describe ClassMixedWithDSLHelpers do
|
|
|
1093
1178
|
end
|
|
1094
1179
|
|
|
1095
1180
|
it 'does not mask the teardown error with an error from dumping the logs' do
|
|
1096
|
-
host.
|
|
1181
|
+
expect( host ).to receive(:port_open?).with(8140).and_return(true)
|
|
1097
1182
|
|
|
1098
|
-
subject.logger.
|
|
1183
|
+
expect( subject.logger ).to receive(:notify).with(/Dumping master log/).and_raise("Error from dumping logs")
|
|
1099
1184
|
|
|
1100
1185
|
expect do
|
|
1101
1186
|
subject.with_puppet_running_on(host, {})
|
|
@@ -1103,8 +1188,8 @@ describe ClassMixedWithDSLHelpers do
|
|
|
1103
1188
|
end
|
|
1104
1189
|
|
|
1105
1190
|
it 'does not swallow a teardown exception if no earlier exception was raised' do
|
|
1106
|
-
host.
|
|
1107
|
-
subject.logger.
|
|
1191
|
+
expect( host ).to receive(:port_open?).with(8140).and_return(true)
|
|
1192
|
+
expect( subject.logger).to_not receive(:error)
|
|
1108
1193
|
expect do
|
|
1109
1194
|
subject.with_puppet_running_on(host, {})
|
|
1110
1195
|
end.to raise_error(RuntimeError, 'Also failed in teardown.')
|
|
@@ -1115,9 +1200,9 @@ describe ClassMixedWithDSLHelpers do
|
|
|
1115
1200
|
|
|
1116
1201
|
describe '#with_puppet_running' do
|
|
1117
1202
|
it 'delegates to #with_puppet_running_on with the default host' do
|
|
1118
|
-
subject.
|
|
1203
|
+
allow( subject ).to receive( :hosts ).and_return( hosts )
|
|
1119
1204
|
|
|
1120
|
-
subject.
|
|
1205
|
+
expect( subject ).to receive( :with_puppet_running_on ).with( master, {:opt => 'value'}, '/dir').once
|
|
1121
1206
|
|
|
1122
1207
|
subject.with_puppet_running( {:opt => 'value'}, '/dir' )
|
|
1123
1208
|
|
|
@@ -1128,18 +1213,18 @@ describe ClassMixedWithDSLHelpers do
|
|
|
1128
1213
|
describe '#fact_on' do
|
|
1129
1214
|
it 'retrieves a fact on a single host' do
|
|
1130
1215
|
result.stdout = "family\n"
|
|
1131
|
-
subject.
|
|
1132
|
-
subject.
|
|
1216
|
+
expect( subject ).to receive(:facter).with('osfamily',{}).once
|
|
1217
|
+
expect( subject ).to receive(:on).and_return(result)
|
|
1133
1218
|
|
|
1134
1219
|
expect( subject.fact_on('host','osfamily') ).to be === result.stdout.chomp
|
|
1135
1220
|
end
|
|
1136
1221
|
|
|
1137
1222
|
it 'retrieves an array of facts from multiple hosts' do
|
|
1138
|
-
subject.
|
|
1223
|
+
allow( subject ).to receive( :hosts ).and_return( hosts )
|
|
1139
1224
|
times = hosts.length
|
|
1140
1225
|
result.stdout = "family\n"
|
|
1141
1226
|
hosts.each do |host|
|
|
1142
|
-
host.
|
|
1227
|
+
expect( host ).to receive(:exec).and_return(result)
|
|
1143
1228
|
end
|
|
1144
1229
|
|
|
1145
1230
|
expect( subject.fact_on(hosts,'osfamily') ).to be === [result.stdout.chomp] * hosts.length
|
|
@@ -1149,8 +1234,8 @@ describe ClassMixedWithDSLHelpers do
|
|
|
1149
1234
|
|
|
1150
1235
|
describe '#fact' do
|
|
1151
1236
|
it 'delegates to #fact_on with the default host' do
|
|
1152
|
-
subject.
|
|
1153
|
-
subject.
|
|
1237
|
+
allow( subject ).to receive(:hosts).and_return(hosts)
|
|
1238
|
+
expect( subject ).to receive(:fact_on).with(master,"osfamily",{}).once
|
|
1154
1239
|
|
|
1155
1240
|
subject.fact('osfamily')
|
|
1156
1241
|
end
|
|
@@ -1165,15 +1250,15 @@ describe ClassMixedWithDSLHelpers do
|
|
|
1165
1250
|
|
|
1166
1251
|
shared_examples 'modify-tk-config-without-error' do
|
|
1167
1252
|
it 'dumps to the SUT config file path' do
|
|
1168
|
-
JSON.
|
|
1169
|
-
subject.
|
|
1253
|
+
allow( JSON ).to receive(:dump)
|
|
1254
|
+
allow( subject ).to receive(:create_remote_file).with(host, config_file_path, anything())
|
|
1170
1255
|
subject.modify_tk_config(host, config_file_path, options_hash, replace)
|
|
1171
1256
|
end
|
|
1172
1257
|
end
|
|
1173
1258
|
|
|
1174
1259
|
before do
|
|
1175
|
-
host.
|
|
1176
|
-
host.
|
|
1260
|
+
allow( host ).to receive(:file_exist?).with(invalid_config_file_path).and_return(false)
|
|
1261
|
+
allow( host ).to receive(:file_exist?).with(config_file_path).and_return(true)
|
|
1177
1262
|
end
|
|
1178
1263
|
|
|
1179
1264
|
describe 'if file does not exist on SUT' do
|
|
@@ -1195,15 +1280,15 @@ describe ClassMixedWithDSLHelpers do
|
|
|
1195
1280
|
describe 'given a false value to its `replace` parameter' do
|
|
1196
1281
|
let(:replace) { false }
|
|
1197
1282
|
before do
|
|
1198
|
-
subject.
|
|
1283
|
+
expect( subject ).to receive(:read_tk_config_string).with(anything())
|
|
1199
1284
|
end
|
|
1200
1285
|
include_examples('modify-tk-config-without-error')
|
|
1201
1286
|
end
|
|
1202
1287
|
|
|
1203
1288
|
describe 'given a true value to its `replace` parameter' do
|
|
1204
1289
|
before do
|
|
1205
|
-
JSON.
|
|
1206
|
-
subject.
|
|
1290
|
+
expect( JSON ).to receive(:dump)
|
|
1291
|
+
expect( subject ).to receive(:create_remote_file).with(host, config_file_path, anything())
|
|
1207
1292
|
end
|
|
1208
1293
|
include_examples('modify-tk-config-without-error')
|
|
1209
1294
|
end
|