class SprinkleDNS::Route53Client
Attributes
hosted_zones[R]
Public Class Methods
new(aws_access_key_id, aws_secret_access_key)
click to toggle source
# File lib/sprinkle_dns/providers/route53_client.rb, line 10 def initialize(aws_access_key_id, aws_secret_access_key) @api_client = Aws::Route53::Client.new( access_key_id: aws_access_key_id, secret_access_key: aws_secret_access_key, region: 'us-east-1', ) @hosted_zone_to_api_mapping = {} end
Public Instance Methods
change_hosted_zones(hosted_zones, configuration)
click to toggle source
# File lib/sprinkle_dns/providers/route53_client.rb, line 76 def change_hosted_zones(hosted_zones, configuration) change_requests = [] hosted_zones.each do |hosted_zone| changes = EntryPolicyService.new(hosted_zone, configuration).compile if changes.any? change_request = @api_client.change_resource_record_sets({ hosted_zone_id: @hosted_zone_to_api_mapping[hosted_zone.name], change_batch: { changes: changes, } }) change_requests << Route53ChangeRequest.new(hosted_zone, change_request.change_info.id, 0, false) end end change_requests end
check_change_requests(change_requests)
click to toggle source
# File lib/sprinkle_dns/providers/route53_client.rb, line 97 def check_change_requests(change_requests) change_requests.reject{|cr| cr.in_sync}.each do |change_request| resp = @api_client.get_change({id: change_request.change_info_id}) change_request.in_sync = resp.change_info.status == 'INSYNC' change_request.tries += 1 end change_requests end
create_hosted_zones(hosted_zones)
click to toggle source
# File lib/sprinkle_dns/providers/route53_client.rb, line 58 def create_hosted_zones(hosted_zones) change_requests = [] hosted_zones.each do |hosted_zone| change_request = @api_client.create_hosted_zone({ name: hosted_zone.name, caller_reference: "#{hosted_zone.name}.#{Time.now.to_i}", hosted_zone_config: { comment: "Created by SprinkleDNS #{SprinkleDNS::VERSION}", }, }) @hosted_zone_to_api_mapping[hosted_zone.name] = change_request.hosted_zone.id change_requests << Route53ChangeRequest.new(hosted_zone, change_request.change_info.id, 0, false) end change_requests end
fetch_hosted_zones(filter: [])
click to toggle source
# File lib/sprinkle_dns/providers/route53_client.rb, line 19 def fetch_hosted_zones(filter: []) hosted_zones = [] more_pages = true next_marker = nil if filter.empty? return [] end while(more_pages) begin data = @api_client.list_hosted_zones({:max_items => nil, :marker => next_marker}) rescue Aws::Route53::Errors::AccessDenied # TODO extract this to custom exceptions raise end more_pages = data.is_truncated next_marker = data.next_marker data.hosted_zones.each do |hosted_zone_data| if filter.include?(hosted_zone_data.name) if hosted_zones.map(&:name).include?(hosted_zone_data.name) raise DuplicatedHostedZones, "Whooops, seems like you have the same hosted zone duplicated on your Route53 account!\nIt's the following: #{hz.name}" end hosted_zone = HostedZone.new(hosted_zone_data.name) hosted_zone.resource_record_sets = get_resource_record_set!(hosted_zone, hosted_zone_data.id) @hosted_zone_to_api_mapping[hosted_zone.name] = hosted_zone_data.id hosted_zones << hosted_zone end end end hosted_zones end
Private Instance Methods
get_resource_record_set!(hosted_zone, hosted_zone_id)
click to toggle source
# File lib/sprinkle_dns/providers/route53_client.rb, line 113 def get_resource_record_set!(hosted_zone, hosted_zone_id) existing_resource_record_sets = [] more_pages = true next_record_name = nil next_record_type = nil next_record_identifier = nil while(more_pages) data = @api_client.list_resource_record_sets( hosted_zone_id: hosted_zone_id, max_items: nil, start_record_name: next_record_name, start_record_type: next_record_type, start_record_identifier: next_record_identifier, ) more_pages = data.is_truncated next_record_name = data.next_record_name next_record_type = data.next_record_type next_record_identifier = data.next_record_identifier data.resource_record_sets.each do |rrs| rrs_name = rrs.name rrs_name = rrs_name.gsub('\\052', '*') rrs_name = rrs_name.gsub('\\100', '@') next if ignored_record_types.include?(rrs.type) && rrs_name == hosted_zone.name entry = if rrs.alias_target HostedZoneAlias.new(rrs.type, rrs_name, rrs.alias_target.hosted_zone_id, rrs.alias_target.dns_name, hosted_zone.name) else HostedZoneEntry.new(rrs.type, rrs_name, rrs.resource_records.map(&:value), rrs.ttl, hosted_zone.name) end existing_resource_record_sets << entry entry.persisted! # TODO test if all entries from are persisted = true end end existing_resource_record_sets end
ignored_record_types()
click to toggle source
# File lib/sprinkle_dns/providers/route53_client.rb, line 109 def ignored_record_types ['NS','SOA'] end