vmpooler-provider-gce 0.3.0 → 0.4.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
  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: []