class Roadworker::HealthCheck

Public Class Methods

config_to_hash(config) click to toggle source
# File lib/roadworker/route53-health-check.rb, line 13
def config_to_hash(config)
  type = config[:type].downcase

  case type
  when 'calculated'
    hash = {:calculated => config[:child_health_checks]}
  when 'cloudwatch_metric'
    hash = {:cloudwatch_metric => config[:alarm_identifier].to_h}
  else
    ipaddr = config[:ip_address]
    port   = config[:port]
    path   = config[:resource_path]
    fqdn   = config[:fully_qualified_domain_name]
    fqdn   = fqdn.downcase if fqdn

    if ipaddr
      url = "#{type}://#{ipaddr}:#{port}"
    else
      url = "#{type}://#{fqdn}:#{port}"
      fqdn = nil
    end

    url << path if path && path != '/'

    hash = {
      :url  => url,
      :host => fqdn,
    }
  end

  [
    :search_string,
    :request_interval,
    :health_threshold,
    :failure_threshold,
    :measure_latency,
    :inverted,
    :enable_sni,
    :insufficient_data_health_status,
  ].each do |key|
    hash[key] = config[key] unless config[key].nil?
  end

  hash
end
gc(route53, options = {}) click to toggle source
# File lib/roadworker/route53-health-check.rb, line 9
def gc(route53, options = {})
  self.new(route53).gc(options)
end
health_checks(route53, options = {}) click to toggle source
# File lib/roadworker/route53-health-check.rb, line 5
def health_checks(route53, options = {})
  self.new(route53).health_checks(options)
end
new(route53) click to toggle source
# File lib/roadworker/route53-health-check.rb, line 92
def initialize(route53)
  @route53 = route53
end
parse_url(url) click to toggle source
# File lib/roadworker/route53-health-check.rb, line 59
def parse_url(url)
  url = URI.parse(url)
  type = url.scheme.upcase
  path = url.path

  if type =~ /\AHTTP/
    if path.nil? or path.empty?
      path = '/'
    end
  else
    path = nil
  end

  config = Aws::Route53::Types::HealthCheckConfig.new

  {
    :port          => url.port,
    :type          => type,
    :resource_path => path,
  }.each {|key, value|
    config[key] = value if value
  }

  if url.host =~ /\A\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\z/
    config.ip_address = url.host
  else
    config.fully_qualified_domain_name = url.host
  end

  return config
end

Public Instance Methods

gc(options = {}) click to toggle source
# File lib/roadworker/route53-health-check.rb, line 146
def gc(options = {})
  check_list = health_checks
  return if check_list.empty?

  if (logger = options[:logger])
    logger.info('Clean HealthChecks')
  end

  Collection.batch(@route53.list_hosted_zones, :hosted_zones) do |zone|
    Collection.batch(@route53.list_resource_record_sets(hosted_zone_id: zone.id), :resource_record_sets) do |record|
      health_check = check_list.delete(record.health_check_id)

      if health_check and health_check.type == 'CALCULATED'
        health_check.child_health_checks.each do |child|
          check_list.delete(child)
        end
      end
    end
  end

  check_list.sort_by {|hc_id, hc| hc.type == 'CALCULATED' ? 0 : 1 }.each do |health_check_id, config|
    @route53.delete_health_check(:health_check_id  => health_check_id)
  end
end
health_checks(options = {}) click to toggle source
# File lib/roadworker/route53-health-check.rb, line 96
def health_checks(options = {})
  check_list = {}

  is_truncated = true
  next_marker = nil

  while is_truncated
    opts = next_marker ? {:marker => next_marker} : {}
    response = @route53.list_health_checks(opts)

    response[:health_checks].each do |check|
      check_list[check[:id]] = check[:health_check_config]
    end

    is_truncated = response[:is_truncated]
    next_marker = response[:next_marker]
  end

  if options[:extended]
    check_list.instance_variable_set(:@route53, @route53)

    def check_list.find_or_create(attrs)
      health_check_id, config = self.find {|hcid, elems| elems == attrs }

      unless health_check_id
        if attrs[:child_health_checks] and attrs[:child_health_checks].empty?
          attrs[:child_health_checks] = nil
        end

        if attrs[:regions] and attrs[:regions].empty?
          attrs[:regions] = nil
        end

        response = @route53.create_health_check({
          :caller_reference    => "roadworker #{Roadworker::VERSION} #{UUID.new.generate}",
          :health_check_config => attrs,
        })

        health_check_id = response[:health_check][:id]
        config = response[:health_check][:health_check_config]
        self[health_check_id] = config
      end

      return health_check_id
    end
  end

  return check_list
end