beaker 0.0.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. checksums.yaml +8 -8
  2. data/.travis.yml +8 -0
  3. data/README.md +6 -6
  4. data/beaker.gemspec +6 -2
  5. data/lib/beaker.rb +1 -1
  6. data/lib/beaker/answers.rb +34 -7
  7. data/lib/beaker/answers/version20.rb +124 -0
  8. data/lib/beaker/answers/version28.rb +21 -0
  9. data/lib/beaker/answers/version30.rb +24 -5
  10. data/lib/beaker/cli.rb +55 -41
  11. data/lib/beaker/command.rb +2 -2
  12. data/lib/beaker/dsl/helpers.rb +320 -106
  13. data/lib/beaker/dsl/install_utils.rb +202 -81
  14. data/lib/beaker/dsl/roles.rb +40 -0
  15. data/lib/beaker/host.rb +28 -20
  16. data/lib/beaker/host/unix.rb +7 -4
  17. data/lib/beaker/host/unix/pkg.rb +42 -12
  18. data/lib/beaker/host/windows.rb +9 -5
  19. data/lib/beaker/host/windows/group.rb +1 -1
  20. data/lib/beaker/host/windows/pkg.rb +41 -8
  21. data/lib/beaker/hypervisor.rb +23 -10
  22. data/lib/beaker/hypervisor/aixer.rb +15 -19
  23. data/lib/beaker/hypervisor/blimper.rb +71 -72
  24. data/lib/beaker/hypervisor/fusion.rb +11 -10
  25. data/lib/beaker/hypervisor/solaris.rb +17 -23
  26. data/lib/beaker/hypervisor/vagrant.rb +27 -12
  27. data/lib/beaker/hypervisor/vcloud.rb +154 -138
  28. data/lib/beaker/hypervisor/vcloud_pooled.rb +97 -0
  29. data/lib/beaker/hypervisor/vsphere.rb +8 -5
  30. data/lib/beaker/hypervisor/vsphere_helper.rb +43 -33
  31. data/lib/beaker/network_manager.rb +16 -12
  32. data/lib/beaker/options/command_line_parser.rb +199 -0
  33. data/lib/beaker/options/hosts_file_parser.rb +39 -0
  34. data/lib/beaker/options/options_file_parser.rb +45 -0
  35. data/lib/beaker/options/options_hash.rb +294 -0
  36. data/lib/beaker/options/parser.rb +288 -0
  37. data/lib/beaker/options/pe_version_scraper.rb +35 -0
  38. data/lib/beaker/options/presets.rb +70 -0
  39. data/lib/beaker/shared.rb +2 -1
  40. data/lib/beaker/shared/host_handler.rb +7 -2
  41. data/lib/beaker/shared/repetition.rb +1 -0
  42. data/lib/beaker/shared/timed.rb +14 -0
  43. data/lib/beaker/test_case.rb +2 -38
  44. data/lib/beaker/test_suite.rb +11 -25
  45. data/lib/beaker/utils/repo_control.rb +6 -8
  46. data/lib/beaker/utils/setup_helper.rb +9 -20
  47. data/spec/beaker/answers_spec.rb +109 -0
  48. data/spec/beaker/command_spec.rb +2 -2
  49. data/spec/beaker/dsl/assertions_spec.rb +1 -3
  50. data/spec/beaker/dsl/helpers_spec.rb +519 -84
  51. data/spec/beaker/dsl/install_utils_spec.rb +265 -16
  52. data/spec/beaker/dsl/roles_spec.rb +31 -10
  53. data/spec/beaker/host/windows/group_spec.rb +55 -0
  54. data/spec/beaker/host_spec.rb +130 -40
  55. data/spec/beaker/hypervisor/aixer_spec.rb +34 -0
  56. data/spec/beaker/hypervisor/blimper_spec.rb +77 -0
  57. data/spec/beaker/hypervisor/fusion_spec.rb +26 -0
  58. data/spec/beaker/hypervisor/hypervisor_spec.rb +66 -0
  59. data/spec/beaker/hypervisor/solaris_spec.rb +39 -0
  60. data/spec/beaker/hypervisor/vagrant_spec.rb +105 -0
  61. data/spec/beaker/hypervisor/vcloud_pooled_spec.rb +60 -0
  62. data/spec/beaker/hypervisor/vcloud_spec.rb +70 -0
  63. data/spec/beaker/hypervisor/vsphere_helper_spec.rb +162 -0
  64. data/spec/beaker/hypervisor/vsphere_spec.rb +76 -0
  65. data/spec/beaker/options/command_line_parser_spec.rb +25 -0
  66. data/spec/beaker/options/data/LATEST +1 -0
  67. data/spec/beaker/options/data/badyaml.cfg +21 -0
  68. data/spec/beaker/options/data/hosts.cfg +21 -0
  69. data/spec/beaker/options/data/opts.txt +6 -0
  70. data/spec/beaker/options/hosts_file_parser_spec.rb +30 -0
  71. data/spec/beaker/options/options_file_parser_spec.rb +23 -0
  72. data/spec/beaker/options/options_hash_spec.rb +111 -0
  73. data/spec/beaker/options/parser_spec.rb +172 -0
  74. data/spec/beaker/options/pe_version_scaper_spec.rb +15 -0
  75. data/spec/beaker/options/presets_spec.rb +24 -0
  76. data/spec/beaker/puppet_command_spec.rb +54 -21
  77. data/spec/beaker/shared/error_handler_spec.rb +40 -0
  78. data/spec/beaker/shared/host_handler_spec.rb +104 -0
  79. data/spec/beaker/shared/repetition_spec.rb +72 -0
  80. data/spec/beaker/test_suite_spec.rb +3 -16
  81. data/spec/beaker/utils/ntp_control_spec.rb +42 -0
  82. data/spec/beaker/utils/repo_control_spec.rb +168 -0
  83. data/spec/beaker/utils/setup_helper_spec.rb +82 -0
  84. data/spec/beaker/utils/validator_spec.rb +58 -0
  85. data/spec/helpers.rb +97 -0
  86. data/spec/matchers.rb +39 -0
  87. data/spec/mock_blimpy.rb +48 -0
  88. data/spec/mock_fission.rb +60 -0
  89. data/spec/mock_vsphere.rb +310 -0
  90. data/spec/mock_vsphere_helper.rb +183 -0
  91. data/spec/mocks.rb +83 -0
  92. data/spec/spec_helper.rb +8 -1
  93. metadata +106 -13
  94. data/beaker.rb +0 -10
  95. data/lib/beaker/options_parsing.rb +0 -323
  96. data/lib/beaker/test_config.rb +0 -148
  97. data/spec/beaker/options_parsing_spec.rb +0 -37
  98. data/spec/mocks_and_helpers.rb +0 -34
@@ -0,0 +1,35 @@
1
+ require 'open-uri'
2
+ module Beaker
3
+ module Options
4
+ #A set of functions to determine the PE version to use during testing
5
+ module PEVersionScraper
6
+ # Scrape the PE version (such as 3.0) from the file at dist_dir/version_file
7
+ #
8
+ # Version file is of the format
9
+ #
10
+ # 3.0.1-3-g57b669e
11
+ #
12
+ # @param [String] dist_dir The directory containing the version_file
13
+ # @param [String] version_file The file to scrape
14
+ #
15
+ # @return [String, nil] The PE version in the version_file or nil if not found
16
+ # @raise [ArgumentError] Raises if version_file does not exist or cannot be opened
17
+ def self.load_pe_version dist_dir, version_file
18
+ version = nil
19
+ begin
20
+ open("#{dist_dir}/#{version_file}") do |file|
21
+ while line = file.gets
22
+ if /(\w.*)/ =~ line then
23
+ version = $1.strip
24
+ end
25
+ end
26
+ end
27
+ rescue Errno::ENOENT, OpenURI::HTTPError => e
28
+ raise ArgumentError, "Failure to examine #{dist_dir}/#{version_file}\n\t\t#{e.to_s}"
29
+ end
30
+ return version
31
+ end
32
+
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,70 @@
1
+ module Beaker
2
+ module Options
3
+ #A set of functions representing the environment variables and preset argument values to be incorporated
4
+ #into the Beaker options Object.
5
+ module Presets
6
+
7
+ # Generates an OptionsHash of the environment variables of interest to Beaker
8
+ #
9
+ # Currently supports:
10
+ #
11
+ # consoleport, IS_PE, pe_dist_dir, pe_version_file, pe_version_file_win
12
+ #
13
+ # @return [OptionsHash] The supported environment variables in an OptionsHash,
14
+ # empty or nil environment variables are removed from the OptionsHash
15
+ def self.env_vars
16
+ h = Beaker::Options::OptionsHash.new
17
+ h.merge({
18
+ :consoleport => ENV['consoleport'] ? ENV['consoleport'].to_i : nil,
19
+ :type => ENV['IS_PE'] ? 'pe' : nil,
20
+ :pe_dir => ENV['pe_dist_dir'],
21
+ :pe_version_file => ENV['pe_version_file'],
22
+ :pe_version_file_win => ENV['pe_version_file'],
23
+ }.delete_if {|key, value| value.nil? or value.empty? })
24
+ end
25
+
26
+ # Generates an OptionsHash of preset values for arguments supported by Beaker
27
+ #
28
+ # @return [OptionsHash] The supported arguments in an OptionsHash
29
+ def self.presets
30
+ h = Beaker::Options::OptionsHash.new
31
+ h.merge({
32
+ :hosts_file => 'sample.cfg',
33
+ :options_file => nil,
34
+ :type => 'pe',
35
+ :provision => true,
36
+ :preserve_hosts => false,
37
+ :root_keys => false,
38
+ :quiet => false,
39
+ :xml => false,
40
+ :color => true,
41
+ :debug => false,
42
+ :dry_run => false,
43
+ :timeout => 300,
44
+ :fail_mode => nil,
45
+ :timesync => false,
46
+ :repo_proxy => false,
47
+ :add_el_extras => false,
48
+ :consoleport => 443,
49
+ :pe_dir => '/opt/enterprise/dists',
50
+ :pe_version_file => 'LATEST',
51
+ :pe_version_file_win => 'LATEST-win',
52
+ :dot_fog => File.join(ENV['HOME'], '.fog'),
53
+ :ec2_yaml => 'config/image_templates/ec2.yaml',
54
+ :help => false,
55
+ :ssh => {
56
+ :config => false,
57
+ :paranoid => false,
58
+ :timeout => 300,
59
+ :auth_methods => ["publickey"],
60
+ :port => 22,
61
+ :forward_agent => true,
62
+ :keys => ["#{ENV['HOME']}/.ssh/id_rsa"],
63
+ :user_known_hosts_file => "#{ENV['HOME']}/.ssh/known_hosts",
64
+ }
65
+ })
66
+ end
67
+
68
+ end
69
+ end
70
+ end
data/lib/beaker/shared.rb CHANGED
@@ -1,4 +1,4 @@
1
- [ 'repetition', 'error_handler', 'host_handler' ].each do |file|
1
+ [ 'repetition', 'error_handler', 'host_handler', 'timed' ].each do |file|
2
2
  begin
3
3
  require "beaker/shared/#{file}"
4
4
  rescue LoadError
@@ -10,6 +10,7 @@ module Beaker
10
10
  include Beaker::Shared::ErrorHandler
11
11
  include Beaker::Shared::HostHandler
12
12
  include Beaker::Shared::Repetition
13
+ include Beaker::Shared::Timed
13
14
  end
14
15
  end
15
16
  include Beaker::Shared
@@ -37,8 +37,13 @@ module Beaker
37
37
 
38
38
  def only_host_with_role(hosts, role)
39
39
  a_host = hosts_with_role(hosts, role)
40
- raise "There can be only one #{role}, but I found:" +
41
- "#{a_host.map {|h| h.to_s } }" unless a_host.length == 1
40
+ case
41
+ when a_host.length == 0
42
+ raise ArgumentError, "There should be one host with #{role} defined!"
43
+ when a_host.length > 1
44
+ host_string = ( a_host.map { |host| host.name } ).join( ', ')
45
+ raise ArgumentError, "There should be only one host with #{role} defined, but I found #{a_host.length} (#{host_string})"
46
+ end
42
47
  a_host.first
43
48
  end
44
49
  end
@@ -17,6 +17,7 @@ module Beaker
17
17
  last_wait, wait = 0, 1
18
18
  while not done and attempt <= attempts do
19
19
  done = block.call
20
+ attempt += 1
20
21
  sleep wait
21
22
  last_wait, wait = wait, last_wait + wait
22
23
  end
@@ -0,0 +1,14 @@
1
+ module Beaker
2
+ module Shared
3
+ module Timed
4
+
5
+ def run_and_report_duration &block
6
+ start = Time.now
7
+ block.call
8
+ Time.now - start
9
+ end
10
+
11
+ end
12
+ end
13
+ end
14
+
@@ -51,9 +51,6 @@ module Beaker
51
51
  # 'pe' directories within 'ROOT/setup' for examples.
52
52
  attr_reader :version
53
53
 
54
- # A Hash of values taken from host config file.
55
- attr_reader :config
56
-
57
54
  # Parsed command line options.
58
55
  attr_reader :options
59
56
 
@@ -94,11 +91,9 @@ module Beaker
94
91
  # against/on.
95
92
  # @param [Logger] logger A logger that implements
96
93
  # {Beaker::Logger}'s interface.
97
- # @param [Hash{String=>String}] config Clusterfck of various config opts.
98
94
  # @param [Hash{Symbol=>String}] options Parsed command line options.
99
95
  # @param [String] path The local path to a test file to be executed.
100
- def initialize(these_hosts, logger, config, options={}, path=nil)
101
- @config = config['CONFIG']
96
+ def initialize(these_hosts, logger, options={}, path=nil)
102
97
  @hosts = these_hosts
103
98
  @logger = logger
104
99
  @options = options
@@ -171,43 +166,12 @@ module Beaker
171
166
  def to_hash
172
167
  hash = {}
173
168
  hash['HOSTS'] = {}
174
- hash['CONFIG'] = @config
175
169
  @hosts.each do |host|
176
170
  hash['HOSTS'][host.name] = host.overrides
177
171
  end
178
172
  hash
179
173
  end
180
174
 
181
- # @deprecated
182
- # An proxy for the last {Beaker::Result#stdout} returned by
183
- # a method that makes remote calls. Use the {Beaker::Result}
184
- # object returned by the method directly instead. For Usage see
185
- # {Beaker::Result}.
186
- def stdout
187
- return nil if @result.nil?
188
- @result.stdout
189
- end
190
-
191
- # @deprecated
192
- # An proxy for the last {Beaker::Result#stderr} returned by
193
- # a method that makes remote calls. Use the {Beaker::Result}
194
- # object returned by the method directly instead. For Usage see
195
- # {Beaker::Result}.
196
- def stderr
197
- return nil if @result.nil?
198
- @result.stderr
199
- end
200
-
201
- # @deprecated
202
- # An proxy for the last {Beaker::Result#exit_code} returned by
203
- # a method that makes remote calls. Use the {Beaker::Result}
204
- # object returned by the method directly instead. For Usage see
205
- # {Beaker::Result}.
206
- def exit_code
207
- return nil if @result.nil?
208
- @result.exit_code
209
- end
210
-
211
175
  # This method retrieves the forge hostname from either:
212
176
  # * The environment variable 'forge_host'
213
177
  # * The parameter 'forge_host' from the CONFIG hash in a node definition
@@ -218,7 +182,7 @@ module Beaker
218
182
  # @return [String] hostname of test forge
219
183
  def forge
220
184
  ENV['forge_host'] ||
221
- @config['forge_host'] ||
185
+ @options['forge_host'] ||
222
186
  'vulcan-acceptance.delivery.puppetlabs.net'
223
187
  end
224
188
  end
@@ -16,29 +16,18 @@ module Beaker
16
16
  # * File Creation Relative to CWD -- Should be a config option
17
17
  # * Better Method Documentation
18
18
  class TestSuite
19
- attr_reader :name, :options, :config, :fail_mode
20
-
21
- def initialize(name, hosts, options, config, fail_mode = nil)
22
- @name = name.gsub(/\s+/, '-')
23
- @hosts = hosts
24
- @run = false
25
- @options = options
26
- @config = config
27
- @fail_mode = @options[:fail_mode] || fail_mode
28
- @logger = options[:logger]
19
+ attr_reader :name, :options, :fail_mode
29
20
 
21
+ def initialize(name, hosts, options, fail_mode = nil)
22
+ @logger = options[:logger]
30
23
  @test_cases = []
31
- @test_files = []
32
-
33
- options[:tests].each do |root|
34
- if File.file? root then
35
- @test_files << root
36
- else
37
- @test_files += Dir.glob(
38
- File.join(root, "**/*.rb")
39
- ).select { |f| File.file?(f) }
40
- end
41
- end
24
+ @test_files = options[name]
25
+ @name = name.to_s.gsub(/\s+/, '-')
26
+ @hosts = hosts
27
+ @run = false
28
+ @options = options
29
+ @fail_mode = options[:fail_mode] || fail_mode
30
+
42
31
  report_and_raise(@logger, RuntimeError.new("#{@name}: no test files found..."), "TestSuite: initialize") if @test_files.empty?
43
32
 
44
33
  @test_files = @test_files.sort
@@ -56,7 +45,7 @@ module Beaker
56
45
  @logger.notify
57
46
  @logger.notify "Begin #{test_file}"
58
47
  start = Time.now
59
- test_case = TestCase.new(@hosts, @logger, config, options, test_file).run_test
48
+ test_case = TestCase.new(@hosts, @logger, options, test_file).run_test
60
49
  duration = Time.now - start
61
50
  @test_cases << test_case
62
51
 
@@ -206,8 +195,6 @@ module Beaker
206
195
  - Host Configuration Summary -
207
196
  HEREDOC
208
197
 
209
- config.dump
210
-
211
198
  elapsed_time = @test_cases.inject(0.0) {|r, t| r + t.runtime.to_f }
212
199
  average_test_time = elapsed_time / test_count
213
200
 
@@ -264,7 +251,6 @@ module Beaker
264
251
  @@log_dir ||= File.join("log", @start_time.strftime("%F_%T"))
265
252
  unless File.directory?(@@log_dir) then
266
253
  FileUtils.mkdir_p(@@log_dir)
267
- FileUtils.cp(options[:config],(File.join(@@log_dir,"config.yml")))
268
254
 
269
255
  latest = File.join("log", "latest")
270
256
  if !File.exist?(latest) or File.symlink?(latest) then
@@ -26,11 +26,9 @@ module Beaker
26
26
  return url
27
27
  end
28
28
 
29
- def apt_get_update
30
- @hosts.each do |host|
31
- if host['platform'] =~ /ubuntu|debian/
32
- host.exec(Command.new("apt-get -y -f -m update"))
33
- end
29
+ def apt_get_update host
30
+ if host[:platform] =~ /(ubuntu)|(debian)/
31
+ host.exec(Command.new("apt-get -y -f -m update"))
34
32
  end
35
33
  end
36
34
 
@@ -51,14 +49,14 @@ module Beaker
51
49
  when host['platform'] =~ /ubuntu/
52
50
  host.exec(Command.new("if test -f /etc/apt/apt.conf; then mv /etc/apt/apt.conf /etc/apt/apt.conf.bk; fi"))
53
51
  copy_file_to_remote(host, '/etc/apt/apt.conf', APT_CFG)
54
- apt_get_update
52
+ apt_get_update(host)
55
53
  when host['platform'] =~ /debian/
56
54
  host.exec(Command.new("if test -f /etc/apt/apt.conf; then mv /etc/apt/apt.conf /etc/apt/apt.conf.bk; fi"))
57
55
  copy_file_to_remote(host, '/etc/apt/apt.conf', APT_CFG)
58
- apt_get_update
56
+ apt_get_update(host)
59
57
  when host['platform'] =~ /solaris-11/
60
58
  host.exec(Command.new("/usr/bin/pkg unset-publisher solaris || :"))
61
- host.exec(Command.new(host,"/usr/bin/pkg set-publisher -g %s solaris" % IPS_PKG_REPO))
59
+ host.exec(Command.new("/usr/bin/pkg set-publisher -g %s solaris" % IPS_PKG_REPO))
62
60
  else
63
61
  @logger.debug "#{host}: repo proxy configuration not modified"
64
62
  end
@@ -1,6 +1,10 @@
1
1
  module Beaker
2
2
  module Utils
3
3
  class SetupHelper
4
+ ETC_HOSTS_PATH = "/etc/hosts"
5
+ ETC_HOSTS_PATH_SOLARIS = "/etc/inet/hosts"
6
+ ROOT_KEYS_SCRIPT = "https://raw.github.com/puppetlabs/puppetlabs-sshkeys/master/templates/scripts/manage_root_authorized_keys"
7
+ ROOT_KEYS_SYNC_CMD = "curl -k -o - #{ROOT_KEYS_SCRIPT} | %s"
4
8
 
5
9
  def initialize(options, hosts)
6
10
  @options = options.dup
@@ -8,21 +12,9 @@ module Beaker
8
12
  @logger = options[:logger]
9
13
  end
10
14
 
11
- def find_masters(hosts)
12
- hosts.select do |host|
13
- host['roles'].include?("master")
14
- end
15
- end
16
-
17
- def find_only_master(hosts)
18
- m = find_masters(hosts)
19
- raise "too many masters, expected one but found #{m.map {|h| h.to_s }}" unless m.length == 1
20
- m.first
21
- end
22
-
23
15
  def add_master_entry
24
16
  @logger.notify "Add Master entry to /etc/hosts"
25
- master = find_only_master(@hosts)
17
+ master = only_host_with_role(@hosts, :master)
26
18
  if master["hypervisor"] and master["hypervisor"] =~ /vagrant/
27
19
  @logger.debug "Don't update master entry on vagrant masters"
28
20
  return
@@ -35,9 +27,9 @@ module Beaker
35
27
  end
36
28
  ip=stdout.chomp
37
29
 
38
- path = "/etc/hosts"
30
+ path = ETC_HOSTS_PATH
39
31
  if master['platform'].include? 'solaris'
40
- path = "/etc/inet/hosts"
32
+ path = ETC_HOSTS_PATH_SOLARIS
41
33
  end
42
34
 
43
35
  @logger.debug "Update %s on #{master}" % path
@@ -57,15 +49,12 @@ module Beaker
57
49
  # but we're deliberately taking the approach of "assume it will work, fix it
58
50
  # when reality dictates otherwise"
59
51
  @logger.notify "Sync root authorized_keys from github"
60
- script = "https://raw.github.com/puppetlabs/puppetlabs-sshkeys/master/templates/scripts/manage_root_authorized_keys"
61
- setup_root_authorized_keys = "curl -k -o - #{script} | %s"
62
- @logger.notify "Sync root authorized_keys from github"
63
52
  @hosts.each do |host|
64
53
  # Allow all exit code, as this operation is unlikely to cause problems if it fails.
65
54
  if host['platform'].include? 'solaris'
66
- host.exec(Command.new(setup_root_authorized_keys % "bash"), :acceptable_exit_codes => (0..255))
55
+ host.exec(Command.new(ROOT_KEYS_SYNC_CMD % "bash"), :acceptable_exit_codes => (0..255))
67
56
  else
68
- host.exec(Command.new(setup_root_authorized_keys % "env PATH=/usr/gnu/bin:$PATH bash"), :acceptable_exit_codes => (0..255))
57
+ host.exec(Command.new(ROOT_KEYS_SYNC_CMD % "env PATH=/usr/gnu/bin:$PATH bash"), :acceptable_exit_codes => (0..255))
69
58
  end
70
59
  end
71
60
  rescue => e
@@ -0,0 +1,109 @@
1
+ require 'spec_helper'
2
+
3
+ module Beaker
4
+ describe Answers do
5
+ let( :basic_hosts ) { make_hosts( { 'pe_ver' => @ver } ) }
6
+ let( :hosts ) { basic_hosts[0]['roles'] = ['master', 'database', 'dashboard']
7
+ basic_hosts[1]['platform'] = 'windows'
8
+ basic_hosts }
9
+ let( :master_certname ) { 'master_certname' }
10
+
11
+ it 'generates 3.0 answers for 3.1 hosts' do
12
+ @ver = '3.1'
13
+ Beaker::Answers::Version30.should_receive( :answers ).with( hosts, master_certname, {} ).once
14
+ subject.answers( @ver, hosts, master_certname, {} )
15
+ end
16
+
17
+ it 'generates 3.0 answers for 3.0 hosts' do
18
+ @ver = '3.0'
19
+ Beaker::Answers::Version30.should_receive( :answers ).with( hosts, master_certname, {} ).once
20
+ subject.answers( @ver, hosts, master_certname, {} )
21
+ end
22
+
23
+ it 'generates 2.8 answers for 2.8 hosts' do
24
+ @ver = '2.8'
25
+ Beaker::Answers::Version28.should_receive( :answers ).with( hosts, master_certname, {} ).once
26
+ subject.answers( @ver, hosts, master_certname, {} )
27
+ end
28
+
29
+ it 'generates 2.0 answers for 2.0 hosts' do
30
+ @ver = '2.0'
31
+ Beaker::Answers::Version20.should_receive( :answers ).with( hosts, master_certname, {} ).once
32
+ subject.answers( @ver, hosts, master_certname, {} )
33
+ end
34
+
35
+ it 'raises an error for an unknown version' do
36
+ @ver = 'x.x'
37
+ expect{ subject.answers( @ver, hosts, master_certname, {} ) }.to raise_error( NotImplementedError )
38
+ end
39
+ end
40
+
41
+ module Answers
42
+ describe Version30 do
43
+ let( :basic_hosts ) { make_hosts( { 'pe_ver' => @ver } ) }
44
+ let( :hosts ) { basic_hosts[0]['roles'] = ['master', 'database', 'dashboard']
45
+ basic_hosts[1]['platform'] = 'windows'
46
+ basic_hosts }
47
+ let( :master_certname ) { 'master_certname' }
48
+
49
+ it 'uses simple answers for upgrade from 3.0.x to 3.0.x' do
50
+ @ver = '3.0'
51
+ expect( subject.answers( hosts, master_certname, { :type => :upgrade } )).to be === { "vm2"=>{ :q_install=>"y", :q_install_vendor_packages=>"y" }, "vm1"=>{ :q_install=>"y", :q_install_vendor_packages=>"y" }, "vm3"=>{ :q_install=>"y", :q_install_vendor_packages=>"y" } }
52
+ end
53
+
54
+ it 'sets correct answers for an agent' do
55
+ expect( subject.answers( hosts, master_certname,{} )['vm3'] ).to be === { :q_install=>"y", :q_vendor_packages_install=>"y", :q_puppetagent_install=>"y", :q_puppet_cloud_install=>"y", :q_verify_packages=>"y", :q_puppet_symlinks_install=>"y", :q_puppetagent_certname=>hosts[2], :q_puppetagent_server=>master_certname, :q_puppetmaster_install=>"n", :q_all_in_one_install=>"n", :q_puppet_enterpriseconsole_install=>"n", :q_puppetdb_install=>"n", :q_database_install=>"n" }
56
+ end
57
+
58
+ it 'sets correct answers for a master' do
59
+ expect( subject.answers( hosts, master_certname, {} )['vm1'] ).to be === { :q_install=>"y", :q_vendor_packages_install=>"y", :q_puppetagent_install=>"y", :q_puppet_cloud_install=>"y", :q_verify_packages=>"y", :q_puppet_symlinks_install=>"y", :q_puppetagent_certname=>hosts[0], :q_puppetagent_server=>master_certname, :q_puppetmaster_install=>"y", :q_all_in_one_install=>"y", :q_puppet_enterpriseconsole_install=>"y", :q_puppetdb_install=>"y", :q_database_install=>"y", :q_puppetdb_hostname=>hosts[0], :q_puppetdb_port=>8081, :q_puppetmaster_dnsaltnames=>"master_certname,puppet,#{hosts[0][:ip]}", :q_puppetmaster_enterpriseconsole_hostname=>hosts[0], :q_puppetmaster_enterpriseconsole_port=>443, :q_puppetmaster_certname=>"master_certname", :q_puppetdb_database_name=>"pe-puppetdb", :q_puppetdb_database_user=>"mYpdBu3r", :q_puppetdb_database_password=>"'~!@\#$%^*-/ aZ'", :q_puppet_enterpriseconsole_auth_database_name=>"console_auth", :q_puppet_enterpriseconsole_auth_database_user=>"mYu7hu3r", :q_puppet_enterpriseconsole_auth_database_password=>"'~!@\#$%^*-/ aZ'", :q_puppet_enterpriseconsole_database_name=>"console", :q_puppet_enterpriseconsole_database_user=>"mYc0nS03u3r", :q_puppet_enterpriseconsole_database_password=>"'~!@\#$%^*-/ aZ'", :q_database_host=>hosts[0], :q_database_port=>5432, :q_pe_database=>"y", :q_puppet_enterpriseconsole_inventory_hostname=>hosts[0], :q_puppet_enterpriseconsole_inventory_certname=>hosts[0], :q_puppet_enterpriseconsole_inventory_dnsaltnames=>hosts[0], :q_puppet_enterpriseconsole_inventory_port=>8140, :q_puppet_enterpriseconsole_master_hostname=>hosts[0], :q_puppet_enterpriseconsole_auth_user_email=>"'admin@example.com'", :q_puppet_enterpriseconsole_auth_password=>"'~!@\#$%^*-/ aZ'", :q_puppet_enterpriseconsole_httpd_port=>443, :q_puppet_enterpriseconsole_smtp_host=>"'vm1'", :q_puppet_enterpriseconsole_smtp_use_tls=>"'n'", :q_puppet_enterpriseconsole_smtp_port=>"'25'", :q_database_root_password=>"'=ZYdjiP3jCwV5eo9s1MBd'", :q_database_root_user=>"pe-postgres" }
60
+ end
61
+ it 'generates nil answers for a windows host' do
62
+ expect( subject.answers( hosts, master_certname, {} )['vm2'] ).to be === nil
63
+ end
64
+ end
65
+
66
+ describe Version28 do
67
+ let( :basic_hosts ) { make_hosts( { 'pe_ver' => @ver } ) }
68
+ let( :hosts ) { basic_hosts[0]['roles'] = ['master', 'database', 'dashboard']
69
+ basic_hosts[1]['platform'] = 'windows'
70
+ basic_hosts }
71
+ let( :master_certname ) { 'master_certname' }
72
+
73
+ it 'sets correct answers for an agent' do
74
+ expect( subject.answers( hosts, master_certname,{} )['vm3'] ).to be === { :q_install=>"y", :q_puppetagent_install=>"y", :q_puppet_cloud_install=>"y", :q_puppet_symlinks_install=>"y", :q_vendor_packages_install=>"y", :q_puppetagent_certname=>hosts[2], :q_puppetagent_server=>hosts[0], :q_puppetmaster_install=>"n", :q_puppet_enterpriseconsole_install=>"n" }
75
+ end
76
+
77
+ it 'sets correct answers for a master' do
78
+ expect( subject.answers( hosts, master_certname, {} )['vm1'] ).to be === { :q_install=>"y", :q_puppetagent_install=>"y", :q_puppet_cloud_install=>"y", :q_puppet_symlinks_install=>"y", :q_vendor_packages_install=>"y", :q_puppetagent_certname=>hosts[0], :q_puppetagent_server=>hosts[0], :q_puppetmaster_install=>"y", :q_puppet_enterpriseconsole_install=>"y", :q_puppetmaster_certname=>"master_certname", :q_puppetmaster_dnsaltnames=>"master_certname,puppet,#{hosts[0][:ip]}", :q_puppetmaster_enterpriseconsole_hostname=>hosts[0], :q_puppetmaster_enterpriseconsole_port=>443, :q_puppetmaster_forward_facts=>"y", :q_puppet_enterpriseconsole_database_install=>"y", :q_puppet_enterpriseconsole_auth_database_name=>"console_auth", :q_puppet_enterpriseconsole_auth_database_user=>"mYu7hu3r", :q_puppet_enterpriseconsole_auth_database_password=>"'~!@\#$%^*-/ aZ'", :q_puppet_enterpriseconsole_database_name=>"console", :q_puppet_enterpriseconsole_database_user=>"mYc0nS03u3r", :q_puppet_enterpriseconsole_database_password=>"'~!@\#$%^*-/ aZ'", :q_puppet_enterpriseconsole_inventory_hostname=>hosts[0], :q_puppet_enterpriseconsole_inventory_certname=>hosts[0], :q_puppet_enterpriseconsole_inventory_dnsaltnames=>hosts[0], :q_puppet_enterpriseconsole_inventory_port=>8140, :q_puppet_enterpriseconsole_master_hostname=>hosts[0], :q_puppet_enterpriseconsole_auth_user_email=>"'admin@example.com'", :q_puppet_enterpriseconsole_auth_password=>"'~!@\#$%^*-/ aZ'", :q_puppet_enterpriseconsole_httpd_port=>443, :q_puppet_enterpriseconsole_smtp_host=>"'vm1'", :q_puppet_enterpriseconsole_smtp_use_tls=>"'n'", :q_puppet_enterpriseconsole_smtp_port=>"'25'", :q_puppet_enterpriseconsole_auth_user=>"'admin@example.com'" }
79
+ end
80
+
81
+ it 'generates nil answers for a windows host' do
82
+ expect( subject.answers( hosts, master_certname, {} )['vm2'] ).to be === nil
83
+ end
84
+
85
+
86
+ end
87
+ describe Version20 do
88
+ let( :basic_hosts ) { make_hosts( { 'pe_ver' => @ver } ) }
89
+ let( :hosts ) { basic_hosts[0]['roles'] = ['master', 'database', 'dashboard']
90
+ basic_hosts[1]['platform'] = 'windows'
91
+ basic_hosts }
92
+ let( :master_certname ) { 'master_certname' }
93
+
94
+ it 'sets correct answers for an agent' do
95
+ expect( subject.answers( hosts, master_certname,{} )['vm3'] ).to be === { :q_install=>"y", :q_puppetagent_install=>"y", :q_puppet_cloud_install=>"y", :q_puppet_symlinks_install=>"y", :q_vendor_packages_install=>"y", :q_puppetagent_certname=>hosts[2], :q_puppetagent_server=>hosts[0], :q_puppetmaster_install=>"n", :q_puppet_enterpriseconsole_install=>"n" }
96
+ end
97
+
98
+ it 'sets correct answers for a master' do
99
+ expect( subject.answers( hosts, master_certname, {} )['vm1'] ).to be === { :q_install=>"y", :q_puppetagent_install=>"y", :q_puppet_cloud_install=>"y", :q_puppet_symlinks_install=>"y", :q_vendor_packages_install=>"y", :q_puppetagent_certname=>hosts[0], :q_puppetagent_server=>hosts[0], :q_puppetmaster_install=>"y", :q_puppet_enterpriseconsole_install=>"y", :q_puppetmaster_certname=>"master_certname", :q_puppetmaster_dnsaltnames=>"master_certname,puppet,#{hosts[0][:ip]}", :q_puppetmaster_enterpriseconsole_hostname=>hosts[0], :q_puppetmaster_enterpriseconsole_port=>443, :q_puppetmaster_forward_facts=>"y", :q_puppet_enterpriseconsole_database_install=>"y", :q_puppet_enterpriseconsole_auth_database_name=>"console_auth", :q_puppet_enterpriseconsole_auth_database_user=>"mYu7hu3r", :q_puppet_enterpriseconsole_auth_database_password=>"'~!@\#$%^*-/ aZ'", :q_puppet_enterpriseconsole_database_name=>"console", :q_puppet_enterpriseconsole_database_user=>"mYc0nS03u3r", :q_puppet_enterpriseconsole_database_root_password=>"'~!@\#$%^*-/ aZ'", :q_puppet_enterpriseconsole_database_password=>"'~!@\#$%^*-/ aZ'", :q_puppet_enterpriseconsole_inventory_hostname=>hosts[0], :q_puppet_enterpriseconsole_inventory_certname=>hosts[0], :q_puppet_enterpriseconsole_inventory_dnsaltnames=>hosts[0], :q_puppet_enterpriseconsole_inventory_port=>8140, :q_puppet_enterpriseconsole_master_hostname=>hosts[0], :q_puppet_enterpriseconsole_auth_user_email=>"'admin@example.com'", :q_puppet_enterpriseconsole_auth_password=>"'~!@\#$%^*-/ aZ'", :q_puppet_enterpriseconsole_httpd_port=>443, :q_puppet_enterpriseconsole_smtp_host=>"'vm1'", :q_puppet_enterpriseconsole_smtp_use_tls=>"'n'", :q_puppet_enterpriseconsole_smtp_port=>"'25'", :q_puppet_enterpriseconsole_auth_user=>"'admin@example.com'" }
100
+ end
101
+
102
+ it 'generates nil answers for a windows host' do
103
+ expect( subject.answers( hosts, master_certname, {} )['vm2'] ).to be === nil
104
+ end
105
+
106
+ end
107
+
108
+ end
109
+ end