google-cloud-dns 0.20.0
Sign up to get free protection for your applications and to get access to all the features.
- 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,176 @@
|
|
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 Change
|
22
|
+
##
|
23
|
+
# Change::List is a special case Array with additional values.
|
24
|
+
class List < DelegateClass(::Array)
|
25
|
+
##
|
26
|
+
# If not empty, indicates that there are more changes that match
|
27
|
+
# the request and this value should be passed to continue.
|
28
|
+
attr_accessor :token
|
29
|
+
|
30
|
+
##
|
31
|
+
# @private Create a new Change::List with an array of Change
|
32
|
+
# instances.
|
33
|
+
def initialize arr = []
|
34
|
+
super arr
|
35
|
+
end
|
36
|
+
|
37
|
+
##
|
38
|
+
# Whether there a next page of changes.
|
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
|
+
# changes = zone.changes
|
50
|
+
# if changes.next?
|
51
|
+
# next_changes = changes.next
|
52
|
+
# end
|
53
|
+
#
|
54
|
+
def next?
|
55
|
+
!token.nil?
|
56
|
+
end
|
57
|
+
|
58
|
+
##
|
59
|
+
# Retrieve the next page of changes.
|
60
|
+
#
|
61
|
+
# @return [Change::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
|
+
# changes = zone.changes
|
71
|
+
# if changes.next?
|
72
|
+
# next_changes = changes.next
|
73
|
+
# end
|
74
|
+
#
|
75
|
+
def next
|
76
|
+
return nil unless next?
|
77
|
+
ensure_zone!
|
78
|
+
@zone.changes token: token, max: @max, order: @order
|
79
|
+
end
|
80
|
+
|
81
|
+
##
|
82
|
+
# Retrieves all changes by repeatedly loading {#next} until {#next?}
|
83
|
+
# returns `false`. Calls the given block once for each change, 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 changes 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 changes. Default is no limit.
|
94
|
+
# @yield [change] The block for accessing each change.
|
95
|
+
# @yieldparam [Change] change The change object.
|
96
|
+
#
|
97
|
+
# @return [Enumerator]
|
98
|
+
#
|
99
|
+
# @example Iterating each change 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
|
+
# changes = zone.changes
|
106
|
+
#
|
107
|
+
# changes.all do |change|
|
108
|
+
# puts change.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
|
+
# changes = zone.changes
|
118
|
+
#
|
119
|
+
# all_names = changes.all.map do |change|
|
120
|
+
# change.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
|
+
# changes = zone.changes
|
130
|
+
#
|
131
|
+
# changes.all(request_limit: 10) do |change|
|
132
|
+
# puts change.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 Changes::List from a response object.
|
154
|
+
def self.from_gapi gapi, zone, max = nil, order = nil
|
155
|
+
changes = new(Array(gapi.changes).map do |g|
|
156
|
+
Change.from_gapi g, zone
|
157
|
+
end)
|
158
|
+
changes.instance_variable_set "@token", gapi.next_page_token
|
159
|
+
changes.instance_variable_set "@zone", zone
|
160
|
+
changes.instance_variable_set "@max", max
|
161
|
+
changes.instance_variable_set "@order", order
|
162
|
+
changes
|
163
|
+
end
|
164
|
+
|
165
|
+
protected
|
166
|
+
|
167
|
+
##
|
168
|
+
# Raise an error unless an active connection is available.
|
169
|
+
def ensure_zone!
|
170
|
+
fail "Must have active connection" unless @zone
|
171
|
+
end
|
172
|
+
end
|
173
|
+
end
|
174
|
+
end
|
175
|
+
end
|
176
|
+
end
|
@@ -0,0 +1,31 @@
|
|
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/credentials"
|
17
|
+
|
18
|
+
module Google
|
19
|
+
module Cloud
|
20
|
+
module Dns
|
21
|
+
##
|
22
|
+
# @private Represents the Oauth2 signing logic for DNS.
|
23
|
+
class Credentials < Google::Cloud::Credentials
|
24
|
+
SCOPE = ["https://www.googleapis.com/auth/ndev.clouddns.readwrite"]
|
25
|
+
PATH_ENV_VARS = %w(DNS_KEYFILE GOOGLE_CLOUD_KEYFILE GCLOUD_KEYFILE)
|
26
|
+
JSON_ENV_VARS = %w(DNS_KEYFILE_JSON GOOGLE_CLOUD_KEYFILE_JSON
|
27
|
+
GCLOUD_KEYFILE_JSON)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,186 @@
|
|
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 "zonefile"
|
17
|
+
require "google/cloud/dns/record"
|
18
|
+
|
19
|
+
module Google
|
20
|
+
module Cloud
|
21
|
+
module Dns
|
22
|
+
##
|
23
|
+
# @private
|
24
|
+
# # DNS Importer
|
25
|
+
#
|
26
|
+
# Reads a [DNS zone file](https://en.wikipedia.org/wiki/Zone_file) and
|
27
|
+
# parses it, creating a collection of Record instances. The returned
|
28
|
+
# records are unsaved, as they are not yet associated with a Zone. Use
|
29
|
+
# {Zone#import} to add zone file records to a Zone.
|
30
|
+
#
|
31
|
+
# Because the Google Cloud DNS API only accepts a single resource record
|
32
|
+
# for each `name` and `type` combination (with multiple `data` elements),
|
33
|
+
# the zone file's records are merged as necessary. During this merge, the
|
34
|
+
# lowest `ttl` of the merged records is used. If none of the merged
|
35
|
+
# records have a `ttl` value, the zone file's global TTL is used for the
|
36
|
+
# record.
|
37
|
+
#
|
38
|
+
# The following record types are supported: A, AAAA, CNAME, MX, NAPTR, NS,
|
39
|
+
# PTR, SOA, SPF, SRV, and TXT.
|
40
|
+
class Importer
|
41
|
+
##
|
42
|
+
# Creates a new Importer that immediately parses the provided zone file
|
43
|
+
# data and creates Record instances.
|
44
|
+
#
|
45
|
+
# @param [String, IO] path_or_io The path to a zone file on the
|
46
|
+
# filesystem, or an IO instance from which zone file data can be read.
|
47
|
+
#
|
48
|
+
def initialize zone, path_or_io
|
49
|
+
@zone = zone
|
50
|
+
@merged_zf_records = {}
|
51
|
+
@records = []
|
52
|
+
@zonefile = create_zonefile path_or_io
|
53
|
+
merge_zonefile_records
|
54
|
+
from_zonefile_records
|
55
|
+
@records.unshift soa_record
|
56
|
+
end
|
57
|
+
|
58
|
+
##
|
59
|
+
# Returns the Record instances created from the zone file.
|
60
|
+
#
|
61
|
+
# @param [String, Array<String>] only Include only records of this type
|
62
|
+
# or types.
|
63
|
+
# @param [String, Array<String>] except Exclude records of this type or
|
64
|
+
# types.
|
65
|
+
#
|
66
|
+
# @return [Array<Record>] An array of unsaved {Record} instances
|
67
|
+
#
|
68
|
+
def records only: nil, except: nil
|
69
|
+
ret = @records
|
70
|
+
ret = ret.select { |r| Array(only).include? r.type } if only
|
71
|
+
ret = ret.reject { |r| Array(except).include? r.type } if except
|
72
|
+
ret
|
73
|
+
end
|
74
|
+
|
75
|
+
protected
|
76
|
+
|
77
|
+
##
|
78
|
+
# The zonefile library returns a two-element array in which the first
|
79
|
+
# element is a symbol type (:a, :mx, and so on), and the second element
|
80
|
+
# is an array containing the records of that type. Group the records by
|
81
|
+
# name and type instead.
|
82
|
+
def merge_zonefile_records
|
83
|
+
@zonefile.records.map do |r|
|
84
|
+
type = r.first
|
85
|
+
type = :aaaa if type == :a4
|
86
|
+
r.last.each do |zf_record|
|
87
|
+
name = Service.fqdn(zf_record[:name], @zonefile.origin)
|
88
|
+
key = [name, type]
|
89
|
+
(@merged_zf_records[key] ||= []) << zf_record
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
##
|
95
|
+
# Convert the grouped records to single array of records, merging
|
96
|
+
# records of the same name and type into a single record with an array
|
97
|
+
# of rrdatas.
|
98
|
+
def from_zonefile_records
|
99
|
+
@records = @merged_zf_records.map do |key, zf_records|
|
100
|
+
ttl = ttl_from_zonefile_records zf_records
|
101
|
+
data = zf_records.map do |zf_record|
|
102
|
+
data_from_zonefile_record(key[1], zf_record)
|
103
|
+
end
|
104
|
+
@zone.record key[0], key[1], ttl, data
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
def soa_record
|
109
|
+
zf_soa = @zonefile.soa
|
110
|
+
ttl = ttl_to_i(zf_soa[:ttl]) || ttl_to_i(@zonefile.ttl)
|
111
|
+
data = data_from_zonefile_record :soa, zf_soa
|
112
|
+
@zone.record zf_soa[:origin], "SOA", ttl, data
|
113
|
+
end
|
114
|
+
|
115
|
+
##
|
116
|
+
# From a collection of records, take the lowest ttl
|
117
|
+
def ttl_from_zonefile_records zf_records
|
118
|
+
ttls = zf_records.map do |zf_record|
|
119
|
+
ttl_to_i(zf_record[:ttl])
|
120
|
+
end
|
121
|
+
min_ttl = ttls.compact.sort.first
|
122
|
+
min_ttl || ttl_to_i(@zonefile.ttl)
|
123
|
+
end
|
124
|
+
|
125
|
+
# rubocop:disable all
|
126
|
+
# Rubocop's line-length and branch condition restrictions prevent
|
127
|
+
# the most straightforward approach to converting zonefile's records
|
128
|
+
# to our own. So disable rubocop for this operation.
|
129
|
+
|
130
|
+
def data_from_zonefile_record type, zf_record
|
131
|
+
case type.to_s.upcase
|
132
|
+
when "A"
|
133
|
+
"#{zf_record[:host]}"
|
134
|
+
when "AAAA"
|
135
|
+
"#{zf_record[:host]}"
|
136
|
+
when "CNAME"
|
137
|
+
"#{zf_record[:host]}"
|
138
|
+
when "MX"
|
139
|
+
"#{zf_record[:pri]} #{zf_record[:host]}"
|
140
|
+
when "NAPTR"
|
141
|
+
"#{zf_record[:order]} #{zf_record[:preference]} #{zf_record[:flags]} #{zf_record[:service]} #{zf_record[:regexp]} #{zf_record[:replacement]}"
|
142
|
+
when "NS"
|
143
|
+
"#{zf_record[:host]}"
|
144
|
+
when "PTR"
|
145
|
+
"#{zf_record[:host]}"
|
146
|
+
when "SOA"
|
147
|
+
"#{zf_record[:primary]} #{zf_record[:email]} #{zf_record[:serial]} #{zf_record[:refresh]} #{zf_record[:retry]} #{zf_record[:expire]} #{zf_record[:minimumTTL]}"
|
148
|
+
when "SPF"
|
149
|
+
"#{zf_record[:data]}"
|
150
|
+
when "SRV"
|
151
|
+
"#{zf_record[:pri]} #{zf_record[:weight]} #{zf_record[:port]} #{zf_record[:host]}"
|
152
|
+
when "TXT"
|
153
|
+
"#{zf_record[:text]}"
|
154
|
+
else
|
155
|
+
fail ArgumentError, "record type '#{type}' is not supported"
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
# rubocop:enable all
|
160
|
+
|
161
|
+
MULTIPLIER = { "s" => (1),
|
162
|
+
"m" => (60),
|
163
|
+
"h" => (60 * 60),
|
164
|
+
"d" => (60 * 60 * 24),
|
165
|
+
"w" => (60 * 60 * 24 * 7) } # :nodoc:
|
166
|
+
|
167
|
+
def ttl_to_i ttl
|
168
|
+
if ttl.respond_to?(:to_int) || ttl.to_s =~ /\A\d+\z/
|
169
|
+
return ttl.to_i
|
170
|
+
elsif (m = /\A(\d+)(w|d|h|m|s)\z/.match ttl)
|
171
|
+
return m[1].to_i * MULTIPLIER[m[2]].to_i
|
172
|
+
end
|
173
|
+
nil
|
174
|
+
end
|
175
|
+
|
176
|
+
def create_zonefile path_or_io # :nodoc:
|
177
|
+
if path_or_io.respond_to? :read
|
178
|
+
Zonefile.new path_or_io.read
|
179
|
+
else
|
180
|
+
Zonefile.from_file path_or_io
|
181
|
+
end
|
182
|
+
end
|
183
|
+
end
|
184
|
+
end
|
185
|
+
end
|
186
|
+
end
|
@@ -0,0 +1,251 @@
|
|
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/errors"
|
17
|
+
require "google/cloud/core/gce"
|
18
|
+
require "google/cloud/dns/service"
|
19
|
+
require "google/cloud/dns/credentials"
|
20
|
+
require "google/cloud/dns/zone"
|
21
|
+
|
22
|
+
module Google
|
23
|
+
module Cloud
|
24
|
+
module Dns
|
25
|
+
##
|
26
|
+
# # Project
|
27
|
+
#
|
28
|
+
# The project is a top level container for resources including Cloud DNS
|
29
|
+
# ManagedZones. Projects can be created only in the [Google Developers
|
30
|
+
# Console](https://console.developers.google.com).
|
31
|
+
#
|
32
|
+
# @example
|
33
|
+
# require "google/cloud"
|
34
|
+
#
|
35
|
+
# gcloud = Google::Cloud.new
|
36
|
+
# dns = gcloud.dns
|
37
|
+
# zone = dns.zone "example-com"
|
38
|
+
# zone.records.each do |record|
|
39
|
+
# puts record.name
|
40
|
+
# end
|
41
|
+
#
|
42
|
+
# See {Google::Cloud#dns}
|
43
|
+
class Project
|
44
|
+
##
|
45
|
+
# @private The Service object.
|
46
|
+
attr_accessor :service
|
47
|
+
|
48
|
+
##
|
49
|
+
# @private The Google API Client object.
|
50
|
+
attr_accessor :gapi
|
51
|
+
|
52
|
+
##
|
53
|
+
# @private Creates a new Service instance.
|
54
|
+
#
|
55
|
+
# See {Google::Cloud.dns}
|
56
|
+
def initialize service
|
57
|
+
@service = service
|
58
|
+
@gapi = nil
|
59
|
+
end
|
60
|
+
|
61
|
+
##
|
62
|
+
# The unique ID string for the current project.
|
63
|
+
#
|
64
|
+
# @example
|
65
|
+
# require "google/cloud"
|
66
|
+
#
|
67
|
+
# gcloud = Google::Cloud.new "my-todo-project",
|
68
|
+
# "/path/to/keyfile.json"
|
69
|
+
# dns = gcloud.dns
|
70
|
+
#
|
71
|
+
# dns.project #=> "my-todo-project"
|
72
|
+
#
|
73
|
+
def project
|
74
|
+
service.project
|
75
|
+
end
|
76
|
+
alias_method :id, :project
|
77
|
+
|
78
|
+
##
|
79
|
+
# The project number.
|
80
|
+
def number
|
81
|
+
reload! if @gapi.nil?
|
82
|
+
@gapi.number
|
83
|
+
end
|
84
|
+
|
85
|
+
##
|
86
|
+
# Maximum allowed number of zones in the project.
|
87
|
+
def zones_quota
|
88
|
+
reload! if @gapi.nil?
|
89
|
+
@gapi.quota.managed_zones if @gapi.quota
|
90
|
+
end
|
91
|
+
|
92
|
+
##
|
93
|
+
# Maximum allowed number of data entries per record.
|
94
|
+
def data_per_record
|
95
|
+
reload! if @gapi.nil?
|
96
|
+
@gapi.quota.resource_records_per_rrset if @gapi.quota
|
97
|
+
end
|
98
|
+
|
99
|
+
##
|
100
|
+
# Maximum allowed number of records to add per change.
|
101
|
+
def additions_per_change
|
102
|
+
reload! if @gapi.nil?
|
103
|
+
@gapi.quota.rrset_additions_per_change if @gapi.quota
|
104
|
+
end
|
105
|
+
|
106
|
+
##
|
107
|
+
# Maximum allowed number of records to delete per change.
|
108
|
+
def deletions_per_change
|
109
|
+
reload! if @gapi.nil?
|
110
|
+
@gapi.quota.rrset_deletions_per_change if @gapi.quota
|
111
|
+
end
|
112
|
+
|
113
|
+
##
|
114
|
+
# Maximum allowed number of records per zone in the project.
|
115
|
+
def records_per_zone
|
116
|
+
reload! if @gapi.nil?
|
117
|
+
@gapi.quota.rrsets_per_managed_zone if @gapi.quota
|
118
|
+
end
|
119
|
+
|
120
|
+
##
|
121
|
+
# Maximum allowed total bytes size for all the data in one change.
|
122
|
+
def total_data_per_change
|
123
|
+
reload! if @gapi.nil?
|
124
|
+
@gapi.quota.total_rrdata_size_per_change if @gapi.quota
|
125
|
+
end
|
126
|
+
|
127
|
+
##
|
128
|
+
# @private Default project.
|
129
|
+
def self.default_project
|
130
|
+
ENV["DNS_PROJECT"] ||
|
131
|
+
ENV["GOOGLE_CLOUD_PROJECT"] ||
|
132
|
+
ENV["GCLOUD_PROJECT"] ||
|
133
|
+
Google::Cloud::Core::GCE.project_id
|
134
|
+
end
|
135
|
+
|
136
|
+
##
|
137
|
+
# Retrieves an existing zone by name or id.
|
138
|
+
#
|
139
|
+
# @param [String, Integer] zone_id The name or id of a zone.
|
140
|
+
#
|
141
|
+
# @return [Google::Cloud::Dns::Zone, nil] Returns `nil` if the zone does
|
142
|
+
# not exist.
|
143
|
+
#
|
144
|
+
# @example
|
145
|
+
# require "google/cloud"
|
146
|
+
#
|
147
|
+
# gcloud = Google::Cloud.new
|
148
|
+
# dns = gcloud.dns
|
149
|
+
# zone = dns.zone "example-com"
|
150
|
+
# puts zone.name
|
151
|
+
#
|
152
|
+
def zone zone_id
|
153
|
+
ensure_service!
|
154
|
+
gapi = service.get_zone zone_id
|
155
|
+
Zone.from_gapi gapi, service
|
156
|
+
rescue Google::Cloud::NotFoundError
|
157
|
+
nil
|
158
|
+
end
|
159
|
+
alias_method :find_zone, :zone
|
160
|
+
alias_method :get_zone, :zone
|
161
|
+
|
162
|
+
##
|
163
|
+
# Retrieves the list of zones belonging to the project.
|
164
|
+
#
|
165
|
+
# @param [String] token A previously-returned page token representing
|
166
|
+
# part of the larger set of results to view.
|
167
|
+
# @param [Integer] max Maximum number of zones to return.
|
168
|
+
#
|
169
|
+
# @return [Array<Google::Cloud::Dns::Zone>] (See
|
170
|
+
# {Google::Cloud::Dns::Zone::List})
|
171
|
+
#
|
172
|
+
# @example
|
173
|
+
# require "google/cloud"
|
174
|
+
#
|
175
|
+
# gcloud = Google::Cloud.new
|
176
|
+
# dns = gcloud.dns
|
177
|
+
# zones = dns.zones
|
178
|
+
# zones.each do |zone|
|
179
|
+
# puts zone.name
|
180
|
+
# end
|
181
|
+
#
|
182
|
+
# @example Retrieve all zones: (See {Zone::List#all})
|
183
|
+
# require "google/cloud"
|
184
|
+
#
|
185
|
+
# gcloud = Google::Cloud.new
|
186
|
+
# dns = gcloud.dns
|
187
|
+
# zones = dns.zones
|
188
|
+
# zones.all do |zone|
|
189
|
+
# puts zone.name
|
190
|
+
# end
|
191
|
+
#
|
192
|
+
def zones token: nil, max: nil
|
193
|
+
ensure_service!
|
194
|
+
gapi = service.list_zones token: token, max: max
|
195
|
+
Zone::List.from_gapi gapi, service, max
|
196
|
+
end
|
197
|
+
alias_method :find_zones, :zones
|
198
|
+
|
199
|
+
##
|
200
|
+
# Creates a new zone.
|
201
|
+
#
|
202
|
+
# @param [String] zone_name User assigned name for this resource. Must
|
203
|
+
# be unique within the project. The name must be 1-32 characters long,
|
204
|
+
# must begin with a letter, end with a letter or digit, and only
|
205
|
+
# contain lowercase letters, digits or dashes.
|
206
|
+
# @param [String] zone_dns The DNS name of this managed zone, for
|
207
|
+
# instance "example.com.".
|
208
|
+
# @param [String] description A string of at most 1024 characters
|
209
|
+
# associated with this resource for the user's convenience. Has no
|
210
|
+
# effect on the managed zone's function.
|
211
|
+
# @param [String] name_server_set A NameServerSet is a set of DNS name
|
212
|
+
# servers that all host the same ManagedZones. Most users will leave
|
213
|
+
# this field unset.
|
214
|
+
#
|
215
|
+
# @return [Google::Cloud::Dns::Zone]
|
216
|
+
#
|
217
|
+
# @example
|
218
|
+
# require "google/cloud"
|
219
|
+
#
|
220
|
+
# gcloud = Google::Cloud.new
|
221
|
+
# dns = gcloud.dns
|
222
|
+
# zone = dns.create_zone "example-com", "example.com."
|
223
|
+
#
|
224
|
+
def create_zone zone_name, zone_dns, description: nil,
|
225
|
+
name_server_set: nil
|
226
|
+
ensure_service!
|
227
|
+
gapi = service.create_zone zone_name, zone_dns,
|
228
|
+
description: description,
|
229
|
+
name_server_set: name_server_set
|
230
|
+
Zone.from_gapi gapi, service
|
231
|
+
end
|
232
|
+
|
233
|
+
##
|
234
|
+
# Reloads the change with updated status from the DNS service.
|
235
|
+
def reload!
|
236
|
+
ensure_service!
|
237
|
+
@gapi = service.get_project
|
238
|
+
end
|
239
|
+
alias_method :refresh!, :reload!
|
240
|
+
|
241
|
+
protected
|
242
|
+
|
243
|
+
##
|
244
|
+
# Raise an error unless an active connection is available.
|
245
|
+
def ensure_service!
|
246
|
+
fail "Must have active connection" unless service
|
247
|
+
end
|
248
|
+
end
|
249
|
+
end
|
250
|
+
end
|
251
|
+
end
|