beaker 2.7.1 → 2.8.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/HISTORY.md +121 -2
- data/lib/beaker/dsl.rb +2 -2
- data/lib/beaker/dsl/helpers.rb +13 -1429
- data/lib/beaker/dsl/helpers/facter_helpers.rb +48 -0
- data/lib/beaker/dsl/helpers/hiera_helpers.rb +71 -0
- data/lib/beaker/dsl/helpers/host_helpers.rb +506 -0
- data/lib/beaker/dsl/helpers/puppet_helpers.rb +698 -0
- data/lib/beaker/dsl/helpers/tk_helpers.rb +101 -0
- data/lib/beaker/dsl/helpers/web_helpers.rb +115 -0
- data/lib/beaker/dsl/install_utils.rb +8 -1570
- data/lib/beaker/dsl/install_utils/ezbake_utils.rb +256 -0
- data/lib/beaker/dsl/install_utils/module_utils.rb +237 -0
- data/lib/beaker/dsl/install_utils/pe_utils.rb +518 -0
- data/lib/beaker/dsl/install_utils/puppet_utils.rb +722 -0
- data/lib/beaker/dsl/outcomes.rb +0 -4
- data/lib/beaker/dsl/roles.rb +0 -3
- data/lib/beaker/dsl/structure.rb +127 -4
- data/lib/beaker/dsl/wrappers.rb +0 -4
- data/lib/beaker/host.rb +23 -0
- data/lib/beaker/host/unix/pkg.rb +4 -4
- data/lib/beaker/host_prebuilt_steps.rb +11 -5
- data/lib/beaker/hypervisor/vagrant.rb +1 -0
- data/lib/beaker/hypervisor/vmpooler.rb +38 -0
- data/lib/beaker/logger.rb +10 -4
- data/lib/beaker/network_manager.rb +5 -4
- data/lib/beaker/options/command_line_parser.rb +7 -0
- data/lib/beaker/shared.rb +2 -1
- data/lib/beaker/shared/semvar.rb +41 -0
- data/lib/beaker/test_suite.rb +20 -6
- data/lib/beaker/version.rb +1 -1
- data/spec/beaker/dsl/helpers/facter_helpers_spec.rb +59 -0
- data/spec/beaker/dsl/helpers/hiera_helpers_spec.rb +96 -0
- data/spec/beaker/dsl/helpers/host_helpers_spec.rb +413 -0
- data/spec/beaker/dsl/{helpers_spec.rb → helpers/puppet_helpers_spec.rb} +2 -611
- data/spec/beaker/dsl/helpers/tk_helpers_spec.rb +83 -0
- data/spec/beaker/dsl/helpers/web_helpers_spec.rb +60 -0
- data/spec/beaker/dsl/install_utils/module_utils_spec.rb +241 -0
- data/spec/beaker/dsl/install_utils/pe_utils_spec.rb +475 -0
- data/spec/beaker/dsl/install_utils/puppet_utils_spec.rb +523 -0
- data/spec/beaker/dsl/structure_spec.rb +108 -0
- data/spec/beaker/host_prebuilt_steps_spec.rb +44 -0
- data/spec/beaker/host_spec.rb +41 -0
- data/spec/beaker/hypervisor/vagrant_spec.rb +2 -1
- data/spec/beaker/logger_spec.rb +9 -2
- data/spec/beaker/network_manager_spec.rb +7 -1
- data/spec/beaker/options/command_line_parser_spec.rb +3 -2
- data/spec/beaker/shared/semvar_spec.rb +36 -0
- data/spec/beaker/test_suite_spec.rb +48 -0
- data/spec/mocks.rb +10 -0
- metadata +23 -5
- data/lib/beaker/dsl/ezbake_utils.rb +0 -259
- data/spec/beaker/dsl/install_utils_spec.rb +0 -1242
@@ -0,0 +1,83 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
class ClassMixedWithDSLHelpers
|
4
|
+
include Beaker::DSL::Helpers
|
5
|
+
include Beaker::DSL::Wrappers
|
6
|
+
include Beaker::DSL::Roles
|
7
|
+
include Beaker::DSL::Patterns
|
8
|
+
|
9
|
+
def logger
|
10
|
+
RSpec::Mocks::Double.new('logger').as_null_object
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
|
+
|
15
|
+
describe ClassMixedWithDSLHelpers do
|
16
|
+
let( :opts ) { Beaker::Options::Presets.env_vars }
|
17
|
+
let( :command ){ 'ls' }
|
18
|
+
let( :host ) { double.as_null_object }
|
19
|
+
let( :result ) { Beaker::Result.new( host, command ) }
|
20
|
+
|
21
|
+
let( :master ) { make_host( 'master', :roles => %w( master agent default) ) }
|
22
|
+
let( :agent ) { make_host( 'agent', :roles => %w( agent ) ) }
|
23
|
+
let( :custom ) { make_host( 'custom', :roles => %w( custom agent ) ) }
|
24
|
+
let( :dash ) { make_host( 'console', :roles => %w( dashboard agent ) ) }
|
25
|
+
let( :db ) { make_host( 'db', :roles => %w( database agent ) ) }
|
26
|
+
let( :hosts ) { [ master, agent, dash, db, custom ] }
|
27
|
+
|
28
|
+
|
29
|
+
describe 'modify_tk_config' do
|
30
|
+
let(:host) { double.as_null_object }
|
31
|
+
let(:config_file_path) { 'existing-file-path'}
|
32
|
+
let(:invalid_config_file_path) { 'nonexisting-file-path'}
|
33
|
+
let(:options_hash) { {:key => 'value'} }
|
34
|
+
let(:replace) { true }
|
35
|
+
|
36
|
+
shared_examples 'modify-tk-config-without-error' do
|
37
|
+
it 'dumps to the SUT config file path' do
|
38
|
+
allow( JSON ).to receive(:dump)
|
39
|
+
allow( subject ).to receive(:create_remote_file).with(host, config_file_path, anything())
|
40
|
+
subject.modify_tk_config(host, config_file_path, options_hash, replace)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
before do
|
45
|
+
allow( host ).to receive(:file_exist?).with(invalid_config_file_path).and_return(false)
|
46
|
+
allow( host ).to receive(:file_exist?).with(config_file_path).and_return(true)
|
47
|
+
end
|
48
|
+
|
49
|
+
describe 'if file does not exist on SUT' do
|
50
|
+
it 'raises Runtime error' do
|
51
|
+
expect do
|
52
|
+
subject.modify_tk_config(host, invalid_config_file_path, options_hash)
|
53
|
+
end.to raise_error(RuntimeError, /.* does not exist on .*/)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
describe 'given an empty options hash' do
|
58
|
+
it 'returns nil' do
|
59
|
+
expect(subject.modify_tk_config(host, 'blahblah', {})).to eq(nil)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
describe 'given a non-empty options hash' do
|
64
|
+
|
65
|
+
describe 'given a false value to its `replace` parameter' do
|
66
|
+
let(:replace) { false }
|
67
|
+
before do
|
68
|
+
expect( subject ).to receive(:read_tk_config_string).with(anything())
|
69
|
+
end
|
70
|
+
include_examples('modify-tk-config-without-error')
|
71
|
+
end
|
72
|
+
|
73
|
+
describe 'given a true value to its `replace` parameter' do
|
74
|
+
before do
|
75
|
+
expect( JSON ).to receive(:dump)
|
76
|
+
expect( subject ).to receive(:create_remote_file).with(host, config_file_path, anything())
|
77
|
+
end
|
78
|
+
include_examples('modify-tk-config-without-error')
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
class ClassMixedWithDSLHelpers
|
4
|
+
include Beaker::DSL::Helpers
|
5
|
+
include Beaker::DSL::Wrappers
|
6
|
+
include Beaker::DSL::Roles
|
7
|
+
include Beaker::DSL::Patterns
|
8
|
+
|
9
|
+
def logger
|
10
|
+
RSpec::Mocks::Double.new('logger').as_null_object
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
|
+
|
15
|
+
describe ClassMixedWithDSLHelpers do
|
16
|
+
|
17
|
+
def fetch_allows
|
18
|
+
allow(subject).to receive( :logger ) { logger }
|
19
|
+
end
|
20
|
+
|
21
|
+
describe "#fetch_http_file" do
|
22
|
+
let( :logger) { double("Beaker::Logger", :notify => nil , :debug => nil ) }
|
23
|
+
|
24
|
+
before do
|
25
|
+
fetch_allows
|
26
|
+
end
|
27
|
+
|
28
|
+
describe "given valid arguments" do
|
29
|
+
|
30
|
+
it "returns its second and third arguments concatenated." do
|
31
|
+
create_files(['destdir/name'])
|
32
|
+
result = subject.fetch_http_file "http://beaker.tool/", "name", "destdir"
|
33
|
+
expect(result).to eq("destdir/name")
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
describe "#fetch_http_dir" do
|
41
|
+
let( :logger) { double("Beaker::Logger", :notify => nil , :debug => nil ) }
|
42
|
+
let( :result) { double(:each_line => []) }
|
43
|
+
|
44
|
+
before do
|
45
|
+
fetch_allows
|
46
|
+
end
|
47
|
+
|
48
|
+
describe "given valid arguments" do
|
49
|
+
|
50
|
+
it "returns basename of first argument concatenated to second." do
|
51
|
+
expect(subject).to receive(:`).with(/^wget.*/).ordered { result }
|
52
|
+
expect($?).to receive(:to_i).and_return(0)
|
53
|
+
result = subject.fetch_http_dir "http://beaker.tool/beep", "destdir"
|
54
|
+
expect(result).to eq("destdir/beep")
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,241 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
class ClassMixedWithDSLInstallUtils
|
4
|
+
include Beaker::DSL::InstallUtils
|
5
|
+
include Beaker::DSL::Wrappers
|
6
|
+
include Beaker::DSL::Helpers
|
7
|
+
include Beaker::DSL::Structure
|
8
|
+
include Beaker::DSL::Roles
|
9
|
+
include Beaker::DSL::Patterns
|
10
|
+
|
11
|
+
def logger
|
12
|
+
@logger ||= RSpec::Mocks::Double.new('logger').as_null_object
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
describe ClassMixedWithDSLInstallUtils do
|
17
|
+
let(:presets) { Beaker::Options::Presets.new }
|
18
|
+
let(:opts) { presets.presets.merge(presets.env_vars) }
|
19
|
+
let(:basic_hosts) { make_hosts( { :pe_ver => '3.0',
|
20
|
+
:platform => 'linux',
|
21
|
+
:roles => [ 'agent' ] }, 4 ) }
|
22
|
+
let(:hosts) { basic_hosts[0][:roles] = ['master', 'database', 'dashboard']
|
23
|
+
basic_hosts[1][:platform] = 'windows'
|
24
|
+
basic_hosts[2][:platform] = 'osx-10.9-x86_64'
|
25
|
+
basic_hosts[3][:platform] = 'eos'
|
26
|
+
basic_hosts }
|
27
|
+
let(:hosts_sorted) { [ hosts[1], hosts[0], hosts[2], hosts[3] ] }
|
28
|
+
|
29
|
+
|
30
|
+
|
31
|
+
describe '#install_dev_puppet_module_on' do
|
32
|
+
context 'having set allow( a ).to receive forge' do
|
33
|
+
it 'stubs the forge on the host' do
|
34
|
+
master = hosts.first
|
35
|
+
allow( subject ).to receive( :options ).and_return( {:forge_host => 'ahost.com'} )
|
36
|
+
|
37
|
+
expect( subject ).to receive( :with_forge_stubbed_on )
|
38
|
+
|
39
|
+
subject.install_dev_puppet_module_on( master, {:source => '/module', :module_name => 'test'} )
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'installs via #install_puppet_module_via_pmt' do
|
43
|
+
master = hosts.first
|
44
|
+
allow( subject ).to receive( :options ).and_return( {:forge_host => 'ahost.com'} )
|
45
|
+
allow( subject ).to receive( :with_forge_stubbed_on ).and_yield
|
46
|
+
|
47
|
+
expect( subject ).to receive( :install_puppet_module_via_pmt_on )
|
48
|
+
|
49
|
+
subject.install_dev_puppet_module_on( master, {:source => '/module', :module_name => 'test'} )
|
50
|
+
end
|
51
|
+
end
|
52
|
+
context 'without allow( a ).to receive forge (default)' do
|
53
|
+
it 'calls copy_module_to to get the module on the SUT' do
|
54
|
+
master = hosts.first
|
55
|
+
allow( subject ).to receive( :options ).and_return( {} )
|
56
|
+
|
57
|
+
expect( subject ).to receive( :copy_module_to )
|
58
|
+
|
59
|
+
subject.install_dev_puppet_module_on( master, {:source => '/module', :module_name => 'test'} )
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
describe '#install_dev_puppet_module' do
|
65
|
+
it 'delegates to #install_dev_puppet_module_on with the hosts list' do
|
66
|
+
allow( subject ).to receive( :hosts ).and_return( hosts )
|
67
|
+
allow( subject ).to receive( :options ).and_return( {} )
|
68
|
+
|
69
|
+
hosts.each do |host|
|
70
|
+
expect( subject ).to receive( :install_dev_puppet_module_on ).
|
71
|
+
with( host, {:source => '/module', :module_name => 'test'})
|
72
|
+
end
|
73
|
+
|
74
|
+
subject.install_dev_puppet_module( {:source => '/module', :module_name => 'test'} )
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
describe '#install_puppet_module_via_pmt_on' do
|
79
|
+
it 'installs module via puppet module tool' do
|
80
|
+
allow( subject ).to receive( :hosts ).and_return( hosts )
|
81
|
+
master = hosts.first
|
82
|
+
|
83
|
+
|
84
|
+
expect( subject ).to receive( :puppet ).with('module install test ', {}).once
|
85
|
+
|
86
|
+
subject.install_puppet_module_via_pmt_on( master, {:module_name => 'test'} )
|
87
|
+
end
|
88
|
+
|
89
|
+
it 'takes the trace option and passes it down correctly' do
|
90
|
+
allow( subject ).to receive( :hosts ).and_return( hosts )
|
91
|
+
master = hosts.first
|
92
|
+
trace_opts = { :trace => nil }
|
93
|
+
master['default_module_install_opts'] = trace_opts
|
94
|
+
|
95
|
+
expect( subject ).to receive( :puppet ).with('module install test ', trace_opts).once
|
96
|
+
|
97
|
+
subject.install_puppet_module_via_pmt_on( master, {:module_name => 'test'} )
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
describe '#install_puppet_module_via_pmt' do
|
102
|
+
it 'delegates to #install_puppet_module_via_pmt with the hosts list' do
|
103
|
+
allow( subject ).to receive( :hosts ).and_return( hosts )
|
104
|
+
|
105
|
+
expect( subject ).to receive( :install_puppet_module_via_pmt_on ).with( hosts, {:source => '/module', :module_name => 'test'}).once
|
106
|
+
|
107
|
+
subject.install_puppet_module_via_pmt( {:source => '/module', :module_name => 'test'} )
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
describe 'copy_module_to' do
|
112
|
+
let(:ignore_list) { Beaker::DSL::InstallUtils::ModuleUtils::PUPPET_MODULE_INSTALL_IGNORE }
|
113
|
+
let(:source){ File.expand_path('./')}
|
114
|
+
let(:target){'/etc/puppetlabs/puppet/modules/testmodule'}
|
115
|
+
let(:module_parse_name){'testmodule'}
|
116
|
+
|
117
|
+
shared_examples 'copy_module_to' do |opts|
|
118
|
+
it{
|
119
|
+
host = double("host")
|
120
|
+
allow( host ).to receive(:[]).with('distmoduledir').and_return('/etc/puppetlabs/puppet/modules')
|
121
|
+
result = double
|
122
|
+
stdout = target.split('/')[0..-2].join('/') + "\n"
|
123
|
+
allow( result ).to receive(:stdout).and_return( stdout )
|
124
|
+
expect( subject ).to receive(:on).with(host, "echo #{File.dirname(target)}" ).and_return(result )
|
125
|
+
allow( Dir ).to receive(:getpwd).and_return(source)
|
126
|
+
|
127
|
+
allow( subject ).to receive(:parse_for_moduleroot).and_return(source)
|
128
|
+
if module_parse_name
|
129
|
+
allow( subject ).to receive(:parse_for_modulename).with(any_args()).and_return(module_parse_name)
|
130
|
+
else
|
131
|
+
expect( subject).to_not receive(:parse_for_modulename)
|
132
|
+
end
|
133
|
+
|
134
|
+
allow( File ).to receive(:exists?).with(any_args()).and_return(false)
|
135
|
+
allow( File ).to receive(:directory?).with(any_args()).and_return(false)
|
136
|
+
|
137
|
+
expect( subject ).to receive(:scp_to).with(host,source, File.dirname(target), {:ignore => ignore_list})
|
138
|
+
expect( subject ).to receive(:on).with(host, "mv #{File.join(File.dirname(target), File.basename(source))} #{target}")
|
139
|
+
if opts.nil?
|
140
|
+
subject.copy_module_to(host)
|
141
|
+
else
|
142
|
+
subject.copy_module_to(host,opts)
|
143
|
+
end
|
144
|
+
}
|
145
|
+
end
|
146
|
+
|
147
|
+
describe 'should call scp with the correct info, with only providing host' do
|
148
|
+
let(:target){'/etc/puppetlabs/puppet/modules/testmodule'}
|
149
|
+
|
150
|
+
it_should_behave_like 'copy_module_to', :module_name => 'testmodule'
|
151
|
+
end
|
152
|
+
|
153
|
+
describe 'should call scp with the correct info, when specifying the modulename' do
|
154
|
+
let(:target){'/etc/puppetlabs/puppet/modules/bogusmodule'}
|
155
|
+
let(:module_parse_name){false}
|
156
|
+
it_should_behave_like 'copy_module_to', {:module_name =>'bogusmodule'}
|
157
|
+
end
|
158
|
+
|
159
|
+
describe 'should call scp with the correct info, when specifying the target to a different path' do
|
160
|
+
target = '/opt/shared/puppet/modules'
|
161
|
+
let(:target){"#{target}/testmodule"}
|
162
|
+
it_should_behave_like 'copy_module_to', {:target_module_path => target, :module_name => 'testmodule'}
|
163
|
+
end
|
164
|
+
|
165
|
+
describe 'should accept multiple hosts when' do
|
166
|
+
it 'used in a default manner' do
|
167
|
+
allow( subject ).to receive( :build_ignore_list ).and_return( [] )
|
168
|
+
allow( subject ).to receive( :parse_for_modulename ).and_return( [nil, 'modulename'] )
|
169
|
+
allow( subject ).to receive( :on ).and_return( double.as_null_object )
|
170
|
+
hosts = [{}, {}]
|
171
|
+
|
172
|
+
expect( subject ).to receive( :scp_to ).twice
|
173
|
+
subject.copy_module_to( hosts )
|
174
|
+
end
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
describe 'split_author_modulename' do
|
179
|
+
it 'should return a correct modulename' do
|
180
|
+
result = subject.split_author_modulename('myname-test_43_module')
|
181
|
+
expect(result[:author]).to eq('myname')
|
182
|
+
expect(result[:module]).to eq('test_43_module')
|
183
|
+
end
|
184
|
+
end
|
185
|
+
|
186
|
+
describe 'get_module_name' do
|
187
|
+
it 'should return an array of author and modulename' do
|
188
|
+
expect(subject.get_module_name('myname-test_43_module')).to eq(['myname', 'test_43_module'])
|
189
|
+
end
|
190
|
+
it 'should return nil for invalid names' do
|
191
|
+
expect(subject.get_module_name('myname-')).to eq(nil)
|
192
|
+
end
|
193
|
+
end
|
194
|
+
|
195
|
+
describe 'parse_for_modulename' do
|
196
|
+
directory = '/testfilepath/myname-testmodule'
|
197
|
+
it 'should return name from metadata.json' do
|
198
|
+
allow( File ).to receive(:exists?).with("#{directory}/metadata.json").and_return(true)
|
199
|
+
allow( File ).to receive(:read).with("#{directory}/metadata.json").and_return(" {\"name\":\"myname-testmodule\"} ")
|
200
|
+
expect( subject.logger ).to receive(:debug).with("Attempting to parse Modulename from metadata.json")
|
201
|
+
expect(subject.logger).to_not receive(:debug).with('Unable to determine name, returning null')
|
202
|
+
expect(subject.parse_for_modulename(directory)).to eq(['myname', 'testmodule'])
|
203
|
+
end
|
204
|
+
it 'should return name from Modulefile' do
|
205
|
+
allow( File ).to receive(:exists?).with("#{directory}/metadata.json").and_return(false)
|
206
|
+
allow( File ).to receive(:exists?).with("#{directory}/Modulefile").and_return(true)
|
207
|
+
allow( File ).to receive(:read).with("#{directory}/Modulefile").and_return("name 'myname-testmodule' \nauthor 'myname'")
|
208
|
+
expect( subject.logger ).to receive(:debug).with("Attempting to parse Modulename from Modulefile")
|
209
|
+
expect(subject.logger).to_not receive(:debug).with("Unable to determine name, returning null")
|
210
|
+
expect(subject.parse_for_modulename(directory)).to eq(['myname', 'testmodule'])
|
211
|
+
end
|
212
|
+
end
|
213
|
+
|
214
|
+
describe 'parse_for_module_root' do
|
215
|
+
directory = '/testfilepath/myname-testmodule'
|
216
|
+
describe 'stops searching when either' do
|
217
|
+
it 'finds a Modulefile' do
|
218
|
+
allow( File ).to receive(:exists?).and_return(false)
|
219
|
+
allow( File ).to receive(:exists?).with("#{directory}/Modulefile").and_return(true)
|
220
|
+
|
221
|
+
expect( subject.logger ).to_not receive(:debug).with("At root, can't parse for another directory")
|
222
|
+
expect( subject.logger ).to receive(:debug).with("No Modulefile or metadata.json found at #{directory}/acceptance, moving up")
|
223
|
+
expect(subject.parse_for_moduleroot("#{directory}/acceptance")).to eq(directory)
|
224
|
+
end
|
225
|
+
it 'finds a metadata.json file' do
|
226
|
+
allow( File ).to receive(:exists?).and_return(false)
|
227
|
+
allow( File ).to receive(:exists?).with("#{directory}/metadata.json").and_return(true)
|
228
|
+
|
229
|
+
expect( subject.logger ).to_not receive(:debug).with("At root, can't parse for another directory")
|
230
|
+
expect( subject.logger ).to receive(:debug).with("No Modulefile or metadata.json found at #{directory}/acceptance, moving up")
|
231
|
+
expect(subject.parse_for_moduleroot("#{directory}/acceptance")).to eq(directory)
|
232
|
+
end
|
233
|
+
end
|
234
|
+
it 'should recersively go up the directory to find the module files' do
|
235
|
+
allow( File ).to receive(:exists?).and_return(false)
|
236
|
+
expect( subject.logger ).to receive(:debug).with("No Modulefile or metadata.json found at #{directory}, moving up")
|
237
|
+
expect( subject.logger ).to receive(:error).with("At root, can't parse for another directory")
|
238
|
+
expect(subject.parse_for_moduleroot(directory)).to eq(nil)
|
239
|
+
end
|
240
|
+
end
|
241
|
+
end
|
@@ -0,0 +1,475 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
class ClassMixedWithDSLInstallUtils
|
4
|
+
include Beaker::DSL::InstallUtils
|
5
|
+
include Beaker::DSL::Wrappers
|
6
|
+
include Beaker::DSL::Helpers
|
7
|
+
include Beaker::DSL::Structure
|
8
|
+
include Beaker::DSL::Roles
|
9
|
+
include Beaker::DSL::Patterns
|
10
|
+
|
11
|
+
def logger
|
12
|
+
@logger ||= RSpec::Mocks::Double.new('logger').as_null_object
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
describe ClassMixedWithDSLInstallUtils do
|
17
|
+
let(:presets) { Beaker::Options::Presets.new }
|
18
|
+
let(:opts) { presets.presets.merge(presets.env_vars) }
|
19
|
+
let(:basic_hosts) { make_hosts( { :pe_ver => '3.0',
|
20
|
+
:platform => 'linux',
|
21
|
+
:roles => [ 'agent' ] }, 4 ) }
|
22
|
+
let(:hosts) { basic_hosts[0][:roles] = ['master', 'database', 'dashboard']
|
23
|
+
basic_hosts[1][:platform] = 'windows'
|
24
|
+
basic_hosts[2][:platform] = 'osx-10.9-x86_64'
|
25
|
+
basic_hosts[3][:platform] = 'eos'
|
26
|
+
basic_hosts }
|
27
|
+
let(:hosts_sorted) { [ hosts[1], hosts[0], hosts[2], hosts[3] ] }
|
28
|
+
let(:winhost) { make_host( 'winhost', { :platform => 'windows',
|
29
|
+
:pe_ver => '3.0',
|
30
|
+
:working_dir => '/tmp' } ) }
|
31
|
+
let(:machost) { make_host( 'machost', { :platform => 'osx-10.9-x86_64',
|
32
|
+
:pe_ver => '3.0',
|
33
|
+
:working_dir => '/tmp' } ) }
|
34
|
+
let(:unixhost) { make_host( 'unixhost', { :platform => 'linux',
|
35
|
+
:pe_ver => '3.0',
|
36
|
+
:working_dir => '/tmp',
|
37
|
+
:dist => 'puppet-enterprise-3.1.0-rc0-230-g36c9e5c-debian-7-i386' } ) }
|
38
|
+
let(:eoshost) { make_host( 'eoshost', { :platform => 'eos',
|
39
|
+
:pe_ver => '3.0',
|
40
|
+
:working_dir => '/tmp',
|
41
|
+
:dist => 'puppet-enterprise-3.7.1-rc0-78-gffc958f-eos-4-i386' } ) }
|
42
|
+
|
43
|
+
describe 'sorted_hosts' do
|
44
|
+
it 'can reorder so that the master comes first' do
|
45
|
+
allow( subject ).to receive( :hosts ).and_return( hosts_sorted )
|
46
|
+
expect( subject.sorted_hosts ).to be === hosts
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'leaves correctly ordered hosts alone' do
|
50
|
+
allow( subject ).to receive( :hosts ).and_return( hosts )
|
51
|
+
expect( subject.sorted_hosts ).to be === hosts
|
52
|
+
end
|
53
|
+
|
54
|
+
it 'does not allow nil entries' do
|
55
|
+
allow( subject ).to receive( :options ).and_return( { :masterless => true } )
|
56
|
+
masterless_host = [basic_hosts[0]]
|
57
|
+
allow( subject ).to receive( :hosts ).and_return( masterless_host )
|
58
|
+
expect( subject.sorted_hosts ).to be === masterless_host
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
describe 'installer_cmd' do
|
63
|
+
|
64
|
+
it 'generates a windows PE install command for a windows host' do
|
65
|
+
winhost['dist'] = 'puppet-enterprise-3.0'
|
66
|
+
allow( subject ).to receive( :hosts ).and_return( [ hosts[1], hosts[0], hosts[2], winhost ] )
|
67
|
+
expect( subject.installer_cmd( winhost, {} ) ).to be === "cd /tmp && cmd /C 'start /w msiexec.exe /qn /L*V tmp.log /i puppet-enterprise-3.0.msi PUPPET_MASTER_SERVER=vm1 PUPPET_AGENT_CERTNAME=winhost'"
|
68
|
+
end
|
69
|
+
|
70
|
+
it 'generates a unix PE install command for a unix host' do
|
71
|
+
the_host = unixhost.dup
|
72
|
+
the_host['pe_installer'] = 'puppet-enterprise-installer'
|
73
|
+
expect( subject.installer_cmd( the_host, {} ) ).to be === "cd /tmp/puppet-enterprise-3.1.0-rc0-230-g36c9e5c-debian-7-i386 && ./puppet-enterprise-installer -a /tmp/answers"
|
74
|
+
end
|
75
|
+
|
76
|
+
it 'generates a unix PE frictionless install command for a unix host with role "frictionless"' do
|
77
|
+
allow( subject ).to receive( :version_is_less ).and_return( false )
|
78
|
+
allow( subject ).to receive( :master ).and_return( 'testmaster' )
|
79
|
+
the_host = unixhost.dup
|
80
|
+
the_host['pe_installer'] = 'puppet-enterprise-installer'
|
81
|
+
the_host['roles'] = ['frictionless']
|
82
|
+
expect( subject.installer_cmd( the_host, {} ) ).to be === "cd /tmp && curl --tlsv1 -kO https://testmaster:8140/packages/3.0/install.bash && bash install.bash"
|
83
|
+
end
|
84
|
+
|
85
|
+
it 'generates a unix PE frictionless install command for a unix host with role "frictionless" and "frictionless_options"' do
|
86
|
+
allow( subject ).to receive( :version_is_less ).and_return( false )
|
87
|
+
allow( subject ).to receive( :master ).and_return( 'testmaster' )
|
88
|
+
the_host = unixhost.dup
|
89
|
+
the_host['pe_installer'] = 'puppet-enterprise-installer'
|
90
|
+
the_host['roles'] = ['frictionless']
|
91
|
+
the_host['frictionless_options'] = { 'main' => { 'dns_alt_names' => 'puppet' } }
|
92
|
+
expect( subject.installer_cmd( the_host, {} ) ).to be === "cd /tmp && curl --tlsv1 -kO https://testmaster:8140/packages/3.0/install.bash && bash install.bash main:dns_alt_names=puppet"
|
93
|
+
end
|
94
|
+
|
95
|
+
it 'generates a osx PE install command for a osx host' do
|
96
|
+
the_host = machost.dup
|
97
|
+
the_host['pe_installer'] = 'puppet-enterprise-installer'
|
98
|
+
expect( subject.installer_cmd( the_host, {} ) ).to be === "cd /tmp && hdiutil attach .dmg && installer -pkg /Volumes/puppet-enterprise-3.0/puppet-enterprise-installer-3.0.pkg -target /"
|
99
|
+
end
|
100
|
+
|
101
|
+
it 'generates an EOS PE install command for an EOS host' do
|
102
|
+
the_host = eoshost.dup
|
103
|
+
commands = ['enable', "extension puppet-enterprise-#{the_host['pe_ver']}-#{the_host['platform']}.swix"]
|
104
|
+
command = commands.join("\n")
|
105
|
+
expect( subject.installer_cmd( the_host, {} ) ).to be === "Cli -c '#{command}'"
|
106
|
+
end
|
107
|
+
|
108
|
+
it 'generates a unix PE install command in verbose for a unix host when pe_debug is enabled' do
|
109
|
+
the_host = unixhost.dup
|
110
|
+
the_host['pe_installer'] = 'puppet-enterprise-installer'
|
111
|
+
the_host[:pe_debug] = true
|
112
|
+
expect( subject.installer_cmd( the_host, {} ) ).to be === "cd /tmp/puppet-enterprise-3.1.0-rc0-230-g36c9e5c-debian-7-i386 && ./puppet-enterprise-installer -D -a /tmp/answers"
|
113
|
+
end
|
114
|
+
|
115
|
+
it 'generates a osx PE install command in verbose for a osx host when pe_debug is enabled' do
|
116
|
+
the_host = machost.dup
|
117
|
+
the_host['pe_installer'] = 'puppet-enterprise-installer'
|
118
|
+
the_host[:pe_debug] = true
|
119
|
+
expect( subject.installer_cmd( the_host, {} ) ).to be === "cd /tmp && hdiutil attach .dmg && installer -verboseR -pkg /Volumes/puppet-enterprise-3.0/puppet-enterprise-installer-3.0.pkg -target /"
|
120
|
+
end
|
121
|
+
|
122
|
+
it 'generates a unix PE frictionless install command in verbose for a unix host with role "frictionless" and pe_debug is enabled' do
|
123
|
+
allow( subject ).to receive( :version_is_less ).and_return( false )
|
124
|
+
allow( subject ).to receive( :master ).and_return( 'testmaster' )
|
125
|
+
the_host = unixhost.dup
|
126
|
+
the_host['pe_installer'] = 'puppet-enterprise-installer'
|
127
|
+
the_host['roles'] = ['frictionless']
|
128
|
+
the_host[:pe_debug] = true
|
129
|
+
expect( subject.installer_cmd( the_host, {} ) ).to be === "cd /tmp && curl --tlsv1 -kO https://testmaster:8140/packages/3.0/install.bash && bash -x install.bash"
|
130
|
+
end
|
131
|
+
|
132
|
+
end
|
133
|
+
|
134
|
+
|
135
|
+
describe 'fetch_pe' do
|
136
|
+
|
137
|
+
it 'can push a local PE .tar.gz to a host and unpack it' do
|
138
|
+
allow( File ).to receive( :directory? ).and_return( true ) #is local
|
139
|
+
allow( File ).to receive( :exists? ).and_return( true ) #is a .tar.gz
|
140
|
+
unixhost['pe_dir'] = '/local/file/path'
|
141
|
+
allow( subject ).to receive( :scp_to ).and_return( true )
|
142
|
+
|
143
|
+
path = unixhost['pe_dir']
|
144
|
+
filename = "#{ unixhost['dist'] }"
|
145
|
+
extension = '.tar.gz'
|
146
|
+
expect( subject ).to receive( :scp_to ).with( unixhost, "#{ path }/#{ filename }#{ extension }", "#{ unixhost['working_dir'] }/#{ filename }#{ extension }" ).once
|
147
|
+
expect( subject ).to receive( :on ).with( unixhost, /gunzip/ ).once
|
148
|
+
expect( subject ).to receive( :on ).with( unixhost, /tar -xvf/ ).once
|
149
|
+
subject.fetch_pe( [unixhost], {} )
|
150
|
+
end
|
151
|
+
|
152
|
+
it 'can download a PE .tar from a URL to a host and unpack it' do
|
153
|
+
allow( File ).to receive( :directory? ).and_return( false ) #is not local
|
154
|
+
allow( subject ).to receive( :link_exists? ) do |arg|
|
155
|
+
if arg =~ /.tar.gz/ #there is no .tar.gz link, only a .tar
|
156
|
+
false
|
157
|
+
else
|
158
|
+
true
|
159
|
+
end
|
160
|
+
end
|
161
|
+
allow( subject ).to receive( :on ).and_return( true )
|
162
|
+
|
163
|
+
path = unixhost['pe_dir']
|
164
|
+
filename = "#{ unixhost['dist'] }"
|
165
|
+
extension = '.tar'
|
166
|
+
expect( subject ).to receive( :on ).with( unixhost, "cd #{ unixhost['working_dir'] }; curl #{ path }/#{ filename }#{ extension } | tar -xvf -" ).once
|
167
|
+
subject.fetch_pe( [unixhost], {} )
|
168
|
+
end
|
169
|
+
|
170
|
+
it 'can download a PE .tar.gz from a URL to a host and unpack it' do
|
171
|
+
allow( File ).to receive( :directory? ).and_return( false ) #is not local
|
172
|
+
allow( subject ).to receive( :link_exists? ).and_return( true ) #is a tar.gz
|
173
|
+
allow( subject ).to receive( :on ).and_return( true )
|
174
|
+
|
175
|
+
path = unixhost['pe_dir']
|
176
|
+
filename = "#{ unixhost['dist'] }"
|
177
|
+
extension = '.tar.gz'
|
178
|
+
expect( subject ).to receive( :on ).with( unixhost, "cd #{ unixhost['working_dir'] }; curl #{ path }/#{ filename }#{ extension } | gunzip | tar -xvf -" ).once
|
179
|
+
subject.fetch_pe( [unixhost], {} )
|
180
|
+
end
|
181
|
+
|
182
|
+
it 'can download a PE .swix from a URL to an EOS host and unpack it' do
|
183
|
+
allow( File ).to receive( :directory? ).and_return( false ) #is not local
|
184
|
+
allow( subject ).to receive( :link_exists? ).and_return( true ) #is a tar.gz
|
185
|
+
allow( subject ).to receive( :on ).and_return( true )
|
186
|
+
|
187
|
+
path = eoshost['pe_dir']
|
188
|
+
filename = "#{ eoshost['dist'] }"
|
189
|
+
extension = '.swix'
|
190
|
+
commands = ['enable', "copy #{path}/#{filename}#{extension} extension:"]
|
191
|
+
command = commands.join("\n")
|
192
|
+
expect( subject ).to receive( :on ).with( eoshost, "Cli -c '#{command}'" ).once
|
193
|
+
subject.fetch_pe( [eoshost], {} )
|
194
|
+
end
|
195
|
+
|
196
|
+
it 'can push a local PE package to a windows host' do
|
197
|
+
allow( File ).to receive( :directory? ).and_return( true ) #is local
|
198
|
+
allow( File ).to receive( :exists? ).and_return( true ) #is present
|
199
|
+
winhost['dist'] = 'puppet-enterprise-3.0'
|
200
|
+
allow( subject ).to receive( :scp_to ).and_return( true )
|
201
|
+
|
202
|
+
path = winhost['pe_dir']
|
203
|
+
filename = "puppet-enterprise-#{ winhost['pe_ver'] }"
|
204
|
+
extension = '.msi'
|
205
|
+
expect( subject ).to receive( :scp_to ).with( winhost, "#{ path }/#{ filename }#{ extension }", "#{ winhost['working_dir'] }/#{ filename }#{ extension }" ).once
|
206
|
+
subject.fetch_pe( [winhost], {} )
|
207
|
+
|
208
|
+
end
|
209
|
+
|
210
|
+
it 'can download a PE dmg from a URL to a mac host' do
|
211
|
+
allow( File ).to receive( :directory? ).and_return( false ) #is not local
|
212
|
+
allow( subject ).to receive( :link_exists? ).and_return( true ) #is not local
|
213
|
+
allow( subject ).to receive( :on ).and_return( true )
|
214
|
+
|
215
|
+
path = machost['pe_dir']
|
216
|
+
filename = "#{ machost['dist'] }"
|
217
|
+
extension = '.dmg'
|
218
|
+
expect( subject ).to receive( :on ).with( machost, "cd #{ machost['working_dir'] }; curl -O #{ path }/#{ filename }#{ extension }" ).once
|
219
|
+
subject.fetch_pe( [machost], {} )
|
220
|
+
end
|
221
|
+
|
222
|
+
it 'can push a PE dmg to a mac host' do
|
223
|
+
allow( File ).to receive( :directory? ).and_return( true ) #is local
|
224
|
+
allow( File ).to receive( :exists? ).and_return( true ) #is present
|
225
|
+
allow( subject ).to receive( :scp_to ).and_return( true )
|
226
|
+
|
227
|
+
path = machost['pe_dir']
|
228
|
+
filename = "#{ machost['dist'] }"
|
229
|
+
extension = '.dmg'
|
230
|
+
expect( subject ).to receive( :scp_to ).with( machost, "#{ path }/#{ filename }#{ extension }", "#{ machost['working_dir'] }/#{ filename }#{ extension }" ).once
|
231
|
+
subject.fetch_pe( [machost], {} )
|
232
|
+
end
|
233
|
+
|
234
|
+
it "does nothing for a frictionless agent for PE >= 3.2.0" do
|
235
|
+
unixhost['roles'] << 'frictionless'
|
236
|
+
unixhost['pe_ver'] = '3.2.0'
|
237
|
+
|
238
|
+
expect( subject).to_not receive(:scp_to)
|
239
|
+
expect( subject).to_not receive(:on)
|
240
|
+
allow( subject ).to receive(:version_is_less).with('3.2.0', '3.2.0').and_return(false)
|
241
|
+
subject.fetch_pe( [unixhost], {} )
|
242
|
+
end
|
243
|
+
end
|
244
|
+
|
245
|
+
describe 'do_install' do
|
246
|
+
it 'can perform a simple installation' do
|
247
|
+
allow( subject ).to receive( :on ).and_return( Beaker::Result.new( {}, '' ) )
|
248
|
+
allow( subject ).to receive( :fetch_pe ).and_return( true )
|
249
|
+
allow( subject ).to receive( :create_remote_file ).and_return( true )
|
250
|
+
allow( subject ).to receive( :sign_certificate_for ).and_return( true )
|
251
|
+
allow( subject ).to receive( :stop_agent_on ).and_return( true )
|
252
|
+
allow( subject ).to receive( :sleep_until_puppetdb_started ).and_return( true )
|
253
|
+
allow( subject ).to receive( :version_is_less ).with('3.0', '4.0').and_return( true )
|
254
|
+
allow( subject ).to receive( :version_is_less ).with('3.0', '3.4').and_return( true )
|
255
|
+
allow( subject ).to receive( :version_is_less ).with('3.0', '3.0').and_return( false )
|
256
|
+
allow( subject ).to receive( :version_is_less ).with('3.0', '3.4').and_return( true )
|
257
|
+
allow( subject ).to receive( :wait_for_host_in_dashboard ).and_return( true )
|
258
|
+
allow( subject ).to receive( :puppet_agent ) do |arg|
|
259
|
+
"puppet agent #{arg}"
|
260
|
+
end
|
261
|
+
allow( subject ).to receive( :puppet ) do |arg|
|
262
|
+
"puppet #{arg}"
|
263
|
+
end
|
264
|
+
|
265
|
+
allow( subject ).to receive( :hosts ).and_return( hosts )
|
266
|
+
#create answers file per-host, except windows
|
267
|
+
expect( subject ).to receive( :create_remote_file ).with( hosts[0], /answers/, /q/ ).once
|
268
|
+
#run installer on all hosts
|
269
|
+
expect( subject ).to receive( :on ).with( hosts[0], /puppet-enterprise-installer/ ).once
|
270
|
+
expect( subject ).to receive( :on ).with( hosts[1], /msiexec.exe/ ).once
|
271
|
+
expect( subject ).to receive( :on ).with( hosts[2], / hdiutil attach puppet-enterprise-3.0-osx-10.9-x86_64.dmg && installer -pkg \/Volumes\/puppet-enterprise-3.0\/puppet-enterprise-installer-3.0.pkg -target \// ).once
|
272
|
+
expect( subject ).to receive( :on ).with( hosts[3], /^Cli/ ).once
|
273
|
+
#does extra mac/EOS specific commands
|
274
|
+
expect( subject ).to receive( :on ).with( hosts[2], /puppet config set server/ ).once
|
275
|
+
expect( subject ).to receive( :on ).with( hosts[3], /puppet config set server/ ).once
|
276
|
+
expect( subject ).to receive( :on ).with( hosts[2], /puppet config set certname/ ).once
|
277
|
+
expect( subject ).to receive( :on ).with( hosts[3], /puppet config set certname/ ).once
|
278
|
+
expect( subject ).to receive( :on ).with( hosts[2], /puppet agent -t/, :acceptable_exit_codes => [1] ).once
|
279
|
+
expect( subject ).to receive( :on ).with( hosts[3], /puppet agent -t/, :acceptable_exit_codes => [0, 1] ).once
|
280
|
+
#sign certificate per-host
|
281
|
+
expect( subject ).to receive( :sign_certificate_for ).with( hosts[0] ).once
|
282
|
+
expect( subject ).to receive( :sign_certificate_for ).with( hosts[1] ).once
|
283
|
+
expect( subject ).to receive( :sign_certificate_for ).with( hosts[2] ).once
|
284
|
+
expect( subject ).to receive( :sign_certificate_for ).with( hosts[3] ).once
|
285
|
+
#stop puppet agent on all hosts
|
286
|
+
expect( subject ).to receive( :stop_agent_on ).with( hosts[0] ).once
|
287
|
+
expect( subject ).to receive( :stop_agent_on ).with( hosts[1] ).once
|
288
|
+
expect( subject ).to receive( :stop_agent_on ).with( hosts[2] ).once
|
289
|
+
expect( subject ).to receive( :stop_agent_on ).with( hosts[3] ).once
|
290
|
+
#wait for puppetdb to start
|
291
|
+
expect( subject ).to receive( :sleep_until_puppetdb_started ).with( hosts[0] ).once
|
292
|
+
#run each puppet agent once
|
293
|
+
expect( subject ).to receive( :on ).with( hosts[0], /puppet agent -t/, :acceptable_exit_codes => [0,2] ).once
|
294
|
+
expect( subject ).to receive( :on ).with( hosts[1], /puppet agent -t/, :acceptable_exit_codes => [0,2] ).once
|
295
|
+
expect( subject ).to receive( :on ).with( hosts[2], /puppet agent -t/, :acceptable_exit_codes => [0,2] ).once
|
296
|
+
expect( subject ).to receive( :on ).with( hosts[3], /puppet agent -t/, :acceptable_exit_codes => [0,2] ).once
|
297
|
+
#run rake task on dashboard
|
298
|
+
expect( subject ).to receive( :on ).with( hosts[0], /\/opt\/puppet\/bin\/rake -sf \/opt\/puppet\/share\/puppet-dashboard\/Rakefile .* RAILS_ENV=production/ ).once
|
299
|
+
#wait for all hosts to appear in the dashboard
|
300
|
+
#run puppet agent now that installation is complete
|
301
|
+
expect( subject ).to receive( :on ).with( hosts, /puppet agent/, :acceptable_exit_codes => [0,2] ).once
|
302
|
+
subject.do_install( hosts, opts )
|
303
|
+
end
|
304
|
+
|
305
|
+
it 'can perform a masterless installation' do
|
306
|
+
hosts = make_hosts({
|
307
|
+
:pe_ver => '3.0',
|
308
|
+
:roles => ['agent']
|
309
|
+
}, 1)
|
310
|
+
|
311
|
+
allow( subject ).to receive( :hosts ).and_return( hosts )
|
312
|
+
allow( subject ).to receive( :options ).and_return({ :masterless => true })
|
313
|
+
allow( subject ).to receive( :on ).and_return( Beaker::Result.new( {}, '' ) )
|
314
|
+
allow( subject ).to receive( :fetch_pe ).and_return( true )
|
315
|
+
allow( subject ).to receive( :create_remote_file ).and_return( true )
|
316
|
+
allow( subject ).to receive( :stop_agent_on ).and_return( true )
|
317
|
+
allow( subject ).to receive( :version_is_less ).with(anything, '3.2.0').exactly(hosts.length + 1).times.and_return( false )
|
318
|
+
|
319
|
+
expect( subject ).to receive( :on ).with( hosts[0], /puppet-enterprise-installer/ ).once
|
320
|
+
expect( subject ).to receive( :create_remote_file ).with( hosts[0], /answers/, /q/ ).once
|
321
|
+
expect( subject ).to_not receive( :sign_certificate_for )
|
322
|
+
expect( subject ).to receive( :stop_agent_on ).with( hosts[0] ).once
|
323
|
+
expect( subject ).to_not receive( :sleep_until_puppetdb_started )
|
324
|
+
expect( subject ).to_not receive( :wait_for_host_in_dashboard )
|
325
|
+
expect( subject ).to_not receive( :on ).with( hosts[0], /puppet agent -t/, :acceptable_exit_codes => [0,2] )
|
326
|
+
subject.do_install( hosts, opts)
|
327
|
+
end
|
328
|
+
end
|
329
|
+
|
330
|
+
describe 'do_higgs_install' do
|
331
|
+
|
332
|
+
before :each do
|
333
|
+
my_time = double( "time double" )
|
334
|
+
allow( my_time ).to receive( :strftime ).and_return( "2014-07-01_15.27.53" )
|
335
|
+
allow( Time ).to receive( :new ).and_return( my_time )
|
336
|
+
|
337
|
+
hosts[0]['working_dir'] = "tmp/2014-07-01_15.27.53"
|
338
|
+
hosts[0]['dist'] = 'dist'
|
339
|
+
hosts[0]['pe_installer'] = 'pe-installer'
|
340
|
+
allow( hosts[0] ).to receive( :tmpdir ).and_return( "/tmp/2014-07-01_15.27.53" )
|
341
|
+
|
342
|
+
@fail_result = Beaker::Result.new( {}, '' )
|
343
|
+
@fail_result.stdout = "No match here"
|
344
|
+
@success_result = Beaker::Result.new( {}, '' )
|
345
|
+
@success_result.stdout = "Please go to https://website in your browser to continue installation"
|
346
|
+
end
|
347
|
+
|
348
|
+
it 'can perform a simple installation' do
|
349
|
+
allow( subject ).to receive( :fetch_pe ).and_return( true )
|
350
|
+
allow( subject ).to receive( :sleep ).and_return( true )
|
351
|
+
|
352
|
+
allow( subject ).to receive( :hosts ).and_return( hosts )
|
353
|
+
|
354
|
+
#run higgs installer command
|
355
|
+
expect( subject ).to receive( :on ).with( hosts[0],
|
356
|
+
"cd /tmp/2014-07-01_15.27.53/puppet-enterprise-3.0-linux ; nohup ./pe-installer <<<Y > higgs_2014-07-01_15.27.53.log 2>&1 &",
|
357
|
+
opts ).once
|
358
|
+
#check to see if the higgs installation has proceeded correctly, works on second check
|
359
|
+
expect( subject ).to receive( :on ).with( hosts[0], /cat #{hosts[0]['higgs_file']}/, { :acceptable_exit_codes => 0..255 }).and_return( @fail_result, @success_result )
|
360
|
+
subject.do_higgs_install( hosts[0], opts )
|
361
|
+
end
|
362
|
+
|
363
|
+
it 'fails out after checking installation log 10 times' do
|
364
|
+
allow( subject ).to receive( :fetch_pe ).and_return( true )
|
365
|
+
allow( subject ).to receive( :sleep ).and_return( true )
|
366
|
+
|
367
|
+
allow( subject ).to receive( :hosts ).and_return( hosts )
|
368
|
+
|
369
|
+
#run higgs installer command
|
370
|
+
expect( subject ).to receive( :on ).with( hosts[0],
|
371
|
+
"cd /tmp/2014-07-01_15.27.53/puppet-enterprise-3.0-linux ; nohup ./pe-installer <<<Y > higgs_2014-07-01_15.27.53.log 2>&1 &",
|
372
|
+
opts ).once
|
373
|
+
#check to see if the higgs installation has proceeded correctly, works on second check
|
374
|
+
expect( subject ).to receive( :on ).with( hosts[0], /cat #{hosts[0]['higgs_file']}/, { :acceptable_exit_codes => 0..255 }).exactly(10).times.and_return( @fail_result )
|
375
|
+
expect{ subject.do_higgs_install( hosts[0], opts ) }.to raise_error
|
376
|
+
end
|
377
|
+
|
378
|
+
end
|
379
|
+
|
380
|
+
describe 'install_pe' do
|
381
|
+
|
382
|
+
it 'calls do_install with sorted hosts' do
|
383
|
+
allow( subject ).to receive( :options ).and_return( {} )
|
384
|
+
allow( subject ).to receive( :hosts ).and_return( hosts_sorted )
|
385
|
+
allow( subject ).to receive( :do_install ).and_return( true )
|
386
|
+
expect( subject ).to receive( :do_install ).with( hosts, {} )
|
387
|
+
subject.install_pe
|
388
|
+
end
|
389
|
+
|
390
|
+
it 'fills in missing pe_ver' do
|
391
|
+
hosts.each do |h|
|
392
|
+
h['pe_ver'] = nil
|
393
|
+
end
|
394
|
+
allow( Beaker::Options::PEVersionScraper ).to receive( :load_pe_version ).and_return( '2.8' )
|
395
|
+
allow( subject ).to receive( :hosts ).and_return( hosts_sorted )
|
396
|
+
allow( subject ).to receive( :options ).and_return( {} )
|
397
|
+
allow( subject ).to receive( :do_install ).and_return( true )
|
398
|
+
expect( subject ).to receive( :do_install ).with( hosts, {} )
|
399
|
+
subject.install_pe
|
400
|
+
hosts.each do |h|
|
401
|
+
expect( h['pe_ver'] ).to be === '2.8'
|
402
|
+
end
|
403
|
+
end
|
404
|
+
end
|
405
|
+
|
406
|
+
describe 'install_higgs' do
|
407
|
+
it 'fills in missing pe_ver' do
|
408
|
+
hosts[0]['pe_ver'] = nil
|
409
|
+
allow( Beaker::Options::PEVersionScraper ).to receive( :load_pe_version ).and_return( '2.8' )
|
410
|
+
allow( subject ).to receive( :hosts ).and_return( [ hosts[1], hosts[0], hosts[2] ] )
|
411
|
+
allow( subject ).to receive( :options ).and_return( {} )
|
412
|
+
allow( subject ).to receive( :do_higgs_install ).and_return( true )
|
413
|
+
expect( subject ).to receive( :do_higgs_install ).with( hosts[0], {} )
|
414
|
+
subject.install_higgs
|
415
|
+
expect( hosts[0]['pe_ver'] ).to be === '2.8'
|
416
|
+
end
|
417
|
+
|
418
|
+
end
|
419
|
+
|
420
|
+
describe 'upgrade_pe' do
|
421
|
+
|
422
|
+
it 'calls puppet-enterprise-upgrader for pre 3.0 upgrades' do
|
423
|
+
allow( Beaker::Options::PEVersionScraper ).to receive( :load_pe_version ).and_return( '2.8' )
|
424
|
+
allow( Beaker::Options::PEVersionScraper ).to receive( :load_pe_version_win ).and_return( '2.8' )
|
425
|
+
the_hosts = [ hosts[0].dup, hosts[1].dup, hosts[2].dup ]
|
426
|
+
allow( subject ).to receive( :hosts ).and_return( the_hosts )
|
427
|
+
allow( subject ).to receive( :options ).and_return( {} )
|
428
|
+
allow( subject ).to receive( :version_is_less ).with('3.0', '3.4.0').and_return( true )
|
429
|
+
allow( subject ).to receive( :version_is_less ).with('2.8', '3.0').and_return( true )
|
430
|
+
version = version_win = '2.8'
|
431
|
+
path = "/path/to/upgradepkg"
|
432
|
+
expect( subject ).to receive( :do_install ).with( the_hosts, {:type=>:upgrade, :set_console_password=>true} )
|
433
|
+
subject.upgrade_pe( path )
|
434
|
+
the_hosts.each do |h|
|
435
|
+
expect( h['pe_installer'] ).to be === 'puppet-enterprise-upgrader'
|
436
|
+
end
|
437
|
+
end
|
438
|
+
|
439
|
+
it 'uses standard upgrader for post 3.0 upgrades' do
|
440
|
+
allow( Beaker::Options::PEVersionScraper ).to receive( :load_pe_version ).and_return( '3.1' )
|
441
|
+
allow( Beaker::Options::PEVersionScraper ).to receive( :load_pe_version_win ).and_return( '3.1' )
|
442
|
+
the_hosts = [ hosts[0].dup, hosts[1].dup, hosts[2].dup ]
|
443
|
+
allow( subject ).to receive( :hosts ).and_return( the_hosts )
|
444
|
+
allow( subject ).to receive( :options ).and_return( {} )
|
445
|
+
allow( subject ).to receive( :version_is_less ).with('3.0', '3.4.0').and_return( true )
|
446
|
+
allow( subject ).to receive( :version_is_less ).with('3.1', '3.0').and_return( false )
|
447
|
+
version = version_win = '3.1'
|
448
|
+
path = "/path/to/upgradepkg"
|
449
|
+
expect( subject ).to receive( :do_install ).with( the_hosts, {:type=>:upgrade, :set_console_password=>true} )
|
450
|
+
subject.upgrade_pe( path )
|
451
|
+
the_hosts.each do |h|
|
452
|
+
expect( h['pe_installer'] ).to be nil
|
453
|
+
end
|
454
|
+
end
|
455
|
+
|
456
|
+
it 'updates pe_ver post upgrade' do
|
457
|
+
allow( Beaker::Options::PEVersionScraper ).to receive( :load_pe_version ).and_return( '2.8' )
|
458
|
+
allow( Beaker::Options::PEVersionScraper ).to receive( :load_pe_version_win ).and_return( '2.8' )
|
459
|
+
the_hosts = [ hosts[0].dup, hosts[1].dup, hosts[2].dup ]
|
460
|
+
allow( subject ).to receive( :hosts ).and_return( the_hosts )
|
461
|
+
allow( subject ).to receive( :options ).and_return( {} )
|
462
|
+
allow( subject ).to receive( :version_is_less ).with('3.0', '3.4.0').and_return( true )
|
463
|
+
allow( subject ).to receive( :version_is_less ).with('2.8', '3.0').and_return( true )
|
464
|
+
version = version_win = '2.8'
|
465
|
+
path = "/path/to/upgradepkg"
|
466
|
+
expect( subject ).to receive( :do_install ).with( the_hosts, {:type=>:upgrade, :set_console_password=>true} )
|
467
|
+
subject.upgrade_pe( path )
|
468
|
+
the_hosts.each do |h|
|
469
|
+
expect( h['pe_ver'] ).to be === '2.8'
|
470
|
+
end
|
471
|
+
end
|
472
|
+
|
473
|
+
end
|
474
|
+
|
475
|
+
end
|