record_store 4.0.7 → 5.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 14801b495fb7de3854e5f838fea6791715079740
4
- data.tar.gz: 53b62b55f069d0d470898c33f2e22cac15d67afa
3
+ metadata.gz: b7441e669b753089b80477c648aeb7eed36e6044
4
+ data.tar.gz: 67c570fbf7975638b488d38926ea570506a8e622
5
5
  SHA512:
6
- metadata.gz: 355693401b9a272fc59db7884bba3e076b33a630391459379fb740f7083e2c6c7d7963eb4f54849fe33fbb75eee8562dc4ce4f59617392bfafcc14d03a834b6b
7
- data.tar.gz: a351738260067279c92f5177dcf1d2cea0b142739b90ace40b0aeedde4bd092ee7eb0582f6b2bdadfb9d1c6754252041e2d692f997cf4c89f206d561108b68ce
6
+ metadata.gz: 648f8eeb88a0cc3a0493e724065758fffda49518a913c35353f0898bd2bff0a6363d2bf8b49e872bcea820a7d06b92ddf42e8eeb56fc08c93b69bbdfd5cb60bc
7
+ data.tar.gz: 8cafafb749bf746dafab7105ac21d8f598c6fcb7bee387f4f58b30aa2a33ab93737dcc371cfe663c42f0f882aae683b82dd4b7f9869010a5521423d5c198feab
data/Gemfile CHANGED
@@ -9,10 +9,13 @@ gem 'fog'
9
9
  gem 'fog-json'
10
10
  gem 'fog-xml'
11
11
  gem 'fog-dynect', '~> 0.2.0'
12
+ gem 'fog-dnsimple', '~> 2.0.0'
13
+ gem 'google-cloud-dns'
12
14
 
13
15
  group :test do
14
16
  gem 'mocha'
15
17
  gem 'vcr'
18
+ gem 'webmock'
16
19
  end
17
20
 
18
21
  group :development do
data/Gemfile.lock CHANGED
@@ -10,10 +10,18 @@ GEM
10
10
  minitest (~> 5.1)
11
11
  thread_safe (~> 0.3, >= 0.3.4)
12
12
  tzinfo (~> 1.1)
13
+ addressable (2.5.2)
14
+ public_suffix (>= 2.0.2, < 4.0)
13
15
  builder (3.2.3)
14
16
  coderay (1.1.1)
17
+ crack (0.4.3)
18
+ safe_yaml (~> 1.0.0)
19
+ declarative (0.0.10)
20
+ declarative-option (0.1.0)
15
21
  ejson (1.0.2)
16
22
  excon (0.57.0)
23
+ faraday (0.13.1)
24
+ multipart-post (>= 1.2, < 3)
17
25
  fission (0.5.0)
18
26
  CFPropertyList (~> 2.2)
19
27
  fog (1.33.0)
@@ -56,6 +64,9 @@ GEM
56
64
  builder
57
65
  excon (~> 0.49)
58
66
  formatador (~> 0.2)
67
+ fog-dnsimple (2.0.0)
68
+ fog-core (>= 1.38, < 3)
69
+ fog-json (~> 1.0)
59
70
  fog-dynect (0.2.0)
60
71
  fog-core
61
72
  fog-json
@@ -112,29 +123,84 @@ GEM
112
123
  fog-core
113
124
  nokogiri (>= 1.5.11, < 2.0.0)
114
125
  formatador (0.2.5)
126
+ google-api-client (0.17.4)
127
+ addressable (~> 2.5, >= 2.5.1)
128
+ googleauth (>= 0.5, < 0.7.0)
129
+ httpclient (>= 2.8.1, < 3.0)
130
+ mime-types (~> 3.0)
131
+ representable (~> 3.0)
132
+ retriable (>= 2.0, < 4.0)
133
+ google-cloud-core (1.1.0)
134
+ google-cloud-env (~> 1.0)
135
+ google-cloud-dns (0.27.0)
136
+ google-api-client (~> 0.17.0)
137
+ google-cloud-core (~> 1.1)
138
+ googleauth (~> 0.6.2)
139
+ zonefile (~> 1.04)
140
+ google-cloud-env (1.0.1)
141
+ faraday (~> 0.11)
142
+ googleauth (0.6.2)
143
+ faraday (~> 0.12)
144
+ jwt (>= 1.4, < 3.0)
145
+ logging (~> 2.0)
146
+ memoist (~> 0.12)
147
+ multi_json (~> 1.11)
148
+ os (~> 0.9)
149
+ signet (~> 0.7)
150
+ hashdiff (0.3.7)
151
+ httpclient (2.8.3)
115
152
  i18n (0.8.4)
116
153
  inflecto (0.0.2)
117
154
  ipaddress (0.8.3)
155
+ jwt (2.1.0)
156
+ little-plugger (1.1.4)
157
+ logging (2.2.2)
158
+ little-plugger (~> 1.1)
159
+ multi_json (~> 1.10)
160
+ memoist (0.16.0)
118
161
  metaclass (0.0.4)
119
162
  method_source (0.8.2)
163
+ mime-types (3.1)
164
+ mime-types-data (~> 3.2015)
165
+ mime-types-data (3.2016.0521)
120
166
  mini_portile2 (2.3.0)
121
167
  minitest (5.10.2)
122
168
  mocha (1.2.1)
123
169
  metaclass (~> 0.0.1)
124
170
  multi_json (1.12.1)
171
+ multipart-post (2.0.0)
125
172
  nokogiri (1.8.1)
126
173
  mini_portile2 (~> 2.3.0)
174
+ os (0.9.6)
127
175
  pry (0.10.4)
128
176
  coderay (~> 1.1.0)
129
177
  method_source (~> 0.8.1)
130
178
  slop (~> 3.4)
179
+ public_suffix (3.0.1)
131
180
  rake (12.0.0)
181
+ representable (3.0.4)
182
+ declarative (< 0.1.0)
183
+ declarative-option (< 0.2.0)
184
+ uber (< 0.2.0)
185
+ retriable (3.1.1)
186
+ safe_yaml (1.0.4)
187
+ signet (0.8.1)
188
+ addressable (~> 2.3)
189
+ faraday (~> 0.9)
190
+ jwt (>= 1.5, < 3.0)
191
+ multi_json (~> 1.10)
132
192
  slop (3.6.0)
133
193
  thor (0.19.4)
134
194
  thread_safe (0.3.6)
135
195
  tzinfo (1.2.3)
136
196
  thread_safe (~> 0.1)
137
- vcr (3.0.3)
197
+ uber (0.1.0)
198
+ vcr (4.0.0)
199
+ webmock (3.2.1)
200
+ addressable (>= 2.3.6)
201
+ crack (>= 0.3.2)
202
+ hashdiff
203
+ zonefile (1.06)
138
204
 
139
205
  PLATFORMS
140
206
  ruby
@@ -144,14 +210,17 @@ DEPENDENCIES
144
210
  activesupport (~> 4.2)
145
211
  ejson
146
212
  fog
213
+ fog-dnsimple (~> 2.0.0)
147
214
  fog-dynect (~> 0.2.0)
148
215
  fog-json
149
216
  fog-xml
217
+ google-cloud-dns
150
218
  mocha
151
219
  pry
152
220
  rake
153
221
  thor
154
222
  vcr
223
+ webmock
155
224
 
156
225
  BUNDLED WITH
157
226
  1.16.0
data/lib/record_store.rb CHANGED
@@ -28,6 +28,7 @@ require 'record_store/changeset'
28
28
  require 'record_store/provider'
29
29
  require 'record_store/provider/dynect'
30
30
  require 'record_store/provider/dnsimple'
31
+ require 'record_store/provider/google_cloud_dns'
31
32
  require 'record_store/cli'
32
33
 
33
34
  module RecordStore
@@ -16,7 +16,6 @@ module RecordStore
16
16
  end
17
17
 
18
18
  def self.update(id, record)
19
- raise ArgumentError.new('id cannot be nil') if id.nil?
20
19
  new(type: :update, record: record, id: id)
21
20
  end
22
21
 
@@ -120,7 +120,7 @@ module RecordStore
120
120
  def download
121
121
  name = options.fetch('name')
122
122
  abort 'Please omit the period at the end of the zone' if name.ends_with?('.')
123
- abort 'Zone with this name already exists in zones/' if File.exists?("#{RecordStore.zones_path}/#{name}.yml")
123
+ abort 'Zone with this name already exists in zones/' if File.exist?("#{RecordStore.zones_path}/#{name}.yml")
124
124
 
125
125
  provider = options.fetch('provider', Provider.provider_for(name))
126
126
  if provider.nil?
@@ -239,7 +239,7 @@ module RecordStore
239
239
  assert_empty_diff
240
240
  puts "Deploy will cause no changes, no need to validate initial state"
241
241
  rescue SystemExit
242
- if File.exists?(File.expand_path(SKIP_CHECKS, Dir.pwd))
242
+ if File.exist?(File.expand_path(SKIP_CHECKS, Dir.pwd))
243
243
  puts "Found '#{SKIP_CHECKS}', skipping predeploy validations"
244
244
  else
245
245
  puts "Checkout git SHA #{ENV['LAST_DEPLOYED_SHA']}"
@@ -8,7 +8,7 @@ module RecordStore
8
8
 
9
9
  begin
10
10
  ns_server = dns.getresource(zone_name, Resolv::DNS::Resource::IN::SOA).mname.to_s
11
- rescue Resolv::ResolvError => e
11
+ rescue Resolv::ResolvError
12
12
  abort "Domain doesn't exist"
13
13
  end
14
14
 
@@ -17,6 +17,8 @@ module RecordStore
17
17
  'DNSimple'
18
18
  when /dynect\.net\z/
19
19
  'DynECT'
20
+ when /googledomains\.com\z/
21
+ 'GoogleCloudDNS'
20
22
  else
21
23
  nil
22
24
  end
@@ -96,7 +98,7 @@ module RecordStore
96
98
  end
97
99
 
98
100
  def secrets
99
- @secrets ||= if File.exists?(RecordStore.secrets_path)
101
+ @secrets ||= if File.exist?(RecordStore.secrets_path)
100
102
  JSON.parse(File.read(RecordStore.secrets_path))
101
103
  else
102
104
  raise "You don't have a secrets.json file set up!"
@@ -15,7 +15,7 @@ module RecordStore
15
15
  record.type,
16
16
  record_hash.fetch(:content),
17
17
  ttl: record_hash.fetch(:ttl),
18
- priority: record_hash.fetch(:prio, nil)
18
+ priority: record_hash.fetch(:priority, nil)
19
19
  )
20
20
 
21
21
  if record.type == 'ALIAS'
@@ -38,16 +38,14 @@ module RecordStore
38
38
 
39
39
  # returns an array of Record objects that match the records which exist in the provider
40
40
  def retrieve_current_records(zone:, stdout: $stdout)
41
- session.list_records(zone).body.map do |record|
42
- record_body = record.fetch('record')
43
-
41
+ session.list_records(zone).body["data"].map do |record_body|
44
42
  begin
45
43
  build_from_api(record_body, zone)
46
44
  rescue StandardError
47
45
  stdout.puts "Cannot build record: #{record_body}"
48
46
  raise
49
47
  end
50
- end.select(&:present?)
48
+ end.compact
51
49
  end
52
50
 
53
51
  # Returns an array of the zones managed by provider as strings
@@ -64,8 +62,8 @@ module RecordStore
64
62
  def session_params
65
63
  {
66
64
  provider: 'DNSimple',
67
- dnsimple_email: secrets.fetch('email'),
68
65
  dnsimple_token: secrets.fetch('api_token'),
66
+ dnsimple_account: secrets.fetch('account_id'),
69
67
  }
70
68
  end
71
69
 
@@ -74,7 +72,7 @@ module RecordStore
74
72
  end
75
73
 
76
74
  def build_from_api(api_record, zone)
77
- record_type = api_record.fetch('record_type')
75
+ record_type = api_record.fetch('type')
78
76
  record = {
79
77
  record_id: api_record.fetch('id'),
80
78
  ttl: api_record.fetch('ttl'),
@@ -91,7 +89,7 @@ module RecordStore
91
89
  when 'CNAME'
92
90
  record.merge!(cname: api_record.fetch('content'))
93
91
  when 'MX'
94
- record.merge!(preference: api_record.fetch('prio'), exchange: api_record.fetch('content'))
92
+ record.merge!(preference: api_record.fetch('priority'), exchange: api_record.fetch('content'))
95
93
  when 'NS'
96
94
  record.merge!(nsdname: api_record.fetch('content'))
97
95
  when 'SPF', 'TXT'
@@ -100,7 +98,7 @@ module RecordStore
100
98
  weight, port, host = api_record.fetch('content').split(' ')
101
99
 
102
100
  record.merge!(
103
- priority: api_record.fetch('prio').to_i,
101
+ priority: api_record.fetch('priority').to_i,
104
102
  weight: weight.to_i,
105
103
  port: port.to_i,
106
104
  target: Record.ensure_ends_with_dot(host),
@@ -129,7 +127,7 @@ module RecordStore
129
127
  when 'CNAME'
130
128
  record_hash[:content] = record.cname.chomp('.')
131
129
  when 'MX'
132
- record_hash[:prio] = record.preference
130
+ record_hash[:priority] = record.preference
133
131
  record_hash[:content] = record.exchange.chomp('.')
134
132
  when 'NS'
135
133
  record_hash[:content] = record.nsdname.chomp('.')
@@ -137,7 +135,7 @@ module RecordStore
137
135
  record_hash[:content] = record.txtdata.gsub('\;', ';')
138
136
  when 'SRV'
139
137
  record_hash[:content] = "#{record.weight} #{record.port} #{record.target.chomp('.')}"
140
- record_hash[:prio] = record.priority
138
+ record_hash[:priority] = record.priority
141
139
  end
142
140
 
143
141
  record_hash
@@ -48,11 +48,11 @@ module RecordStore
48
48
  records.map do |record_body|
49
49
  begin
50
50
  build_from_api(record_body)
51
- rescue StandardError => e
51
+ rescue StandardError
52
52
  stdout.puts "Cannot build record: #{record_body}"
53
53
  end
54
54
  end
55
- end.select(&:present?)
55
+ end.compact
56
56
  end
57
57
 
58
58
  # Returns an array of the zones managed by provider as strings
@@ -0,0 +1,121 @@
1
+ require 'google/cloud/dns'
2
+
3
+ module RecordStore
4
+ class Provider::GoogleCloudDNS < Provider
5
+ class << self
6
+ def apply_changeset(changeset, stdout = $stdout)
7
+ zone = session.zone(convert_to_name(changeset.zone))
8
+
9
+ deletions = convert_records_to_gcloud_record_sets(zone, changeset.current_records)
10
+ additions = convert_records_to_gcloud_record_sets(zone, changeset.desired_records)
11
+
12
+ # The Google API library will handle applying the changeset transactioanlly
13
+ zone.update(additions, deletions)
14
+ end
15
+
16
+ # returns an array of Record objects that match the records which exist in the provider
17
+ def retrieve_current_records(zone:, stdout: $stdout)
18
+ gcloud_record_sets = session.zone(convert_to_name(zone)).records
19
+
20
+ records = gcloud_record_sets.map do |record_set|
21
+ next if record_set.type == 'SOA'
22
+
23
+ # Unroll each record set into multiple records
24
+ record_set.data.map do |record|
25
+ begin
26
+ record_set_member = record_set.dup
27
+ record_set_member.data = [record]
28
+ build_from_api(record_set_member)
29
+ rescue StandardError
30
+ stdout.puts "Cannot build record: #{record}"
31
+ end
32
+ end
33
+ end
34
+
35
+ # We need to filter out for nil records (i.e. since skip the SOA record)
36
+ records.flatten.compact
37
+ end
38
+
39
+ # Returns an array of the zones managed by provider as strings
40
+ def zones
41
+ session.zones.map { |zone| zone.gapi.dns_name }
42
+ end
43
+
44
+ private
45
+
46
+ def session
47
+ @dns ||= begin
48
+ Google::Cloud::Dns.new({
49
+ project_id: secrets.fetch('project_id'),
50
+ credentials: Google::Cloud::Dns::Credentials.new(secrets),
51
+ })
52
+ end
53
+ end
54
+
55
+ def secrets
56
+ super.fetch('google_cloud_dns')
57
+ end
58
+
59
+ def convert_to_name(zone)
60
+ zone.gsub('.', '-')
61
+ end
62
+
63
+ # Google's API operates on resource record sets instead of individual
64
+ # records. A resource record set is a single object that has the rdata
65
+ # for all resource records with the same fully qualified domain name and
66
+ # record type. See https://cloud.google.com/dns/api/v1/resourceRecordSets
67
+ #
68
+ # This methods takes an array of records and builds Google API
69
+ # ResourceRecordSets objects.
70
+ def convert_records_to_gcloud_record_sets(zone, records)
71
+ record_sets = records.group_by do |record|
72
+ [record.type, record.fqdn]
73
+ end
74
+
75
+
76
+ record_sets.map do |(rr_type, rr_fqdn), records_for_set|
77
+ zone.record(rr_fqdn, rr_type, records_for_set[0].ttl, records_for_set.map(&:rdata_txt))
78
+ end
79
+ end
80
+
81
+ def build_from_api(record)
82
+ record_params = {
83
+ id: record.object_id,
84
+ ttl: record.ttl,
85
+ fqdn: record.name,
86
+ }
87
+
88
+ return if record.type == 'SOA'
89
+
90
+ case record.type
91
+ when 'A', 'AAAA'
92
+ record_params.merge!(address: record.data[0])
93
+ when 'CNAME'
94
+ record_params.merge!(cname: record.data[0])
95
+ when 'MX'
96
+ preference, exchange = record.data[0].split(' ')
97
+ record_params.merge!(preference: preference, exchange: exchange)
98
+ when 'NS'
99
+ record_params.merge!(nsdname: record.data[0])
100
+ when 'SPF', 'TXT'
101
+ record_params.merge!(txtdata: record.data[0].gsub(';', '\;'))
102
+ when 'SRV'
103
+ priority, weight, port, target = record.data[0].split(' ')
104
+
105
+ record_params.merge!(
106
+ priority: priority.to_i,
107
+ weight: weight.to_i,
108
+ port: port.to_i,
109
+ target: target,
110
+ )
111
+ end
112
+
113
+ unless record_params.fetch(:fqdn).ends_with?('.')
114
+ record_params[:fqdn] += '.'
115
+ end
116
+
117
+ Record.const_get(record.type).new(record_params)
118
+ end
119
+ end
120
+ end
121
+ end
@@ -56,6 +56,19 @@ module RecordStore
56
56
  "#{type},#{fqdn}"
57
57
  end
58
58
 
59
+ def rdata
60
+ raise NotImplementedError
61
+ end
62
+
63
+ def rdata_txt
64
+ raise NotImplementedError
65
+ end
66
+
67
+ def to_s
68
+ rr_type = self.class.name.demodulize
69
+ "[#{rr_type}Record] #{fqdn} #{ttl} IN #{rr_type} #{rdata_txt}"
70
+ end
71
+
59
72
  protected
60
73
 
61
74
  def validate_label_length
@@ -10,21 +10,21 @@ module RecordStore
10
10
  @address = record.fetch(:address)
11
11
  end
12
12
 
13
- def to_s
14
- "[ARecord] #{fqdn} #{ttl} IN A #{address}"
15
- end
16
-
17
13
  def rdata
18
14
  { address: address }
19
15
  end
20
16
 
17
+ def rdata_txt
18
+ address
19
+ end
20
+
21
21
  private
22
22
 
23
23
  def valid_address?
24
24
  begin
25
25
  ip = IPAddr.new(address)
26
26
  errors.add(:address, 'is not an IPv4 address') unless ip.ipv4?
27
- rescue IPAddr::InvalidAddressError => e
27
+ rescue IPAddr::InvalidAddressError
28
28
  errors.add(:address, 'is invalid')
29
29
  end
30
30
  end
@@ -10,21 +10,21 @@ module RecordStore
10
10
  @address = record.fetch(:address)
11
11
  end
12
12
 
13
- def to_s
14
- "[AAAARecord] #{fqdn} #{ttl} IN AAAA #{address}"
15
- end
16
-
17
13
  def rdata
18
14
  { address: address }
19
15
  end
20
16
 
17
+ def rdata_txt
18
+ address
19
+ end
20
+
21
21
  private
22
22
 
23
23
  def valid_address?
24
24
  begin
25
25
  ip = IPAddr.new(address)
26
26
  errors.add(:address, 'is not an IPv6 address') unless ip.ipv6?
27
- rescue IPAddr::InvalidAddressError => e
27
+ rescue IPAddr::InvalidAddressError
28
28
  errors.add(:address, 'is invalid')
29
29
  end
30
30
  end
@@ -14,8 +14,8 @@ module RecordStore
14
14
  { alias: self.alias }
15
15
  end
16
16
 
17
- def to_s
18
- "[ALIASRecord] #{fqdn} #{ttl} IN ALIAS #{self.alias}"
17
+ def rdata_txt
18
+ self.alias
19
19
  end
20
20
 
21
21
  def validate_circular_reference
@@ -14,8 +14,8 @@ module RecordStore
14
14
  { cname: cname }
15
15
  end
16
16
 
17
- def to_s
18
- "[CNAMERecord] #{fqdn} #{ttl} IN CNAME #{cname}"
17
+ def rdata_txt
18
+ cname
19
19
  end
20
20
 
21
21
  def validate_circular_reference
@@ -8,7 +8,7 @@ module RecordStore
8
8
  def initialize(record)
9
9
  super
10
10
  @exchange = Record.ensure_ends_with_dot(record.fetch(:exchange))
11
- @preference = record.fetch(:preference)
11
+ @preference = Integer(record.fetch(:preference))
12
12
  end
13
13
 
14
14
  def rdata
@@ -18,8 +18,8 @@ module RecordStore
18
18
  }
19
19
  end
20
20
 
21
- def to_s
22
- "[MXRecord] #{fqdn} #{ttl} IN MX #{preference} #{exchange}"
21
+ def rdata_txt
22
+ "#{preference} #{exchange}"
23
23
  end
24
24
  end
25
25
  end
@@ -13,8 +13,8 @@ module RecordStore
13
13
  { nsdname: nsdname }
14
14
  end
15
15
 
16
- def to_s
17
- "[NSRecord] #{fqdn} #{ttl} IN NS #{nsdname}"
16
+ def rdata_txt
17
+ nsdname
18
18
  end
19
19
  end
20
20
  end
@@ -10,11 +10,15 @@ module RecordStore
10
10
  end
11
11
 
12
12
  def to_s
13
- "[SPFRecord] #{fqdn} #{ttl} IN SPF \"#{txtdata}\""
13
+ "[SPFRecord] #{fqdn} #{ttl} IN SPF \"#{rdata_txt}\""
14
14
  end
15
15
 
16
16
  def rdata
17
17
  { txtdata: txtdata }
18
18
  end
19
+
20
+ def rdata_txt
21
+ txtdata
22
+ end
19
23
  end
20
24
  end
@@ -15,13 +15,12 @@ module RecordStore
15
15
  @target = record.fetch(:target)
16
16
  end
17
17
 
18
- def to_s
19
- "[SRVRecord] #{fqdn} #{ttl} IN SRV #{priority} #{weight} #{port} #{target}"
20
- end
21
-
22
18
  def rdata
23
19
  { priority: priority, port: port, weight: weight, target: target }
24
20
  end
25
21
 
22
+ def rdata_txt
23
+ "#{priority} #{weight} #{port} #{target}"
24
+ end
26
25
  end
27
26
  end
@@ -11,13 +11,17 @@ module RecordStore
11
11
  end
12
12
 
13
13
  def to_s
14
- "[TXTRecord] #{fqdn} #{ttl} IN TXT \"#{txtdata}\""
14
+ "[TXTRecord] #{fqdn} #{ttl} IN TXT \"#{rdata_txt}\""
15
15
  end
16
16
 
17
17
  def rdata
18
18
  { txtdata: txtdata }
19
19
  end
20
20
 
21
+ def rdata_txt
22
+ txtdata
23
+ end
24
+
21
25
  private
22
26
 
23
27
  def escaped_semicolons
@@ -1,3 +1,3 @@
1
1
  module RecordStore
2
- VERSION = '4.0.7'.freeze
2
+ VERSION = '5.0.0'.freeze
3
3
  end
@@ -5,7 +5,19 @@
5
5
  "password": "dynect_password"
6
6
  },
7
7
  "dnsimple": {
8
- "email": "dnsimple_email",
8
+ "account_id": "dnsimple_email",
9
9
  "api_token": "dnsimple_api_token"
10
+ },
11
+ "google_cloud_dns": {
12
+ "type": "type",
13
+ "project_id": "project_id",
14
+ "private_key_id": "private_key_id",
15
+ "private_key": "-----BEGIN RSA PRIVATE KEY-----\nMIICWgIBAAKBgGsd4RrLAgGKI3cRmywv1FXoAzNG3pgh1X/xjeDu5Fnjr8bvDGog\nctx9iyr5p7NbazgAQxaBWXAgr9p0jjkWzSaTCNskSuk/jJwwn4VQbfXKkyNNaIuc\nk2xn++JJ7Dv4+ODJupP3+A1QUH/uzsGi7xGGNzkC1ojSZlT40OxDrP1VAgMBAAEC\ngYA0xQ2Gg4hDdegu2m+VfyKeB6S7+CfkzpY9Z6S7sTSxy+dmm5GEHuQ3F2oeC8vA\nIkNZ3VcvmR2UjaXUeyMtoLwDpmboRPm3SEtITReSBQGLTeeFymJwIPks0VXckOTh\nrhbyK7StiJ/0jWNtted0vBPEjEAuP6tyURpbVGIBQ1V+aQJBALv6sWWZOKVVThNc\nOGpnBAzTWGQMgp9nD+7rwbAbzRD3hvW5ln6O94a0XPWg9WD++gHDVr9OU7Ooe63O\n/0qw3EcCQQCR4IyjUqYzBZWyD+EKugNtc8VAOrJsYIE+gkajiikjV4nbj8CVg/CO\nunLrkDGAHTgzfY2tTyI6gQt2ctbfFRODAkB8Kl5tBqVVCCDXRu340mzpb9yN0Xmi\ngvgST+WTRvnQQEAEJX9Tv2mer5pLoPMUC7fl3Dp7iOhe3mY7a2RT2LjXAkAVNUg9\nFm8DS/SPhq95F8IXz5UF2YLHLuCbbeVHMXb5pGhue1/MXPpERecfSD9qGNVq5v4K\nDE81oj1AY0HJ/Q5xAkAYOrEnGeJSjLhvJYfMJOAjf39pJs0Kh/2C7HySaILNWt3f\nK590FbFkwBw+bmylpnOxa2jJpzt7F3gGIast6on3\n-----END RSA PRIVATE KEY-----",
16
+ "client_email": "client_email",
17
+ "client_id": "client_id",
18
+ "auth_uri": "https://accounts.google.com/o/oauth2/auth",
19
+ "token_uri": "https://accounts.google.com/o/oauth2/token",
20
+ "auth_provider_x509_cert_url": "auth_provider_x509_cert_url",
21
+ "client_x509_cert_url": "client_x509_cert_url"
10
22
  }
11
23
  }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: record_store
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.0.7
4
+ version: 5.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Willem van Bergen
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2018-01-08 00:00:00.000000000 Z
12
+ date: 2018-01-26 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: thor
@@ -221,6 +221,7 @@ files:
221
221
  - lib/record_store/provider.rb
222
222
  - lib/record_store/provider/dnsimple.rb
223
223
  - lib/record_store/provider/dynect.rb
224
+ - lib/record_store/provider/google_cloud_dns.rb
224
225
  - lib/record_store/record.rb
225
226
  - lib/record_store/record/a.rb
226
227
  - lib/record_store/record/aaaa.rb