Fix vmpooler folder purging

This commit updates folder purging references to ensure that provider
name references are referring to the named provider, rather than the
provider type. Without this change folder purging fails because it
cannot identify target folders.
This commit is contained in:
kirby@puppetlabs.com 2020-07-17 16:19:57 -07:00
parent 807daef248
commit ef4ca261d0
2 changed files with 44 additions and 29 deletions

View file

@ -539,15 +539,14 @@ module Vmpooler
def purge_unused_vms_and_folders def purge_unused_vms_and_folders
global_purge = $config[:config]['purge_unconfigured_folders'] global_purge = $config[:config]['purge_unconfigured_folders']
providers = $config[:providers].keys providers = $config[:providers].keys
providers.each do |provider| providers.each do |provider_key|
provider_purge = $config[:providers][provider]['purge_unconfigured_folders'] provider_purge = $config[:providers][provider_key]['purge_unconfigured_folders'] || global_purge
provider_purge = global_purge if provider_purge.nil?
if provider_purge if provider_purge
Thread.new do Thread.new do
begin begin
purge_vms_and_folders($providers[provider.to_s]) purge_vms_and_folders(provider_key)
rescue StandardError => e rescue StandardError => e
$logger.log('s', "[!] failed while purging provider #{provider} VMs and folders with an error: #{e}") $logger.log('s', "[!] failed while purging provider #{provider_key} VMs and folders with an error: #{e}")
end end
end end
end end
@ -556,14 +555,13 @@ module Vmpooler
end end
# Return a list of pool folders # Return a list of pool folders
def pool_folders(provider) def pool_folders(provider_name)
provider_name = provider.name
folders = {} folders = {}
$config[:pools].each do |pool| $config[:pools].each do |pool|
next unless pool['provider'] == provider_name next unless pool['provider'] == provider_name.to_s
folder_parts = pool['folder'].split('/') folder_parts = pool['folder'].split('/')
datacenter = provider.get_target_datacenter_from_config(pool['name']) datacenter = $providers[provider_name.to_s].get_target_datacenter_from_config(pool['name'])
folders[folder_parts.pop] = "#{datacenter}/vm/#{folder_parts.join('/')}" folders[folder_parts.pop] = "#{datacenter}/vm/#{folder_parts.join('/')}"
end end
folders folders
@ -577,8 +575,9 @@ module Vmpooler
base.uniq base.uniq
end end
def purge_vms_and_folders(provider) def purge_vms_and_folders(provider_name)
configured_folders = pool_folders(provider) provider = $providers[provider_name.to_s]
configured_folders = pool_folders(provider_name)
base_folders = get_base_folders(configured_folders) base_folders = get_base_folders(configured_folders)
whitelist = provider.provider_config['folder_whitelist'] whitelist = provider.provider_config['folder_whitelist']
provider.purge_unconfigured_folders(base_folders, configured_folders, whitelist) provider.purge_unconfigured_folders(base_folders, configured_folders, whitelist)

View file

@ -1418,16 +1418,24 @@ EOT
) )
} }
it 'should return a list of pool folders' do context 'when evaluating pool folders' do
expect(provider).to receive(:get_target_datacenter_from_config).with(pool).and_return(datacenter) before do
expect(subject).not_to be_nil
# Inject mock provider into global variable - Note this is a code smell
$providers = { provider_name => provider }
end
expect(subject.pool_folders(provider)).to eq(expected_response) it 'should return a list of pool folders' do
end expect(provider).to receive(:get_target_datacenter_from_config).with(pool).and_return(datacenter)
it 'should raise an error when the provider fails to get the datacenter' do expect(subject.pool_folders(provider_name)).to eq(expected_response)
expect(provider).to receive(:get_target_datacenter_from_config).with(pool).and_raise('mockerror') end
expect{ subject.pool_folders(provider) }.to raise_error(RuntimeError, 'mockerror') it 'should raise an error when the provider fails to get the datacenter' do
expect(provider).to receive(:get_target_datacenter_from_config).with(pool).and_raise('mockerror')
expect{ subject.pool_folders(provider_name) }.to raise_error(RuntimeError, 'mockerror')
end
end end
end end
@ -1456,20 +1464,28 @@ EOT
) )
} }
it 'should run purge_unconfigured_folders' do context 'when purging folders' do
expect(subject).to receive(:pool_folders).and_return(configured_folders) before do
expect(provider).to receive(:purge_unconfigured_folders).with(base_folders, configured_folders, whitelist) expect(subject).not_to be_nil
expect(provider).to receive(:provider_config).and_return({}) # Inject mock provider into global variable - Note this is a code smell
$providers = { provider_name => provider }
end
subject.purge_vms_and_folders(provider) it 'should run purge_unconfigured_folders' do
end expect(subject).to receive(:pool_folders).and_return(configured_folders)
expect(provider).to receive(:purge_unconfigured_folders).with(base_folders, configured_folders, whitelist)
expect(provider).to receive(:provider_config).and_return({})
it 'should raise any errors' do subject.purge_vms_and_folders(provider_name)
expect(subject).to receive(:pool_folders).and_return(configured_folders) end
expect(provider).to receive(:purge_unconfigured_folders).with(base_folders, configured_folders, whitelist).and_raise('mockerror')
expect(provider).to receive(:provider_config).and_return({})
expect{ subject.purge_vms_and_folders(provider) }.to raise_error(RuntimeError, 'mockerror') it 'should raise any errors' do
expect(subject).to receive(:pool_folders).and_return(configured_folders)
expect(provider).to receive(:purge_unconfigured_folders).with(base_folders, configured_folders, whitelist).and_raise('mockerror')
expect(provider).to receive(:provider_config).and_return({})
expect{ subject.purge_vms_and_folders(provider_name) }.to raise_error(RuntimeError, 'mockerror')
end
end end
end end