google-cloud-dns 0.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/lib/google-cloud-dns.rb +121 -0
- data/lib/google/cloud/dns.rb +290 -0
- data/lib/google/cloud/dns/change.rb +160 -0
- data/lib/google/cloud/dns/change/list.rb +176 -0
- data/lib/google/cloud/dns/credentials.rb +31 -0
- data/lib/google/cloud/dns/importer.rb +186 -0
- data/lib/google/cloud/dns/project.rb +251 -0
- data/lib/google/cloud/dns/record.rb +173 -0
- data/lib/google/cloud/dns/record/list.rb +177 -0
- data/lib/google/cloud/dns/service.rb +166 -0
- data/lib/google/cloud/dns/version.rb +22 -0
- data/lib/google/cloud/dns/zone.rb +768 -0
- data/lib/google/cloud/dns/zone/list.rb +170 -0
- data/lib/google/cloud/dns/zone/transaction.rb +180 -0
- metadata +214 -0
@@ -0,0 +1,173 @@
|
|
1
|
+
# Copyright 2015 Google Inc. All rights reserved.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
|
16
|
+
require "google/cloud/dns/record/list"
|
17
|
+
|
18
|
+
module Google
|
19
|
+
module Cloud
|
20
|
+
module Dns
|
21
|
+
##
|
22
|
+
# # DNS Record
|
23
|
+
#
|
24
|
+
# Represents a set of DNS resource records (RRs) for a given
|
25
|
+
# {Google::Cloud::Dns::Record#name} and {Google::Cloud::Dns::Record#type}
|
26
|
+
# in a {Google::Cloud::Dns::Zone}. Since it is a value object, a newly
|
27
|
+
# created Record instance is transient until it is added to a Zone with
|
28
|
+
# {Google::Cloud::Dns::Zone#update}. Note that
|
29
|
+
# {Google::Cloud::Dns::Zone#add} and the {Google::Cloud::Dns::Zone#update}
|
30
|
+
# block parameter can be used instead of {Google::Cloud::Dns::Zone#record}
|
31
|
+
# or `Record.new` to create new records.
|
32
|
+
#
|
33
|
+
# @example
|
34
|
+
# require "google/cloud"
|
35
|
+
#
|
36
|
+
# gcloud = Google::Cloud.new
|
37
|
+
# dns = gcloud.dns
|
38
|
+
# zone = dns.zone "example-com"
|
39
|
+
#
|
40
|
+
# zone.records.count #=> 2
|
41
|
+
# record = zone.record "example.com.", "A", 86400, "1.2.3.4"
|
42
|
+
# zone.records.count #=> 2
|
43
|
+
# change = zone.update record
|
44
|
+
# zone.records.count #=> 3
|
45
|
+
#
|
46
|
+
class Record
|
47
|
+
##
|
48
|
+
# The owner of the record. For example: `example.com.`.
|
49
|
+
#
|
50
|
+
# @return [String]
|
51
|
+
#
|
52
|
+
attr_accessor :name
|
53
|
+
|
54
|
+
##
|
55
|
+
# The identifier of a [supported record type
|
56
|
+
# ](https://cloud.google.com/dns/what-is-cloud-dns#supported_record_types).
|
57
|
+
# For example: `A`, `AAAA`, `CNAME`, `MX`, or `TXT`.
|
58
|
+
#
|
59
|
+
# @return [String]
|
60
|
+
#
|
61
|
+
attr_accessor :type
|
62
|
+
|
63
|
+
##
|
64
|
+
# The number of seconds that the record can be cached by resolvers.
|
65
|
+
#
|
66
|
+
# @return [Integer]
|
67
|
+
#
|
68
|
+
attr_accessor :ttl
|
69
|
+
|
70
|
+
##
|
71
|
+
# The array of resource record data, as determined by `type` and defined
|
72
|
+
# in [RFC 1035 (section
|
73
|
+
# 5)](http://tools.ietf.org/html/rfc1035#section-5) and [RFC 1034
|
74
|
+
# (section 3.6.1)](http://tools.ietf.org/html/rfc1034#section-3.6.1).
|
75
|
+
# For example: ["10 mail.example.com.", "20 mail2.example.com."].
|
76
|
+
#
|
77
|
+
# @return [Array<String>]
|
78
|
+
#
|
79
|
+
attr_accessor :data
|
80
|
+
|
81
|
+
##
|
82
|
+
# Creates a Record value object.
|
83
|
+
#
|
84
|
+
# @param [String] name The owner of the record. For example:
|
85
|
+
# `example.com.`.
|
86
|
+
# @param [String] type The identifier of a [supported record
|
87
|
+
# type](https://cloud.google.com/dns/what-is-cloud-dns).
|
88
|
+
# For example: `A`, `AAAA`, `CNAME`, `MX`, or `TXT`.
|
89
|
+
# @param [Integer] ttl The number of seconds that the record can be
|
90
|
+
# cached by resolvers.
|
91
|
+
# @param [String, Array<String>] data The resource record data, as
|
92
|
+
# determined by `type` and defined in [RFC
|
93
|
+
# 1035 (section 5)](http://tools.ietf.org/html/rfc1035#section-5) and
|
94
|
+
# [RFC 1034
|
95
|
+
# (section 3.6.1)](http://tools.ietf.org/html/rfc1034#section-3.6.1).
|
96
|
+
# For example: ["10 mail.example.com.", "20 mail2.example.com."].
|
97
|
+
#
|
98
|
+
def initialize name, type, ttl, data
|
99
|
+
fail ArgumentError, "name is required" unless name
|
100
|
+
fail ArgumentError, "type is required" unless type
|
101
|
+
fail ArgumentError, "ttl is required" unless ttl
|
102
|
+
fail ArgumentError, "data is required" unless data
|
103
|
+
@name = name.to_s
|
104
|
+
@type = type.to_s.upcase
|
105
|
+
@ttl = Integer(ttl)
|
106
|
+
@data = Array(data)
|
107
|
+
end
|
108
|
+
|
109
|
+
##
|
110
|
+
# @private Returns an array of strings in the zone file format, one
|
111
|
+
# for each element in the record's data array.
|
112
|
+
def to_zonefile_records
|
113
|
+
data.map do |rrdata|
|
114
|
+
"#{name} #{ttl} IN #{type} #{rrdata}"
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
##
|
119
|
+
# Returns a deep copy of the record. Useful for updating records, since
|
120
|
+
# the original, unmodified record must be passed for deletion when using
|
121
|
+
# {Google::Cloud::Dns::Zone#update}.
|
122
|
+
#
|
123
|
+
def dup
|
124
|
+
other = super
|
125
|
+
other.data = data.map(&:dup)
|
126
|
+
other
|
127
|
+
end
|
128
|
+
|
129
|
+
##
|
130
|
+
# @private New Record from a Google API Client object.
|
131
|
+
def self.from_gapi gapi
|
132
|
+
new gapi.name, gapi.type, gapi.ttl, gapi.rrdatas
|
133
|
+
end
|
134
|
+
|
135
|
+
##
|
136
|
+
# @private Convert the record object to a Google API hash.
|
137
|
+
def to_gapi
|
138
|
+
Google::Apis::DnsV1::ResourceRecordSet.new(
|
139
|
+
kind: "dns#resourceRecordSet",
|
140
|
+
name: name,
|
141
|
+
rrdatas: data,
|
142
|
+
ttl: ttl,
|
143
|
+
type: type
|
144
|
+
)
|
145
|
+
end
|
146
|
+
|
147
|
+
# @private
|
148
|
+
def hash
|
149
|
+
[name, type, ttl, data].hash
|
150
|
+
end
|
151
|
+
|
152
|
+
# @private
|
153
|
+
def eql? other
|
154
|
+
return false unless other.is_a? self.class
|
155
|
+
name == other.name && type == other.type &&
|
156
|
+
ttl == other.ttl && data == other.data
|
157
|
+
end
|
158
|
+
|
159
|
+
# @private
|
160
|
+
def == other
|
161
|
+
self.eql? other
|
162
|
+
end
|
163
|
+
|
164
|
+
# @private
|
165
|
+
def <=> other
|
166
|
+
return nil unless other.is_a? self.class
|
167
|
+
[name, type, ttl, data] <=>
|
168
|
+
[other.name, other.type, other.ttl, other.data]
|
169
|
+
end
|
170
|
+
end
|
171
|
+
end
|
172
|
+
end
|
173
|
+
end
|
@@ -0,0 +1,177 @@
|
|
1
|
+
# Copyright 2015 Google Inc. All rights reserved.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
|
16
|
+
require "delegate"
|
17
|
+
|
18
|
+
module Google
|
19
|
+
module Cloud
|
20
|
+
module Dns
|
21
|
+
class Record
|
22
|
+
##
|
23
|
+
# Record::List is a special case Array with additional values.
|
24
|
+
class List < DelegateClass(::Array)
|
25
|
+
##
|
26
|
+
# If not empty, indicates that there are more records that match
|
27
|
+
# the request and this value should be passed to continue.
|
28
|
+
attr_accessor :token
|
29
|
+
|
30
|
+
##
|
31
|
+
# @private Create a new Record::List with an array of Record
|
32
|
+
# instances.
|
33
|
+
def initialize arr = []
|
34
|
+
super arr
|
35
|
+
end
|
36
|
+
|
37
|
+
##
|
38
|
+
# Whether there a next page of records.
|
39
|
+
#
|
40
|
+
# @return [Boolean]
|
41
|
+
#
|
42
|
+
# @example
|
43
|
+
# require "google/cloud"
|
44
|
+
#
|
45
|
+
# gcloud = Google::Cloud.new
|
46
|
+
# dns = gcloud.dns
|
47
|
+
# zone = dns.zone "example-com"
|
48
|
+
#
|
49
|
+
# records = zone.records "example.com."
|
50
|
+
# if records.next?
|
51
|
+
# next_records = records.next
|
52
|
+
# end
|
53
|
+
#
|
54
|
+
def next?
|
55
|
+
!token.nil?
|
56
|
+
end
|
57
|
+
|
58
|
+
##
|
59
|
+
# Retrieve the next page of records.
|
60
|
+
#
|
61
|
+
# @return [Record::List]
|
62
|
+
#
|
63
|
+
# @example
|
64
|
+
# require "google/cloud"
|
65
|
+
#
|
66
|
+
# gcloud = Google::Cloud.new
|
67
|
+
# dns = gcloud.dns
|
68
|
+
# zone = dns.zone "example-com"
|
69
|
+
#
|
70
|
+
# records = zone.records "example.com."
|
71
|
+
# if records.next?
|
72
|
+
# next_records = records.next
|
73
|
+
# end
|
74
|
+
#
|
75
|
+
def next
|
76
|
+
return nil unless next?
|
77
|
+
ensure_zone!
|
78
|
+
@zone.records @name, @type, token: token, max: @max
|
79
|
+
end
|
80
|
+
|
81
|
+
##
|
82
|
+
# Retrieves all records by repeatedly loading {#next} until {#next?}
|
83
|
+
# returns `false`. Calls the given block once for each record, which
|
84
|
+
# is passed as the parameter.
|
85
|
+
#
|
86
|
+
# An Enumerator is returned if no block is given.
|
87
|
+
#
|
88
|
+
# This method may make several API calls until all records are
|
89
|
+
# retrieved. Be sure to use as narrow a search criteria as possible.
|
90
|
+
# Please use with caution.
|
91
|
+
#
|
92
|
+
# @param [Integer] request_limit The upper limit of API requests to
|
93
|
+
# make to load all records. Default is no limit.
|
94
|
+
# @yield [record] The block for accessing each record.
|
95
|
+
# @yieldparam [Record] record The record object.
|
96
|
+
#
|
97
|
+
# @return [Enumerator]
|
98
|
+
#
|
99
|
+
# @example Iterating each record by passing a block:
|
100
|
+
# require "google/cloud"
|
101
|
+
#
|
102
|
+
# gcloud = Google::Cloud.new
|
103
|
+
# dns = gcloud.dns
|
104
|
+
# zone = dns.zone "example-com"
|
105
|
+
# records = zone.records "example.com."
|
106
|
+
#
|
107
|
+
# records.all do |record|
|
108
|
+
# puts record.name
|
109
|
+
# end
|
110
|
+
#
|
111
|
+
# @example Using the enumerator by not passing a block:
|
112
|
+
# require "google/cloud"
|
113
|
+
#
|
114
|
+
# gcloud = Google::Cloud.new
|
115
|
+
# dns = gcloud.dns
|
116
|
+
# zone = dns.zone "example-com"
|
117
|
+
# records = zone.records "example.com."
|
118
|
+
#
|
119
|
+
# all_names = records.all.map do |record|
|
120
|
+
# record.name
|
121
|
+
# end
|
122
|
+
#
|
123
|
+
# @example Limit the number of API calls made:
|
124
|
+
# require "google/cloud"
|
125
|
+
#
|
126
|
+
# gcloud = Google::Cloud.new
|
127
|
+
# dns = gcloud.dns
|
128
|
+
# zone = dns.zone "example-com"
|
129
|
+
# records = zone.records "example.com."
|
130
|
+
#
|
131
|
+
# records.all(request_limit: 10) do |record|
|
132
|
+
# puts record.name
|
133
|
+
# end
|
134
|
+
#
|
135
|
+
def all request_limit: nil
|
136
|
+
request_limit = request_limit.to_i if request_limit
|
137
|
+
unless block_given?
|
138
|
+
return enum_for(:all, request_limit: request_limit)
|
139
|
+
end
|
140
|
+
results = self
|
141
|
+
loop do
|
142
|
+
results.each { |r| yield r }
|
143
|
+
if request_limit
|
144
|
+
request_limit -= 1
|
145
|
+
break if request_limit < 0
|
146
|
+
end
|
147
|
+
break unless results.next?
|
148
|
+
results = results.next
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
##
|
153
|
+
# @private New Records::List from a response object.
|
154
|
+
def self.from_gapi gapi, zone, name = nil, type = nil, max = nil
|
155
|
+
records = new(Array(gapi.rrsets).map do |g|
|
156
|
+
Record.from_gapi g
|
157
|
+
end)
|
158
|
+
records.instance_variable_set "@token", gapi.next_page_token
|
159
|
+
records.instance_variable_set "@zone", zone
|
160
|
+
records.instance_variable_set "@name", name
|
161
|
+
records.instance_variable_set "@type", type
|
162
|
+
records.instance_variable_set "@max", max
|
163
|
+
records
|
164
|
+
end
|
165
|
+
|
166
|
+
protected
|
167
|
+
|
168
|
+
##
|
169
|
+
# Raise an error unless an active connection is available.
|
170
|
+
def ensure_zone!
|
171
|
+
fail "Must have active connection" unless @zone
|
172
|
+
end
|
173
|
+
end
|
174
|
+
end
|
175
|
+
end
|
176
|
+
end
|
177
|
+
end
|
@@ -0,0 +1,166 @@
|
|
1
|
+
# Copyright 2016 Google Inc. All rights reserved.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
|
16
|
+
require "google/cloud/errors"
|
17
|
+
require "google/cloud/dns/version"
|
18
|
+
require "google/apis/dns_v1"
|
19
|
+
|
20
|
+
module Google
|
21
|
+
module Cloud
|
22
|
+
module Dns
|
23
|
+
##
|
24
|
+
# @private
|
25
|
+
# Represents the service to DNS, exposing the API calls.
|
26
|
+
class Service
|
27
|
+
##
|
28
|
+
# Alias to the Google Client API module
|
29
|
+
API = Google::Apis::DnsV1
|
30
|
+
|
31
|
+
attr_accessor :project
|
32
|
+
attr_accessor :credentials
|
33
|
+
|
34
|
+
##
|
35
|
+
# Creates a new Service instance.
|
36
|
+
def initialize project, credentials, retries: nil, timeout: nil
|
37
|
+
@project = project
|
38
|
+
@credentials = credentials
|
39
|
+
@service = API::DnsService.new
|
40
|
+
@service.client_options.application_name = "google-cloud-dns"
|
41
|
+
@service.client_options.application_version = \
|
42
|
+
Google::Cloud::Dns::VERSION
|
43
|
+
@service.request_options.retries = retries || 3
|
44
|
+
@service.request_options.timeout_sec = timeout if timeout
|
45
|
+
@service.authorization = @credentials.client
|
46
|
+
end
|
47
|
+
|
48
|
+
def service
|
49
|
+
return mocked_service if mocked_service
|
50
|
+
@service
|
51
|
+
end
|
52
|
+
attr_accessor :mocked_service
|
53
|
+
|
54
|
+
##
|
55
|
+
# Returns Google::Apis::DnsV1::Project
|
56
|
+
def get_project project_id = @project
|
57
|
+
execute { service.get_project project_id }
|
58
|
+
end
|
59
|
+
|
60
|
+
##
|
61
|
+
# Returns Google::Apis::DnsV1::ManagedZone
|
62
|
+
def get_zone zone_id
|
63
|
+
execute { service.get_managed_zone @project, zone_id }
|
64
|
+
end
|
65
|
+
|
66
|
+
##
|
67
|
+
# Returns Google::Apis::DnsV1::ListManagedZonesResponse
|
68
|
+
def list_zones token: nil, max: nil
|
69
|
+
execute do
|
70
|
+
service.list_managed_zones @project, max_results: max,
|
71
|
+
page_token: token
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
##
|
76
|
+
# Returns Google::Apis::DnsV1::ManagedZone
|
77
|
+
def create_zone zone_name, zone_dns, description: nil,
|
78
|
+
name_server_set: nil
|
79
|
+
managed_zone = Google::Apis::DnsV1::ManagedZone.new(
|
80
|
+
kind: "dns#managedZone",
|
81
|
+
name: zone_name,
|
82
|
+
dns_name: zone_dns,
|
83
|
+
description: (description || ""),
|
84
|
+
name_server_set: name_server_set
|
85
|
+
)
|
86
|
+
execute { service.create_managed_zone @project, managed_zone }
|
87
|
+
end
|
88
|
+
|
89
|
+
def delete_zone zone_id
|
90
|
+
execute { service.delete_managed_zone @project, zone_id }
|
91
|
+
end
|
92
|
+
|
93
|
+
##
|
94
|
+
# Returns Google::Apis::DnsV1::Change
|
95
|
+
def get_change zone_id, change_id
|
96
|
+
execute { service.get_change @project, zone_id, change_id }
|
97
|
+
end
|
98
|
+
|
99
|
+
##
|
100
|
+
# Returns Google::Apis::DnsV1::ListChangesResponse
|
101
|
+
def list_changes zone_id, token: nil, max: nil, order: nil, sort: nil
|
102
|
+
execute do
|
103
|
+
service.list_changes @project, zone_id, max_results: max,
|
104
|
+
page_token: token,
|
105
|
+
sort_by: sort,
|
106
|
+
sort_order: order
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
##
|
111
|
+
# Returns Google::Apis::DnsV1::Change
|
112
|
+
def create_change zone_id, additions, deletions
|
113
|
+
change = Google::Apis::DnsV1::Change.new(
|
114
|
+
kind: "dns#change",
|
115
|
+
additions: Array(additions),
|
116
|
+
deletions: Array(deletions)
|
117
|
+
)
|
118
|
+
execute { service.create_change @project, zone_id, change }
|
119
|
+
end
|
120
|
+
|
121
|
+
##
|
122
|
+
# Returns Google::Apis::DnsV1::ListResourceRecordSetsResponse
|
123
|
+
def list_records zone_id, name = nil, type = nil, token: nil, max: nil
|
124
|
+
execute do
|
125
|
+
service.list_resource_record_sets @project, zone_id,
|
126
|
+
max_results: max, name: name,
|
127
|
+
page_token: token, type: type
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
##
|
132
|
+
# Fully Qualified Domain Name
|
133
|
+
def self.fqdn name, origin_dns
|
134
|
+
name = name.to_s.strip
|
135
|
+
return name if self.ip_addr? name
|
136
|
+
name = origin_dns if name.empty?
|
137
|
+
name = origin_dns if name == "@"
|
138
|
+
name = "#{name}.#{origin_dns}" unless name.include? "."
|
139
|
+
name = "#{name}." unless name.end_with? "."
|
140
|
+
name
|
141
|
+
end
|
142
|
+
|
143
|
+
require "ipaddr"
|
144
|
+
|
145
|
+
def self.ip_addr? name
|
146
|
+
IPAddr.new name
|
147
|
+
true
|
148
|
+
rescue IPAddr::Error
|
149
|
+
false
|
150
|
+
end
|
151
|
+
|
152
|
+
def inspect
|
153
|
+
"#{self.class}(#{@project})"
|
154
|
+
end
|
155
|
+
|
156
|
+
protected
|
157
|
+
|
158
|
+
def execute
|
159
|
+
yield
|
160
|
+
rescue Google::Apis::Error => e
|
161
|
+
raise Google::Cloud::Error.from_error(e)
|
162
|
+
end
|
163
|
+
end
|
164
|
+
end
|
165
|
+
end
|
166
|
+
end
|