class Qurd::Action::Route53

Clean up route53 records @example Route53 configuration

auto_scaling_queues:
  staging:
    credentials: foo
    region: us-east-1
    queues:
      - "/QueueName/i"
route53:
  staging:
    hosted_zone: "staging.example.com."

Public Class Methods

configure(_action) click to toggle source

Verify each auto_scaling_queue has a corresponding route53 key and that each of those keys defines a hosted_zone @param [String] _action the action being configured @raise [RuntimeError] if any auto_scaling_queues do not have correctly

configured +route53+ keys
# File lib/qurd/action/route53.rb, line 32
def self.configure(_action)
  return if @configure_done
  check_configuration
  @configure_done = true
end

Private Class Methods

check_configuration() click to toggle source
# File lib/qurd/action/route53.rb, line 154
def self.check_configuration
  missing = []
  qurd_configuration.auto_scaling_queues.each do |name, _monitor|
    missing << name unless config_valid?(name)
  end
  m = missing.join(', ')
  qurd_logger! "Missing configuration for route53: #{m}" unless m.empty?
end
config_valid?(name) click to toggle source
# File lib/qurd/action/route53.rb, line 144
def self.config_valid?(name)
  if qurd_configuration.route53.nil? || \
     qurd_configuration.route53[name].nil? || \
     qurd_configuration.route53[name].hosted_zone.nil?
    false
  else
    true
  end
end

Public Instance Methods

terminate() click to toggle source

Delete the record, if the message did not fail other processing steps and dry_run is not true @see {#Qurd::Message}

# File lib/qurd/action/route53.rb, line 41
def terminate
  if failed?
    qurd_logger.warn('Not deleting, message failed to process')
  elsif qurd_configuration.dry_run
    if !hosted_zone
      qurd_logger.debug('Dry run; missing hosted_zone')
    elsif !hostname
      qurd_logger.debug('Dry run; missing hostname')
    elsif !resource_record
      qurd_logger.debug('Dry run; missing resource_record')
    else
      qurd_logger.debug('Dry run; would delete')
    end
  else
    route53_delete
  end
end
test() click to toggle source

Respond to test actions

# File lib/qurd/action/route53.rb, line 60
def test
  qurd_logger.info('Test')
end

Private Instance Methods

chef_node_name() click to toggle source
# File lib/qurd/action/route53.rb, line 74
def chef_node_name
  return @chef_node_name if @chef_node_name
  @chef_node_name = chef_node.name
  qurd_logger.debug("Found chef name '#{@chef_node_name}'")
  @chef_node_name
rescue NoMethodError
  qurd_logger.debug('No node found')
  nil
end
hosted_zone(tries = nil) click to toggle source
# File lib/qurd/action/route53.rb, line 129
def hosted_zone(tries = nil)
  return @hosted_zone if @hosted_zone
  name = qurd_route53.hosted_zone
  qurd_logger.debug("Looking for zone '#{name}'")
  aws_retryable(tries) do
    @hosted_zone = route53.list_hosted_zones_by_name(
      dns_name: name,
      max_items: 1
    ).hosted_zones.first
    qurd_logger.debug "Found zone '#{@hosted_zone}'"
  end
  @hosted_zone || qurd_logger!("Zone not found: '#{name}'",
                               Errors::ZoneNotFound)
end
hostname() click to toggle source
# File lib/qurd/action/route53.rb, line 84
def hostname
  @hostname = instance_name || chef_node_name
  @hostname.sub!(/([^.])$/, '\1.')
  qurd_logger.debug("Using host '#{@hostname}'")
  @hostname
rescue NoMethodError
  qurd_logger!('No instance or chef information',
               Errors::HostNotFound)
end
qurd_route53() click to toggle source
# File lib/qurd/action/route53.rb, line 70
def qurd_route53
  @config ||= qurd_configuration.route53[name]
end
resource_record(tries = nil) click to toggle source
# File lib/qurd/action/route53.rb, line 94
def resource_record(tries = nil)
  @rr = aws_retryable(tries) do
    route53.list_resource_record_sets(
      hosted_zone_id: hosted_zone.id,
      start_record_name: hostname,
      max_items: 1
    ).resource_record_sets.first
  end
  @rr || qurd_logger!('Resource record not found',
                      Errors::ResourceNotFound)
end
route53() click to toggle source
# File lib/qurd/action/route53.rb, line 66
def route53
  @route53 ||= aws_client(:Route53)
end
route53_delete(tries = nil) click to toggle source
# File lib/qurd/action/route53.rb, line 106
def route53_delete(tries = nil)
  qurd_logger.debug('Deleting')
  aws_retryable(tries) do
    route53.change_resource_record_sets(
      hosted_zone_id: hosted_zone.id,
      change_batch: {
        changes: [
          action: 'DELETE',
          resource_record_set: {
            name: resource_record.name,
            type: resource_record.type,
            ttl: resource_record.ttl,
            resource_records: resource_record.resource_records
          }
        ]
      }
    )
  end
rescue Qurd::Action::Route53::Errors => e
  qurd_logger.error("Failed to delete: #{e}")
  failed!(e)
end