beaker 0.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 (88) hide show
  1. checksums.yaml +15 -0
  2. data/.gitignore +17 -0
  3. data/.rspec +2 -0
  4. data/.simplecov +14 -0
  5. data/DOCUMENTING.md +167 -0
  6. data/Gemfile +3 -0
  7. data/LICENSE +17 -0
  8. data/README.md +332 -0
  9. data/Rakefile +121 -0
  10. data/beaker.gemspec +42 -0
  11. data/beaker.rb +10 -0
  12. data/bin/beaker +9 -0
  13. data/lib/beaker.rb +36 -0
  14. data/lib/beaker/answers.rb +29 -0
  15. data/lib/beaker/answers/version28.rb +104 -0
  16. data/lib/beaker/answers/version30.rb +194 -0
  17. data/lib/beaker/cli.rb +113 -0
  18. data/lib/beaker/command.rb +241 -0
  19. data/lib/beaker/command_factory.rb +21 -0
  20. data/lib/beaker/dsl.rb +85 -0
  21. data/lib/beaker/dsl/assertions.rb +87 -0
  22. data/lib/beaker/dsl/helpers.rb +625 -0
  23. data/lib/beaker/dsl/install_utils.rb +299 -0
  24. data/lib/beaker/dsl/outcomes.rb +99 -0
  25. data/lib/beaker/dsl/roles.rb +97 -0
  26. data/lib/beaker/dsl/structure.rb +63 -0
  27. data/lib/beaker/dsl/wrappers.rb +100 -0
  28. data/lib/beaker/host.rb +193 -0
  29. data/lib/beaker/host/aix.rb +15 -0
  30. data/lib/beaker/host/aix/file.rb +16 -0
  31. data/lib/beaker/host/aix/group.rb +35 -0
  32. data/lib/beaker/host/aix/user.rb +32 -0
  33. data/lib/beaker/host/unix.rb +54 -0
  34. data/lib/beaker/host/unix/exec.rb +15 -0
  35. data/lib/beaker/host/unix/file.rb +16 -0
  36. data/lib/beaker/host/unix/group.rb +40 -0
  37. data/lib/beaker/host/unix/pkg.rb +22 -0
  38. data/lib/beaker/host/unix/user.rb +32 -0
  39. data/lib/beaker/host/windows.rb +44 -0
  40. data/lib/beaker/host/windows/exec.rb +18 -0
  41. data/lib/beaker/host/windows/file.rb +15 -0
  42. data/lib/beaker/host/windows/group.rb +36 -0
  43. data/lib/beaker/host/windows/pkg.rb +26 -0
  44. data/lib/beaker/host/windows/user.rb +32 -0
  45. data/lib/beaker/hypervisor.rb +37 -0
  46. data/lib/beaker/hypervisor/aixer.rb +52 -0
  47. data/lib/beaker/hypervisor/blimper.rb +123 -0
  48. data/lib/beaker/hypervisor/fusion.rb +56 -0
  49. data/lib/beaker/hypervisor/solaris.rb +65 -0
  50. data/lib/beaker/hypervisor/vagrant.rb +118 -0
  51. data/lib/beaker/hypervisor/vcloud.rb +175 -0
  52. data/lib/beaker/hypervisor/vsphere.rb +80 -0
  53. data/lib/beaker/hypervisor/vsphere_helper.rb +200 -0
  54. data/lib/beaker/logger.rb +167 -0
  55. data/lib/beaker/network_manager.rb +73 -0
  56. data/lib/beaker/options_parsing.rb +323 -0
  57. data/lib/beaker/result.rb +55 -0
  58. data/lib/beaker/shared.rb +15 -0
  59. data/lib/beaker/shared/error_handler.rb +17 -0
  60. data/lib/beaker/shared/host_handler.rb +46 -0
  61. data/lib/beaker/shared/repetition.rb +28 -0
  62. data/lib/beaker/ssh_connection.rb +198 -0
  63. data/lib/beaker/test_case.rb +225 -0
  64. data/lib/beaker/test_config.rb +148 -0
  65. data/lib/beaker/test_suite.rb +288 -0
  66. data/lib/beaker/utils.rb +7 -0
  67. data/lib/beaker/utils/ntp_control.rb +42 -0
  68. data/lib/beaker/utils/repo_control.rb +92 -0
  69. data/lib/beaker/utils/setup_helper.rb +77 -0
  70. data/lib/beaker/utils/validator.rb +27 -0
  71. data/spec/beaker/command_spec.rb +94 -0
  72. data/spec/beaker/dsl/assertions_spec.rb +104 -0
  73. data/spec/beaker/dsl/helpers_spec.rb +230 -0
  74. data/spec/beaker/dsl/install_utils_spec.rb +70 -0
  75. data/spec/beaker/dsl/outcomes_spec.rb +43 -0
  76. data/spec/beaker/dsl/roles_spec.rb +86 -0
  77. data/spec/beaker/dsl/structure_spec.rb +60 -0
  78. data/spec/beaker/dsl/wrappers_spec.rb +52 -0
  79. data/spec/beaker/host_spec.rb +95 -0
  80. data/spec/beaker/logger_spec.rb +117 -0
  81. data/spec/beaker/options_parsing_spec.rb +37 -0
  82. data/spec/beaker/puppet_command_spec.rb +128 -0
  83. data/spec/beaker/ssh_connection_spec.rb +39 -0
  84. data/spec/beaker/test_case_spec.rb +6 -0
  85. data/spec/beaker/test_suite_spec.rb +44 -0
  86. data/spec/mocks_and_helpers.rb +34 -0
  87. data/spec/spec_helper.rb +15 -0
  88. metadata +359 -0
data/Rakefile ADDED
@@ -0,0 +1,121 @@
1
+
2
+ task :default => [ 'test:spec' ]
3
+
4
+ task :spec do
5
+ Rake::Task['test:spec'].invoke
6
+ end
7
+
8
+ namespace :test do
9
+ desc 'Run specs (with coverage on 1.9), alias `spec` & the default'
10
+ task :spec do
11
+ original_dir = Dir.pwd
12
+ Dir.chdir( File.expand_path(File.dirname(__FILE__)) )
13
+ sh 'export COVERAGE=true; bundle exec rspec'
14
+ Dir.chdir( original_dir )
15
+ end
16
+ end
17
+
18
+
19
+ ###########################################################
20
+ #
21
+ # Documentation Tasks
22
+ #
23
+ ###########################################################
24
+
25
+
26
+ DOCS_DAEMON = "yard server --reload --daemon --server thin"
27
+ FOREGROUND_SERVER = 'bundle exec yard server --reload --verbose --server thin lib/beaker'
28
+
29
+ def running?( cmdline )
30
+ ps = `ps -ef`
31
+ found = ps.lines.grep( /#{Regexp.quote( cmdline )}/ )
32
+ if found.length > 1
33
+ raise StandardError, "Found multiple YARD Servers. Don't know what to do."
34
+ end
35
+
36
+ yes = found.empty? ? false : true
37
+ return yes, found.first
38
+ end
39
+
40
+ def pid_from( output )
41
+ output.squeeze(' ').strip.split(' ')[1]
42
+ end
43
+
44
+ desc 'Start the documentation server in the foreground'
45
+ task :docs => 'docs:clear' do
46
+ original_dir = Dir.pwd
47
+ Dir.chdir( File.expand_path(File.dirname(__FILE__)) )
48
+ sh FOREGROUND_SERVER
49
+ Dir.chdir( original_dir )
50
+ end
51
+
52
+ namespace :docs do
53
+
54
+ desc 'Clear the generated documentation cache'
55
+ task :clear do
56
+ original_dir = Dir.pwd
57
+ Dir.chdir( File.expand_path(File.dirname(__FILE__)) )
58
+ sh 'rm -rf docs'
59
+ Dir.chdir( original_dir )
60
+ end
61
+
62
+ desc 'Generate static documentation'
63
+ task :gen => 'docs:clear' do
64
+ original_dir = Dir.pwd
65
+ Dir.chdir( File.expand_path(File.dirname(__FILE__)) )
66
+ sh 'bundle exec yard doc'
67
+ Dir.chdir( original_dir )
68
+ end
69
+
70
+ desc 'Run the documentation server in the background, alias `bg`'
71
+ task :background => 'docs:clear' do
72
+ yes, output = running?( DOCS_DAEMON )
73
+ if yes
74
+ puts "Not starting a new YARD Server..."
75
+ puts "Found one running with pid #{pid_from( output )}."
76
+ else
77
+ original_dir = Dir.pwd
78
+ Dir.chdir( File.expand_path(File.dirname(__FILE__)) )
79
+ sh "bundle exec #{DOCS_DAEMON}"
80
+ Dir.chdir( original_dir )
81
+ end
82
+ end
83
+
84
+ task(:bg) { Rake::Task['docs:background'].invoke }
85
+
86
+ desc 'Check the status of the documentation server'
87
+ task :status do
88
+ yes, output = running?( DOCS_DAEMON )
89
+ if yes
90
+ pid = pid_from( output )
91
+ puts "Found a YARD Server running with pid #{pid}"
92
+ else
93
+ puts "Could not find a running YARD Server."
94
+ end
95
+ end
96
+
97
+ desc "Stop a running YARD Server"
98
+ task :stop do
99
+ yes, output = running?( DOCS_DAEMON )
100
+ if yes
101
+ pid = pid_from( output )
102
+ puts "Found a YARD Server running with pid #{pid}"
103
+ `kill #{pid}`
104
+ puts "Stopping..."
105
+ yes, output = running?( DOCS_DAEMON )
106
+ if yes
107
+ `kill -9 #{pid}`
108
+ yes, output = running?( DOCS_DAEMON )
109
+ if yes
110
+ puts "Could not Stop Server!"
111
+ else
112
+ puts "Server stopped."
113
+ end
114
+ else
115
+ puts "Server stopped."
116
+ end
117
+ else
118
+ puts "Could not find a running YARD Server"
119
+ end
120
+ end
121
+ end
data/beaker.gemspec ADDED
@@ -0,0 +1,42 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require 'rbconfig'
4
+ ruby_conf = defined?(RbConfig) ? RbConfig::CONFIG : Config::CONFIG
5
+ less_than_one_nine = ruby_conf['MAJOR'].to_i == 1 && ruby_conf['MINOR'].to_i < 9
6
+
7
+ Gem::Specification.new do |s|
8
+ s.name = "beaker"
9
+ s.version = '0.0.0'
10
+ s.authors = ["Puppetlabs"]
11
+ s.email = ["delivery@puppetlabs.com"]
12
+ s.homepage = "https://github.com/puppetlabs/beaker"
13
+ s.summary = %q{Let's test Puppet!}
14
+ s.description = %q{Puppetlabs accceptance testing harness}
15
+ s.license = 'Apache2'
16
+
17
+ s.files = `git ls-files`.split("\n")
18
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
19
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
20
+ s.require_paths = ["lib"]
21
+
22
+ # Testing dependencies
23
+ s.add_development_dependency 'rspec', '2.11.0'
24
+ s.add_development_dependency 'fakefs', '0.4'
25
+ s.add_development_dependency 'rake'
26
+ s.add_development_dependency 'simplecov' unless less_than_one_nine
27
+
28
+ # Documentation dependencies
29
+ s.add_development_dependency 'yard'
30
+ s.add_development_dependency 'markdown' unless less_than_one_nine
31
+ s.add_development_dependency 'thin'
32
+
33
+ # Run time dependencies
34
+ s.add_runtime_dependency 'json'
35
+ s.add_runtime_dependency 'net-ssh'
36
+ s.add_runtime_dependency 'net-scp'
37
+ s.add_runtime_dependency 'rbvmomi'
38
+ s.add_runtime_dependency 'blimpy'
39
+ s.add_runtime_dependency 'nokogiri', '1.5.10'
40
+ s.add_runtime_dependency 'fission' if RUBY_PLATFORM =~ /darwin/i
41
+ s.add_runtime_dependency 'inifile'
42
+ end
data/beaker.rb ADDED
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ if ENV['RUBYLIB']
4
+ ENV['RUBYLIB'] += ':lib'
5
+ else
6
+ ENV['RUBYLIB'] = 'lib'
7
+ end
8
+
9
+ system('bin/beaker', *ARGV)
10
+ exit $?.exitstatus
data/bin/beaker ADDED
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rubygems' unless defined?(Gem)
4
+ require 'beaker'
5
+
6
+ Beaker::CLI.new.execute!
7
+
8
+ puts "systest completed successfully, thanks."
9
+ exit 0
data/lib/beaker.rb ADDED
@@ -0,0 +1,36 @@
1
+ require 'rubygems' unless defined?(Gem)
2
+ module Beaker
3
+
4
+ %w( utils test_suite test_config result command options_parsing network_manager cli ).each do |lib|
5
+ begin
6
+ require "beaker/#{lib}"
7
+ rescue LoadError
8
+ require File.expand_path(File.join(File.dirname(__FILE__), 'beaker', lib))
9
+ end
10
+ end
11
+ # These really are our sub-systems that live within the harness today
12
+ # Ideally I would like to see them split out into modules that can be
13
+ # included as such here
14
+ #
15
+ # The Testing DSL
16
+ require 'beaker/dsl'
17
+ #
18
+ # Our Host Abstraction Layer
19
+ require 'beaker/host'
20
+ #
21
+ # Our Hypervisor Abstraction Layer
22
+ require 'beaker/hypervisor'
23
+ #
24
+ # How we manage connecting to hosts and hypervisors
25
+ #require 'beaker/connectivity'
26
+ #
27
+ # Our test runner, suite, test cases and steps
28
+ #require 'beaker/runner'
29
+ #
30
+ # Common setup and testing steps
31
+ #require 'beaker/steps'
32
+ #
33
+ # Shared methods and helpers
34
+ require 'beaker/shared'
35
+
36
+ end
@@ -0,0 +1,29 @@
1
+ [ 'version30', 'version28' ].each do |file|
2
+ begin
3
+ require "beaker/answers/#{file}"
4
+ rescue LoadError
5
+ require File.expand_path(File.join(File.dirname(__FILE__), 'answers', file))
6
+ end
7
+ end
8
+
9
+ module Beaker
10
+ module Answers
11
+
12
+ def self.answers(version, hosts, master_certname, options)
13
+
14
+ case version
15
+ when /\A3\.0/
16
+ Version30.answers(hosts, master_certname, options)
17
+ when /\A2\.8/
18
+ Version28.answers(hosts, master_certname, options)
19
+ else
20
+ raise NotImplementedError, "Don't know how to generate answers for #{version}"
21
+ end
22
+ end
23
+
24
+ def self.answer_string(host, answers)
25
+ answers[host.name].map { |k,v| "#{k}=#{v}" }.join("\n")
26
+ end
27
+
28
+ end
29
+ end
@@ -0,0 +1,104 @@
1
+ module Beaker
2
+ module Answers
3
+ module Version28
4
+
5
+ def self.host_answers(host, master_certname, master, dashboard, options)
6
+ return nil if host['platform'] =~ /windows/
7
+
8
+ agent_a = {
9
+ :q_install => 'y',
10
+ :q_puppetagent_install => 'y',
11
+ :q_puppet_cloud_install => 'y',
12
+ :q_puppet_symlinks_install => 'y',
13
+ :q_vendor_packages_install => 'y',
14
+ :q_puppetagent_certname => host,
15
+ :q_puppetagent_server => master,
16
+
17
+ # Disable console and master by default
18
+ # This will be overridden by other blocks being merged in
19
+ :q_puppetmaster_install => 'n',
20
+ :q_puppet_enterpriseconsole_install => 'n',
21
+ }
22
+
23
+ master_a = {
24
+ :q_puppetmaster_install => 'y',
25
+ :q_puppetmaster_certname => master_certname,
26
+ :q_puppetmaster_install => 'y',
27
+ :q_puppetmaster_dnsaltnames => master_certname+",puppet",
28
+ :q_puppetmaster_enterpriseconsole_hostname => dashboard,
29
+ :q_puppetmaster_enterpriseconsole_port => 443,
30
+ :q_puppetmaster_forward_facts => 'y',
31
+ }
32
+
33
+ if master['ip']
34
+ master_a[:q_puppetmaster_dnsaltnames]+=","+master['ip']
35
+ end
36
+
37
+ dashboard_user = "'#{ENV['q_puppet_enterpriseconsole_auth_user_email'] || 'admin@example.com'}'"
38
+ smtp_host = "'#{ENV['q_puppet_enterpriseconsole_smtp_host'] || dashboard}'"
39
+ dashboard_password = ENV['q_puppet_enterpriseconsole_auth_password'] || '~!@#$%^*-/ aZ'
40
+ smtp_port = "'#{ENV['q_puppet_enterpriseconsole_smtp_port'] || 25}'"
41
+ smtp_username = ENV['q_puppet_enterpriseconsole_smtp_username']
42
+ smtp_password = ENV['q_puppet_enterpriseconsole_smtp_password']
43
+ smtp_use_tls = "'#{ENV['q_puppet_enterpriseconsole_smtp_use_tls'] || 'n'}'"
44
+
45
+ console_a = {
46
+ :q_puppet_enterpriseconsole_install => 'y',
47
+ :q_puppet_enterpriseconsole_database_install => 'y',
48
+ :q_puppet_enterpriseconsole_auth_database_name => 'console_auth',
49
+ :q_puppet_enterpriseconsole_auth_database_user => 'mYu7hu3r',
50
+ :q_puppet_enterpriseconsole_auth_database_password => "'#{dashboard_password}'",
51
+ :q_puppet_enterpriseconsole_database_name => 'console',
52
+ :q_puppet_enterpriseconsole_database_user => 'mYc0nS03u3r',
53
+ :q_puppet_enterpriseconsole_database_password => "'#{dashboard_password}'",
54
+ :q_puppet_enterpriseconsole_inventory_hostname => host,
55
+ :q_puppet_enterpriseconsole_inventory_certname => host,
56
+ :q_puppet_enterpriseconsole_inventory_dnsaltnames => master,
57
+ :q_puppet_enterpriseconsole_inventory_port => 8140,
58
+ :q_puppet_enterpriseconsole_master_hostname => master,
59
+
60
+ :q_puppet_enterpriseconsole_auth_user_email => dashboard_user,
61
+ :q_puppet_enterpriseconsole_auth_password => "'#{dashboard_password}'",
62
+
63
+ :q_puppet_enterpriseconsole_httpd_port => 443,
64
+
65
+ :q_puppet_enterpriseconsole_smtp_host => smtp_host,
66
+ :q_puppet_enterpriseconsole_smtp_use_tls => smtp_use_tls,
67
+ :q_puppet_enterpriseconsole_smtp_port => smtp_port,
68
+ }
69
+
70
+ console_a[:q_puppet_enterpriseconsole_auth_user] = console_a[:q_puppet_enterpriseconsole_auth_user_email]
71
+
72
+ if smtp_password and smtp_username
73
+ console_a.merge!({
74
+ :q_puppet_enterpriseconsole_smtp_password => "'#{smtp_password}'",
75
+ :q_puppet_enterpriseconsole_smtp_username => "'#{smtp_username}'",
76
+ :q_puppet_enterpriseconsole_smtp_user_auth => 'y'
77
+ })
78
+ end
79
+
80
+ answers = agent_a.dup
81
+ if host == master
82
+ answers.merge! master_a
83
+ end
84
+
85
+ if host == dashboard
86
+ answers.merge! console_a
87
+ end
88
+
89
+ return answers
90
+ end
91
+
92
+ def self.answers(hosts, master_certname, options)
93
+ the_answers = {}
94
+ dashboard = only_host_with_role(hosts, 'dashboard')
95
+ master = only_host_with_role(hosts, 'master')
96
+ hosts.each do |h|
97
+ the_answers[h.name] = host_answers(h, master_certname, master, dashboard, options)
98
+ end
99
+ return the_answers
100
+ end
101
+
102
+ end
103
+ end
104
+ end
@@ -0,0 +1,194 @@
1
+ module Beaker
2
+ module Answers
3
+ module Version30
4
+
5
+ def self.host_answers(host, master_certname, master, database, dashboard, options)
6
+ # Windows hosts don't have normal answers...
7
+ return nil if host['platform'] =~ /windows/
8
+
9
+ # Everything's an agent
10
+ agent_a = {
11
+ :q_puppetagent_install => 'y',
12
+ :q_puppet_cloud_install => 'y',
13
+ :q_verify_packages => ENV['q_verify_packages'] || 'y',
14
+ :q_puppet_symlinks_install => 'y',
15
+ :q_puppetagent_certname => host,
16
+ :q_puppetagent_server => master,
17
+
18
+ # Disable database, console, and master by default
19
+ # This will be overridden by other blocks being merged in.
20
+ :q_puppetmaster_install => 'n',
21
+ :q_all_in_one_install => 'n',
22
+ :q_puppet_enterpriseconsole_install => 'n',
23
+ :q_puppetdb_install => 'n',
24
+ :q_database_install => 'n',
25
+ }
26
+
27
+ # These base answers are needed by all
28
+ common_a = {
29
+ :q_install => 'y',
30
+ :q_vendor_packages_install => 'y',
31
+ }
32
+
33
+ # master/database answers
34
+ master_database_a = {
35
+ :q_puppetmaster_certname => master_certname
36
+ }
37
+
38
+ # Master/dashboard answers
39
+ master_console_a = {
40
+ :q_puppetdb_hostname => database,
41
+ :q_puppetdb_port => 8081
42
+ }
43
+
44
+ # Master only answers
45
+ master_a = {
46
+ :q_puppetmaster_install => 'y',
47
+ :q_puppetmaster_dnsaltnames => master_certname+",puppet",
48
+ :q_puppetmaster_enterpriseconsole_hostname => dashboard,
49
+ :q_puppetmaster_enterpriseconsole_port => 443,
50
+ }
51
+
52
+ if master['ip']
53
+ master_a[:q_puppetmaster_dnsaltnames]+=","+master['ip']
54
+ end
55
+
56
+ # Common answers for console and database
57
+ dashboard_password = "'#{ENV['q_puppet_enterpriseconsole_auth_password'] || '~!@#$%^*-/ aZ'}'"
58
+ puppetdb_password = "'#{ENV['q_puppetdb_password'] || '~!@#$%^*-/ aZ'}'"
59
+
60
+ console_database_a = {
61
+ :q_puppetdb_database_name => 'pe-puppetdb',
62
+ :q_puppetdb_database_user => 'mYpdBu3r',
63
+ :q_puppetdb_database_password => puppetdb_password,
64
+ :q_puppet_enterpriseconsole_auth_database_name => 'console_auth',
65
+ :q_puppet_enterpriseconsole_auth_database_user => 'mYu7hu3r',
66
+ :q_puppet_enterpriseconsole_auth_database_password => dashboard_password,
67
+ :q_puppet_enterpriseconsole_database_name => 'console',
68
+ :q_puppet_enterpriseconsole_database_user => 'mYc0nS03u3r',
69
+ :q_puppet_enterpriseconsole_database_password => dashboard_password,
70
+
71
+ :q_database_host => database,
72
+ :q_database_port => 5432
73
+ }
74
+
75
+ # Console only answers
76
+ dashboard_user = "'#{ENV['q_puppet_enterpriseconsole_auth_user_email'] || 'admin@example.com'}'"
77
+
78
+ smtp_host = "'#{ENV['q_puppet_enterpriseconsole_smtp_host'] || dashboard}'"
79
+ smtp_port = "'#{ENV['q_puppet_enterpriseconsole_smtp_port'] || 25}'"
80
+ smtp_username = ENV['q_puppet_enterpriseconsole_smtp_username']
81
+ smtp_password = ENV['q_puppet_enterpriseconsole_smtp_password']
82
+ smtp_use_tls = "'#{ENV['q_puppet_enterpriseconsole_smtp_use_tls'] || 'n'}'"
83
+
84
+ console_a = {
85
+ :q_puppet_enterpriseconsole_install => 'y',
86
+ :q_puppet_enterpriseconsole_inventory_hostname => host,
87
+ :q_puppet_enterpriseconsole_inventory_certname => host,
88
+ :q_puppet_enterpriseconsole_inventory_dnsaltnames => dashboard,
89
+ :q_puppet_enterpriseconsole_inventory_port => 8140,
90
+ :q_puppet_enterpriseconsole_master_hostname => master,
91
+
92
+ :q_puppet_enterpriseconsole_auth_user_email => dashboard_user,
93
+ :q_puppet_enterpriseconsole_auth_password => dashboard_password,
94
+
95
+ :q_puppet_enterpriseconsole_httpd_port => 443,
96
+
97
+ :q_puppet_enterpriseconsole_smtp_host => smtp_host,
98
+ :q_puppet_enterpriseconsole_smtp_use_tls => smtp_use_tls,
99
+ :q_puppet_enterpriseconsole_smtp_port => smtp_port,
100
+ }
101
+
102
+ if smtp_password and smtp_username
103
+ console_a.merge!({
104
+ :q_puppet_enterpriseconsole_smtp_password => "'#{smtp_password}'",
105
+ :q_puppet_enterpriseconsole_smtp_username => "'#{smtp_username}'",
106
+ :q_puppet_enterpriseconsole_smtp_user_auth => 'y'
107
+ })
108
+ end
109
+
110
+ # Database only answers
111
+ database_a = {
112
+ :q_puppetdb_install => 'y',
113
+ :q_database_install => 'y',
114
+ :q_database_root_password => "'=ZYdjiP3jCwV5eo9s1MBd'",
115
+ :q_database_root_user => 'pe-postgres',
116
+ }
117
+
118
+ # Special answers for special hosts
119
+ aix_a = {
120
+ :q_run_updtvpkg => 'y',
121
+ }
122
+
123
+ answers = common_a.dup
124
+
125
+ unless options[:type] == :upgrade
126
+ answers.merge! agent_a
127
+ end
128
+
129
+ if host == master
130
+ answers.merge! master_console_a
131
+ unless options[:type] == :upgrade
132
+ answers.merge! master_a
133
+ answers.merge! master_database_a
134
+ end
135
+ end
136
+
137
+ if host == dashboard
138
+ answers.merge! master_console_a
139
+ answers.merge! console_database_a
140
+ answers[:q_pe_database] = 'y'
141
+ unless options[:type] == :upgrade
142
+ answers.merge! console_a
143
+ else
144
+ answers[:q_database_export_dir] = '/tmp'
145
+ end
146
+ end
147
+
148
+ if host == database
149
+ if database != master
150
+ if options[:type] == :upgrade
151
+ # This is kinda annoying - if we're upgrading to 3.0 and are
152
+ # puppetdb, we're actually doing a clean install. We thus
153
+ # need the core agent answers.
154
+ answers.merge! agent_a
155
+ end
156
+ answers.merge! master_database_a
157
+ end
158
+ answers.merge! database_a
159
+ answers.merge! console_database_a
160
+ end
161
+
162
+ if host == master and host == database and host == dashboard
163
+ answers[:q_all_in_one_install] = 'y'
164
+ end
165
+
166
+ if host['platform'].include? 'aix'
167
+ answers.merge! aix_a
168
+ end
169
+
170
+ return answers
171
+ end
172
+
173
+ def self.answers(hosts, master_certname, options)
174
+ the_answers = {}
175
+ database = only_host_with_role(hosts, 'database')
176
+ dashboard = only_host_with_role(hosts, 'dashboard')
177
+ master = only_host_with_role(hosts, 'master')
178
+ hosts.each do |h|
179
+ if options[:type] == :upgrade and options[:from] =~ /\A3.0/
180
+ # 3.0.x to 3.0.x should require no answers
181
+ the_answers[h.name] = {
182
+ :q_install => 'y',
183
+ :q_install_vendor_packages => 'y',
184
+ }
185
+ else
186
+ the_answers[h.name] = host_answers(h, master_certname, master, database, dashboard, options)
187
+ end
188
+ end
189
+ return the_answers
190
+ end
191
+
192
+ end
193
+ end
194
+ end