(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

@ -28,6 +28,10 @@ module Vmpooler
Vmpooler::API.settings.config[:pools]
end
def pools_at_startup
Vmpooler::API.settings.config[:pools_at_startup]
end
def pool_exists?(template)
Vmpooler::API.settings.config[:pool_names].include?(template)
end
@ -289,6 +293,32 @@ module Vmpooler
puts 'd', "[!] [#{poolname}] failed while evaluating usage labels on '#{vmname}' with an error: #{e}"
end
def reset_pool_size(poolname)
result = { 'ok' => false }
pool_index = pool_index(pools)
pools_updated = 0
sync_pool_sizes
pool_size_now = pools[pool_index[poolname]]['size'].to_i
pool_size_original = pools_at_startup[pool_index[poolname]]['size'].to_i
result['pool_size_before_reset'] = pool_size_now
result['pool_size_before_overrides'] = pool_size_original
unless pool_size_now == pool_size_original
pools[pool_index[poolname]]['size'] = pool_size_original
backend.hdel('vmpooler__config__poolsize', poolname)
backend.sadd('vmpooler__pool__undo_size_override', poolname)
pools_updated += 1
status 201
end
status 200 unless pools_updated > 0
result['ok'] = true
result
end
def update_pool_size(payload)
result = { 'ok' => false }
@ -309,6 +339,33 @@ module Vmpooler
result
end
def reset_pool_template(poolname)
result = { 'ok' => false }
pool_index_live = pool_index(pools)
pool_index_original = pool_index(pools_at_startup)
pools_updated = 0
sync_pool_templates
template_now = pools[pool_index_live[poolname]]['template']
template_original = pools_at_startup[pool_index_original[poolname]]['template']
result['template_before_reset'] = template_now
result['template_before_overrides'] = template_original
unless template_now == template_original
pools[pool_index_live[poolname]]['template'] = template_original
backend.hdel('vmpooler__config__template', poolname)
backend.sadd('vmpooler__pool__undo_template_override', poolname)
pools_updated += 1
status 201
end
status 200 unless pools_updated > 0
result['ok'] = true
result
end
def update_pool_template(payload)
result = { 'ok' => false }
@ -1375,6 +1432,26 @@ module Vmpooler
JSON.pretty_generate(result)
end
delete "#{api_prefix}/config/poolsize/:pool/?" do
content_type :json
result = { 'ok' => false }
if config['experimental_features']
need_token! if Vmpooler::API.settings.config[:auth]
if pool_exists?(params[:pool])
result = reset_pool_size(params[:pool])
else
metrics.increment('config.invalid.unknown')
status 404
end
else
status 405
end
JSON.pretty_generate(result)
end
post "#{api_prefix}/config/poolsize/?" do
content_type :json
result = { 'ok' => false }
@ -1406,6 +1483,26 @@ module Vmpooler
JSON.pretty_generate(result)
end
delete "#{api_prefix}/config/pooltemplate/:pool/?" do
content_type :json
result = { 'ok' => false }
if config['experimental_features']
need_token! if Vmpooler::API.settings.config[:auth]
if pool_exists?(params[:pool])
result = reset_pool_template(params[:pool])
else
metrics.increment('config.invalid.unknown')
status 404
end
else
status 405
end
JSON.pretty_generate(result)
end
post "#{api_prefix}/config/pooltemplate/?" do
content_type :json
result = { 'ok' => false }