class Qurd::Configuration

Parse a configuration file, create a logger and various data structures

Attributes

config[R]

@!attribute [r] config

Configuration options, ie
+aws_credentials+, +auto_scaling_queues+, +actions+, +daemonize+,
+dry_run+, +listen_timeout+, +log_file+, +log_level+, +pid_file+,
+save_failures+, +stats_interval+, +sqs_set_attributes_timeout+,
+visibility_timeout+, +wait_time+.
Additional configuration keys include +listeners+.
@return [Hashie::Mash] the config YAML as a Mash

@!attribute [r] logger

The logger
@return [Cabin::Channel]
logger[R]

@!attribute [r] config

Configuration options, ie
+aws_credentials+, +auto_scaling_queues+, +actions+, +daemonize+,
+dry_run+, +listen_timeout+, +log_file+, +log_level+, +pid_file+,
+save_failures+, +stats_interval+, +sqs_set_attributes_timeout+,
+visibility_timeout+, +wait_time+.
Additional configuration keys include +listeners+.
@return [Hashie::Mash] the config YAML as a Mash

@!attribute [r] logger

The logger
@return [Cabin::Channel]

Public Instance Methods

configure(config_path) click to toggle source

Configure Qurd @param [String] config_path The path to the config file, default

+/etc/qurd/config.yml+
# File lib/qurd/configuration.rb, line 53
def configure(config_path)
  init(config_path)
  mkdir_p_file!(@config.pid_file)

  configure_credentials
  configure_auto_scaling_queues
  configure_actions
end
debug?() click to toggle source

Determine if the daemon is running in debug mode @return [Boolean]

# File lib/qurd/configuration.rb, line 64
def debug?
  config.log_level == 'debug'
end
get_context(attrs = {}) click to toggle source

Get a logging context and optionally initialize it @param [Hash] attrs a hash of values to merge into the context @return [Cabin::Context]

# File lib/qurd/configuration.rb, line 79
def get_context(attrs = {})
  ctx = logger.context
  attrs.each do |k, v|
    ctx[k] = v
  end
  ctx
end
init(config_path) click to toggle source

Initialize Qurd @param [String] config_path The path to the config file, default

+/etc/qurd/config.yml+
# File lib/qurd/configuration.rb, line 23
def init(config_path)
  config_path ||= '/etc/qurd/config.yml'
  @config = Hashie::Mash.new YAML.load(File.read(config_path))
  @sqs_queues = {}
  @config.daemonize = false if @config.daemonize.nil?
  @config.dry_run = get_or_default(@config, :dry_run, false)
  @config.pid_file ||= '/var/run/qurd/qurd.pid'
  @config.save_failures = get_or_default(@config, :save_failures, true)
  @queues = []
  @aws_credentials = []
  st = get_or_default(@config, :sqs_set_attributes_timeout, 10, :to_f)
  si = get_or_default(@config, :stats_interval, 600, :to_i)
  vt = get_or_default(@config, :visibility_timeout, 300, :to_s)
  wt = get_or_default(@config, :wait_time, 20, :to_s)
  lt = get_or_default(@config, :listen_timeout, vt, :to_f)
  @config.stats_interval = si
  @config.visibility_timeout = vt
  @config.wait_time = wt
  @config.sqs_set_attributes_timeout = st
  @config.listen_timeout = lt
  %w[launch launch_error terminate terminate_error test].each do |action|
    @config.actions[action] ||= []
  end

  configure_logger
end
logger!(msg, e = RuntimeError) click to toggle source

Log an error and raise an exception @param [String] msg The error and exception message @param [Exception] e The exception to raise

# File lib/qurd/configuration.rb, line 71
def logger!(msg, e = RuntimeError)
  logger.error msg
  fail e, msg
end

Private Instance Methods

configure_actions() click to toggle source

Convert strings to objects

# File lib/qurd/configuration.rb, line 112
def configure_actions
  missing = config.actions.inject([]) do |ary, mod|
    action, klasses = mod
    return ary if klasses.nil?
    ctx = get_context(action: action)
    logger! 'Action types must be an array' unless klasses.is_a?(Array)
    klasses.map! do |klass|
      begin
        k = string2class(klass)
        k.configure(action)
        k
      rescue NameError, LoadError => e
        logger.error(e)
        ary << klass
      end
    end
    ctx.clear
    ary
  end

  m = missing.uniq.join(', ')
  logger! "Class undefined for actions: #{m}" if missing.any?
end
configure_auto_scaling_queues() click to toggle source

Configure sqs clients and queues

# File lib/qurd/configuration.rb, line 158
def configure_auto_scaling_queues
  config.listeners = config.auto_scaling_queues.map do |name, monitor|
    if (config.auto_scaling_queues.nil? ||
         config.auto_scaling_queues.empty?) &&
       config.aws_credentials.default
      creds = config.aws_credentials.default
      monitor.credentials = 'default'
    else
      creds = config.aws_credentials[monitor.credentials]
    end
    verify_account!(name, monitor)
    logger!("Undefined credential: '#{monitor.credentials}'") unless creds
    vt = get_or_default(monitor, :visibility_timeout,
                        config.visibility_timeout, :to_s)
    wt = get_or_default(monitor, :wait_time, config.wait_time, :to_s)
    Listener.new(
      aws_credentials: creds,
      name: name,
      queues: monitor.queues,
      region: monitor.region,
      visibility_timeout: vt,
      wait_time: wt
    )
  end
end
configure_credentials() click to toggle source
# File lib/qurd/configuration.rb, line 89
def configure_credentials
  if config.aws_credentials.nil? || config.aws_credentials.empty?
    creds = default_credentials
  else
    creds = config.aws_credentials.map do |cred|
      cred.options ||= {}
      case cred.type
      when 'assume_role_credentials'
        assume_role_credentials(cred)
      when 'credentials'
        credentials(cred)
      when 'shared_credentials'
        shared_credentials(cred)
      when 'instance_profile_credentials'
        instance_profile_credentials(cred)
      else qurd_logger! "Credential type unknown: '#{cred.type}'"
      end
    end
  end
  config.aws_credentials = Hash[creds]
end
configure_logger() click to toggle source

Configure Cabin and Aws logging

# File lib/qurd/configuration.rb, line 137
def configure_logger
  @logger = Cabin::Channel.new
  if config.log_file || config.daemonize
    path = config.log_file || '/var/log/qurd/qurd.log'
    mkdir_p_file!(path)
    config.log_file_io = open(path, 'w')
    @ruby_logger = Logger.new(config.log_file_io)
    @logger.level = (config.log_level || :info).to_sym
  else
    @logger.level = (config.log_level || :debug).to_sym
    @ruby_logger = Logger.new(STDOUT)
  end
  @logger.subscribe(@ruby_logger)

  Aws.config[:logger] = @ruby_logger
  Aws.config[:http_wire_trace] = debug?

  @logger.debug('Logging configured')
end