class FlapjackConfigurator::UserConfiguration

User Configuration: Class representing the desired configuration as passed into the utility

Attributes

config[R]
entity_map[R]

Public Class Methods

new(config, diner, logger) click to toggle source
# File lib/flapjack_configurator/user_configuration.rb, line 11
def initialize(config, diner, logger)
  @config = config
  @logger = logger
  @media_config = {}

  _sanity_check

  @entity_map = EntityMapper.new(self, diner)
end

Public Instance Methods

_complete_config_merge(contact_id, config_key) click to toggle source
# File lib/flapjack_configurator/user_configuration.rb, line 59
def _complete_config_merge(contact_id, config_key)
  contact_settings = contact_config(contact_id)[config_key]
  fail("Missing #{config_key} settings for contact #{contact_id}") if contact_settings.nil?

  baseline_opts = baseline_config.key?(config_key) ? baseline_config[config_key] : {}
  contact_defaults = contact_settings.key?('defaults') ? contact_settings['defaults'] : {}

  merged_config = {}
  (contact_settings.keys - %w(defaults)).each do |key|
    # Only merge baseline/defaults if the contact has the setting defined
    # This is to prevent errors from partial configs built from only partial defaults.
    if baseline_opts.key? key
      merged_config[key] = baseline_opts[key].merge(contact_defaults.merge(contact_settings[key]))
    else
      merged_config[key] = contact_defaults.merge(contact_settings[key])
    end
  end

  @logger.debug("#{contact_id} #{config_key} complete config: #{merged_config}")
  return merged_config
end
_sanity_check() click to toggle source
# File lib/flapjack_configurator/user_configuration.rb, line 21
def _sanity_check
  # Check that required keys are present
  fail('Config missing contacts block') unless @config.key? 'contacts'
  @config['contacts'].each do |contact_id, contact_val|
    %w(details notification_media notification_rules).each do |contact_opt|
      fail("#{contact_id} contact config missing #{contact_opt} block") unless contact_val.key? contact_opt
    end
  end
end
baseline_config() click to toggle source
# File lib/flapjack_configurator/user_configuration.rb, line 51
def baseline_config
  if @config.key? 'baseline_options'
    return @config['baseline_options']
  else
    return {}
  end
end
contact_config(contact_id) click to toggle source
# File lib/flapjack_configurator/user_configuration.rb, line 35
def contact_config(contact_id)
  return nil unless @config['contacts'].key? contact_id

  # Merge in defaults for keys which may be omitted
  return {
    'entities' => { 'exact' => [], 'regex' => [] },
    'entities_blacklist' => { 'exact' => [], 'regex' => [] }
  }.deep_merge(@config['contacts'][contact_id])
end
contact_ids() click to toggle source
# File lib/flapjack_configurator/user_configuration.rb, line 31
def contact_ids
  @config['contacts'].keys
end
default_contacts() click to toggle source

Return a list of contacts with the default bit set This is pretty entitymapper centric, but it makes more sense here due to current layout.

# File lib/flapjack_configurator/user_configuration.rb, line 47
def default_contacts
  @config['contacts'].select { |_, contact| contact.key? 'entities' }.select { |_, c| c['entities']['default'] }.keys
end
media(contact_id) click to toggle source
# File lib/flapjack_configurator/user_configuration.rb, line 81
def media(contact_id)
  if @media_config[contact_id].nil?
    @media_config[contact_id] = _complete_config_merge(contact_id, 'notification_media')
  end
  return @media_config[contact_id]
end
notification_rules(contact_id) click to toggle source
# File lib/flapjack_configurator/user_configuration.rb, line 88
def notification_rules(contact_id)
  notification_rules = _complete_config_merge(contact_id, 'notification_rules')

  # Double check that the defined rules call for media which exists
  notification_rules.each do |nr_id, nr_val|
    %w(warning_media critical_media unknown_media).each do |alert_type|
      next unless nr_val.key? alert_type
      nr_val[alert_type].each do |alert_media|
        unless media(contact_id).keys.include? alert_media
          @logger.warn("Notification rule #{nr_id} for contact #{contact_id} calls for media #{alert_media} in #{alert_type} which isn't defined for #{contact_id}")
        end
      end
    end
  end

  # The notification rules need to have unique IDs contianing the contact id
  return {}.tap { |rv| notification_rules.each { |nr_id, nr_val| rv["#{contact_id}_#{nr_id}"] = nr_val } }
end