vmpooler-provider-gce 0.5.0 → 1.0.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/providers/gce.rb +17 -30
- data/lib/vmpooler-provider-gce/version.rb +1 -1
- metadata +4 -25
- data/lib/vmpooler/cloud_dns.rb +0 -63
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 27f860db3bb8d1ca4e7280abb91b4f9c22b91b035b24993711fc4e0358ae391b
|
4
|
+
data.tar.gz: 75cf0175b0122a255ff8026ab5a4d7b52a092b054bb9299a1f0d34313d7510ba
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1ff5a190eb5ad2f24dfcf87264d8e254ccaf76f9433fad3ce83f996596a2f6707f3b786d73833d1d57f071827ad4519c54f53c9f58035f367e9afc255dfc33bc
|
7
|
+
data.tar.gz: a79d52db51975c9a24bdb8511394ffacf7609586a08a8c27e71190680a6fff9f6998092b5f4a34a91b34d1ee204f6cd1fd2dd181e0fb3eac0c4831ba18f01f46
|
@@ -1,10 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'googleauth'
|
4
|
-
require 'google/apis/compute_v1'
|
5
|
-
require 'vmpooler/cloud_dns'
|
6
3
|
require 'bigdecimal'
|
7
4
|
require 'bigdecimal/util'
|
5
|
+
require 'google/apis/compute_v1'
|
6
|
+
require 'googleauth'
|
7
|
+
require 'vmpooler/dns/base'
|
8
8
|
require 'vmpooler/providers/base'
|
9
9
|
|
10
10
|
module Vmpooler
|
@@ -82,12 +82,9 @@ module Vmpooler
|
|
82
82
|
return provider_config['machine_type'] if provider_config['machine_type']
|
83
83
|
end
|
84
84
|
|
85
|
-
def domain
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
def dns_zone_resource_name
|
90
|
-
provider_config['dns_zone_resource_name']
|
85
|
+
def domain(pool_name)
|
86
|
+
dns_plugin_name = pool_config(pool_name)['dns_plugin']
|
87
|
+
dns_config(dns_plugin_name)
|
91
88
|
end
|
92
89
|
|
93
90
|
# Base methods that are implemented:
|
@@ -191,7 +188,7 @@ module Vmpooler
|
|
191
188
|
boot: true,
|
192
189
|
initialize_params: init_params
|
193
190
|
)
|
194
|
-
append_domain = domain
|
191
|
+
append_domain = domain(pool_name)
|
195
192
|
fqdn = "#{new_vmname}.#{append_domain}" if append_domain
|
196
193
|
|
197
194
|
# Assume all pool config is valid i.e. not missing
|
@@ -208,9 +205,12 @@ module Vmpooler
|
|
208
205
|
debug_logger('trigger insert_instance')
|
209
206
|
result = connection.insert_instance(project, zone(pool_name), client)
|
210
207
|
wait_for_operation(project, pool_name, result)
|
211
|
-
|
212
|
-
|
213
|
-
|
208
|
+
get_vm(pool_name, new_vmname)
|
209
|
+
end
|
210
|
+
|
211
|
+
def get_vm_ip_address(vm_name, pool_name)
|
212
|
+
vm_object = get_vm(pool_name, vm_name)
|
213
|
+
vm_object['ip']
|
214
214
|
end
|
215
215
|
|
216
216
|
# create_disk creates an additional disk for an existing VM. It will name the new
|
@@ -424,10 +424,8 @@ module Vmpooler
|
|
424
424
|
|
425
425
|
unless deleted
|
426
426
|
debug_logger("trigger delete_instance #{vm_name}")
|
427
|
-
vm_hash = get_vm(pool_name, vm_name)
|
428
427
|
result = connection.delete_instance(project, zone(pool_name), vm_name)
|
429
428
|
wait_for_operation(project, pool_name, result, 10)
|
430
|
-
dns_teardown(vm_hash)
|
431
429
|
end
|
432
430
|
|
433
431
|
# list and delete any leftover disk, for instance if they were detached from the instance
|
@@ -462,10 +460,12 @@ module Vmpooler
|
|
462
460
|
true
|
463
461
|
end
|
464
462
|
|
465
|
-
def vm_ready?(
|
463
|
+
def vm_ready?(pool_name, vm_name)
|
464
|
+
debug_logger('vm_ready?')
|
466
465
|
begin
|
467
466
|
# TODO: we could use a healthcheck resource attached to instance
|
468
|
-
|
467
|
+
domain = domain(pool_name)
|
468
|
+
open_socket(vm_name, domain)
|
469
469
|
rescue StandardError => _e
|
470
470
|
return false
|
471
471
|
end
|
@@ -497,9 +497,6 @@ module Vmpooler
|
|
497
497
|
|
498
498
|
debug_logger("trigger async delete_instance #{vm.name}")
|
499
499
|
result = connection.delete_instance(project, zone, vm.name)
|
500
|
-
vm_pool = vm.labels&.key?('pool') ? vm.labels['pool'] : nil
|
501
|
-
existing_vm = generate_vm_hash(vm, vm_pool)
|
502
|
-
dns_teardown(existing_vm)
|
503
500
|
result_list << result
|
504
501
|
end
|
505
502
|
# now check they are done
|
@@ -560,16 +557,6 @@ module Vmpooler
|
|
560
557
|
|
561
558
|
# END BASE METHODS
|
562
559
|
|
563
|
-
def dns_setup(created_instance)
|
564
|
-
dns = Vmpooler::PoolManager::CloudDns.new(project, dns_zone_resource_name)
|
565
|
-
dns.dns_create_or_replace(created_instance)
|
566
|
-
end
|
567
|
-
|
568
|
-
def dns_teardown(created_instance)
|
569
|
-
dns = Vmpooler::PoolManager::CloudDns.new(project, dns_zone_resource_name)
|
570
|
-
dns.dns_teardown(created_instance)
|
571
|
-
end
|
572
|
-
|
573
560
|
def should_be_ignored(item, allowlist)
|
574
561
|
return false if allowlist.nil?
|
575
562
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vmpooler-provider-gce
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Puppet
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-04-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
requirement: !ruby/object:Gem::Requirement
|
@@ -49,35 +49,15 @@ dependencies:
|
|
49
49
|
requirements:
|
50
50
|
- - "~>"
|
51
51
|
- !ruby/object:Gem::Version
|
52
|
-
version: 0
|
53
|
-
name: google-cloud-dns
|
54
|
-
prerelease: false
|
55
|
-
type: :runtime
|
56
|
-
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
requirements:
|
58
|
-
- - "~>"
|
59
|
-
- !ruby/object:Gem::Version
|
60
|
-
version: 0.35.1
|
61
|
-
- !ruby/object:Gem::Dependency
|
62
|
-
requirement: !ruby/object:Gem::Requirement
|
63
|
-
requirements:
|
64
|
-
- - ">="
|
65
|
-
- !ruby/object:Gem::Version
|
66
|
-
version: 1.3.0
|
67
|
-
- - "~>"
|
68
|
-
- !ruby/object:Gem::Version
|
69
|
-
version: '2.3'
|
52
|
+
version: '3.0'
|
70
53
|
name: vmpooler
|
71
54
|
prerelease: false
|
72
55
|
type: :runtime
|
73
56
|
version_requirements: !ruby/object:Gem::Requirement
|
74
57
|
requirements:
|
75
|
-
- - ">="
|
76
|
-
- !ruby/object:Gem::Version
|
77
|
-
version: 1.3.0
|
78
58
|
- - "~>"
|
79
59
|
- !ruby/object:Gem::Version
|
80
|
-
version: '
|
60
|
+
version: '3.0'
|
81
61
|
- !ruby/object:Gem::Dependency
|
82
62
|
requirement: !ruby/object:Gem::Requirement
|
83
63
|
requirements:
|
@@ -218,7 +198,6 @@ extensions: []
|
|
218
198
|
extra_rdoc_files: []
|
219
199
|
files:
|
220
200
|
- lib/vmpooler-provider-gce/version.rb
|
221
|
-
- lib/vmpooler/cloud_dns.rb
|
222
201
|
- lib/vmpooler/providers/gce.rb
|
223
202
|
homepage: https://github.com/puppetlabs/vmpooler-provider-gce
|
224
203
|
licenses:
|
data/lib/vmpooler/cloud_dns.rb
DELETED
@@ -1,63 +0,0 @@
|
|
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
|