File: records.rb

package info (click to toggle)
ruby-fog-aws 3.8.0-1
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 8,092 kB
  • sloc: ruby: 72,795; javascript: 14; makefile: 9; sh: 4
file content (113 lines) | stat: -rw-r--r-- 4,370 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
require 'fog/aws/models/dns/record'

module Fog
  module AWS
    class DNS
      class Records < Fog::Collection
        attribute :is_truncated,            :aliases => ['IsTruncated']
        attribute :max_items,               :aliases => ['MaxItems']
        attribute :name
        attribute :next_record_name,        :aliases => ['NextRecordName']
        attribute :next_record_type,        :aliases => ['NextRecordType']
        attribute :next_record_identifier,  :aliases => ['NextRecordIdentifier']
        attribute :type
        attribute :identifier

        attribute :zone

        model Fog::AWS::DNS::Record

        def all(options = {})
          requires :zone
          options[:max_items]  ||= max_items
          options[:name]       ||= zone.domain
          options[:type]       ||= type
          options[:identifier] ||= identifier
          options.delete_if {|key, value| value.nil?}

          data = service.list_resource_record_sets(zone.id, options).body
          # NextRecordIdentifier is completely absent instead of nil, so set to nil, or iteration breaks.
          data['NextRecordIdentifier'] = nil unless data.key?('NextRecordIdentifier')

          merge_attributes(data.reject {|key, value| !['IsTruncated', 'MaxItems', 'NextRecordName', 'NextRecordType', 'NextRecordIdentifier'].include?(key)})
          load(data['ResourceRecordSets'])
        end

        #
        # Load all zone records into the collection.
        #
        def all!
          data = []

          merge_attributes({'NextRecordName' => nil,
                            'NextRecordType' => nil,
                            'NextRecordIdentifier' => nil,
                            'IsTruncated' => nil})

          begin
            options = {
                :name => next_record_name,
                :type => next_record_type,
                :identifier => next_record_identifier
            }
            options.delete_if {|key, value| value.nil?}

            batch = service.list_resource_record_sets(zone.id, options).body
            # NextRecordIdentifier is completely absent instead of nil, so set to nil, or iteration breaks.
            batch['NextRecordIdentifier'] = nil unless batch.key?('NextRecordIdentifier')

            merge_attributes(batch.reject {|key, value| !['IsTruncated', 'MaxItems', 'NextRecordName', 'NextRecordType', 'NextRecordIdentifier'].include?(key)})

            data.concat(batch['ResourceRecordSets'])
          end while is_truncated

          load(data)
        end

        #
        # AWS Route 53 records are uniquely identified by a compound key of name, type, and identifier.
        # #get allows one to retrieve a record using one or more of those key components.
        #
        # ==== Parameters
        # * record_name - The name of the record to retrieve.
        # * record_type - The type of record to retrieve, if nil, then the first matching record is returned.
        # * record_identifier - The record set identifier to retrieve, if nil, then the first matching record is returned.
        #
        def get(record_name, record_type = nil, record_identifier = nil)
          requires :zone
          # Append a trailing period to the record_name if absent.
          record_name = record_name + "." unless record_name.end_with?(".")
          record_type = record_type.upcase unless record_type.nil?

          options = {
              :max_items  => 1,
              :name       => record_name,
              :type       => record_type,
              :identifier => record_identifier
          }
          options.delete_if {|key, value| value.nil?}

          data = service.list_resource_record_sets(zone.id, options).body

          # look for an exact match in the records
          (data['ResourceRecordSets'] || []).map do |record_data|
            record = new(record_data)

            if (record.name.casecmp(record_name) == 0) &&
                (record_type.nil? || (record.type == record_type)) &&
                (record_identifier.nil? || (record.set_identifier == record_identifier))
              record
            end
          end.compact.first
        rescue Fog::AWS::DNS::NotFound
          nil
        end

        def new(attributes = {})
          requires :zone
          super({ :zone => zone }.merge!(attributes))
        end
      end
    end
  end
end