mirror of
https://github.com/puppetlabs/vmpooler.git
synced 2026-01-26 10:08:40 -05:00
(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:
parent
6db71d8589
commit
a0caa41a54
7 changed files with 409 additions and 6 deletions
|
|
@ -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
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue