mirror of
https://github.com/puppetlabs/vmpooler.git
synced 2026-01-26 01:58:41 -05:00
(POOLER-66) Purge vms and folders no longer configured
This commit enables optional purging for vms and folders when they are not configured in the vmpooler provided configuration. Base folders are determined from folders specified in the pool configuration. Then, anything not configured in that folder for that provider and is not a whitelisted folder title will be destroyed. Without this change vmpooler will leave unconfigured vms and folders behind and any vms will be left running forever without manual intervention. Additionally, any associated redis data will never be expired.
This commit is contained in:
parent
7e5ef2f4e5
commit
a34c8dd11b
5 changed files with 585 additions and 0 deletions
|
|
@ -802,6 +802,140 @@ EOT
|
|||
end
|
||||
end
|
||||
|
||||
describe '#purge_unused_vms_and_folders' do
|
||||
let(:config) { YAML.load(<<-EOT
|
||||
---
|
||||
:config: {}
|
||||
:providers:
|
||||
:mock: {}
|
||||
:pools:
|
||||
- name: '#{pool}'
|
||||
size: 1
|
||||
EOT
|
||||
)
|
||||
}
|
||||
|
||||
it 'should return when purging is not enabled' do
|
||||
expect(subject.purge_unused_vms_and_folders).to be_nil
|
||||
end
|
||||
|
||||
context 'with purging enabled globally' do
|
||||
before(:each) do
|
||||
config[:config]['purge_unconfigured_folders'] = true
|
||||
expect(Thread).to receive(:new).and_yield
|
||||
end
|
||||
|
||||
it 'should run a purge for each provider' do
|
||||
expect(subject).to receive(:purge_vms_and_folders)
|
||||
|
||||
subject.purge_unused_vms_and_folders
|
||||
end
|
||||
|
||||
it 'should log when purging fails' do
|
||||
expect(subject).to receive(:purge_vms_and_folders).and_raise(RuntimeError,'MockError')
|
||||
expect(logger).to receive(:log).with('s', '[!] failed while purging provider mock VMs and folders with an error: MockError')
|
||||
|
||||
subject.purge_unused_vms_and_folders
|
||||
end
|
||||
end
|
||||
|
||||
context 'with purging enabled on the provider' do
|
||||
before(:each) do
|
||||
config[:providers][:mock]['purge_unconfigured_folders'] = true
|
||||
expect(Thread).to receive(:new).and_yield
|
||||
end
|
||||
|
||||
it 'should run a purge for the provider' do
|
||||
expect(subject).to receive(:purge_vms_and_folders)
|
||||
|
||||
subject.purge_unused_vms_and_folders
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe '#pool_folders' do
|
||||
let(:folder_name) { 'myinstance' }
|
||||
let(:folder_base) { 'vmpooler' }
|
||||
let(:folder) { [folder_base,folder_name].join('/') }
|
||||
let(:datacenter) { 'dc1' }
|
||||
let(:provider_name) { 'mock_provider' }
|
||||
let(:expected_response) {
|
||||
{
|
||||
folder_name => "#{datacenter}/vm/#{folder_base}"
|
||||
}
|
||||
}
|
||||
let(:config) { YAML.load(<<-EOT
|
||||
---
|
||||
:providers:
|
||||
:mock:
|
||||
:pools:
|
||||
- name: '#{pool}'
|
||||
folder: '#{folder}'
|
||||
size: 1
|
||||
datacenter: '#{datacenter}'
|
||||
provider: '#{provider_name}'
|
||||
- name: '#{pool}2'
|
||||
folder: '#{folder}'
|
||||
size: 1
|
||||
datacenter: '#{datacenter}'
|
||||
provider: '#{provider_name}2'
|
||||
EOT
|
||||
)
|
||||
}
|
||||
|
||||
it 'should return a list of pool folders' do
|
||||
expect(provider).to receive(:get_target_datacenter_from_config).with(pool).and_return(datacenter)
|
||||
|
||||
expect(subject.pool_folders(provider)).to eq(expected_response)
|
||||
end
|
||||
|
||||
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) }.to raise_error(RuntimeError, 'mockerror')
|
||||
end
|
||||
end
|
||||
|
||||
describe '#purge_vms_and_folders' do
|
||||
let(:folder_name) { 'myinstance' }
|
||||
let(:folder_base) { 'vmpooler' }
|
||||
let(:datacenter) { 'dc1' }
|
||||
let(:full_folder_path) { "#{datacenter}/vm/folder_base" }
|
||||
let(:configured_folders) { { folder_name => full_folder_path } }
|
||||
let(:base_folders) { [ full_folder_path ] }
|
||||
let(:folder) { [folder_base,folder_name].join('/') }
|
||||
let(:provider_name) { 'mock_provider' }
|
||||
let(:whitelist) { nil }
|
||||
let(:config) { YAML.load(<<-EOT
|
||||
---
|
||||
:config: {}
|
||||
:providers:
|
||||
:mock_provider: {}
|
||||
:pools:
|
||||
- name: '#{pool}'
|
||||
folder: '#{folder}'
|
||||
size: 1
|
||||
datacenter: '#{datacenter}'
|
||||
provider: '#{provider_name}'
|
||||
EOT
|
||||
)
|
||||
}
|
||||
|
||||
it 'should run purge_unconfigured_folders' do
|
||||
expect(subject).to receive(:pool_folders).and_return(configured_folders)
|
||||
expect(provider).to receive(:purge_unconfigured_folders).with(base_folders, configured_folders, whitelist)
|
||||
|
||||
subject.purge_vms_and_folders(provider)
|
||||
end
|
||||
|
||||
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{ subject.purge_vms_and_folders(provider) }.to raise_error(RuntimeError, 'mockerror')
|
||||
end
|
||||
end
|
||||
|
||||
describe '#create_vm_disk' do
|
||||
let(:provider) { double('provider') }
|
||||
let(:disk_size) { 15 }
|
||||
|
|
@ -2080,6 +2214,8 @@ EOT
|
|||
let(:config) {
|
||||
YAML.load(<<-EOT
|
||||
---
|
||||
:providers:
|
||||
:vsphere: {}
|
||||
:pools:
|
||||
- name: #{pool}
|
||||
- name: 'dummy'
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue