mirror of
https://github.com/puppetlabs/vmpooler.git
synced 2026-01-26 10:08:40 -05:00
First attempt at adding connection pool to pool manager
This commit is contained in:
parent
70f0482d33
commit
52bf6c4c89
5 changed files with 498 additions and 413 deletions
|
|
@ -110,7 +110,7 @@ module Vmpooler
|
|||
# Create an index of pool aliases
|
||||
parsed_config[:pool_names] = Set.new
|
||||
unless parsed_config[:pools]
|
||||
redis = new_redis(parsed_config[:redis]['server'], parsed_config[:redis]['port'], parsed_config[:redis]['password'])
|
||||
redis = redis_connection(parsed_config[:redis]['server'], parsed_config[:redis]['port'], parsed_config[:redis]['password'])
|
||||
parsed_config[:pools] = load_pools_from_redis(redis)
|
||||
end
|
||||
|
||||
|
|
@ -156,7 +156,7 @@ module Vmpooler
|
|||
pools
|
||||
end
|
||||
|
||||
def self.new_redis(host = 'localhost', port = nil, password = nil)
|
||||
def self.redis_connection(host = 'localhost', port = nil, password = nil)
|
||||
Redis.new(host: host, port: port, password: password)
|
||||
end
|
||||
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -14,10 +14,11 @@ module Vmpooler
|
|||
# Provider options passed in during initialization
|
||||
attr_reader :provider_options
|
||||
|
||||
def initialize(config, logger, metrics, name, options)
|
||||
def initialize(config, logger, metrics, redis_connection_pool, name, options)
|
||||
@config = config
|
||||
@logger = logger
|
||||
@metrics = metrics
|
||||
@redis = redis_connection_pool
|
||||
@provider_name = name
|
||||
|
||||
# Ensure that there is not a nil provider configuration
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@ module Vmpooler
|
|||
attr_reader :connection_pool
|
||||
|
||||
def initialize(config, logger, metrics, name, options)
|
||||
super(config, logger, metrics, name, options)
|
||||
super(config, logger, metrics, redis_connection_pool, name, options)
|
||||
|
||||
task_limit = global_config[:config].nil? || global_config[:config]['task_limit'].nil? ? 10 : global_config[:config]['task_limit'].to_i
|
||||
# The default connection pool size is:
|
||||
|
|
@ -39,6 +39,7 @@ module Vmpooler
|
|||
end
|
||||
@provider_hosts = {}
|
||||
@provider_hosts_lock = Mutex.new
|
||||
@redis = redis
|
||||
end
|
||||
|
||||
# name of the provider class
|
||||
|
|
@ -59,12 +60,16 @@ module Vmpooler
|
|||
def destroy_vm_and_log(vm_name, vm_object, pool, data_ttl)
|
||||
try = 0 if try.nil?
|
||||
max_tries = 3
|
||||
$redis.srem("vmpooler__completed__#{pool}", vm_name)
|
||||
$redis.hdel("vmpooler__active__#{pool}", vm_name)
|
||||
$redis.hset("vmpooler__vm__#{vm_name}", 'destroy', Time.now)
|
||||
@redis.with do |redis|
|
||||
redis.multi
|
||||
redis.srem("vmpooler__completed__#{pool}", vm_name)
|
||||
redis.hdel("vmpooler__active__#{pool}", vm_name)
|
||||
redis.hset("vmpooler__vm__#{vm_name}", 'destroy', Time.now)
|
||||
|
||||
# Auto-expire metadata key
|
||||
$redis.expire('vmpooler__vm__' + vm_name, (data_ttl * 60 * 60))
|
||||
# Auto-expire metadata key
|
||||
redis.expire('vmpooler__vm__' + vm_name, (data_ttl * 60 * 60))
|
||||
redis.exec
|
||||
end
|
||||
|
||||
start = Time.now
|
||||
|
||||
|
|
@ -968,9 +973,13 @@ module Vmpooler
|
|||
begin
|
||||
connection = ensured_vsphere_connection(pool_object)
|
||||
vm_hash = get_vm_details(pool_name, vm_name, connection)
|
||||
$redis.hset("vmpooler__vm__#{vm_name}", 'host', vm_hash['host_name'])
|
||||
@redis.with do |redis|
|
||||
redis.multi
|
||||
redis.hset("vmpooler__vm__#{vm_name}", 'host', vm_hash['host_name'])
|
||||
migration_count = redis.scard('vmpooler__migration')
|
||||
redis.exec
|
||||
end
|
||||
migration_limit = @config[:config]['migration_limit'] if @config[:config].key?('migration_limit')
|
||||
migration_count = $redis.scard('vmpooler__migration')
|
||||
if migration_enabled? @config
|
||||
if migration_count >= migration_limit
|
||||
logger.log('s', "[ ] [#{pool_name}] '#{vm_name}' is running on #{vm_hash['host_name']}. No migration will be evaluated since the migration_limit has been reached")
|
||||
|
|
@ -993,15 +1002,23 @@ module Vmpooler
|
|||
end
|
||||
|
||||
def migrate_vm_to_new_host(pool_name, vm_name, vm_hash, connection)
|
||||
$redis.sadd('vmpooler__migration', vm_name)
|
||||
@redis.with do |redis|
|
||||
redis.sadd('vmpooler__migration', vm_name)
|
||||
end
|
||||
target_host_name = select_next_host(pool_name, @provider_hosts, vm_hash['architecture'])
|
||||
target_host_object = find_host_by_dnsname(connection, target_host_name)
|
||||
finish = migrate_vm_and_record_timing(pool_name, vm_name, vm_hash, target_host_object, target_host_name)
|
||||
$redis.hset("vmpooler__vm__#{vm_name}", 'host', target_host_name)
|
||||
$redis.hset("vmpooler__vm__#{vm_name}", 'migrated', true)
|
||||
@redis.with do |redis|
|
||||
redis.multi
|
||||
redis.hset("vmpooler__vm__#{vm_name}", 'host', target_host_name)
|
||||
redis.hset("vmpooler__vm__#{vm_name}", 'migrated', true)
|
||||
redis.exec
|
||||
end
|
||||
logger.log('s', "[>] [#{pool_name}] '#{vm_name}' migrated from #{vm_hash['host_name']} to #{target_host_name} in #{finish} seconds")
|
||||
ensure
|
||||
$redis.srem('vmpooler__migration', vm_name)
|
||||
@redis.with do |redis|
|
||||
redis.srem('vmpooler__migration', vm_name)
|
||||
end
|
||||
end
|
||||
|
||||
def migrate_vm_and_record_timing(pool_name, vm_name, vm_hash, target_host_object, dest_host_name)
|
||||
|
|
@ -1011,9 +1028,13 @@ module Vmpooler
|
|||
metrics.timing("migrate.#{pool_name}", finish)
|
||||
metrics.increment("migrate_from.#{vm_hash['host_name']}")
|
||||
metrics.increment("migrate_to.#{dest_host_name}")
|
||||
checkout_to_migration = format('%<time>.2f', time: Time.now - Time.parse($redis.hget("vmpooler__vm__#{vm_name}", 'checkout')))
|
||||
$redis.hset("vmpooler__vm__#{vm_name}", 'migration_time', finish)
|
||||
$redis.hset("vmpooler__vm__#{vm_name}", 'checkout_to_migration', checkout_to_migration)
|
||||
@redis.with do |redis|
|
||||
checkout_to_migration = format('%<time>.2f', time: Time.now - Time.parse(redis.hget("vmpooler__vm__#{vm_name}", 'checkout')))
|
||||
redis.multi
|
||||
redis.hset("vmpooler__vm__#{vm_name}", 'migration_time', finish)
|
||||
redis.hset("vmpooler__vm__#{vm_name}", 'checkout_to_migration', checkout_to_migration)
|
||||
redis.exec
|
||||
end
|
||||
finish
|
||||
end
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue