beaker 0.0.0

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