beaker 2.5.1 → 2.6.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 +184 -2
- data/acceptance/fixtures/README.md +3 -0
- data/acceptance/fixtures/module/Gemfile +12 -0
- data/acceptance/fixtures/module/README.md +79 -0
- data/acceptance/fixtures/module/Rakefile +18 -0
- data/acceptance/fixtures/module/lib/empty.txt +1 -0
- data/acceptance/fixtures/module/manifests/init.pp +41 -0
- data/acceptance/fixtures/module/metadata.json +14 -0
- data/acceptance/fixtures/module/spec/acceptance/demo_spec.rb +72 -0
- data/acceptance/fixtures/module/spec/acceptance/nodesets/centos-59-x64.yml +10 -0
- data/acceptance/fixtures/module/spec/acceptance/nodesets/centos-64-x64-pe.yml +12 -0
- data/acceptance/fixtures/module/spec/acceptance/nodesets/centos-64-x64.yml +10 -0
- data/acceptance/fixtures/module/spec/acceptance/nodesets/centos-65-x64.yml +10 -0
- data/acceptance/fixtures/module/spec/acceptance/nodesets/default.yml +10 -0
- data/acceptance/fixtures/module/spec/acceptance/nodesets/fedora-18-x64.yml +10 -0
- data/acceptance/fixtures/module/spec/acceptance/nodesets/internal-vpool.yml +17 -0
- data/acceptance/fixtures/module/spec/acceptance/nodesets/sles-11-x64.yml +10 -0
- data/acceptance/fixtures/module/spec/acceptance/nodesets/ubuntu-server-10044-x64.yml +10 -0
- data/acceptance/fixtures/module/spec/acceptance/nodesets/ubuntu-server-12042-x64.yml +10 -0
- data/acceptance/fixtures/module/spec/acceptance/nodesets/ubuntu-server-1404-x64.yml +11 -0
- data/acceptance/fixtures/module/spec/acceptance/nodesets/ubuntu-server-14042-x64.yml +16 -0
- data/acceptance/fixtures/module/spec/classes/init_spec.rb +7 -0
- data/acceptance/fixtures/module/spec/spec_helper.rb +1 -0
- data/acceptance/fixtures/module/spec/spec_helper_acceptance.rb +38 -0
- data/acceptance/fixtures/module/tests/init.pp +12 -0
- data/acceptance/fixtures/module/vendor/bundle/ruby/gems.txt +1 -0
- data/acceptance/pre_suite/README.md +7 -0
- data/acceptance/tests/base/README.md +4 -0
- data/acceptance/tests/base/host.rb +154 -0
- data/acceptance/tests/puppet/README.md +3 -0
- data/lib/beaker/answers/version20.rb +1 -1
- data/lib/beaker/answers/version28.rb +1 -1
- data/lib/beaker/answers/version30.rb +1 -1
- data/lib/beaker/dsl/helpers.rb +12 -2
- data/lib/beaker/dsl/install_utils.rb +16 -6
- data/lib/beaker/host.rb +79 -13
- data/lib/beaker/host/pswindows/exec.rb +4 -0
- data/lib/beaker/host/unix.rb +3 -12
- data/lib/beaker/host/windows.rb +2 -11
- data/lib/beaker/host/windows/file.rb +1 -1
- data/lib/beaker/host/windows/pkg.rb +1 -1
- data/lib/beaker/host_prebuilt_steps.rb +1 -1
- data/lib/beaker/hypervisor.rb +4 -2
- data/lib/beaker/hypervisor/{vcloud_pooled.rb → vmpooler.rb} +10 -14
- data/lib/beaker/options/presets.rb +1 -0
- data/lib/beaker/version.rb +1 -1
- data/spec/beaker/dsl/helpers_spec.rb +16 -0
- data/spec/beaker/dsl/install_utils_spec.rb +7 -6
- data/spec/beaker/host_spec.rb +13 -11
- data/spec/beaker/hypervisor/hypervisor_spec.rb +2 -2
- data/spec/beaker/hypervisor/{vcloud_pooled_spec.rb → vmpooler_spec.rb} +20 -20
- metadata +33 -4
@@ -709,7 +709,7 @@ module Beaker
|
|
709
709
|
end
|
710
710
|
|
711
711
|
# Certain install paths may not create the config dirs/files needed
|
712
|
-
on host, "mkdir -p #{host['puppetpath']}"
|
712
|
+
on host, "mkdir -p #{host['puppetpath']}" unless host[:type] =~ /aio/
|
713
713
|
on host, "echo '' >> #{host.puppet['hiera_config']}"
|
714
714
|
end
|
715
715
|
nil
|
@@ -770,7 +770,7 @@ module Beaker
|
|
770
770
|
# @return nil
|
771
771
|
def configure_puppet_on(host, opts = {})
|
772
772
|
if host['platform'] =~ /windows/
|
773
|
-
puppet_conf =
|
773
|
+
puppet_conf = host.puppet['config']
|
774
774
|
conf_data = ''
|
775
775
|
opts.each do |section,options|
|
776
776
|
conf_data << "[#{section}]`n"
|
@@ -781,7 +781,7 @@ module Beaker
|
|
781
781
|
end
|
782
782
|
on host, powershell("\$text = \\\"#{conf_data}\\\"; Set-Content -path '#{puppet_conf}' -value \$text")
|
783
783
|
else
|
784
|
-
puppet_conf =
|
784
|
+
puppet_conf = host.puppet['config']
|
785
785
|
conf_data = ''
|
786
786
|
opts.each do |section,options|
|
787
787
|
conf_data << "[#{section}]\n"
|
@@ -1426,17 +1426,27 @@ module Beaker
|
|
1426
1426
|
:ignore_list => PUPPET_MODULE_INSTALL_IGNORE}.merge(opts)
|
1427
1427
|
ignore_list = build_ignore_list(opts)
|
1428
1428
|
target_module_dir = on( host, "echo #{opts[:target_module_path]}" ).stdout.chomp
|
1429
|
-
|
1429
|
+
source_path = File.expand_path( opts[:source] )
|
1430
|
+
source_dir = File.dirname(source_path)
|
1431
|
+
source_name = File.basename(source_path)
|
1430
1432
|
if opts.has_key?(:module_name)
|
1431
1433
|
module_name = opts[:module_name]
|
1432
1434
|
else
|
1433
|
-
_, module_name = parse_for_modulename(
|
1435
|
+
_, module_name = parse_for_modulename( source_path )
|
1434
1436
|
end
|
1435
1437
|
|
1436
1438
|
opts[:protocol] ||= 'scp'
|
1437
1439
|
case opts[:protocol]
|
1438
1440
|
when 'scp'
|
1439
|
-
|
1441
|
+
#move to the host
|
1442
|
+
scp_to host, source_path, target_module_dir, {:ignore => ignore_list}
|
1443
|
+
#rename to the selected module name, if not correct
|
1444
|
+
cur_path = File.join(target_module_dir, source_name)
|
1445
|
+
new_path = File.join(target_module_dir, module_name)
|
1446
|
+
if cur_path != new_path
|
1447
|
+
# NOTE: this will need to be updated to handle powershell only windows SUTs
|
1448
|
+
on host, "mv #{cur_path} #{new_path}"
|
1449
|
+
end
|
1440
1450
|
when 'rsync'
|
1441
1451
|
rsync_to host, source, File.join(target_module_dir, module_name), {:ignore => ignore_list}
|
1442
1452
|
else
|
data/lib/beaker/host.rb
CHANGED
@@ -212,8 +212,13 @@ module Beaker
|
|
212
212
|
#@return [Boolean] true if x86_64, false otherwise
|
213
213
|
def determine_if_x86_64
|
214
214
|
if is_cygwin?
|
215
|
-
|
216
|
-
|
215
|
+
if self[:platform] =~ /osx|solaris/
|
216
|
+
result = exec(Beaker::Command.new("uname -a | grep x86_64"), :acceptable_exit_codes => (0...127))
|
217
|
+
result.exit_code == 0
|
218
|
+
else
|
219
|
+
result = exec(Beaker::Command.new("arch | grep x86_64"), :acceptable_exit_codes => (0...127))
|
220
|
+
result.exit_code == 0
|
221
|
+
end
|
217
222
|
else
|
218
223
|
result = exec(Beaker::Command.new("wmic os get osarchitecture"), :acceptable_exit_codes => (0...127))
|
219
224
|
result.stdout =~ /64/
|
@@ -225,6 +230,29 @@ module Beaker
|
|
225
230
|
@x86_64 ||= determine_if_x86_64
|
226
231
|
end
|
227
232
|
|
233
|
+
# Converts the provided environment file to a new shell script in /etc/profile.d, then sources that file.
|
234
|
+
# This is for sles based hosts.
|
235
|
+
# @param [String] env_file The ssh environment file to read from
|
236
|
+
def mirror_env_to_profile_d env_file
|
237
|
+
if self[:platform] =~ /sles-/
|
238
|
+
@logger.debug("mirroring environment to /etc/profile.d on sles platform host")
|
239
|
+
cur_env = exec(Beaker::Command.new("cat #{env_file}")).stdout
|
240
|
+
shell_env = ''
|
241
|
+
cur_env.each_line do |env_line|
|
242
|
+
shell_env << "export #{env_line}"
|
243
|
+
end
|
244
|
+
#here doc it over
|
245
|
+
exec(Beaker::Command.new("cat << EOF > #{self[:profile_d_env_file]}\n#{shell_env}EOF"))
|
246
|
+
#set permissions
|
247
|
+
exec(Beaker::Command.new("chmod +x #{self[:profile_d_env_file]}"))
|
248
|
+
#keep it current
|
249
|
+
exec(Beaker::Command.new("source #{self[:profile_d_env_file]}"))
|
250
|
+
else
|
251
|
+
#noop
|
252
|
+
@logger.debug("will not mirror environment to /etc/profile.d on non-sles platform host")
|
253
|
+
end
|
254
|
+
end
|
255
|
+
|
228
256
|
#Add the provided key/val to the current ssh environment
|
229
257
|
#@param [String] key The key to add the value to
|
230
258
|
#@param [String] val The value for the key
|
@@ -236,14 +264,17 @@ module Beaker
|
|
236
264
|
env_file = self[:ssh_env_file]
|
237
265
|
escaped_val = Regexp.escape(val).gsub('/', '\/').gsub(';', '\;')
|
238
266
|
#see if the key/value pair already exists
|
239
|
-
if exec(Beaker::Command.new("grep
|
267
|
+
if exec(Beaker::Command.new("grep #{key}=.*#{escaped_val} #{env_file}"), :acceptable_exit_codes => (0..255) ).exit_code == 0
|
240
268
|
return #nothing to do here, key value pair already exists
|
241
269
|
#see if the key already exists
|
242
270
|
elsif exec(Beaker::Command.new("grep #{key} #{env_file}"), :acceptable_exit_codes => (0..255) ).exit_code == 0
|
243
|
-
exec(Beaker::SedCommand.new(self['
|
271
|
+
exec(Beaker::SedCommand.new(self['platform'], "s/#{key}=/#{key}=#{escaped_val}:/", env_file))
|
244
272
|
else
|
245
273
|
exec(Beaker::Command.new("echo \"#{key}=#{val}\" >> #{env_file}"))
|
246
274
|
end
|
275
|
+
#update the profile.d to current state
|
276
|
+
#match it to the contents of ssh_env_file
|
277
|
+
mirror_env_to_profile_d(env_file)
|
247
278
|
else #powershell windows
|
248
279
|
#see if the key/value pair already exists
|
249
280
|
result = exec(Beaker::Command.new("set #{key}"), :acceptable_exit_codes => (0..255))
|
@@ -259,6 +290,15 @@ module Beaker
|
|
259
290
|
end
|
260
291
|
end
|
261
292
|
|
293
|
+
#Return the value of a specific env var
|
294
|
+
#@param [String] key The key to look for
|
295
|
+
#@example
|
296
|
+
# host.get_env_var('path')
|
297
|
+
def get_env_var key
|
298
|
+
key = key.to_s.upcase
|
299
|
+
exec(Beaker::Command.new("env | grep #{key}"), :acceptable_exit_codes => (0..255)).stdout.chomp
|
300
|
+
end
|
301
|
+
|
262
302
|
#Delete the provided key/val from the current ssh environment
|
263
303
|
#@param [String] key The key to delete the value from
|
264
304
|
#@param [String] val The value to delete for the key
|
@@ -267,11 +307,17 @@ module Beaker
|
|
267
307
|
def delete_env_var key, val
|
268
308
|
key = key.to_s.upcase
|
269
309
|
if self.is_cygwin?
|
310
|
+
env_file = self[:ssh_env_file]
|
270
311
|
val = Regexp.escape(val).gsub('/', '\/').gsub(';', '\;')
|
271
312
|
#if the key only has that single value remove the entire line
|
272
|
-
exec(Beaker::SedCommand.new(self['
|
273
|
-
#
|
274
|
-
exec(Beaker::SedCommand.new(self['
|
313
|
+
exec(Beaker::SedCommand.new(self['platform'], "/#{key}=#{val}$/d", env_file))
|
314
|
+
#value in middle of list
|
315
|
+
exec(Beaker::SedCommand.new(self['platform'], "s/#{key}=\\(.*\\)[;:]#{val}/#{key}=\\1/", env_file))
|
316
|
+
#value in start of list
|
317
|
+
exec(Beaker::SedCommand.new(self['platform'], "s/#{key}=#{val}[;:]/#{key}=/", env_file))
|
318
|
+
#update the profile.d to current state
|
319
|
+
#match it to the contents of ssh_env_file
|
320
|
+
mirror_env_to_profile_d(env_file)
|
275
321
|
else #powershell windows
|
276
322
|
#get the current value of the key
|
277
323
|
result = exec(Beaker::Command.new("set #{key}"), :acceptable_exit_codes => (0..255))
|
@@ -337,6 +383,12 @@ module Beaker
|
|
337
383
|
end
|
338
384
|
end
|
339
385
|
|
386
|
+
# Recursively remove the path provided
|
387
|
+
# @param [String] path The path to remove
|
388
|
+
def rm_rf path
|
389
|
+
exec(Beaker::Command.new("rm -rf #{path}"))
|
390
|
+
end
|
391
|
+
|
340
392
|
# Create the provided directory structure on the host
|
341
393
|
# @param [String] dir The directory structure to create on the host
|
342
394
|
# @return [Boolean] True, if directory construction succeeded, otherwise False
|
@@ -344,18 +396,31 @@ module Beaker
|
|
344
396
|
if self.is_cygwin?
|
345
397
|
cmd = "mkdir -p #{dir}"
|
346
398
|
else
|
347
|
-
|
399
|
+
windows_dirstring = dir.gsub('/','\\')
|
400
|
+
cmd = "if not exist #{windows_dirstring} (md #{windows_dirstring})"
|
348
401
|
end
|
349
402
|
|
350
403
|
result = exec(Beaker::Command.new(cmd), :acceptable_exit_codes => [0, 1])
|
351
404
|
result.exit_code == 0
|
352
405
|
end
|
353
406
|
|
354
|
-
# scp files from the localhost to this test host, if a directory is provided it is recursively copied
|
407
|
+
# scp files from the localhost to this test host, if a directory is provided it is recursively copied.
|
408
|
+
# If the provided source is a directory both the contents of the directory and the directory
|
409
|
+
# itself will be copied to the host, if you only want to copy directory contents you will either need to specify
|
410
|
+
# the contents file by file or do a separate 'mv' command post scp_to to create the directory structure as desired.
|
411
|
+
# To determine if a file/dir is 'ignored' we compare to any contents of the source dir and NOT any part of the path
|
412
|
+
# to that source dir.
|
413
|
+
#
|
355
414
|
# @param source [String] The path to the file/dir to upload
|
356
415
|
# @param target [String] The destination path on the host
|
357
416
|
# @param options [Hash{Symbol=>String}] Options to alter execution
|
358
417
|
# @option options [Array<String>] :ignore An array of file/dir paths that will not be copied to the host
|
418
|
+
# @example
|
419
|
+
# do_scp_to('source/dir1/dir2/dir3', 'target')
|
420
|
+
# -> will result in creation of target/source/dir1/dir2/dir3 on host
|
421
|
+
#
|
422
|
+
# do_scp_to('source/file.rb', 'target', { :ignore => 'file.rb' }
|
423
|
+
# -> will result in not files copyed to the host, all are ignored
|
359
424
|
def do_scp_to source, target, options
|
360
425
|
@logger.notify "localhost $ scp #{source} #{@name}:#{target} {:ignore => #{options[:ignore]}}"
|
361
426
|
|
@@ -365,9 +430,10 @@ module Beaker
|
|
365
430
|
ignore_re = nil
|
366
431
|
if has_ignore
|
367
432
|
ignore_arr = Array(options[:ignore]).map do |entry|
|
368
|
-
"((\/|\\A)#{entry}(\/|\\z))"
|
433
|
+
"((\/|\\A)#{Regexp.escape(entry)}(\/|\\z))"
|
369
434
|
end
|
370
435
|
ignore_re = Regexp.new(ignore_arr.join('|'))
|
436
|
+
@logger.debug("going to ignore #{ignore_re}")
|
371
437
|
end
|
372
438
|
|
373
439
|
# either a single file, or a directory with no ignores
|
@@ -388,7 +454,7 @@ module Beaker
|
|
388
454
|
end
|
389
455
|
else # a directory with ignores
|
390
456
|
dir_source = Dir.glob("#{source}/**/*").reject do |f|
|
391
|
-
f =~ ignore_re
|
457
|
+
f.gsub(/\A#{Regexp.escape(source)}/, '') =~ ignore_re #only match against subdirs, not full path
|
392
458
|
end
|
393
459
|
@logger.trace "After rejecting ignored files/dirs, going to scp [#{dir_source.join(", ")}]"
|
394
460
|
|
@@ -400,7 +466,7 @@ module Beaker
|
|
400
466
|
required_dirs.each do |dir|
|
401
467
|
dir_path = Pathname.new(dir)
|
402
468
|
if dir_path.absolute?
|
403
|
-
mkdir_p(File.join(target, dir.gsub(source
|
469
|
+
mkdir_p(File.join(target, dir.gsub(/#{Regexp.escape(File.dirname(File.absolute_path(source)))}/, '')))
|
404
470
|
else
|
405
471
|
mkdir_p( File.join(target, dir) )
|
406
472
|
end
|
@@ -411,7 +477,7 @@ module Beaker
|
|
411
477
|
dir_source.each do |s|
|
412
478
|
s_path = Pathname.new(s)
|
413
479
|
if s_path.absolute?
|
414
|
-
file_path = File.join(target, File.dirname(s).gsub(source
|
480
|
+
file_path = File.join(target, File.dirname(s).gsub(/#{Regexp.escape(File.dirname(File.absolute_path(source)))}/,''))
|
415
481
|
else
|
416
482
|
file_path = File.join(target, File.dirname(s))
|
417
483
|
end
|
data/lib/beaker/host/unix.rb
CHANGED
@@ -26,7 +26,7 @@ module Unix
|
|
26
26
|
'puppetbin' => '/opt/puppet/bin/puppet',
|
27
27
|
'puppetbindir' => '/opt/puppet/bin',
|
28
28
|
'puppetsbindir' => '/opt/puppet/sbin',
|
29
|
-
'
|
29
|
+
'privatebindir' => '/opt/puppetlabs/puppet/bin',
|
30
30
|
'puppetvardir' => '/var/opt/lib/pe-puppet',
|
31
31
|
'hieradatadir' => '/var/lib/hiera',
|
32
32
|
'hieraconf' => '/etc/puppetlabs/puppet/hiera.yaml',
|
@@ -48,7 +48,7 @@ module Unix
|
|
48
48
|
'puppetvardir' => '/var/lib/puppet',
|
49
49
|
'puppetbin' => '/usr/bin/puppet',
|
50
50
|
'puppetbindir' => '/usr/bin',
|
51
|
-
'
|
51
|
+
'privatebindir' => '/usr/bin',
|
52
52
|
'hieralibdir' => '/opt/puppet-git-repos/hiera/lib',
|
53
53
|
'hierapuppetlibdir' => '/opt/puppet-git-repos/hiera-puppet/lib',
|
54
54
|
'hierabindir' => '/opt/puppet-git-repos/hiera/bin',
|
@@ -64,17 +64,8 @@ module Unix
|
|
64
64
|
h = Beaker::Options::OptionsHash.new
|
65
65
|
h.merge({
|
66
66
|
'user' => 'root',
|
67
|
-
'group' => 'puppet',
|
68
|
-
'puppetserver-confdir' => '/etc/puppetlabs/puppetserver/conf.d',
|
69
|
-
'puppetservice' => 'puppetserver',
|
70
|
-
'puppetpath' => '/etc/puppetlabs/puppet',
|
71
|
-
'puppetconfdir' => '/etc/puppetlabs/puppet',
|
72
|
-
'puppetvardir' => '/opt/puppetlabs/puppet/cache',
|
73
|
-
'puppetbin' => '/opt/puppetlabs/puppet/bin/puppet',
|
74
67
|
'puppetbindir' => '/opt/puppetlabs/bin',
|
75
|
-
'
|
76
|
-
'hieradatadir' => '/etc/puppetlabs/code/hieradata',
|
77
|
-
'hieraconf' => '/etc/puppetlabs/code/hiera.yaml',
|
68
|
+
'privatebindir' => '/opt/puppetlabs/puppet/bin',
|
78
69
|
'distmoduledir' => '/etc/puppetlabs/code/modules',
|
79
70
|
'sitemoduledir' => '/opt/puppetlabs/puppet/modules',
|
80
71
|
'pathseparator' => ':',
|
data/lib/beaker/host/windows.rb
CHANGED
@@ -58,17 +58,8 @@ module Windows
|
|
58
58
|
h = Beaker::Options::OptionsHash.new
|
59
59
|
h.merge({
|
60
60
|
'user' => 'Administrator',
|
61
|
-
'
|
62
|
-
|
63
|
-
# 'puppetservice' not applicable on Windows
|
64
|
-
'puppetpath' => '`cygpath -smF 35`/PuppetLabs/puppet/etc',
|
65
|
-
'puppetconfdir' => '`cygpath -smF 35`/PuppetLabs/puppet/etc',
|
66
|
-
'puppetvardir' => '`cygpath -smF 35`/PuppetLabs/puppet/cache',
|
67
|
-
# 'puppetbin' not required on Windows
|
68
|
-
'puppetbindir' => '/cygdrive/c/Program Files (x86)/Puppet Labs/Puppet/bin:/cygdrive/c/Program Files/Puppet Labs/Puppet/bin:/cygdrive/c/Program Files (x86)/Puppet Labs/Puppet/sys/ruby/bin:/cygdrive/c/Program Files/Puppet Labs/Puppet/sys/ruby/bin',
|
69
|
-
# systembindir not required on Windows
|
70
|
-
'hieradatadir' => '`cygpath -smF 35`/Puppetlabs/code/hieradata',
|
71
|
-
'hieraconf' => '`cygpath -smF 35`/Puppetlabs/code/hiera.yaml',
|
61
|
+
'puppetbindir' => '/cygdrive/c/Program Files (x86)/Puppet Labs/Puppet/bin:/cygdrive/c/Program Files/Puppet Labs/Puppet/bin',
|
62
|
+
'privatebindir' => '/cygdrive/c/Program Files (x86)/Puppet Labs/Puppet/sys/ruby/bin:/cygdrive/c/Program Files/Puppet Labs/Puppet/sys/ruby/bin',
|
72
63
|
'distmoduledir' => '`cygpath -smF 35`/PuppetLabs/code/modules',
|
73
64
|
# sitemoduledir not included (check PUP-4049 for more info)
|
74
65
|
'pathseparator' => ';',
|
@@ -14,7 +14,7 @@ module Windows::File
|
|
14
14
|
end
|
15
15
|
|
16
16
|
def file_exist?(path)
|
17
|
-
result = exec(Beaker::Command.new("test -e #{path}"), :acceptable_exit_codes => [0, 1])
|
17
|
+
result = exec(Beaker::Command.new("test -e '#{path}'"), :acceptable_exit_codes => [0, 1])
|
18
18
|
result.exit_code == 0
|
19
19
|
end
|
20
20
|
end
|
@@ -38,7 +38,7 @@ module Windows::Pkg
|
|
38
38
|
#Examine the host system to determine the architecture, overrides default host determine_if_x86_64 so that wmic is used
|
39
39
|
#@return [Boolean] true if x86_64, false otherwise
|
40
40
|
def determine_if_x86_64
|
41
|
-
identify_windows_architecture =~ /64/
|
41
|
+
(identify_windows_architecture =~ /64/) == 0
|
42
42
|
end
|
43
43
|
|
44
44
|
private
|
@@ -350,7 +350,7 @@ module Beaker
|
|
350
350
|
if host['platform'] =~ /debian|ubuntu|cumulus/
|
351
351
|
host.exec(Command.new("sudo su -c \"service ssh restart\""), {:pty => true})
|
352
352
|
elsif host['platform'] =~ /centos|el-|redhat|fedora|eos/
|
353
|
-
host.exec(Command.new("sudo -E /sbin/service sshd
|
353
|
+
host.exec(Command.new("sudo -E /sbin/service sshd reload"), {:pty => true})
|
354
354
|
else
|
355
355
|
@logger.warn("Attempting to update ssh on non-supported platform: #{host.name}: #{host['platform']}")
|
356
356
|
end
|
data/lib/beaker/hypervisor.rb
CHANGED
@@ -30,9 +30,11 @@ module Beaker
|
|
30
30
|
Beaker::Fusion
|
31
31
|
when /^ec2$/
|
32
32
|
Beaker::AwsSdk
|
33
|
+
when /^vmpooler$/
|
34
|
+
Beaker::Vmpooler
|
33
35
|
when /^vcloud$/
|
34
36
|
if options['pooling_api']
|
35
|
-
Beaker::
|
37
|
+
Beaker::Vmpooler
|
36
38
|
else
|
37
39
|
Beaker::Vcloud
|
38
40
|
end
|
@@ -131,6 +133,6 @@ module Beaker
|
|
131
133
|
end
|
132
134
|
end
|
133
135
|
|
134
|
-
[ 'vsphere_helper', 'vagrant', 'vagrant_virtualbox', 'vagrant_parallels', 'vagrant_libvirt', 'vagrant_fusion', 'vagrant_workstation', 'fusion', 'aws_sdk', 'vsphere', '
|
136
|
+
[ 'vsphere_helper', 'vagrant', 'vagrant_virtualbox', 'vagrant_parallels', 'vagrant_libvirt', 'vagrant_fusion', 'vagrant_workstation', 'fusion', 'aws_sdk', 'vsphere', 'vmpooler', 'vcloud', 'aixer', 'solaris', 'docker', 'google_compute', 'openstack' ].each do |lib|
|
135
137
|
require "beaker/hypervisor/#{lib}"
|
136
138
|
end
|
@@ -3,7 +3,7 @@ require 'json'
|
|
3
3
|
require 'net/http'
|
4
4
|
|
5
5
|
module Beaker
|
6
|
-
class
|
6
|
+
class Vmpooler < Beaker::Hypervisor
|
7
7
|
SSH_EXCEPTIONS = [
|
8
8
|
SocketError,
|
9
9
|
Timeout::Error,
|
@@ -15,14 +15,10 @@ module Beaker
|
|
15
15
|
Errno::ENETUNREACH,
|
16
16
|
]
|
17
17
|
|
18
|
-
def initialize(
|
18
|
+
def initialize(vmpooler_hosts, options)
|
19
19
|
@options = options
|
20
20
|
@logger = options[:logger]
|
21
|
-
@hosts =
|
22
|
-
|
23
|
-
raise 'You must specify a datastore for vCloud instances!' unless @options['datastore']
|
24
|
-
raise 'You must specify a resource pool for vCloud instances!' unless @options['resourcepool']
|
25
|
-
raise 'You must specify a folder for vCloud instances!' unless @options['folder']
|
21
|
+
@hosts = vmpooler_hosts
|
26
22
|
end
|
27
23
|
|
28
24
|
def check_url url
|
@@ -66,7 +62,7 @@ module Beaker
|
|
66
62
|
request_payload[h['template']] = (request_payload[h['template']].to_i + 1).to_s
|
67
63
|
end
|
68
64
|
|
69
|
-
@logger.notify "Requesting VM set from
|
65
|
+
@logger.notify "Requesting VM set from vmpooler"
|
70
66
|
|
71
67
|
last_wait, wait = 0, 1
|
72
68
|
waited = 0 #the amount of time we've spent waiting for this host to provision
|
@@ -93,20 +89,20 @@ module Beaker
|
|
93
89
|
|
94
90
|
h['vmhostname'] = domain ? "#{hostname}.#{domain}" : hostname
|
95
91
|
|
96
|
-
@logger.notify "Using available
|
92
|
+
@logger.notify "Using available host '#{h['vmhostname']}' (#{h.name})"
|
97
93
|
end
|
98
94
|
else
|
99
|
-
raise "
|
95
|
+
raise "Vmpooler.provision - requested host set not available"
|
100
96
|
end
|
101
97
|
rescue JSON::ParserError, RuntimeError, *SSH_EXCEPTIONS => e
|
102
98
|
if waited <= @options[:timeout].to_i
|
103
|
-
@logger.debug("Retrying provision for
|
99
|
+
@logger.debug("Retrying provision for vmpooler host after waiting #{wait} second(s) (failed with #{e.class})")
|
104
100
|
sleep wait
|
105
101
|
waited += wait
|
106
102
|
last_wait, wait = wait, last_wait + wait
|
107
103
|
retry
|
108
104
|
end
|
109
|
-
report_and_raise(@logger, e, '
|
105
|
+
report_and_raise(@logger, e, 'Vmpooler.provision')
|
110
106
|
end
|
111
107
|
|
112
108
|
@logger.notify 'Spent %.2f seconds grabbing VMs' % (Time.now - start)
|
@@ -120,7 +116,7 @@ module Beaker
|
|
120
116
|
|
121
117
|
start = Time.now
|
122
118
|
vm_names.each do |name|
|
123
|
-
@logger.notify "Handing '#{name}' back to
|
119
|
+
@logger.notify "Handing '#{name}' back to vmpooler for VM destruction"
|
124
120
|
|
125
121
|
uri = URI.parse(get_template_url(@options['pooling_api'], name))
|
126
122
|
|
@@ -130,7 +126,7 @@ module Beaker
|
|
130
126
|
begin
|
131
127
|
response = http.request(request)
|
132
128
|
rescue *SSH_EXCEPTIONS => e
|
133
|
-
report_and_raise(@logger, e, '
|
129
|
+
report_and_raise(@logger, e, 'Vmpooler.cleanup (http.request)')
|
134
130
|
end
|
135
131
|
end
|
136
132
|
|
@@ -160,6 +160,7 @@ module Beaker
|
|
160
160
|
:pe_version_file_win => 'LATEST-win',
|
161
161
|
:host_env => {},
|
162
162
|
:ssh_env_file => '~/.ssh/environment',
|
163
|
+
:profile_d_env_file => '/etc/profile.d/beaker_env.sh',
|
163
164
|
:answers => {
|
164
165
|
:q_puppet_enterpriseconsole_auth_user_email => 'admin@example.com',
|
165
166
|
:q_puppet_enterpriseconsole_auth_password => '~!@#$%^*-/ aZ',
|