class Fog::AWS::DNS

Public Class Methods

change_resource_record_sets_data(zone_id, change_batch, version, options = {}) click to toggle source

Returns the xml request for a given changeset

# File lib/fog/aws/dns.rb, line 218
def self.change_resource_record_sets_data(zone_id, change_batch, version, options = {})
  # AWS methods return zone_ids that looks like '/hostedzone/id'.  Let the caller either use
  # that form or just the actual id (which is what this request needs)
  zone_id = zone_id.sub('/hostedzone/', '')

  optional_tags = ''
  options.each do |option, value|
    case option
    when :comment
      optional_tags += "<Comment>#{value}</Comment>"
    end
  end

  #build XML
  if change_batch.count > 0

    changes = "<ChangeBatch>#{optional_tags}<Changes>"

    change_batch.each do |change_item|
      action_tag = %Q{<Action>#{change_item[:action]}</Action>}
      name_tag   = %Q{<Name>#{change_item[:name]}</Name>}
      type_tag   = %Q{<Type>#{change_item[:type]}</Type>}

      # TTL must be omitted if using an alias record
      ttl_tag = ''
      ttl_tag += %Q{<TTL>#{change_item[:ttl]}</TTL>} unless change_item[:alias_target]

      weight_tag = ''
      set_identifier_tag = ''
      region_tag = ''
      if change_item[:set_identifier]
        set_identifier_tag += %Q{<SetIdentifier>#{change_item[:set_identifier]}</SetIdentifier>}
        if change_item[:weight] # Weighted Record
          weight_tag += %Q{<Weight>#{change_item[:weight]}</Weight>}
        elsif change_item[:region] # Latency record
          region_tag += %Q{<Region>#{change_item[:region]}</Region>}
        end
      end

      failover_tag = if change_item[:failover]
                       %Q{<Failover>#{change_item[:failover]}</Failover>}
                     end

      geolocation_tag = if change_item[:geo_location]
                          xml_geo = change_item[:geo_location].map { |k,v| "<#{k}>#{v}</#{k}>" }.join
                          %Q{<GeoLocation>#{xml_geo}</GeoLocation>}
                        end

      resource_records = change_item[:resource_records] || []
      resource_record_tags = ''
      resource_records.each do |record|
        resource_record_tags += %Q{<ResourceRecord><Value>#{record}</Value></ResourceRecord>}
      end

      # ResourceRecords must be omitted if using an alias record
      resource_tag = ''
      resource_tag += %Q{<ResourceRecords>#{resource_record_tags}</ResourceRecords>} if resource_records.any?

      alias_target_tag = ''
      if change_item[:alias_target]
        # Accept either underscore or camel case for hash keys.
        dns_name = change_item[:alias_target][:dns_name] || change_item[:alias_target][:DNSName]
        hosted_zone_id = change_item[:alias_target][:hosted_zone_id] || change_item[:alias_target][:HostedZoneId] || AWS.hosted_zone_for_alias_target(dns_name)
        evaluate_target_health = change_item[:alias_target][:evaluate_target_health] || change_item[:alias_target][:EvaluateTargetHealth] || false
        evaluate_target_health_xml = !evaluate_target_health.nil? ? %Q{<EvaluateTargetHealth>#{evaluate_target_health}</EvaluateTargetHealth>} : ''
        alias_target_tag += %Q{<AliasTarget><HostedZoneId>#{hosted_zone_id}</HostedZoneId><DNSName>#{dns_name}</DNSName>#{evaluate_target_health_xml}</AliasTarget>}
      end

      health_check_id_tag = if change_item[:health_check_id]
                              %Q{<HealthCheckId>#{change_item[:health_check_id]}</HealthCheckId>}
                            end

      change_tags = %Q{<Change>#{action_tag}<ResourceRecordSet>#{name_tag}#{type_tag}#{set_identifier_tag}#{weight_tag}#{region_tag}#{failover_tag}#{geolocation_tag}#{ttl_tag}#{resource_tag}#{alias_target_tag}#{health_check_id_tag}</ResourceRecordSet></Change>}
      changes += change_tags
    end

    changes += '</Changes></ChangeBatch>'
  end

  %Q{<?xml version="1.0" encoding="UTF-8"?><ChangeResourceRecordSetsRequest xmlns="https://route53.amazonaws.com/doc/#{version}/">#{changes}</ChangeResourceRecordSetsRequest>}
end
elb_dualstack_hosted_zone_mapping() click to toggle source

See docs.aws.amazon.com/general/latest/gr/rande.html#elb_region This needs to be kept in sync manually sadly for now as seemingly this data is not available via an API

# File lib/fog/aws/dns.rb, line 196
def self.elb_dualstack_hosted_zone_mapping
  @elb_dualstack_hosted_zone_mapping ||= {
    "ap-northeast-1" => "Z14GRHDCWA56QT",
    "ap-northeast-2" => "ZWKZPGTI48KDX",
    "ap-northeast-3" => "Z5LXEXXYW11ES",
    "ap-south-1" => "ZP97RAFLXTNZK",
    "ap-southeast-1" => "Z1LMS91P8CMLE5",
    "ap-southeast-2" => "Z1GM3OXH4ZPM65",
    "ca-central-1" => "ZQSVJUPU6J1EY",
    "eu-central-1" => "Z215JYRZR1TBD5",
    "eu-west-1" => "Z32O12XQLNTSW2",
    "eu-west-2" => "ZHURV8PSTC4K8",
    "eu-west-3" => "Z3Q77PNBQS71R4",
    "us-east-1" => "Z35SXDOTRQ7X7K",
    "us-east-2" => "Z3AADJGX6KTTL2",
    "us-west-1" => "Z368ELLRRE2KJ0",
    "us-west-2" => "Z1H1FL5HABSF5",
    "sa-east-1" => "Z2P70J7HTTTPLU",
  }
end
elb_hosted_zone_mapping() click to toggle source
# File lib/fog/aws/dns.rb, line 180
def self.elb_hosted_zone_mapping
  @elb_hosted_zone_mapping ||= {
    "ap-northeast-1" => "Z2YN17T5R711GT",
    "ap-southeast-1" => "Z1WI8VXHPB1R38",
    "ap-southeast-2" => "Z2999QAZ9SRTIC",
    "eu-west-1"      => "Z3NF1Z3NOM5OY2",
    "eu-central-1"   => "Z215JYRZR1TBD5",
    "sa-east-1"      => "Z2ES78Y61JGQKS",
    "us-east-1"      => "Z3DZXE0Q79N41H",
    "us-west-1"      => "Z1M58G0W56PQJA",
    "us-west-2"      => "Z33MTJ483KN6FU",
  }
end
hosted_zone_for_alias_target(dns_name) click to toggle source
# File lib/fog/aws/dns.rb, line 168
def self.hosted_zone_for_alias_target(dns_name)
  hosted_zones = if dns_name.match(/^dualstack\./)
    elb_dualstack_hosted_zone_mapping
  else
    elb_hosted_zone_mapping
  end

  Hash[hosted_zones.select { |k, _|
    dns_name =~ /\A.+\.#{k}\.elb\.amazonaws\.com\.?\z/
  }].values.last
end