vmpooler-provider-gce 0.1.2 → 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: c1f22f8c5aea6e2a9f2a6cb2d635c3433ccb90c983919d3a33b30a41cb1ab80a
4
- data.tar.gz: 84310c0950ebf6ba4fd87457e8750aaf689a64eb6b79f4c1490878294e27785a
3
+ metadata.gz: d84f2dc8dd84470083c1f6d7b87b8c4d213d9d1ed1dca1558fbdf02ef8553bf8
4
+ data.tar.gz: dac3ab9c8105b1dda22c61f787d5a2e0f7bf1cdee25998a130c1e286dfdca19c
5
5
  SHA512:
6
- metadata.gz: 24d390125d902e57a1ef0b48e53b207b386e97cb0439f8a411cf0a9eb64b754ce31842c96fa66a51601590e47e4548613844dac3d8515e22068713c10795c128
7
- data.tar.gz: 8f9166867e5258c310c8b1f2ab0e2d51bb32d2d93dff85b4b96e5a69dc9d8ae8adc07c769ad1e3987019b03a94552e3709cdfc3952596b01a6344436a460fad9
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']
@@ -181,19 +176,28 @@ module Vmpooler
181
176
  network: network_name
182
177
  )
183
178
  network_interfaces.subnetwork = subnetwork_name(pool_name) if subnetwork_name(pool_name)
184
- init_params = {
179
+ init_params = Google::Apis::ComputeV1::AttachedDiskInitializeParams.new(
185
180
  source_image: pool['template'], # The source image to create this disk.
186
181
  labels: { 'vm' => new_vmname, 'pool' => pool_name },
187
182
  disk_name: "#{new_vmname}-disk0"
188
- }
183
+ )
184
+ # rubocop:disable Style/IfUnlessModifier
185
+ if pool['disk_type'] && !pool['disk_type'].empty?
186
+ init_params.disk_type = "https://www.googleapis.com/compute/v1/projects/#{project}/zones/#{zone(pool_name)}/diskTypes/#{pool['disk_type']}"
187
+ end
188
+ # rubocop:enable Style/IfUnlessModifier
189
189
  disk = Google::Apis::ComputeV1::AttachedDisk.new(
190
190
  auto_delete: true,
191
191
  boot: true,
192
- initialize_params: Google::Apis::ComputeV1::AttachedDiskInitializeParams.new(init_params)
192
+ initialize_params: init_params
193
193
  )
194
+ append_domain = domain || global_config[:config]['domain']
195
+ fqdn = "#{new_vmname}.#{append_domain}" if append_domain
196
+
194
197
  # Assume all pool config is valid i.e. not missing
195
198
  client = ::Google::Apis::ComputeV1::Instance.new(
196
199
  name: new_vmname,
200
+ hostname: fqdn,
197
201
  machine_type: pool['machine_type'],
198
202
  disks: [disk],
199
203
  network_interfaces: [network_interfaces],
@@ -557,28 +561,13 @@ module Vmpooler
557
561
  # END BASE METHODS
558
562
 
559
563
  def dns_setup(created_instance)
560
- dns_zone = dns.zone(dns_zone_resource_name) if dns_zone_resource_name
561
- return unless dns_zone && created_instance && created_instance['name'] && created_instance['ip']
562
-
563
- name = created_instance['name']
564
- begin
565
- change = dns_zone.add(name, 'A', 60, [created_instance['ip']])
566
- debug_logger("#{change.id} - #{change.started_at} - #{change.status} DNS address added") if change
567
- rescue Google::Cloud::AlreadyExistsError => _e
568
- # 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.
569
- # the error is Google::Cloud::AlreadyExistsError: alreadyExists: The resource 'entity.change.additions[0]' named 'instance-8.test.vmpooler.net. (A)' already exists
570
- change = dns_zone.replace(name, 'A', 60, [created_instance['ip']])
571
- debug_logger("#{change.id} - #{change.started_at} - #{change.status} DNS address previously existed and was replaced") if change
572
- end
564
+ dns = Vmpooler::PoolManager::CloudDns.new(project, dns_zone_resource_name)
565
+ dns.dns_create_or_replace(created_instance)
573
566
  end
574
567
 
575
568
  def dns_teardown(created_instance)
576
- dns_zone = dns.zone(dns_zone_resource_name) if dns_zone_resource_name
577
- return unless dns_zone && created_instance
578
-
579
- name = created_instance['name']
580
- change = dns_zone.remove(name, 'A')
581
- 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)
582
571
  end
583
572
 
584
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.1.2'
4
+ VERSION = '0.4.0'
5
5
  end
metadata CHANGED
@@ -1,177 +1,182 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vmpooler-provider-gce
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
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-01-10 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
+ - - ">="
32
31
  - !ruby/object:Gem::Version
33
32
  version: 0.16.2
34
- type: :runtime
33
+ - - "<"
34
+ - !ruby/object:Gem::Version
35
+ version: 1.3.0
36
+ name: googleauth
35
37
  prerelease: false
38
+ type: :runtime
36
39
  version_requirements: !ruby/object:Gem::Requirement
37
40
  requirements:
38
- - - "~>"
41
+ - - ">="
39
42
  - !ruby/object:Gem::Version
40
43
  version: 0.16.2
44
+ - - "<"
45
+ - !ruby/object:Gem::Version
46
+ version: 1.3.0
41
47
  - !ruby/object:Gem::Dependency
42
- name: google-cloud-dns
43
48
  requirement: !ruby/object:Gem::Requirement
44
49
  requirements:
45
50
  - - "~>"
46
51
  - !ruby/object:Gem::Version
47
52
  version: 0.35.1
48
- type: :runtime
53
+ name: google-cloud-dns
49
54
  prerelease: false
55
+ type: :runtime
50
56
  version_requirements: !ruby/object:Gem::Requirement
51
57
  requirements:
52
58
  - - "~>"
53
59
  - !ruby/object:Gem::Version
54
60
  version: 0.35.1
55
61
  - !ruby/object:Gem::Dependency
56
- name: vmpooler
57
62
  requirement: !ruby/object:Gem::Requirement
58
63
  requirements:
59
- - - "~>"
60
- - !ruby/object:Gem::Version
61
- version: '1.3'
62
64
  - - ">="
63
65
  - !ruby/object:Gem::Version
64
66
  version: 1.3.0
65
- type: :development
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: '2.3'
70
+ name: vmpooler
66
71
  prerelease: false
72
+ type: :development
67
73
  version_requirements: !ruby/object:Gem::Requirement
68
74
  requirements:
69
- - - "~>"
70
- - !ruby/object:Gem::Version
71
- version: '1.3'
72
75
  - - ">="
73
76
  - !ruby/object:Gem::Version
74
77
  version: 1.3.0
78
+ - - "~>"
79
+ - !ruby/object:Gem::Version
80
+ version: '2.3'
75
81
  - !ruby/object:Gem::Dependency
76
- name: climate_control
77
82
  requirement: !ruby/object:Gem::Requirement
78
83
  requirements:
79
84
  - - ">="
80
85
  - !ruby/object:Gem::Version
81
86
  version: 0.2.0
82
- type: :development
87
+ name: climate_control
83
88
  prerelease: false
89
+ type: :development
84
90
  version_requirements: !ruby/object:Gem::Requirement
85
91
  requirements:
86
92
  - - ">="
87
93
  - !ruby/object:Gem::Version
88
94
  version: 0.2.0
89
95
  - !ruby/object:Gem::Dependency
90
- name: mock_redis
91
96
  requirement: !ruby/object:Gem::Requirement
92
97
  requirements:
93
98
  - - ">="
94
99
  - !ruby/object:Gem::Version
95
100
  version: 0.17.0
96
- type: :development
101
+ name: mock_redis
97
102
  prerelease: false
103
+ type: :development
98
104
  version_requirements: !ruby/object:Gem::Requirement
99
105
  requirements:
100
106
  - - ">="
101
107
  - !ruby/object:Gem::Version
102
108
  version: 0.17.0
103
109
  - !ruby/object:Gem::Dependency
104
- name: pry
105
110
  requirement: !ruby/object:Gem::Requirement
106
111
  requirements:
107
112
  - - ">="
108
113
  - !ruby/object:Gem::Version
109
114
  version: '0'
110
- type: :development
115
+ name: pry
111
116
  prerelease: false
117
+ type: :development
112
118
  version_requirements: !ruby/object:Gem::Requirement
113
119
  requirements:
114
120
  - - ">="
115
121
  - !ruby/object:Gem::Version
116
122
  version: '0'
117
123
  - !ruby/object:Gem::Dependency
118
- name: rack-test
119
124
  requirement: !ruby/object:Gem::Requirement
120
125
  requirements:
121
126
  - - ">="
122
127
  - !ruby/object:Gem::Version
123
128
  version: '0.6'
124
- type: :development
129
+ name: rack-test
125
130
  prerelease: false
131
+ type: :development
126
132
  version_requirements: !ruby/object:Gem::Requirement
127
133
  requirements:
128
134
  - - ">="
129
135
  - !ruby/object:Gem::Version
130
136
  version: '0.6'
131
137
  - !ruby/object:Gem::Dependency
132
- name: rspec
133
138
  requirement: !ruby/object:Gem::Requirement
134
139
  requirements:
135
140
  - - ">="
136
141
  - !ruby/object:Gem::Version
137
142
  version: '3.2'
138
- type: :development
143
+ name: rspec
139
144
  prerelease: false
145
+ type: :development
140
146
  version_requirements: !ruby/object:Gem::Requirement
141
147
  requirements:
142
148
  - - ">="
143
149
  - !ruby/object:Gem::Version
144
150
  version: '3.2'
145
151
  - !ruby/object:Gem::Dependency
146
- name: rubocop
147
152
  requirement: !ruby/object:Gem::Requirement
148
153
  requirements:
149
154
  - - "~>"
150
155
  - !ruby/object:Gem::Version
151
156
  version: 1.1.0
152
- type: :development
157
+ name: rubocop
153
158
  prerelease: false
159
+ type: :development
154
160
  version_requirements: !ruby/object:Gem::Requirement
155
161
  requirements:
156
162
  - - "~>"
157
163
  - !ruby/object:Gem::Version
158
164
  version: 1.1.0
159
165
  - !ruby/object:Gem::Dependency
160
- name: simplecov
161
166
  requirement: !ruby/object:Gem::Requirement
162
167
  requirements:
163
168
  - - ">="
164
169
  - !ruby/object:Gem::Version
165
170
  version: 0.11.2
166
- type: :development
171
+ name: simplecov
167
172
  prerelease: false
173
+ type: :development
168
174
  version_requirements: !ruby/object:Gem::Requirement
169
175
  requirements:
170
176
  - - ">="
171
177
  - !ruby/object:Gem::Version
172
178
  version: 0.11.2
173
179
  - !ruby/object:Gem::Dependency
174
- name: thor
175
180
  requirement: !ruby/object:Gem::Requirement
176
181
  requirements:
177
182
  - - "~>"
@@ -180,8 +185,9 @@ dependencies:
180
185
  - - ">="
181
186
  - !ruby/object:Gem::Version
182
187
  version: 1.0.1
183
- type: :development
188
+ name: thor
184
189
  prerelease: false
190
+ type: :development
185
191
  version_requirements: !ruby/object:Gem::Requirement
186
192
  requirements:
187
193
  - - "~>"
@@ -191,20 +197,20 @@ dependencies:
191
197
  - !ruby/object:Gem::Version
192
198
  version: 1.0.1
193
199
  - !ruby/object:Gem::Dependency
194
- name: yarjuf
195
200
  requirement: !ruby/object:Gem::Requirement
196
201
  requirements:
197
202
  - - ">="
198
203
  - !ruby/object:Gem::Version
199
204
  version: '2.0'
200
- type: :development
205
+ name: yarjuf
201
206
  prerelease: false
207
+ type: :development
202
208
  version_requirements: !ruby/object:Gem::Requirement
203
209
  requirements:
204
210
  - - ">="
205
211
  - !ruby/object:Gem::Version
206
212
  version: '2.0'
207
- description:
213
+ description:
208
214
  email:
209
215
  - support@puppet.com
210
216
  executables: []
@@ -212,12 +218,13 @@ extensions: []
212
218
  extra_rdoc_files: []
213
219
  files:
214
220
  - lib/vmpooler-provider-gce/version.rb
221
+ - lib/vmpooler/cloud_dns.rb
215
222
  - lib/vmpooler/providers/gce.rb
216
223
  homepage: https://github.com/puppetlabs/vmpooler-provider-gce
217
224
  licenses:
218
225
  - Apache-2.0
219
226
  metadata: {}
220
- post_install_message:
227
+ post_install_message:
221
228
  rdoc_options: []
222
229
  require_paths:
223
230
  - lib
@@ -232,9 +239,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
232
239
  - !ruby/object:Gem::Version
233
240
  version: '0'
234
241
  requirements: []
235
- rubyforge_project:
236
- rubygems_version: 2.7.6.2
237
- signing_key:
242
+ rubygems_version: 3.2.29
243
+ signing_key:
238
244
  specification_version: 4
239
245
  summary: GCE provider for VMPooler
240
246
  test_files: []