Class: Fog::DNS::AWS::Real

Inherits:
Object
  • Object
show all
Defined in:
lib/fog/aws/dns.rb,
lib/fog/aws/requests/dns/get_change.rb,
lib/fog/aws/requests/dns/get_hosted_zone.rb,
lib/fog/aws/requests/dns/list_hosted_zones.rb,
lib/fog/aws/requests/dns/create_hosted_zone.rb,
lib/fog/aws/requests/dns/delete_hosted_zone.rb,
lib/fog/aws/requests/dns/list_resource_record_sets.rb,
lib/fog/aws/requests/dns/change_resource_record_sets.rb

Instance Method Summary collapse

Constructor Details

#initialize(options = {}) ⇒ Real

Initialize connection to Route 53 DNS service

Notes

options parameter must include values for :aws_access_key_id and :aws_secret_access_key in order to create a connection

Examples

dns = Fog::AWS::DNS.new(
  :aws_access_key_id => your_aws_access_key_id,
  :aws_secret_access_key => your_aws_secret_access_key
)

Parameters

  • options<~Hash> - config arguments for connection. Defaults to {}.

Returns

  • dns object with connection to aws.



80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
# File 'lib/fog/aws/dns.rb', line 80

def initialize(options={})
  require 'fog/core/parser'

  @aws_access_key_id      = options[:aws_access_key_id]
  @aws_secret_access_key  = options[:aws_secret_access_key]
  @connection_options     = options[:connection_options] || {}
  @hmac       = Fog::HMAC.new('sha1', @aws_secret_access_key)
  @host       = options[:host]        || 'route53.amazonaws.com'
  @path       = options[:path]        || '/'
  @persistent = options[:persistent]  || true
  @port       = options[:port]        || 443
  @scheme     = options[:scheme]      || 'https'
  @version    = options[:version]     || '2011-05-05'

  @connection = Fog::Connection.new("#{@scheme}://#{@host}:#{@port}#{@path}", @persistent, @connection_options)
end

Instance Method Details

#change_resource_record_sets(zone_id, change_batch, options = {}) ⇒ Object

Use this action to create or change your authoritative DNS information for a zone

Parameters

  • zone_id<~String> - ID of the zone these changes apply to

  • options<~Hash>

    • comment<~String> - Any comments you want to include about the change.

    • change_batch<~Array> - The information for a change request

      • changes<~Hash> -

        • action<~String> - ‘CREATE’ or ‘DELETE’

        • name<~String> - This must be a fully-specified name, ending with a final period

        • type<~String> - A | AAAA | CNAME | MX | NS | PTR | SOA | SPF | SRV | TXT

        • ttl<~Integer> - Time-to-live value - omit if using an alias record

        • resource_record<~String> - Omit if using an alias record

        • alias_target<~Hash> - Information about the domain to which you are redirecting traffic (Alias record sets only)

          • dns_name<~String> - The Elastic Load Balancing domain to which you want to reroute traffic

          • hosted_zone_id<~String> - The ID of the hosted zone that contains the Elastic Load Balancing domain to which you want to reroute traffic

Returns

  • response<~Excon::Response>:

    • body<~Hash>:

      • ‘ChangeInfo’<~Hash>

        • ‘Id’<~String> - The ID of the request

        • ‘Status’<~String> - status of the request - PENDING | INSYNC

        • ‘SubmittedAt’<~String> - The date and time the change was made

    • status<~Integer> - 201 when successful



33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
# File 'lib/fog/aws/requests/dns/change_resource_record_sets.rb', line 33

def change_resource_record_sets(zone_id, change_batch, 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]

      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]
        alias_target_tag += %Q{<AliasTarget><HostedZoneId>#{change_item[:alias_target][:hosted_zone_id]}</HostedZoneId><DNSName>#{change_item[:alias_target][:dns_name]}</DNSName></AliasTarget>}
      end

      change_tags = %Q{<Change>#{action_tag}<ResourceRecordSet>#{name_tag}#{type_tag}#{ttl_tag}#{resource_tag}#{alias_target_tag}</ResourceRecordSet></Change>}
      changes += change_tags
    end

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

  body = %Q{<?xml version="1.0" encoding="UTF-8"?><ChangeResourceRecordSetsRequest xmlns="https://route53.amazonaws.com/doc/2011-05-05/">#{changes}</ChangeResourceRecordSetsRequest>}
  request({
    :body       => body,
    :parser     => Fog::Parsers::DNS::AWS::ChangeResourceRecordSets.new,
    :expects    => 200,
    :method     => 'POST',
    :path       => "hostedzone/#{zone_id}/rrset"
  })

end

#create_hosted_zone(name, options = {}) ⇒ Object

Creates a new hosted zone

Parameters

  • name<~String> - The name of the domain. Must be a fully-specified domain that ends with a period

  • options<~Hash>

    • caller_ref<~String> - unique string that identifies the request & allows failed

      calls to be retried without the risk of executing the operation twice
      
    • comment<~String> -

Returns

  • response<~Excon::Response>:

    • body<~Hash>:

      • ‘HostedZone’<~Hash>:

        • ‘Id’<~String> -

        • ‘Name’<~String> -

        • ‘CallerReference’<~String>

        • ‘Comment’<~String> -

      • ‘ChangeInfo’<~Hash> -

        • ‘Id’<~String>

        • ‘Status’<~String>

        • ‘SubmittedAt’<~String>

      • ‘NameServers’<~Array>

        • ‘NameServer’<~String>

    • status<~Integer> - 201 when successful



32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/fog/aws/requests/dns/create_hosted_zone.rb', line 32

def create_hosted_zone(name, options = {})

  optional_tags = ''
  if options[:caller_ref]
    optional_tags += "<CallerReference>#{options[:caller_ref]}</CallerReference>"
  else
    #make sure we have a unique call reference
    caller_ref = "ref-#{rand(1000000).to_s}"
    optional_tags += "<CallerReference>#{caller_ref}</CallerReference>"
  end
  if options[:comment]
    optional_tags += "<HostedZoneConfig><Comment>#{options[:comment]}</Comment></HostedZoneConfig>"
  end

  request({
    :body    => %Q{<?xml version="1.0" encoding="UTF-8"?><CreateHostedZoneRequest xmlns="https://route53.amazonaws.com/doc/2011-05-05/"><Name>#{name}</Name>#{optional_tags}</CreateHostedZoneRequest>},
    :parser  => Fog::Parsers::DNS::AWS::CreateHostedZone.new,
    :expects => 201,
    :method  => 'POST',
    :path    => "hostedzone"
  })

end

#delete_hosted_zone(zone_id) ⇒ Object

Delete a hosted zone

Parameters

  • zone_id<~String> -

Returns

  • response<~Excon::Response>:

    • body<~Hash>:

      • ‘ChangeInfo’<~Hash> -

        • ‘Id’<~String> The ID of the request

        • ‘Status’<~String> The current state of the hosted zone

        • ‘SubmittedAt’<~String> The date and time the change was made

    • status<~Integer> - 200 when successful



21
22
23
24
25
26
27
28
29
30
31
32
33
34
# File 'lib/fog/aws/requests/dns/delete_hosted_zone.rb', line 21

def delete_hosted_zone(zone_id)

  # 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/', '')

  request({
    :expects => 200,
    :parser  => Fog::Parsers::DNS::AWS::DeleteHostedZone.new,
    :method  => 'DELETE',
    :path    => "hostedzone/#{zone_id}"
  })

end

#get_change(change_id) ⇒ Object

returns the current state of a change request

Parameters

  • change_id<~String>

Returns

  • response<~Excon::Response>:

    • body<~Hash>:

      • ‘Id’<~String>

      • ‘Status’<~String>

      • ‘SubmittedAt’<~String>

    • status<~Integer> - 200 when successful



20
21
22
23
24
25
26
27
28
29
30
31
32
33
# File 'lib/fog/aws/requests/dns/get_change.rb', line 20

def get_change(change_id)

  # AWS methods return change_ids that looks like '/change/id'.  Let the caller either use
  # that form or just the actual id (which is what this request needs)
  change_id = change_id.sub('/change/', '')

  request({
    :expects => 200,
    :parser  => Fog::Parsers::DNS::AWS::GetChange.new,
    :method  => 'GET',
    :path    => "change/#{change_id}"
  })

end

#get_hosted_zone(zone_id) ⇒ Object

retrieve information about a hosted zone

Parameters

  • zone_id<~String> - The ID of the hosted zone

Returns

  • response<~Excon::Response>:

    • body<~Hash>:

      • ‘HostedZone’<~Hash>:

        • ‘Id’<~String> -

        • ‘Name’<~String> -

        • ‘CallerReference’<~String>

        • ‘Comment’<~String> -

      • ‘NameServers’<~Array>

        • ‘NameServer’<~String>

    • status<~Integer> - 201 when successful



24
25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/fog/aws/requests/dns/get_hosted_zone.rb', line 24

def get_hosted_zone(zone_id)

  # 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/', '')

  request({
    :expects => 200,
    :parser  => Fog::Parsers::DNS::AWS::GetHostedZone.new,
    :method  => 'GET',
    :path    => "hostedzone/#{zone_id}"
  })

end

#list_hosted_zones(options = {}) ⇒ Object

Describe all or specified instances

Parameters

  • options<~Hash>

    • marker<~String> - Indicates where to begin in your list of hosted zones.

    • max_items<~Integer> - The maximum number of hosted zones to be included in the response body

Returns

  • response<~Excon::Response>:

    • body<~Hash>:

      • ‘HostedZones’<~Array>:

        • ‘HostedZone’<~Hash>:

          • ‘Id’<~String> -

          • ‘Name’<~String> -

          • ‘CallerReference’<~String>

          • ‘Comment’<~String> -

      • ‘Marker’<~String> -

      • ‘MaxItems’<~Integer> -

      • ‘IsTruncated’<~String> -

      • ‘NextMarket’<~String>

    • status<~Integer> - 200 when successful



29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# File 'lib/fog/aws/requests/dns/list_hosted_zones.rb', line 29

def list_hosted_zones(options = {})

  parameters = {}
  options.each do |option, value|
    case option
    when :marker
      parameters[option] = value
    when :max_items
      parameters[:maxitems] = value
    end
  end

  request({
    :query   => parameters,
    :parser  => Fog::Parsers::DNS::AWS::ListHostedZones.new,
    :expects => 200,
    :method  => 'GET',
    :path    => "hostedzone"
  })

end

#list_resource_record_sets(zone_id, options = {}) ⇒ Object

list your resource record sets

Parameters

  • zone_id<~String> -

  • options<~Hash>

    • type<~String> -

    • name<~String> -

    • max_items<~Integer> -

Returns

  • response<~Excon::Response>:

    • body<~Hash>:

      • ‘ResourceRecordSet’<~Array>:

        • ‘Name’<~String> -

        • ‘Type’<~String> -

        • ‘TTL’<~Integer> -

        • ‘AliasTarget’<~Hash> -

          • ‘HostedZoneId’<~String> -

          • ‘DNSName’<~String> -

        • ‘ResourceRecords’<~Array>

          • ‘Value’<~String> -

      • ‘IsTruncated’<~String> -

      • ‘MaxItems’<~String> -

      • ‘NextRecordName’<~String>

      • ‘NexRecordType’<~String>

    • status<~Integer> - 201 when successful



34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/fog/aws/requests/dns/list_resource_record_sets.rb', line 34

def list_resource_record_sets(zone_id, 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/', '')

  parameters = {}
  options.each do |option, value|
    case option
    when :type, :name
      parameters[option] = "#{value}"
    when :max_items
      parameters['maxitems'] = "#{value}"
    end
  end

  request({
    :query   => parameters,
    :parser  => Fog::Parsers::DNS::AWS::ListResourceRecordSets.new,
    :expects => 200,
    :method  => 'GET',
    :path    => "hostedzone/#{zone_id}/rrset"
  })

end

#reloadObject



97
98
99
# File 'lib/fog/aws/dns.rb', line 97

def reload
  @connection.reset
end