beaker 2.18.3 → 2.19.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/HISTORY.md +439 -2
- data/acceptance/lib/beaker/acceptance/install_utils.rb +58 -0
- data/acceptance/pre_suite/puppet_git/install.rb +6 -65
- data/acceptance/tests/foss_utils/clone_git_repo_on.rb +49 -0
- data/beaker.gemspec +2 -0
- data/lib/beaker/dsl/helpers/web_helpers.rb +2 -1
- data/lib/beaker/dsl/install_utils/aio_defaults.rb +0 -2
- data/lib/beaker/dsl/install_utils/foss_utils.rb +97 -60
- data/lib/beaker/dsl/install_utils/pe_utils.rb +30 -53
- data/lib/beaker/dsl/install_utils/puppet_utils.rb +43 -0
- data/lib/beaker/dsl/install_utils/windows_utils.rb +144 -0
- data/lib/beaker/dsl/roles.rb +20 -3
- data/lib/beaker/dsl/structure.rb +14 -3
- data/lib/beaker/host.rb +24 -3
- data/lib/beaker/host/unix/pkg.rb +9 -0
- data/lib/beaker/host/windows/exec.rb +3 -0
- data/lib/beaker/host_prebuilt_steps.rb +5 -9
- data/lib/beaker/hypervisor/aws_sdk.rb +22 -18
- data/lib/beaker/hypervisor/docker.rb +7 -0
- data/lib/beaker/hypervisor/vmpooler.rb +4 -0
- data/lib/beaker/logger.rb +12 -1
- data/lib/beaker/options/command_line_parser.rb +9 -0
- data/lib/beaker/options/options_hash.rb +3 -296
- data/lib/beaker/options/parser.rb +12 -0
- data/lib/beaker/options/presets.rb +0 -1
- data/lib/beaker/ssh_connection.rb +48 -23
- data/lib/beaker/test_case.rb +1 -1
- data/lib/beaker/version.rb +1 -1
- data/spec/beaker/dsl/helpers/web_helpers_spec.rb +10 -1
- data/spec/beaker/dsl/install_utils/foss_utils_spec.rb +194 -49
- data/spec/beaker/dsl/install_utils/pe_utils_spec.rb +112 -22
- data/spec/beaker/dsl/install_utils/puppet_utils_spec.rb +57 -0
- data/spec/beaker/dsl/install_utils/windows_utils_spec.rb +132 -0
- data/spec/beaker/dsl/roles_spec.rb +36 -5
- data/spec/beaker/dsl/structure_spec.rb +9 -2
- data/spec/beaker/host/unix/pkg_spec.rb +26 -6
- data/spec/beaker/host_prebuilt_steps_spec.rb +3 -2
- data/spec/beaker/host_spec.rb +18 -0
- data/spec/beaker/hypervisor/aixer_spec.rb +1 -1
- data/spec/beaker/hypervisor/aws_sdk_spec.rb +595 -58
- data/spec/beaker/hypervisor/docker_spec.rb +2 -1
- data/spec/beaker/hypervisor/solaris_spec.rb +1 -0
- data/spec/beaker/hypervisor/vagrant_spec.rb +2 -1
- data/spec/beaker/logger_spec.rb +39 -0
- data/spec/beaker/options/command_line_parser_spec.rb +2 -2
- data/spec/beaker/options/options_hash_spec.rb +1 -102
- data/spec/beaker/options/parser_spec.rb +19 -0
- data/spec/beaker/options/pe_version_scaper_spec.rb +11 -1
- data/spec/beaker/options/presets_spec.rb +8 -0
- data/spec/beaker/ssh_connection_spec.rb +39 -21
- data/spec/helpers.rb +9 -3
- data/spec/mocks.rb +2 -0
- metadata +34 -11
- data/lib/beaker/answers.rb +0 -143
- data/lib/beaker/answers/version20.rb +0 -120
- data/lib/beaker/answers/version28.rb +0 -121
- data/lib/beaker/answers/version30.rb +0 -227
- data/lib/beaker/answers/version32.rb +0 -44
- data/lib/beaker/answers/version34.rb +0 -51
- data/lib/beaker/answers/version38.rb +0 -29
- data/lib/beaker/answers/version40.rb +0 -44
- data/spec/beaker/answers_spec.rb +0 -547
@@ -328,6 +328,7 @@ module Beaker
|
|
328
328
|
end
|
329
329
|
|
330
330
|
normalize_and_validate_tags()
|
331
|
+
resolve_symlinks()
|
331
332
|
|
332
333
|
#set the default role
|
333
334
|
set_default_host!(@options[:HOSTS])
|
@@ -365,6 +366,17 @@ module Beaker
|
|
365
366
|
end
|
366
367
|
end
|
367
368
|
|
369
|
+
# resolves all file symlinks that require it.
|
370
|
+
#
|
371
|
+
# @note doing it here allows us to not need duplicate logic, which we
|
372
|
+
# would need if we were doing it in the parser (--hosts & --config)
|
373
|
+
#
|
374
|
+
# @return nil
|
375
|
+
# @api public
|
376
|
+
def resolve_symlinks()
|
377
|
+
@options[:hosts_file] = File.realpath(@options[:hosts_file]) if @options[:hosts_file]
|
378
|
+
end
|
379
|
+
|
368
380
|
private
|
369
381
|
|
370
382
|
# @api private
|
@@ -6,6 +6,7 @@ module Beaker
|
|
6
6
|
class SshConnection
|
7
7
|
|
8
8
|
attr_accessor :logger
|
9
|
+
attr_accessor :ip, :vmhostname, :hostname
|
9
10
|
|
10
11
|
RETRYABLE_EXCEPTIONS = [
|
11
12
|
SocketError,
|
@@ -21,41 +22,65 @@ module Beaker
|
|
21
22
|
IOError,
|
22
23
|
]
|
23
24
|
|
24
|
-
def initialize
|
25
|
-
@
|
25
|
+
def initialize name_hash, user = nil, ssh_opts = {}, options = {}
|
26
|
+
@vmhostname = name_hash[:vmhostname]
|
27
|
+
@ip = name_hash[:ip]
|
28
|
+
@hostname = name_hash[:hostname]
|
26
29
|
@user = user
|
27
30
|
@ssh_opts = ssh_opts
|
28
31
|
@logger = options[:logger]
|
29
32
|
@options = options
|
30
33
|
end
|
31
34
|
|
32
|
-
def self.connect
|
33
|
-
connection = new
|
35
|
+
def self.connect name_hash, user = 'root', ssh_opts = {}, options = {}
|
36
|
+
connection = new name_hash, user, ssh_opts, options
|
34
37
|
connection.connect
|
35
38
|
connection
|
36
39
|
end
|
37
40
|
|
41
|
+
def connect_block host, user, ssh_opts
|
42
|
+
try = 1
|
43
|
+
last_wait = 2
|
44
|
+
wait = 3
|
45
|
+
begin
|
46
|
+
@logger.debug "Attempting ssh connection to #{host}, user: #{user}, opts: #{ssh_opts}"
|
47
|
+
Net::SSH.start(host, user, ssh_opts)
|
48
|
+
rescue *RETRYABLE_EXCEPTIONS => e
|
49
|
+
if try <= 8
|
50
|
+
@logger.warn "Try #{try} -- Host #{host} unreachable: #{e.class.name} - #{e.message}"
|
51
|
+
@logger.warn "Trying again in #{wait} seconds"
|
52
|
+
sleep wait
|
53
|
+
(last_wait, wait) = wait, last_wait + wait
|
54
|
+
try += 1
|
55
|
+
retry
|
56
|
+
else
|
57
|
+
@logger.warn "Failed to connect to #{host}, after #{try} attempts"
|
58
|
+
nil
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
38
63
|
# connect to the host
|
39
64
|
def connect
|
40
|
-
try
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
65
|
+
#try three ways to connect to host (ip, vmhostname, hostname)
|
66
|
+
methods = []
|
67
|
+
if @ip
|
68
|
+
@ssh ||= connect_block(@ip, @user, @ssh_opts)
|
69
|
+
methods << "ip (#{@ip})"
|
70
|
+
end
|
71
|
+
if @vmhostname && !@ssh
|
72
|
+
@ssh ||= connect_block(@vmhostname, @user, @ssh_opts)
|
73
|
+
methods << "vmhostname (#{@vmhostname})"
|
74
|
+
end
|
75
|
+
if @hostname && !@ssh
|
76
|
+
@ssh ||= connect_block(@hostname, @user, @ssh_opts)
|
77
|
+
methods << "hostname (#{@hostname})"
|
78
|
+
end
|
79
|
+
if not @ssh
|
80
|
+
@logger.error "Failed to connect to #{@hostname}, attempted #{methods.join(', ')}"
|
81
|
+
raise RuntimeError, "Cannot connect to #{@hostname}"
|
82
|
+
end
|
83
|
+
@ssh
|
59
84
|
end
|
60
85
|
|
61
86
|
# closes this SshConnection
|
data/lib/beaker/test_case.rb
CHANGED
data/lib/beaker/version.rb
CHANGED
@@ -29,12 +29,21 @@ describe ClassMixedWithDSLHelpers do
|
|
29
29
|
|
30
30
|
it "returns its second and third arguments concatenated." do
|
31
31
|
create_files(['destdir/name'])
|
32
|
-
result = subject.fetch_http_file "http://beaker.tool
|
32
|
+
result = subject.fetch_http_file "http://beaker.tool", "name", "destdir"
|
33
33
|
expect(result).to eq("destdir/name")
|
34
34
|
end
|
35
35
|
|
36
36
|
end
|
37
37
|
|
38
|
+
describe 'given invalid arguments' do
|
39
|
+
|
40
|
+
it 'chomps correctly when given a URL ending with a / character' do
|
41
|
+
expect( subject ).to receive( :open ).with( 'http://beaker.tool/name', anything )
|
42
|
+
subject.fetch_http_file( "http://beaker.tool/", "name", "destdir" )
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
|
38
47
|
end
|
39
48
|
|
40
49
|
describe "#fetch_http_dir" do
|
@@ -16,10 +16,11 @@ end
|
|
16
16
|
describe ClassMixedWithDSLInstallUtils do
|
17
17
|
let(:metadata) { @metadata ||= {} }
|
18
18
|
let(:presets) { Beaker::Options::Presets.new }
|
19
|
-
let(:opts) { presets.presets.merge(presets.env_vars) }
|
19
|
+
let(:opts) { presets.presets.merge(presets.env_vars).merge({ :type => 'foss' }) }
|
20
20
|
let(:basic_hosts) { make_hosts( { :pe_ver => '3.0',
|
21
|
-
|
22
|
-
|
21
|
+
:platform => 'linux',
|
22
|
+
:roles => [ 'agent' ],
|
23
|
+
:type => 'foss' }, 4 ) }
|
23
24
|
let(:hosts) { basic_hosts[0][:roles] = ['master', 'database', 'dashboard']
|
24
25
|
basic_hosts[1][:platform] = 'windows'
|
25
26
|
basic_hosts[2][:platform] = 'osx-10.9-x86_64'
|
@@ -29,13 +30,16 @@ describe ClassMixedWithDSLInstallUtils do
|
|
29
30
|
let(:winhost) { make_host( 'winhost', { :platform => 'windows',
|
30
31
|
:pe_ver => '3.0',
|
31
32
|
:working_dir => '/tmp',
|
33
|
+
:type => 'foss',
|
32
34
|
:is_cygwin => true} ) }
|
33
35
|
let(:winhost_non_cygwin) { make_host( 'winhost_non_cygwin', { :platform => 'windows',
|
34
36
|
:pe_ver => '3.0',
|
35
37
|
:working_dir => '/tmp',
|
38
|
+
:type => 'foss',
|
36
39
|
:is_cygwin => 'false' } ) }
|
37
40
|
let(:machost) { make_host( 'machost', { :platform => 'osx-10.9-x86_64',
|
38
41
|
:pe_ver => '3.0',
|
42
|
+
:type => 'foss',
|
39
43
|
:working_dir => '/tmp' } ) }
|
40
44
|
let(:freebsdhost9) { make_host( 'freebsdhost9', { :platform => 'freebsd-9-x64',
|
41
45
|
:pe_ver => '3.0',
|
@@ -46,55 +50,60 @@ describe ClassMixedWithDSLInstallUtils do
|
|
46
50
|
let(:unixhost) { make_host( 'unixhost', { :platform => 'linux',
|
47
51
|
:pe_ver => '3.0',
|
48
52
|
:working_dir => '/tmp',
|
53
|
+
:type => 'foss',
|
49
54
|
:dist => 'puppet-enterprise-3.1.0-rc0-230-g36c9e5c-debian-7-i386' } ) }
|
50
55
|
let(:eoshost) { make_host( 'eoshost', { :platform => 'eos',
|
51
56
|
:pe_ver => '3.0',
|
52
57
|
:working_dir => '/tmp',
|
58
|
+
:type => 'foss',
|
53
59
|
:dist => 'puppet-enterprise-3.7.1-rc0-78-gffc958f-eos-4-i386' } ) }
|
60
|
+
let(:win_temp) { 'C:\\Windows\\Temp' }
|
54
61
|
|
55
62
|
|
56
63
|
context '#configure_foss_defaults_on' do
|
57
|
-
it 'uses aio paths for hosts
|
64
|
+
it 'uses aio paths for hosts with role aio' do
|
58
65
|
hosts.each do |host|
|
59
|
-
host[:
|
66
|
+
host[:pe_ver] = nil
|
67
|
+
host[:version] = nil
|
68
|
+
host[:roles] = host[:roles] | ['aio']
|
60
69
|
end
|
70
|
+
expect(subject).to receive(:add_foss_defaults_on).exactly(hosts.length).times
|
61
71
|
expect(subject).to receive(:add_aio_defaults_on).exactly(hosts.length).times
|
62
72
|
expect(subject).to receive(:add_puppet_paths_on).exactly(hosts.length).times
|
63
73
|
|
64
74
|
subject.configure_foss_defaults_on( hosts )
|
65
75
|
end
|
66
76
|
|
67
|
-
it 'uses
|
77
|
+
it 'uses no paths for hosts with no type' do
|
68
78
|
hosts.each do |host|
|
69
|
-
host[:type] =
|
79
|
+
host[:type] = nil
|
70
80
|
end
|
71
|
-
expect(subject).to receive(:
|
72
|
-
expect(subject).to receive(:
|
81
|
+
expect(subject).to receive(:add_aio_defaults_on).never
|
82
|
+
expect(subject).to receive(:add_foss_defaults_on).never
|
83
|
+
expect(subject).to receive(:add_puppet_paths_on).never
|
73
84
|
|
74
85
|
subject.configure_foss_defaults_on( hosts )
|
75
86
|
end
|
76
87
|
|
77
|
-
it 'uses
|
78
|
-
|
88
|
+
it 'uses aio paths for hosts with aio type (backwards compatability)' do
|
89
|
+
hosts.each do |host|
|
90
|
+
host[:type] = 'aio'
|
91
|
+
end
|
92
|
+
expect(subject).to receive(:add_aio_defaults_on).exactly(hosts.length).times
|
93
|
+
expect(subject).to receive(:add_foss_defaults_on).never
|
79
94
|
expect(subject).to receive(:add_puppet_paths_on).exactly(hosts.length).times
|
80
95
|
|
81
96
|
subject.configure_foss_defaults_on( hosts )
|
82
97
|
end
|
83
98
|
|
84
|
-
it 'uses aio paths for hosts of version >= 4.0
|
85
|
-
agents = []
|
86
|
-
not_agents = []
|
99
|
+
it 'uses aio paths for hosts of version >= 4.0' do
|
87
100
|
hosts.each do |host|
|
88
101
|
host[:version] = '4.0'
|
89
102
|
host[:pe_ver] = nil
|
90
|
-
|
91
|
-
agents << host
|
92
|
-
else
|
93
|
-
not_agents << host
|
94
|
-
end
|
103
|
+
host[:roles] = host[:roles] - ['aio']
|
95
104
|
end
|
96
|
-
expect(subject).to receive(:add_aio_defaults_on).exactly(
|
97
|
-
expect(subject).to receive(:add_foss_defaults_on).exactly(
|
105
|
+
expect(subject).to receive(:add_aio_defaults_on).exactly(hosts.length).times
|
106
|
+
expect(subject).to receive(:add_foss_defaults_on).exactly(hosts.length).times
|
98
107
|
expect(subject).to receive(:add_puppet_paths_on).exactly(hosts.length).times
|
99
108
|
|
100
109
|
subject.configure_foss_defaults_on( hosts )
|
@@ -103,8 +112,23 @@ describe ClassMixedWithDSLInstallUtils do
|
|
103
112
|
it 'uses foss paths for hosts of version < 4.0' do
|
104
113
|
hosts.each do |host|
|
105
114
|
host[:version] = '3.8'
|
115
|
+
host[:pe_ver] = nil
|
116
|
+
end
|
117
|
+
expect(subject).to receive(:add_foss_defaults_on).exactly(hosts.length).times
|
118
|
+
expect(subject).to receive(:add_aio_defaults_on).never
|
119
|
+
expect(subject).to receive(:add_puppet_paths_on).exactly(hosts.length).times
|
120
|
+
|
121
|
+
subject.configure_foss_defaults_on( hosts )
|
122
|
+
end
|
123
|
+
|
124
|
+
it 'uses foss paths for foss-like type foss-package' do
|
125
|
+
hosts.each do |host|
|
126
|
+
host[:type] = 'foss-package'
|
127
|
+
host[:version] = '3.8'
|
128
|
+
host[:pe_ver] = nil
|
106
129
|
end
|
107
130
|
expect(subject).to receive(:add_foss_defaults_on).exactly(hosts.length).times
|
131
|
+
expect(subject).to receive(:add_aio_defaults_on).never
|
108
132
|
expect(subject).to receive(:add_puppet_paths_on).exactly(hosts.length).times
|
109
133
|
|
110
134
|
subject.configure_foss_defaults_on( hosts )
|
@@ -112,6 +136,54 @@ describe ClassMixedWithDSLInstallUtils do
|
|
112
136
|
|
113
137
|
end
|
114
138
|
|
139
|
+
context 'lookup_in_env' do
|
140
|
+
it 'returns a default properly' do
|
141
|
+
env_var = subject.lookup_in_env('noway', 'nonesuch', 'returnme')
|
142
|
+
expect(env_var).to be == 'returnme'
|
143
|
+
env_var = subject.lookup_in_env('noway', nil, 'returnme')
|
144
|
+
expect(env_var).to be == 'returnme'
|
145
|
+
end
|
146
|
+
it 'finds correct env variable' do
|
147
|
+
allow(ENV).to receive(:[]).with(nil).and_return(nil)
|
148
|
+
allow(ENV).to receive(:[]).with('REALLYNONE').and_return(nil)
|
149
|
+
allow(ENV).to receive(:[]).with('NONESUCH').and_return('present')
|
150
|
+
allow(ENV).to receive(:[]).with('NOWAY_PROJ_NONESUCH').and_return('exists')
|
151
|
+
env_var = subject.lookup_in_env('nonesuch', 'noway-proj', 'fail')
|
152
|
+
expect(env_var).to be == 'exists'
|
153
|
+
env_var = subject.lookup_in_env('nonesuch')
|
154
|
+
expect(env_var).to be == 'present'
|
155
|
+
env_var = subject.lookup_in_env('reallynone')
|
156
|
+
expect(env_var).to be == nil
|
157
|
+
env_var = subject.lookup_in_env('reallynone',nil,'default')
|
158
|
+
expect(env_var).to be == 'default'
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
context 'build_giturl' do
|
163
|
+
it 'returns urls properly' do
|
164
|
+
allow(ENV).to receive(:[]).with('SERVER').and_return(nil)
|
165
|
+
allow(ENV).to receive(:[]).with('FORK').and_return(nil)
|
166
|
+
allow(ENV).to receive(:[]).with('PUPPET_FORK').and_return(nil)
|
167
|
+
allow(ENV).to receive(:[]).with('PUPPET_SERVER').and_return(nil)
|
168
|
+
url = subject.build_giturl('puppet')
|
169
|
+
expect(url).to be == 'https://github.com/puppetlabs/puppet.git'
|
170
|
+
url = subject.build_giturl('puppet', 'er0ck')
|
171
|
+
expect(url).to be == 'https://github.com/er0ck/puppet.git'
|
172
|
+
url = subject.build_giturl('puppet', 'er0ck', 'bitbucket.com')
|
173
|
+
expect(url).to be == 'https://bitbucket.com/er0ck-puppet.git'
|
174
|
+
url = subject.build_giturl('puppet', 'er0ck', 'github.com', 'https://')
|
175
|
+
expect(url).to be == 'https://github.com/er0ck/puppet.git'
|
176
|
+
url = subject.build_giturl('puppet', 'er0ck', 'github.com', 'https')
|
177
|
+
expect(url).to be == 'https://github.com/er0ck/puppet.git'
|
178
|
+
url = subject.build_giturl('puppet', 'er0ck', 'github.com', 'git@')
|
179
|
+
expect(url).to be == 'git@github.com:er0ck/puppet.git'
|
180
|
+
url = subject.build_giturl('puppet', 'er0ck', 'github.com', 'git')
|
181
|
+
expect(url).to be == 'git@github.com:er0ck/puppet.git'
|
182
|
+
url = subject.build_giturl('puppet', 'er0ck', 'github.com', 'ssh')
|
183
|
+
expect(url).to be == 'git@github.com:er0ck/puppet.git'
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
115
187
|
context 'extract_repo_info_from' do
|
116
188
|
[{ :protocol => 'git', :path => 'git://github.com/puppetlabs/project.git' },
|
117
189
|
{ :protocol => 'ssh', :path => 'git@github.com:puppetlabs/project.git' },
|
@@ -175,13 +247,15 @@ describe ClassMixedWithDSLInstallUtils do
|
|
175
247
|
end
|
176
248
|
|
177
249
|
context 'install_puppet_from_msi' do
|
250
|
+
before :each do
|
251
|
+
expect(subject).to receive(:get_temp_path).and_return(win_temp)
|
252
|
+
end
|
178
253
|
|
179
254
|
it 'installs puppet on cygwin windows' do
|
180
255
|
allow(subject).to receive(:link_exists?).and_return( true )
|
181
|
-
|
182
|
-
expect(subject).to receive(:on).with(winhost, 'curl -O http://downloads.puppetlabs.com/windows/puppet-3.7.1.msi')
|
256
|
+
expect(subject).to receive(:on).with(winhost, "curl -o \"#{win_temp}\\puppet-3.7.1.msi\" -O http://downloads.puppetlabs.com/windows/puppet-3.7.1.msi")
|
183
257
|
expect(subject).to receive(:on).with(winhost, " echo 'export PATH=$PATH:\"/cygdrive/c/Program Files (x86)/Puppet Labs/Puppet/bin\":\"/cygdrive/c/Program Files/Puppet Labs/Puppet/bin\"' > /etc/bash.bashrc ")
|
184
|
-
expect(subject).to receive(:
|
258
|
+
expect(subject).to receive(:install_msi_on).with(winhost, "#{win_temp}\\puppet-3.7.1.msi", {}, {:debug => nil})
|
185
259
|
|
186
260
|
subject.install_puppet_from_msi( winhost, {:version => '3.7.1', :win_download_url => 'http://downloads.puppetlabs.com/windows'} )
|
187
261
|
end
|
@@ -191,18 +265,18 @@ describe ClassMixedWithDSLInstallUtils do
|
|
191
265
|
|
192
266
|
expect(winhost_non_cygwin).to receive(:mkdir_p).with('C:\\ProgramData\\PuppetLabs\\puppet\\etc\\modules')
|
193
267
|
|
194
|
-
expect(subject).to receive(:on) do |
|
268
|
+
expect(subject).to receive(:on).with(winhost_non_cygwin, instance_of( Beaker::Command )) do |host, beaker_command|
|
195
269
|
expect(beaker_command.command).to eq('powershell.exe')
|
196
|
-
expect(beaker_command.args).to eq(["-ExecutionPolicy Bypass", "-InputFormat None", "-NoLogo", "-NoProfile", "-NonInteractive", "-Command $webclient = New-Object System.Net.WebClient; $webclient.DownloadFile('http://downloads.puppetlabs.com/windows/puppet-3.7.1.msi','
|
197
|
-
end
|
270
|
+
expect(beaker_command.args).to eq(["-ExecutionPolicy Bypass", "-InputFormat None", "-NoLogo", "-NoProfile", "-NonInteractive", "-Command $webclient = New-Object System.Net.WebClient; $webclient.DownloadFile('http://downloads.puppetlabs.com/windows/puppet-3.7.1.msi','#{win_temp}\\puppet-3.7.1.msi')"])
|
271
|
+
end.once
|
198
272
|
|
199
|
-
expect(subject).to receive(:
|
273
|
+
expect(subject).to receive(:install_msi_on).with(winhost_non_cygwin, "#{win_temp}\\puppet-3.7.1.msi", {}, {:debug => nil})
|
200
274
|
|
201
275
|
subject.install_puppet_from_msi( winhost_non_cygwin, {:version => '3.7.1', :win_download_url => 'http://downloads.puppetlabs.com/windows'} )
|
202
276
|
end
|
203
277
|
end
|
204
278
|
|
205
|
-
context '
|
279
|
+
context 'clone_git_repo_on' do
|
206
280
|
it 'does a ton of stuff it probably shouldnt' do
|
207
281
|
repo = { :name => 'puppet',
|
208
282
|
:path => 'git://my.server.net/puppet.git',
|
@@ -214,11 +288,11 @@ describe ClassMixedWithDSLInstallUtils do
|
|
214
288
|
allow( subject ).to receive( :metadata ).and_return( metadata )
|
215
289
|
allow( subject ).to receive( :configure_foss_defaults_on ).and_return( true )
|
216
290
|
|
217
|
-
expect( subject ).to receive( :logger ).exactly(
|
218
|
-
expect( subject ).to receive( :on ).exactly(
|
291
|
+
expect( subject ).to receive( :logger ).exactly( 2 ).times.and_return( logger )
|
292
|
+
expect( subject ).to receive( :on ).exactly( 3 ).times
|
219
293
|
|
220
294
|
subject.instance_variable_set( :@metadata, {} )
|
221
|
-
subject.
|
295
|
+
subject.clone_git_repo_on( host, path, repo )
|
222
296
|
end
|
223
297
|
|
224
298
|
it 'allows a checkout depth of 1' do
|
@@ -233,15 +307,14 @@ describe ClassMixedWithDSLInstallUtils do
|
|
233
307
|
logger = double.as_null_object
|
234
308
|
allow( subject ).to receive( :metadata ).and_return( metadata )
|
235
309
|
allow( subject ).to receive( :configure_foss_defaults_on ).and_return( true )
|
236
|
-
expect( subject ).to receive( :logger ).exactly(
|
237
|
-
expect( subject ).to receive( :on ).with( host,"test -d #{path} || mkdir -p #{path}").exactly( 1 ).times
|
310
|
+
expect( subject ).to receive( :logger ).exactly( 2 ).times.and_return( logger )
|
311
|
+
expect( subject ).to receive( :on ).with( host, "test -d #{path} || mkdir -p #{path}", {:accept_all_exit_codes=>true} ).exactly( 1 ).times
|
238
312
|
# this is the the command we want to test
|
239
|
-
expect( subject ).to receive( :on ).with( host, cmd ).exactly( 1 ).times
|
240
|
-
expect( subject ).to receive( :on ).with( host, "cd #{path}/#{repo[:name]} && git remote rm origin && git remote add origin #{repo[:path]} && git fetch origin +refs/pull/*:refs/remotes/origin/pr/* +refs/heads/*:refs/remotes/origin/* && git clean -fdx && git checkout -f #{repo[:rev]}" ).exactly( 1 ).times
|
241
|
-
expect( subject ).to receive( :on ).with( host, "cd #{path}/#{repo[:name]} && if [ -f install.rb ]; then ruby ./install.rb ; else true; fi" ).exactly( 1 ).times
|
313
|
+
expect( subject ).to receive( :on ).with( host, cmd, {:accept_all_exit_codes=>true} ).exactly( 1 ).times
|
314
|
+
expect( subject ).to receive( :on ).with( host, "cd #{path}/#{repo[:name]} && git remote rm origin && git remote add origin #{repo[:path]} && git fetch origin +refs/pull/*:refs/remotes/origin/pr/* +refs/heads/*:refs/remotes/origin/* && git clean -fdx && git checkout -f #{repo[:rev]}", {:accept_all_exit_codes=>true} ).exactly( 1 ).times
|
242
315
|
|
243
316
|
subject.instance_variable_set( :@metadata, {} )
|
244
|
-
subject.
|
317
|
+
subject.clone_git_repo_on( host, path, repo )
|
245
318
|
end
|
246
319
|
|
247
320
|
it 'allows a checkout depth with a rev from a specific branch' do
|
@@ -257,16 +330,57 @@ describe ClassMixedWithDSLInstallUtils do
|
|
257
330
|
allow( subject ).to receive( :configure_foss_defaults_on ).and_return( true )
|
258
331
|
logger = double.as_null_object
|
259
332
|
allow( subject ).to receive( :metadata ).and_return( metadata )
|
260
|
-
expect( subject ).to receive( :logger ).exactly(
|
261
|
-
expect( subject ).to receive( :on ).with( host,"test -d #{path} || mkdir -p #{path}").exactly( 1 ).times
|
333
|
+
expect( subject ).to receive( :logger ).exactly( 2 ).times.and_return( logger )
|
334
|
+
expect( subject ).to receive( :on ).with( host, "test -d #{path} || mkdir -p #{path}", {:accept_all_exit_codes=>true} ).exactly( 1 ).times
|
262
335
|
# this is the the command we want to test
|
263
|
-
expect( subject ).to receive( :on ).with( host, cmd ).exactly( 1 ).times
|
264
|
-
expect( subject ).to receive( :on ).with( host, "cd #{path}/#{repo[:name]} && git remote rm origin && git remote add origin #{repo[:path]} && git fetch origin +refs/pull/*:refs/remotes/origin/pr/* +refs/heads/*:refs/remotes/origin/* && git clean -fdx && git checkout -f #{repo[:rev]}" ).exactly( 1 ).times
|
265
|
-
|
336
|
+
expect( subject ).to receive( :on ).with( host, cmd, {:accept_all_exit_codes=>true} ).exactly( 1 ).times
|
337
|
+
expect( subject ).to receive( :on ).with( host, "cd #{path}/#{repo[:name]} && git remote rm origin && git remote add origin #{repo[:path]} && git fetch origin +refs/pull/*:refs/remotes/origin/pr/* +refs/heads/*:refs/remotes/origin/* && git clean -fdx && git checkout -f #{repo[:rev]}", {:accept_all_exit_codes=>true} ).exactly( 1 ).times
|
338
|
+
|
339
|
+
subject.instance_variable_set( :@metadata, {} )
|
340
|
+
subject.clone_git_repo_on( host, path, repo )
|
341
|
+
end
|
342
|
+
end
|
343
|
+
|
344
|
+
context 'install_from_git' do
|
345
|
+
it 'does a ton of stuff it probably shouldnt' do
|
346
|
+
repo = { :name => 'puppet',
|
347
|
+
:path => 'git://my.server.net/puppet.git',
|
348
|
+
:rev => 'master' }
|
349
|
+
path = '/path/to/repos'
|
350
|
+
host = { 'platform' => 'debian' }
|
351
|
+
logger = double.as_null_object
|
352
|
+
|
353
|
+
allow( subject ).to receive( :metadata ).and_return( metadata )
|
354
|
+
allow( subject ).to receive( :configure_foss_defaults_on ).and_return( true )
|
355
|
+
|
356
|
+
expect( subject ).to receive( :logger ).exactly( 3 ).times.and_return( logger )
|
357
|
+
expect( subject ).to receive( :on ).exactly( 4 ).times
|
266
358
|
|
267
359
|
subject.instance_variable_set( :@metadata, {} )
|
268
360
|
subject.install_from_git( host, path, repo )
|
269
361
|
end
|
362
|
+
|
363
|
+
it 'should attempt to install ruby code' do
|
364
|
+
repo = { :name => 'puppet',
|
365
|
+
:path => 'git://my.server.net/puppet.git',
|
366
|
+
:rev => 'master',
|
367
|
+
:depth => 1 }
|
368
|
+
|
369
|
+
path = '/path/to/repos'
|
370
|
+
cmd = "test -d #{path}/#{repo[:name]} || git clone --branch #{repo[:rev]} --depth #{repo[:depth]} #{repo[:path]} #{path}/#{repo[:name]}"
|
371
|
+
host = { 'platform' => 'debian' }
|
372
|
+
logger = double.as_null_object
|
373
|
+
allow( subject ).to receive( :metadata ).and_return( metadata )
|
374
|
+
allow( subject ).to receive( :configure_foss_defaults_on ).and_return( true )
|
375
|
+
expect( subject ).to receive( :logger ).exactly( 3 ).times.and_return( logger )
|
376
|
+
expect( subject ).to receive( :on ).with( host, "test -d #{path} || mkdir -p #{path}", {:accept_all_exit_codes=>true} ).exactly( 1 ).times
|
377
|
+
expect( subject ).to receive( :on ).with( host, cmd, {:accept_all_exit_codes=>true} ).exactly( 1 ).times
|
378
|
+
expect( subject ).to receive( :on ).with( host, "cd #{path}/#{repo[:name]} && git remote rm origin && git remote add origin #{repo[:path]} && git fetch origin +refs/pull/*:refs/remotes/origin/pr/* +refs/heads/*:refs/remotes/origin/* && git clean -fdx && git checkout -f #{repo[:rev]}", {:accept_all_exit_codes=>true} ).exactly( 1 ).times
|
379
|
+
expect( subject ).to receive( :on ).with( host, "cd #{path}/#{repo[:name]} && if [ -f install.rb ]; then ruby ./install.rb ; else true; fi", {:accept_all_exit_codes=>true} ).exactly( 1 ).times
|
380
|
+
|
381
|
+
subject.instance_variable_set( :@metadata, {} )
|
382
|
+
subject.install_from_git_on( host, path, repo )
|
383
|
+
end
|
270
384
|
end
|
271
385
|
|
272
386
|
describe '#install_puppet' do
|
@@ -337,19 +451,28 @@ describe ClassMixedWithDSLInstallUtils do
|
|
337
451
|
end
|
338
452
|
context 'on windows' do
|
339
453
|
let(:platform) { Beaker::Platform.new('windows-2008r2-i386') }
|
454
|
+
|
455
|
+
before :each do
|
456
|
+
expect(subject).to receive(:get_temp_path).exactly(hosts.length).times.and_return(win_temp)
|
457
|
+
end
|
458
|
+
|
340
459
|
it 'installs specific version of puppet when passed :version' do
|
341
460
|
allow(hosts[0]).to receive(:is_cygwin?).and_return(true)
|
342
461
|
allow(subject).to receive(:link_exists?).and_return( true )
|
343
|
-
expect(subject).to receive(:on).with(hosts[0],
|
462
|
+
expect(subject).to receive(:on).with(hosts[0], "curl -o \"#{win_temp}\\puppet-3.msi\" -O http://downloads.puppetlabs.com/windows/puppet-3.msi")
|
344
463
|
expect(subject).to receive(:on).with(hosts[0], " echo 'export PATH=$PATH:\"/cygdrive/c/Program Files (x86)/Puppet Labs/Puppet/bin\":\"/cygdrive/c/Program Files/Puppet Labs/Puppet/bin\"' > /etc/bash.bashrc ")
|
345
|
-
expect(subject).to receive(:
|
464
|
+
expect(subject).to receive(:install_msi_on).with(hosts[0], "#{win_temp}\\puppet-3.msi", {}, {:debug => nil}).exactly(1).times
|
465
|
+
allow(subject).to receive(:install_msi_on).with(any_args)
|
466
|
+
|
346
467
|
subject.install_puppet(:version => '3')
|
347
468
|
end
|
348
469
|
it 'installs from custom url when passed :win_download_url' do
|
349
470
|
allow(hosts[0]).to receive(:is_cygwin?).and_return(true)
|
350
471
|
allow(subject).to receive(:link_exists?).and_return( true )
|
351
|
-
expect(subject).to receive(:on).with(hosts[0],
|
352
|
-
expect(subject).to receive(:
|
472
|
+
expect(subject).to receive(:on).with(hosts[0], "curl -o \"#{win_temp}\\puppet-3.msi\" -O http://nightlies.puppetlabs.com/puppet-latest/repos/windows/puppet-3.msi")
|
473
|
+
expect(subject).to receive(:install_msi_on).with(hosts[0], "#{win_temp}\\puppet-3.msi", {}, {:debug => nil})
|
474
|
+
allow(subject).to receive(:install_msi_on).with(any_args)
|
475
|
+
|
353
476
|
subject.install_puppet( :version => '3', :win_download_url => 'http://nightlies.puppetlabs.com/puppet-latest/repos/windows' )
|
354
477
|
end
|
355
478
|
end
|
@@ -742,13 +865,14 @@ describe ClassMixedWithDSLInstallUtils do
|
|
742
865
|
host['platform'] = platform
|
743
866
|
opts = { :version => '0.1.0' }
|
744
867
|
allow( subject ).to receive( :options ).and_return( {} )
|
868
|
+
copied_path = "#{win_temp}\\puppet-agent-x64.msi"
|
745
869
|
mock_echo = Object.new()
|
746
|
-
allow( mock_echo ).to receive( :raw_output ).and_return(
|
870
|
+
allow( mock_echo ).to receive( :raw_output ).and_return( copied_path )
|
747
871
|
|
748
872
|
expect(subject).to receive(:fetch_http_file).once.with(/\/windows$/, 'puppet-agent-x64.msi', /\/windows$/)
|
749
873
|
expect(subject).to receive(:scp_to).once.with(host, /\/puppet-agent-x64.msi$/, /cygpath/)
|
874
|
+
expect(subject).to receive(:install_msi_on).with(host, copied_path, {}, {:debug => nil}).once
|
750
875
|
expect(subject).to receive(:on).ordered.with(host, /echo/).and_return(mock_echo)
|
751
|
-
expect(subject).to receive(:on).ordered.with(host, anything)
|
752
876
|
|
753
877
|
subject.install_puppetagent_dev_repo( host, opts )
|
754
878
|
end
|
@@ -786,6 +910,25 @@ describe ClassMixedWithDSLInstallUtils do
|
|
786
910
|
end
|
787
911
|
end
|
788
912
|
|
913
|
+
describe '#install_puppet_agent_pe_promoted_repo_on' do
|
914
|
+
|
915
|
+
it 'splits the platform string version correctly to get ubuntu puppet-agent packages' do
|
916
|
+
platform = Object.new()
|
917
|
+
allow(platform).to receive(:to_array) { ['ubuntu', '9999', 'x42']}
|
918
|
+
host = basic_hosts.first
|
919
|
+
host['platform'] = platform
|
920
|
+
|
921
|
+
expect(subject).to receive(:fetch_http_file).once.with(/\/puppet-agent\//, "puppet-agent-ubuntu-99.99-x42.tar.gz", /ubuntu/)
|
922
|
+
expect(subject).to receive(:scp_to).once.with(host, /-ubuntu-99.99-x42\./, "/root")
|
923
|
+
expect(subject).to receive(:on).ordered.with(host, /^tar.*-ubuntu-99.99-x42/)
|
924
|
+
expect(subject).to receive(:on).ordered.with(host, /dpkg\ -i\ --force-all/)
|
925
|
+
expect(subject).to receive(:on).ordered.with(host, /apt-get\ update/)
|
926
|
+
|
927
|
+
subject.install_puppet_agent_pe_promoted_repo_on( host, {} )
|
928
|
+
end
|
929
|
+
|
930
|
+
end
|
931
|
+
|
789
932
|
describe '#install_cert_on_windows' do
|
790
933
|
before do
|
791
934
|
allow(subject).to receive(:on).and_return(Beaker::Result.new({},''))
|
@@ -842,11 +985,13 @@ describe ClassMixedWithDSLInstallUtils do
|
|
842
985
|
|
843
986
|
before :each do
|
844
987
|
allow( subject ).to receive( :configure_foss_defaults_on ).and_return( true )
|
988
|
+
allow( subject ).to receive( :install_msi_on ).with( any_args )
|
845
989
|
end
|
846
990
|
|
847
991
|
def test_fetch_http_file_no_ending_slash(platform)
|
848
992
|
@platform = platform
|
849
993
|
allow( subject ).to receive( :scp_to )
|
994
|
+
allow( subject ).to receive( :configure_type_defaults_on ).with(host)
|
850
995
|
|
851
996
|
expect( subject ).to receive( :fetch_http_file ).with( /[^\/]\z/, anything, anything )
|
852
997
|
subject.install_puppet_agent_pe_promoted_repo_on( host, opts )
|