vmpooler-provider-gce 0.3.0 → 0.5.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 +4 -4
- data/lib/vmpooler/cloud_dns.rb +63 -0
- data/lib/vmpooler/providers/gce.rb +12 -34
- data/lib/vmpooler-provider-gce/version.rb +1 -1
- metadata +36 -36
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a1cc4681f0151b64579a620b4ad41f6b2304e6e30ed49395bc690d66268face4
|
4
|
+
data.tar.gz: aef7add3fbd7c9809dc525ca8f909779e4689cd9593eb7a19095b2fc06a8bbe7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a1161e83b4d4eef28b00c8da75d2420d1b4a4d88bb40df1fb29450096e5ba18a39baa1467b0519449f6d621fb62a147907f834ba8f15dacca2c3c58e694d7179
|
7
|
+
data.tar.gz: c88b97da6dda16889cec9d012e867f8cb4b7b2fe8ddc0488d60effe57351d053faa0e68f23ab4fce226255ada921ec3a31c8df3861b93881a5724d82995fcdff
|
@@ -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 '
|
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
|
-
|
570
|
-
|
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
|
-
|
586
|
-
|
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)
|
@@ -703,15 +683,13 @@ module Vmpooler
|
|
703
683
|
|
704
684
|
# This should supercede the open_socket method in the Pool Manager
|
705
685
|
def open_socket(host, domain = nil, timeout = 5, port = 22, &_block)
|
706
|
-
|
707
|
-
|
708
|
-
|
709
|
-
|
710
|
-
|
711
|
-
|
712
|
-
|
713
|
-
sock.close
|
714
|
-
end
|
686
|
+
target_host = host
|
687
|
+
target_host = "#{host}.#{domain}" if domain
|
688
|
+
sock = TCPSocket.new(target_host, port, connect_timeout: timeout)
|
689
|
+
begin
|
690
|
+
yield sock if block_given?
|
691
|
+
ensure
|
692
|
+
sock.close
|
715
693
|
end
|
716
694
|
end
|
717
695
|
|
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.
|
4
|
+
version: 0.5.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:
|
11
|
+
date: 2023-03-06 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
|
-
|
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.
|
37
|
-
|
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.
|
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
|
-
|
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
|
-
|
70
|
+
name: vmpooler
|
72
71
|
prerelease: false
|
72
|
+
type: :runtime
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
242
|
-
|
243
|
-
signing_key:
|
242
|
+
rubygems_version: 3.3.25
|
243
|
+
signing_key:
|
244
244
|
specification_version: 4
|
245
245
|
summary: GCE provider for VMPooler
|
246
246
|
test_files: []
|