mirror of
https://github.com/puppetlabs/vmpooler-provider-gce.git
synced 2026-01-26 03:18:41 -05:00
Start extracting dns setup and teardown
This commit is contained in:
parent
8015a18ea4
commit
d8c47134ef
2 changed files with 8 additions and 79 deletions
|
|
@ -1,63 +0,0 @@
|
||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
require 'googleauth'
|
|
||||||
require 'google/cloud/dns'
|
|
||||||
|
|
||||||
module Vmpooler
|
|
||||||
class PoolManager
|
|
||||||
# This class interacts with GCP Cloud DNS to create or delete records.
|
|
||||||
class CloudDns
|
|
||||||
def initialize(project, dns_zone_resource_name)
|
|
||||||
@dns = Google::Cloud::Dns.new(project_id: project)
|
|
||||||
@dns_zone_resource_name = dns_zone_resource_name
|
|
||||||
end
|
|
||||||
|
|
||||||
def dns_create_or_replace(created_instance)
|
|
||||||
dns_zone = @dns.zone(@dns_zone_resource_name) if @dns_zone_resource_name
|
|
||||||
return unless dns_zone && created_instance && created_instance['name'] && created_instance['ip']
|
|
||||||
|
|
||||||
retries = 0
|
|
||||||
name = created_instance['name']
|
|
||||||
begin
|
|
||||||
change = dns_zone.add(name, 'A', 60, [created_instance['ip']])
|
|
||||||
debug_logger("#{change.id} - #{change.started_at} - #{change.status} DNS address added") if change
|
|
||||||
rescue Google::Cloud::AlreadyExistsError => _e
|
|
||||||
# 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.
|
|
||||||
# the error is Google::Cloud::AlreadyExistsError: alreadyExists: The resource 'entity.change.additions[0]' named 'instance-8.test.vmpooler.net. (A)' already exists
|
|
||||||
change = dns_zone.replace(name, 'A', 60, [created_instance['ip']])
|
|
||||||
debug_logger("#{change.id} - #{change.started_at} - #{change.status} DNS address previously existed and was replaced") if change
|
|
||||||
rescue Google::Cloud::FailedPreconditionError => e
|
|
||||||
# this error was experienced intermittently, will retry to see if it can complete successfully
|
|
||||||
# the error is Google::Cloud::FailedPreconditionError: conditionNotMet: Precondition not met for 'entity.change.deletions[0]'
|
|
||||||
debug_logger("DNS create failed, retrying error: #{e}")
|
|
||||||
sleep 5
|
|
||||||
retry if (retries += 1) < 30
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def dns_teardown(created_instance)
|
|
||||||
dns_zone = @dns.zone(@dns_zone_resource_name) if @dns_zone_resource_name
|
|
||||||
return unless dns_zone && created_instance
|
|
||||||
|
|
||||||
retries = 0
|
|
||||||
name = created_instance['name']
|
|
||||||
change = dns_zone.remove(name, 'A')
|
|
||||||
debug_logger("#{change.id} - #{change.started_at} - #{change.status} DNS address removed") if change
|
|
||||||
rescue Google::Cloud::FailedPreconditionError => e
|
|
||||||
# this error was experienced intermittently, will retry to see if it can complete successfully
|
|
||||||
# the error is Google::Cloud::FailedPreconditionError: conditionNotMet: Precondition not met for 'entity.change.deletions[1]'
|
|
||||||
debug_logger("DNS teardown failed, retrying error: #{e}")
|
|
||||||
sleep 5
|
|
||||||
retry if (retries += 1) < 30
|
|
||||||
end
|
|
||||||
|
|
||||||
# used in local dev environment, set DEBUG_FLAG=true
|
|
||||||
# this way the upstream vmpooler manager does not get polluted with logs
|
|
||||||
def debug_logger(message, send_to_upstream: false)
|
|
||||||
# the default logger is simple and does not enforce debug levels (the first argument)
|
|
||||||
puts message if ENV['DEBUG_FLAG']
|
|
||||||
logger.log('[g]', message) if send_to_upstream
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
@ -1,10 +1,10 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
require 'googleauth'
|
|
||||||
require 'google/apis/compute_v1'
|
|
||||||
require 'vmpooler/cloud_dns'
|
|
||||||
require 'bigdecimal'
|
require 'bigdecimal'
|
||||||
require 'bigdecimal/util'
|
require 'bigdecimal/util'
|
||||||
|
require 'google/apis/compute_v1'
|
||||||
|
require 'googleauth'
|
||||||
|
require 'vmpooler/dns/base'
|
||||||
require 'vmpooler/providers/base'
|
require 'vmpooler/providers/base'
|
||||||
|
|
||||||
module Vmpooler
|
module Vmpooler
|
||||||
|
|
@ -209,7 +209,11 @@ module Vmpooler
|
||||||
result = connection.insert_instance(project, zone(pool_name), client)
|
result = connection.insert_instance(project, zone(pool_name), client)
|
||||||
wait_for_operation(project, pool_name, result)
|
wait_for_operation(project, pool_name, result)
|
||||||
created_instance = get_vm(pool_name, new_vmname)
|
created_instance = get_vm(pool_name, new_vmname)
|
||||||
dns_setup(created_instance)
|
# Exceptions thrown if ip does not exist in preexisting vm? Redis::CommandError: ERR wrong number of arguments for 'hset' command
|
||||||
|
@redis.with_metrics do |redis|
|
||||||
|
ip = created_instance['ip']
|
||||||
|
redis.hset("vmpooler__vm__#{new_vmname}", 'ip', ip)
|
||||||
|
end
|
||||||
created_instance
|
created_instance
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
@ -427,7 +431,6 @@ module Vmpooler
|
||||||
vm_hash = get_vm(pool_name, vm_name)
|
vm_hash = get_vm(pool_name, vm_name)
|
||||||
result = connection.delete_instance(project, zone(pool_name), vm_name)
|
result = connection.delete_instance(project, zone(pool_name), vm_name)
|
||||||
wait_for_operation(project, pool_name, result, 10)
|
wait_for_operation(project, pool_name, result, 10)
|
||||||
dns_teardown(vm_hash)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
# list and delete any leftover disk, for instance if they were detached from the instance
|
# list and delete any leftover disk, for instance if they were detached from the instance
|
||||||
|
|
@ -499,7 +502,6 @@ module Vmpooler
|
||||||
result = connection.delete_instance(project, zone, vm.name)
|
result = connection.delete_instance(project, zone, vm.name)
|
||||||
vm_pool = vm.labels&.key?('pool') ? vm.labels['pool'] : nil
|
vm_pool = vm.labels&.key?('pool') ? vm.labels['pool'] : nil
|
||||||
existing_vm = generate_vm_hash(vm, vm_pool)
|
existing_vm = generate_vm_hash(vm, vm_pool)
|
||||||
dns_teardown(existing_vm)
|
|
||||||
result_list << result
|
result_list << result
|
||||||
end
|
end
|
||||||
# now check they are done
|
# now check they are done
|
||||||
|
|
@ -560,16 +562,6 @@ module Vmpooler
|
||||||
|
|
||||||
# END BASE METHODS
|
# END BASE METHODS
|
||||||
|
|
||||||
def dns_setup(created_instance)
|
|
||||||
dns = Vmpooler::PoolManager::CloudDns.new(project, dns_zone_resource_name)
|
|
||||||
dns.dns_create_or_replace(created_instance)
|
|
||||||
end
|
|
||||||
|
|
||||||
def dns_teardown(created_instance)
|
|
||||||
dns = Vmpooler::PoolManager::CloudDns.new(project, dns_zone_resource_name)
|
|
||||||
dns.dns_teardown(created_instance)
|
|
||||||
end
|
|
||||||
|
|
||||||
def should_be_ignored(item, allowlist)
|
def should_be_ignored(item, allowlist)
|
||||||
return false if allowlist.nil?
|
return false if allowlist.nil?
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue