(DIO-2675) Undo pool size template overrides

This implements a delete method for pooltemplate and poolsize. The API
removes the override from Redis and then adds an entry in Redis that
causes the pool manager to wake up and process the removal of the
override.

To facilitate this, a new variable has been created in lib/vmpooler.rb
to hold a copy of the original / pre-override config. This supplemental
copy of the pools is then indexed for use as a reference.

When pool manager wakes up to process an override removal, it looks up
the pre-override value from the config via the new variables mentioned
above.

Just as with entering overrides, no restart is needed. Template and pool
size changes are logged so that anyone watching or reviewing the logs
can see what happened when. The new API endpoints also return values for
both the pre-revert and post-revert value.
This commit is contained in:
Gene Liverman 2021-10-14 15:08:55 -04:00
parent 6db71d8589
commit a0caa41a54
No known key found for this signature in database
GPG key ID: 3AF83985B6C857C6
7 changed files with 409 additions and 6 deletions

View file

@ -784,6 +784,10 @@ module Vmpooler
# - Fires when a pool reset is requested
# - Additional options
# :poolname
# :undo_override
# - Fires when a pool override removal is requested
# - Additional options
# :poolname
#
def sleep_with_wakeup_events(loop_delay, wakeup_period = 5, options = {})
exit_by = Time.now + loop_delay
@ -826,6 +830,11 @@ module Vmpooler
break if pending
end
if options[:undo_override]
break if redis.sismember('vmpooler__pool__undo_template_override', options[:poolname])
break if redis.sismember('vmpooler__pool__undo_size_override', options[:poolname])
end
if options[:pending_vm]
pending_vm_count = redis.scard("vmpooler__pending__#{options[:poolname]}")
break unless pending_vm_count == 0
@ -880,7 +889,7 @@ module Vmpooler
loop_delay = (loop_delay * loop_delay_decay).to_i
loop_delay = loop_delay_max if loop_delay > loop_delay_max
end
sleep_with_wakeup_events(loop_delay, loop_delay_min, pool_size_change: true, poolname: pool['name'], pool_template_change: true, clone_target_change: true, pending_vm: true, pool_reset: true)
sleep_with_wakeup_events(loop_delay, loop_delay_min, pool_size_change: true, poolname: pool['name'], pool_template_change: true, clone_target_change: true, pending_vm: true, pool_reset: true, undo_override: true)
unless maxloop == 0
break if loop_count >= maxloop
@ -1040,15 +1049,18 @@ module Vmpooler
return if mutex.locked?
@redis.with_metrics do |redis|
poolsize = redis.hget('vmpooler__config__poolsize', pool['name'])
break if poolsize.nil?
pool_size_requested = redis.hget('vmpooler__config__poolsize', pool['name'])
break if pool_size_requested.nil?
poolsize = Integer(poolsize)
break if poolsize == pool['size']
pool_size_requested = Integer(pool_size_requested)
pool_size_currently = pool['size']
break if pool_size_requested == pool_size_currently
mutex.synchronize do
pool['size'] = poolsize
pool['size'] = pool_size_requested
end
$logger.log('s', "[*] [#{pool['name']}] size updated from #{pool_size_currently} to #{pool_size_requested}")
end
end
@ -1066,6 +1078,38 @@ module Vmpooler
end
end
def undo_override(pool, provider)
poolname = pool['name']
mutex = pool_mutex(poolname)
return if mutex.locked?
@redis.with_metrics do |redis|
break unless redis.sismember('vmpooler__pool__undo_template_override', poolname)
redis.srem('vmpooler__pool__undo_template_override', poolname)
template_now = pool['template']
template_original = $config[:pools_at_startup][$config[:pool_index][poolname]]['template']
mutex.synchronize do
update_pool_template(pool, provider, template_original, template_now, redis)
end
end
@redis.with_metrics do |redis|
break unless redis.sismember('vmpooler__pool__undo_size_override', poolname)
redis.srem('vmpooler__pool__undo_size_override', poolname)
pool_size_now = pool['size']
pool_size_original = $config[:pools_at_startup][$config[:pool_index][poolname]]['size']
mutex.synchronize do
pool['size'] = pool_size_original
end
$logger.log('s', "[*] [#{poolname}] size updated from #{pool_size_now} to #{pool_size_original}")
end
end
def create_inventory(pool, provider, pool_check_response)
inventory = {}
begin
@ -1300,6 +1344,9 @@ module Vmpooler
# Reset a pool when poolreset is requested from the API
reset_pool(pool)
# Undo overrides submitted via the api
undo_override(pool, provider)
pool_check_response
end