lib/beaker-answers/answers.rb in beaker-answers-0.4.3 vs lib/beaker-answers/answers.rb in beaker-answers-0.5.0
- old
+ new
@@ -1,17 +1,22 @@
module BeakerAnswers
# This class provides methods for generating PE answer file
# information.
class Answers
+ # This is a temporary default for deciding which configuration file format
+ # to fall back to in 2016.2.0. Once we have cutover to MEEP, it should be
+ # removed.
+ DEFAULT_FORMAT = :bash
DEFAULT_ANSWERS = StringifyHash.new.merge({
+ :q_install => 'y',
:q_puppet_enterpriseconsole_auth_user_email => 'admin@example.com',
:q_puppet_enterpriseconsole_auth_password => '~!@#$%^*-/ aZ',
:q_puppet_enterpriseconsole_smtp_port => 25,
:q_puppet_enterpriseconsole_smtp_use_tls => 'n',
:q_verify_packages => 'y',
- :q_puppetdb_password => '~!@#$%^*-/ aZ',
+ :q_puppetdb_database_password => '~!@#$%^*-/ aZ',
:q_puppetmaster_enterpriseconsole_port => 443,
:q_puppet_enterpriseconsole_auth_database_name => 'console_auth',
:q_puppet_enterpriseconsole_auth_database_user => 'mYu7hu3r',
:q_puppet_enterpriseconsole_database_name => 'console',
:q_puppet_enterpriseconsole_database_user => 'mYc0nS03u3r',
@@ -23,12 +28,12 @@
:q_orchestrator_database_password => '~!@#$%^*-/ aZ',
:q_puppetdb_database_name => 'pe-puppetdb',
:q_puppetdb_database_user => 'mYpdBu3r',
:q_database_port => 5432,
:q_puppetdb_port => 8081,
+ :q_classifier_database_name => 'pe-classifier',
:q_classifier_database_user => 'DFGhjlkj',
- :q_database_name => 'pe-classifier',
:q_classifier_database_password => '~!@#$%^*-/ aZ',
:q_activity_database_user => 'adsfglkj',
:q_activity_database_name => 'pe-activity',
:q_activity_database_password => '~!@#$%^*-/ aZ',
:q_rbac_database_user => 'RbhNBklm',
@@ -38,17 +43,44 @@
:q_exit_for_nc_migrate => 'n',
:q_enable_future_parser => 'n',
:q_pe_check_for_updates => 'n',
})
+ DEFAULT_HIERA_ANSWERS = StringifyHash.new.merge(flatten_keys_to_joined_string({
+ 'console_admin_password' => DEFAULT_ANSWERS[:q_puppet_enterpriseconsole_auth_password],
+ 'puppet_enterprise' => {
+ 'puppetdb_database_name' => DEFAULT_ANSWERS[:q_puppetdb_database_name],
+ 'puppetdb_database_user' => DEFAULT_ANSWERS[:q_puppetdb_database_user],
+ 'puppetdb_database_password' => DEFAULT_ANSWERS[:q_puppetdb_database_password],
+ 'classifier_database_name' => DEFAULT_ANSWERS[:q_classifier_database_name],
+ 'classifier_database_user' => DEFAULT_ANSWERS[:q_classifier_database_user],
+ 'classifier_database_password' => DEFAULT_ANSWERS[:q_classifier_database_password],
+ 'activity_database_name' => DEFAULT_ANSWERS[:q_activity_database_name],
+ 'activity_database_user' => DEFAULT_ANSWERS[:q_activity_database_user],
+ 'activity_database_password' => DEFAULT_ANSWERS[:q_activity_database_password],
+ 'rbac_database_name' => DEFAULT_ANSWERS[:q_rbac_database_name],
+ 'rbac_database_user' => DEFAULT_ANSWERS[:q_rbac_database_user],
+ 'rbac_database_password' => DEFAULT_ANSWERS[:q_rbac_database_password],
+ 'orchestrator_database_name' => DEFAULT_ANSWERS[:q_orchestrator_database_name],
+ 'orchestrator_database_user' => DEFAULT_ANSWERS[:q_orchestrator_database_user],
+ 'orchestrator_database_password' => DEFAULT_ANSWERS[:q_orchestrator_database_password],
+ 'use_application_services' => true,
+ }
+ }))
# Determine the list of supported PE versions, return as an array
# @return [Array<String>] An array of the supported versions
def self.supported_versions
BeakerAnswers.constants.select {|c| BeakerAnswers.const_get(c).is_a?(Class) && BeakerAnswers.const_get(c).respond_to?(:pe_version_matcher)}
end
+ # Determine the list of supported upgrade PE versions, return as an array
+ # @return [Array<String>] An array of the supported versions
+ def self.supported_upgrade_versions
+ BeakerAnswers.constants.select {|c| BeakerAnswers.const_get(c).is_a?(Class) && BeakerAnswers.const_get(c).respond_to?(:upgrade_version_matcher)}
+ end
+
# When given a Puppet Enterprise version, a list of hosts and other
# qualifying data this method will return the appropriate object that can be used
# to generate answer file data.
#
# @param [String] version Puppet Enterprise version to generate answer data for
@@ -56,10 +88,19 @@
# @param [Hash] options options for answer files
# @option options [Symbol] :type Should be one of :upgrade or :install.
# @return [Hash] A hash (keyed from hosts) containing hashes of answer file
# data.
def self.create version, hosts, options
+ # if :upgrade is detected, then we return the simpler upgrade answers
+ if options[:type] == :upgrade
+ self.supported_upgrade_versions.each do |upgrade_version_class|
+ if BeakerAnswers.const_get(upgrade_version_class).send(:upgrade_version_matcher) =~ version
+ return BeakerAnswers.const_get(upgrade_version_class).send(:new, version, hosts, options)
+ end
+ end
+ warn 'Only upgrades to version 3.8.x generate specific upgrade answers. Defaulting to full answers.'
+ end
# finds all potential version classes
# discovers new version classes as they are added, no more crazy case statement
version_classes = self.supported_versions
version_classes.each do |vc|
@@ -69,42 +110,71 @@
end
end
raise NotImplementedError, "Don't know how to generate answers for #{version}"
end
- # The answer value for a provided question. Use the user answer when available, otherwise return the default
+ # The answer value for a provided question. Use the user answer when
+ # available, otherwise return the default.
+ #
# @param [Hash] options options for answer file
- # @option options [Symbol] :answer Contains a hash of user provided question name and answer value pairs.
- # @param [String] default Should there be no user value for the provided question name return this default
+ # @option options [Symbol] :answers Contains a hash of user provided
+ # question name and answer value pairs.
+ # @param [String] default Should there be no user value for the provided
+ # question name return this default
# @return [String] The answer value
def answer_for(options, q, default = nil)
- answer = DEFAULT_ANSWERS[q]
+ case @format
+ when :bash
+ answer = DEFAULT_ANSWERS[q]
+ answers = options[:answers]
+ when :hiera
+ answer = DEFAULT_HIERA_ANSWERS[q]
+ answers = flatten_keys_to_joined_string(options[:answers]) if options[:answers]
+ else
+ raise NotImplementedError, "Don't know how to determine answers for #{@format}"
+ end
+
# check to see if there is a value for this in the provided options
- if options[:answers] && options[:answers][q]
- answer = options[:answers][q]
+ if answers && answers[q]
+ answer = answers[q]
end
# use the default if we don't have anything
if not answer
answer = default
end
answer
end
+ def get_defaults_or_answers(defaults_to_set)
+ config = {}
+
+ defaults_to_set.each do |key|
+ config[key] = answer_for(@options, key)
+ end
+
+ return config
+ end
+
# When given a Puppet Enterprise version, a list of hosts and other
# qualifying data this method will return a hash (keyed from the hosts)
# of default Puppet Enterprise answer file data hashes.
#
# @param [String] version Puppet Enterprise version to generate answer data for
# @param [Array<Beaker::Host>] hosts An array of host objects.
# @param [Hash] options options for answer files
# @option options [Symbol] :type Should be one of :upgrade or :install.
+ # @option options [Symbol] :format Should be one of :bash or :hiera. This
+ # is a temporary setting which only has an impact on version201620 answers.
+ # Setting :bash will result in the "classic" PE answer file being generated
+ # Setting :hiera will generate the new PE hiera config file format
# @return [Hash] A hash (keyed from hosts) containing hashes of answer file
# data.
def initialize(version, hosts, options)
@version = version
@hosts = hosts
@options = options
+ @format = (options[:format] || DEFAULT_FORMAT).to_sym
end
# Generate the answers hash based upon version, host and option information
def generate_answers
raise "This should be handled by subclasses!"
@@ -130,10 +200,18 @@
# end
def answer_string(host)
answers[host.name].map { |k,v| "#{k}=#{v}" }.join("\n")
end
+ def answer_hiera
+ raise(NotImplementedError, "Hiera configuration is not available in this version of PE (#{self.class})")
+ end
+
+ def installer_configuration_string(host)
+ answer_string(host)
+ end
+
#Find a single host with the role provided. Raise an error if more than one host is found to have the
#provided role.
#
#@param [Array<Host>] hosts The hosts to examine
#@param [String] role The host returned will have this role in its role list
@@ -145,10 +223,9 @@
if found_hosts.length == 0 or found_hosts.length > 1
raise ArgumentError, "There should be one host with #{role} defined, found #{found_hosts.length} matching hosts (#{found_hosts})"
end
found_hosts.first
end
-
end
# pull in all the available answer versions
require_rel 'versions'
end