mirror of
https://github.com/puppetlabs/vmpooler.git
synced 2026-01-26 01:58:41 -05:00
Connect domain settings to pools, create v2 API
This commit is contained in:
parent
7786c9193e
commit
6b9eb2369f
19 changed files with 3964 additions and 19 deletions
|
|
@ -60,6 +60,7 @@ module Vmpooler
|
|||
to_set[k] = pool[k]
|
||||
end
|
||||
to_set['alias'] = pool['alias'].join(',') if to_set.key?('alias')
|
||||
to_set['domain'] = get_domain_for_pool(pool['name'])
|
||||
redis.hmset("vmpooler__pool__#{pool['name']}", to_set.to_a.flatten) unless to_set.empty?
|
||||
end
|
||||
previously_configured_pools.each do |pool|
|
||||
|
|
@ -361,35 +362,39 @@ module Vmpooler
|
|||
max_hostname_retries = 3
|
||||
while hostname_retries < max_hostname_retries
|
||||
hostname, hostname_available = generate_and_check_hostname
|
||||
domain = $config[:config]['domain']
|
||||
dns_ip, dns_available = check_dns_available(hostname, domain)
|
||||
domain = get_domain_for_pool(pool_name)
|
||||
if domain
|
||||
fqdn = "#{hostname}.#{domain}"
|
||||
else
|
||||
fqdn = hostname
|
||||
end
|
||||
dns_ip, dns_available = check_dns_available(fqdn)
|
||||
break if hostname_available && dns_available
|
||||
|
||||
hostname_retries += 1
|
||||
|
||||
if !hostname_available
|
||||
$metrics.increment("errors.duplicatehostname.#{pool_name}")
|
||||
$logger.log('s', "[!] [#{pool_name}] Generated hostname #{hostname} was not unique (attempt \##{hostname_retries} of #{max_hostname_retries})")
|
||||
$logger.log('s', "[!] [#{pool_name}] Generated hostname #{fqdn} was not unique (attempt \##{hostname_retries} of #{max_hostname_retries})")
|
||||
elsif !dns_available
|
||||
$metrics.increment("errors.staledns.#{pool_name}")
|
||||
$logger.log('s', "[!] [#{pool_name}] Generated hostname #{hostname} already exists in DNS records (#{dns_ip}), stale DNS")
|
||||
$logger.log('s', "[!] [#{pool_name}] Generated hostname #{fqdn} already exists in DNS records (#{dns_ip}), stale DNS")
|
||||
end
|
||||
end
|
||||
|
||||
raise "Unable to generate a unique hostname after #{hostname_retries} attempts. The last hostname checked was #{hostname}" unless hostname_available && dns_available
|
||||
raise "Unable to generate a unique hostname after #{hostname_retries} attempts. The last hostname checked was #{fqdn}" unless hostname_available && dns_available
|
||||
|
||||
hostname
|
||||
fqdn
|
||||
end
|
||||
|
||||
def check_dns_available(vm_name, domain = nil)
|
||||
# Query the DNS for the name we want to create and if it already exists, mark it unavailable
|
||||
# This protects against stale DNS records
|
||||
vm_name = "#{vm_name}.#{domain}" if domain
|
||||
# Query the DNS for the name we want to create and if it already exists, mark it unavailable
|
||||
# This protects against stale DNS records
|
||||
def check_dns_available(vm_name)
|
||||
begin
|
||||
dns_ip = Resolv.getaddress(vm_name)
|
||||
rescue Resolv::ResolvError
|
||||
# this is the expected case, swallow the error
|
||||
# eg "no address for blah-daisy"
|
||||
# eg "no address for blah-daisy.example.com"
|
||||
return ['', true]
|
||||
end
|
||||
[dns_ip, false]
|
||||
|
|
@ -397,6 +402,7 @@ module Vmpooler
|
|||
|
||||
def _clone_vm(pool_name, provider, request_id = nil, pool_alias = nil)
|
||||
new_vmname = find_unique_hostname(pool_name)
|
||||
pool_domain = get_domain_for_pool(pool_name)
|
||||
mutex = vm_mutex(new_vmname)
|
||||
mutex.synchronize do
|
||||
@redis.with_metrics do |redis|
|
||||
|
|
@ -406,6 +412,7 @@ module Vmpooler
|
|||
redis.hset("vmpooler__vm__#{new_vmname}", 'clone', Time.now)
|
||||
redis.hset("vmpooler__vm__#{new_vmname}", 'template', pool_name) # This value is used to represent the pool.
|
||||
redis.hset("vmpooler__vm__#{new_vmname}", 'pool', pool_name)
|
||||
redis.hset("vmpooler__vm__#{new_vmname}", 'domain', pool_domain) if pool_domain
|
||||
redis.hset("vmpooler__vm__#{new_vmname}", 'request_id', request_id) if request_id
|
||||
redis.hset("vmpooler__vm__#{new_vmname}", 'pool_alias', pool_alias) if pool_alias
|
||||
redis.exec
|
||||
|
|
@ -658,6 +665,27 @@ module Vmpooler
|
|||
$providers[provider_name]
|
||||
end
|
||||
|
||||
# @param pool_name [String] - the name of the pool
|
||||
# @return [String] - domain name for pool, if set
|
||||
def get_domain_for_pool(pool_name)
|
||||
pool = $config[:pools].find { |p| p['name'] == pool_name }
|
||||
return nil unless pool
|
||||
|
||||
provider_name = pool.fetch('provider', nil)
|
||||
return nil unless provider_name
|
||||
|
||||
$logger.log('d', "[*] [get_domain_for_pool] #{pool_name}'s provider is #{provider_name}")
|
||||
if config[:providers] && config[:providers][provider_name.to_sym] && config[:providers][provider_name.to_sym]['domain']
|
||||
domain = config[:providers][provider_name.to_sym]['domain']
|
||||
elsif config[:config] && config[:config]['domain']
|
||||
domain = config[:config]['domain']
|
||||
else
|
||||
domain = nil
|
||||
end
|
||||
|
||||
domain
|
||||
end
|
||||
|
||||
def check_disk_queue(maxloop = 0, loop_delay = 5)
|
||||
$logger.log('d', '[*] [disk_manager] starting worker thread')
|
||||
|
||||
|
|
@ -879,7 +907,7 @@ module Vmpooler
|
|||
loop_count = 1
|
||||
loop_delay = loop_delay_min
|
||||
provider = get_provider_for_pool(pool['name'])
|
||||
raise("Could not find provider '#{pool['provider']}") if provider.nil?
|
||||
raise("Could not find provider '#{pool['provider']}'") if provider.nil?
|
||||
|
||||
sync_pool_template(pool)
|
||||
loop do
|
||||
|
|
@ -1366,7 +1394,7 @@ module Vmpooler
|
|||
|
||||
return provider_klass.const_get(classname).new(config, logger, metrics, redis_connection_pool, provider_name, options)
|
||||
end
|
||||
raise("Provider '#{provider_class}' is unknown for pool with provider name '#{provider_name}'") if provider.nil?
|
||||
raise("Provider '#{provider_class}' is unknown for pool with provider name '#{provider_name}'") if provider_klass.nil?
|
||||
end
|
||||
|
||||
def check_ondemand_requests(maxloop = 0,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue