vmpooler-provider-gce 0.3.0 → 0.4.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 856708caecc1c4c2c358113c386dc6c46f5dc3691a2b7365f6dbf7069697d0d2
4
- data.tar.gz: e2c5763e28ebc96ad0aaecb3af6b47e6851fed2f4c4352630630cd30d7500c91
3
+ metadata.gz: d84f2dc8dd84470083c1f6d7b87b8c4d213d9d1ed1dca1558fbdf02ef8553bf8
4
+ data.tar.gz: dac3ab9c8105b1dda22c61f787d5a2e0f7bf1cdee25998a130c1e286dfdca19c
5
5
  SHA512:
6
- metadata.gz: c0f57ec8d1a5a362d89514f0aa2ebcad4c9c669478567e12c2da1e762a21405ac250e6bf848b646ee2d3f03a600e364e3ae959a77ff8813ba2ededc8af9d094e
7
- data.tar.gz: 0dd0e93bcd3e437c276165a01b30b3618568f7d39bb7826287cc80027f316f143b6a2477a5a5a88f8399910804b47d8529dc03cabcd988d9bd45116bef076c83
6
+ metadata.gz: 857d5925f6a618b75f90fde55265366804455cbc126bf6395e2d0d5f7e17a10c40f1901ddb3e900ba93024b684b185e34ded7d13cb11b46b3e81ada5657be244
7
+ data.tar.gz: 6c8681ed0c3b8cf9df4b5726fee60756cba2d0c9919421f0fc2eaf898f4e45fb8ecab23d5bfcd82b69e455bfaf7e3a3a8cb3fbab3e6bb1eb31e5826d0ad9e7db
@@ -0,0 +1,63 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'googleauth'
4
+ require 'google/cloud/dns'
5
+
6
+ module Vmpooler
7
+ class PoolManager
8
+ # This class interacts with GCP Cloud DNS to create or delete records.
9
+ class CloudDns
10
+ def initialize(project, dns_zone_resource_name)
11
+ @dns = Google::Cloud::Dns.new(project_id: project)
12
+ @dns_zone_resource_name = dns_zone_resource_name
13
+ end
14
+
15
+ def dns_create_or_replace(created_instance)
16
+ dns_zone = @dns.zone(@dns_zone_resource_name) if @dns_zone_resource_name
17
+ return unless dns_zone && created_instance && created_instance['name'] && created_instance['ip']
18
+
19
+ retries = 0
20
+ name = created_instance['name']
21
+ begin
22
+ change = dns_zone.add(name, 'A', 60, [created_instance['ip']])
23
+ debug_logger("#{change.id} - #{change.started_at} - #{change.status} DNS address added") if change
24
+ rescue Google::Cloud::AlreadyExistsError => _e
25
+ # DNS setup is done only for new instances, so in the rare case where a DNS record already exists (it is stale) and we replace it.
26
+ # the error is Google::Cloud::AlreadyExistsError: alreadyExists: The resource 'entity.change.additions[0]' named 'instance-8.test.vmpooler.net. (A)' already exists
27
+ change = dns_zone.replace(name, 'A', 60, [created_instance['ip']])
28
+ debug_logger("#{change.id} - #{change.started_at} - #{change.status} DNS address previously existed and was replaced") if change
29
+ rescue Google::Cloud::FailedPreconditionError => e
30
+ # this error was experienced intermittently, will retry to see if it can complete successfully
31
+ # the error is Google::Cloud::FailedPreconditionError: conditionNotMet: Precondition not met for 'entity.change.deletions[0]'
32
+ debug_logger("DNS create failed, retrying error: #{e}")
33
+ sleep 5
34
+ retry if (retries += 1) < 30
35
+ end
36
+ end
37
+
38
+ def dns_teardown(created_instance)
39
+ dns_zone = @dns.zone(@dns_zone_resource_name) if @dns_zone_resource_name
40
+ return unless dns_zone && created_instance
41
+
42
+ retries = 0
43
+ name = created_instance['name']
44
+ change = dns_zone.remove(name, 'A')
45
+ debug_logger("#{change.id} - #{change.started_at} - #{change.status} DNS address removed") if change
46
+ rescue Google::Cloud::FailedPreconditionError => e
47
+ # this error was experienced intermittently, will retry to see if it can complete successfully
48
+ # the error is Google::Cloud::FailedPreconditionError: conditionNotMet: Precondition not met for 'entity.change.deletions[1]'
49
+ debug_logger("DNS teardown failed, retrying error: #{e}")
50
+ sleep 5
51
+ retry if (retries += 1) < 30
52
+ end
53
+
54
+ # used in local dev environment, set DEBUG_FLAG=true
55
+ # this way the upstream vmpooler manager does not get polluted with logs
56
+ def debug_logger(message, send_to_upstream: false)
57
+ # the default logger is simple and does not enforce debug levels (the first argument)
58
+ puts message if ENV['DEBUG_FLAG']
59
+ logger.log('[g]', message) if send_to_upstream
60
+ end
61
+ end
62
+ end
63
+ end
@@ -2,7 +2,7 @@
2
2
 
3
3
  require 'googleauth'
4
4
  require 'google/apis/compute_v1'
5
- require 'google/cloud/dns'
5
+ require 'vmpooler/cloud_dns'
6
6
  require 'bigdecimal'
7
7
  require 'bigdecimal/util'
8
8
  require 'vmpooler/providers/base'
@@ -58,11 +58,6 @@ module Vmpooler
58
58
  end
59
59
  end
60
60
 
61
- def dns
62
- @dns ||= Google::Cloud::Dns.new(project_id: project)
63
- @dns
64
- end
65
-
66
61
  # main configuration options
67
62
  def project
68
63
  provider_config['project']
@@ -566,28 +561,13 @@ module Vmpooler
566
561
  # END BASE METHODS
567
562
 
568
563
  def dns_setup(created_instance)
569
- dns_zone = dns.zone(dns_zone_resource_name) if dns_zone_resource_name
570
- return unless dns_zone && created_instance && created_instance['name'] && created_instance['ip']
571
-
572
- name = created_instance['name']
573
- begin
574
- change = dns_zone.add(name, 'A', 60, [created_instance['ip']])
575
- debug_logger("#{change.id} - #{change.started_at} - #{change.status} DNS address added") if change
576
- rescue Google::Cloud::AlreadyExistsError => _e
577
- # DNS setup is done only for new instances, so in the rare case where a DNS record already exists (it is stale) and we replace it.
578
- # the error is Google::Cloud::AlreadyExistsError: alreadyExists: The resource 'entity.change.additions[0]' named 'instance-8.test.vmpooler.net. (A)' already exists
579
- change = dns_zone.replace(name, 'A', 60, [created_instance['ip']])
580
- debug_logger("#{change.id} - #{change.started_at} - #{change.status} DNS address previously existed and was replaced") if change
581
- end
564
+ dns = Vmpooler::PoolManager::CloudDns.new(project, dns_zone_resource_name)
565
+ dns.dns_create_or_replace(created_instance)
582
566
  end
583
567
 
584
568
  def dns_teardown(created_instance)
585
- dns_zone = dns.zone(dns_zone_resource_name) if dns_zone_resource_name
586
- return unless dns_zone && created_instance
587
-
588
- name = created_instance['name']
589
- change = dns_zone.remove(name, 'A')
590
- debug_logger("#{change.id} - #{change.started_at} - #{change.status} DNS address removed") if change
569
+ dns = Vmpooler::PoolManager::CloudDns.new(project, dns_zone_resource_name)
570
+ dns.dns_teardown(created_instance)
591
571
  end
592
572
 
593
573
  def should_be_ignored(item, allowlist)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module VmpoolerProviderGce
4
- VERSION = '0.3.0'
4
+ VERSION = '0.4.0'
5
5
  end
metadata CHANGED
@@ -1,31 +1,30 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vmpooler-provider-gce
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Puppet
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-06-21 00:00:00.000000000 Z
11
+ date: 2022-07-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: google-apis-compute_v1
15
14
  requirement: !ruby/object:Gem::Requirement
16
15
  requirements:
17
16
  - - "~>"
18
17
  - !ruby/object:Gem::Version
19
18
  version: '0.14'
20
- type: :runtime
19
+ name: google-apis-compute_v1
21
20
  prerelease: false
21
+ type: :runtime
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0.14'
27
27
  - !ruby/object:Gem::Dependency
28
- name: googleauth
29
28
  requirement: !ruby/object:Gem::Requirement
30
29
  requirements:
31
30
  - - ">="
@@ -33,9 +32,10 @@ dependencies:
33
32
  version: 0.16.2
34
33
  - - "<"
35
34
  - !ruby/object:Gem::Version
36
- version: 1.2.0
37
- type: :runtime
35
+ version: 1.3.0
36
+ name: googleauth
38
37
  prerelease: false
38
+ type: :runtime
39
39
  version_requirements: !ruby/object:Gem::Requirement
40
40
  requirements:
41
41
  - - ">="
@@ -43,23 +43,22 @@ dependencies:
43
43
  version: 0.16.2
44
44
  - - "<"
45
45
  - !ruby/object:Gem::Version
46
- version: 1.2.0
46
+ version: 1.3.0
47
47
  - !ruby/object:Gem::Dependency
48
- name: google-cloud-dns
49
48
  requirement: !ruby/object:Gem::Requirement
50
49
  requirements:
51
50
  - - "~>"
52
51
  - !ruby/object:Gem::Version
53
52
  version: 0.35.1
54
- type: :runtime
53
+ name: google-cloud-dns
55
54
  prerelease: false
55
+ type: :runtime
56
56
  version_requirements: !ruby/object:Gem::Requirement
57
57
  requirements:
58
58
  - - "~>"
59
59
  - !ruby/object:Gem::Version
60
60
  version: 0.35.1
61
61
  - !ruby/object:Gem::Dependency
62
- name: vmpooler
63
62
  requirement: !ruby/object:Gem::Requirement
64
63
  requirements:
65
64
  - - ">="
@@ -68,8 +67,9 @@ dependencies:
68
67
  - - "~>"
69
68
  - !ruby/object:Gem::Version
70
69
  version: '2.3'
71
- type: :development
70
+ name: vmpooler
72
71
  prerelease: false
72
+ type: :development
73
73
  version_requirements: !ruby/object:Gem::Requirement
74
74
  requirements:
75
75
  - - ">="
@@ -79,105 +79,104 @@ dependencies:
79
79
  - !ruby/object:Gem::Version
80
80
  version: '2.3'
81
81
  - !ruby/object:Gem::Dependency
82
- name: climate_control
83
82
  requirement: !ruby/object:Gem::Requirement
84
83
  requirements:
85
84
  - - ">="
86
85
  - !ruby/object:Gem::Version
87
86
  version: 0.2.0
88
- type: :development
87
+ name: climate_control
89
88
  prerelease: false
89
+ type: :development
90
90
  version_requirements: !ruby/object:Gem::Requirement
91
91
  requirements:
92
92
  - - ">="
93
93
  - !ruby/object:Gem::Version
94
94
  version: 0.2.0
95
95
  - !ruby/object:Gem::Dependency
96
- name: mock_redis
97
96
  requirement: !ruby/object:Gem::Requirement
98
97
  requirements:
99
98
  - - ">="
100
99
  - !ruby/object:Gem::Version
101
100
  version: 0.17.0
102
- type: :development
101
+ name: mock_redis
103
102
  prerelease: false
103
+ type: :development
104
104
  version_requirements: !ruby/object:Gem::Requirement
105
105
  requirements:
106
106
  - - ">="
107
107
  - !ruby/object:Gem::Version
108
108
  version: 0.17.0
109
109
  - !ruby/object:Gem::Dependency
110
- name: pry
111
110
  requirement: !ruby/object:Gem::Requirement
112
111
  requirements:
113
112
  - - ">="
114
113
  - !ruby/object:Gem::Version
115
114
  version: '0'
116
- type: :development
115
+ name: pry
117
116
  prerelease: false
117
+ type: :development
118
118
  version_requirements: !ruby/object:Gem::Requirement
119
119
  requirements:
120
120
  - - ">="
121
121
  - !ruby/object:Gem::Version
122
122
  version: '0'
123
123
  - !ruby/object:Gem::Dependency
124
- name: rack-test
125
124
  requirement: !ruby/object:Gem::Requirement
126
125
  requirements:
127
126
  - - ">="
128
127
  - !ruby/object:Gem::Version
129
128
  version: '0.6'
130
- type: :development
129
+ name: rack-test
131
130
  prerelease: false
131
+ type: :development
132
132
  version_requirements: !ruby/object:Gem::Requirement
133
133
  requirements:
134
134
  - - ">="
135
135
  - !ruby/object:Gem::Version
136
136
  version: '0.6'
137
137
  - !ruby/object:Gem::Dependency
138
- name: rspec
139
138
  requirement: !ruby/object:Gem::Requirement
140
139
  requirements:
141
140
  - - ">="
142
141
  - !ruby/object:Gem::Version
143
142
  version: '3.2'
144
- type: :development
143
+ name: rspec
145
144
  prerelease: false
145
+ type: :development
146
146
  version_requirements: !ruby/object:Gem::Requirement
147
147
  requirements:
148
148
  - - ">="
149
149
  - !ruby/object:Gem::Version
150
150
  version: '3.2'
151
151
  - !ruby/object:Gem::Dependency
152
- name: rubocop
153
152
  requirement: !ruby/object:Gem::Requirement
154
153
  requirements:
155
154
  - - "~>"
156
155
  - !ruby/object:Gem::Version
157
156
  version: 1.1.0
158
- type: :development
157
+ name: rubocop
159
158
  prerelease: false
159
+ type: :development
160
160
  version_requirements: !ruby/object:Gem::Requirement
161
161
  requirements:
162
162
  - - "~>"
163
163
  - !ruby/object:Gem::Version
164
164
  version: 1.1.0
165
165
  - !ruby/object:Gem::Dependency
166
- name: simplecov
167
166
  requirement: !ruby/object:Gem::Requirement
168
167
  requirements:
169
168
  - - ">="
170
169
  - !ruby/object:Gem::Version
171
170
  version: 0.11.2
172
- type: :development
171
+ name: simplecov
173
172
  prerelease: false
173
+ type: :development
174
174
  version_requirements: !ruby/object:Gem::Requirement
175
175
  requirements:
176
176
  - - ">="
177
177
  - !ruby/object:Gem::Version
178
178
  version: 0.11.2
179
179
  - !ruby/object:Gem::Dependency
180
- name: thor
181
180
  requirement: !ruby/object:Gem::Requirement
182
181
  requirements:
183
182
  - - "~>"
@@ -186,8 +185,9 @@ dependencies:
186
185
  - - ">="
187
186
  - !ruby/object:Gem::Version
188
187
  version: 1.0.1
189
- type: :development
188
+ name: thor
190
189
  prerelease: false
190
+ type: :development
191
191
  version_requirements: !ruby/object:Gem::Requirement
192
192
  requirements:
193
193
  - - "~>"
@@ -197,20 +197,20 @@ dependencies:
197
197
  - !ruby/object:Gem::Version
198
198
  version: 1.0.1
199
199
  - !ruby/object:Gem::Dependency
200
- name: yarjuf
201
200
  requirement: !ruby/object:Gem::Requirement
202
201
  requirements:
203
202
  - - ">="
204
203
  - !ruby/object:Gem::Version
205
204
  version: '2.0'
206
- type: :development
205
+ name: yarjuf
207
206
  prerelease: false
207
+ type: :development
208
208
  version_requirements: !ruby/object:Gem::Requirement
209
209
  requirements:
210
210
  - - ">="
211
211
  - !ruby/object:Gem::Version
212
212
  version: '2.0'
213
- description:
213
+ description:
214
214
  email:
215
215
  - support@puppet.com
216
216
  executables: []
@@ -218,12 +218,13 @@ extensions: []
218
218
  extra_rdoc_files: []
219
219
  files:
220
220
  - lib/vmpooler-provider-gce/version.rb
221
+ - lib/vmpooler/cloud_dns.rb
221
222
  - lib/vmpooler/providers/gce.rb
222
223
  homepage: https://github.com/puppetlabs/vmpooler-provider-gce
223
224
  licenses:
224
225
  - Apache-2.0
225
226
  metadata: {}
226
- post_install_message:
227
+ post_install_message:
227
228
  rdoc_options: []
228
229
  require_paths:
229
230
  - lib
@@ -238,9 +239,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
238
239
  - !ruby/object:Gem::Version
239
240
  version: '0'
240
241
  requirements: []
241
- rubyforge_project:
242
- rubygems_version: 2.7.6.2
243
- signing_key:
242
+ rubygems_version: 3.2.29
243
+ signing_key:
244
244
  specification_version: 4
245
245
  summary: GCE provider for VMPooler
246
246
  test_files: []