class BeakerAnswers::Answers
This class provides methods for generating PE answer file information.
Constants
- DEFAULT_ANSWERS
- DEFAULT_FORMAT
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_HIERA_ANSWERS
Public Class Methods
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 @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. @return [Hash] A hash (keyed from hosts) containing hashes of answer file
data.
# File lib/beaker-answers/answers.rb, line 92 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| # check to see if the version matches the regex for this class of answers if BeakerAnswers.const_get(vc).send(:pe_version_matcher) =~ version return BeakerAnswers.const_get(vc).send(:new, version, hosts, options) end end raise NotImplementedError, "Don't know how to generate answers for #{version}" 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.
# File lib/beaker-answers/answers.rb, line 171 def initialize(version, hosts, options) @version = version @hosts = hosts @options = options @format = (options[:format] || DEFAULT_FORMAT).to_sym end
Determine the list of supported upgrade PE versions, return as an array @return [Array<String>] An array of the supported versions
# File lib/beaker-answers/answers.rb, line 78 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
Determine the list of supported PE versions, return as an array @return [Array<String>] An array of the supported versions
# File lib/beaker-answers/answers.rb, line 72 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
Public Instance Methods
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] :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
# File lib/beaker-answers/answers.rb, line 124 def answer_for(options, q, default = nil) 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 answers && answers[q] answer = answers[q] end # use the default if we don't have anything if not answer answer = default end answer end
# File lib/beaker-answers/answers.rb, line 205 def answer_hiera raise(NotImplementedError, "Hiera configuration is not available in this version of PE (#{self.class})") end
This converts a data hash provided by answers, and returns a Puppet Enterprise compatible answer file ready for use.
@param [Beaker::Host] host Host object in question to generate the answer
file for.
@return [String] a string of answers @example Generating an answer file for a series of hosts
hosts.each do |host| answers = Beaker::Answers.new("2.0", hosts, "master") create_remote_file host, "/mypath/answer", answers.answer_string(host, answers) end
# File lib/beaker-answers/answers.rb, line 201 def answer_string(host) answers[host.name].map { |k,v| "#{k}=#{v}" }.join("\n") end
Access the answers hash for this version, host and option information. If the answers have not yet been calculated, generate them. @return [Hash] A hash of answers keyed by host.name
# File lib/beaker-answers/answers.rb, line 186 def answers @answers ||= generate_answers end
Generate the answers hash based upon version, host and option information
# File lib/beaker-answers/answers.rb, line 179 def generate_answers raise "This should be handled by subclasses!" end
# File lib/beaker-answers/answers.rb, line 147 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
# File lib/beaker-answers/answers.rb, line 209 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 @return [Host] The single host with the desired role in its roles list @raise [ArgumentError] Raised if more than one host has the given role defined, or if no host has the
role defined.
# File lib/beaker-answers/answers.rb, line 221 def only_host_with_role(hosts, role) found_hosts = hosts.select{ |host| role.nil? or host['roles'].include?(role.to_s)} 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