beaker 0.0.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
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