mirror of
https://github.com/puppetlabs/vmpooler-provider-vsphere.git
synced 2026-01-26 03:18:41 -05:00
Move vSphere specific methods out of VMPooler
VMPooler has the vSphere provider taken out, moving some vSphere related methods to the provider: 1) pool_folders 2) get_base_folders And the related spec tests. At the same time renaming some configuration and code items to remove harmful terminology. Note this version of the vsphere provider needs to run on vmpooler that also contain the renaming changes (version >2.1)
This commit is contained in:
parent
9b452472f0
commit
81d71b8a13
5 changed files with 118 additions and 107 deletions
|
|
@ -61,7 +61,7 @@ EOT
|
|||
---
|
||||
:config:
|
||||
:providers:
|
||||
:mock:
|
||||
:vsphere:
|
||||
:pools:
|
||||
- name: '#{pool}'
|
||||
size: 1
|
||||
|
|
@ -1060,7 +1060,7 @@ EOT
|
|||
end
|
||||
end
|
||||
|
||||
describe '#purge_unused_vms_and_folders' do
|
||||
describe '#purge_unused_vms_and_resources' do
|
||||
let(:config) { YAML.load(<<-EOT
|
||||
---
|
||||
:config: {}
|
||||
|
|
@ -1074,104 +1074,46 @@ EOT
|
|||
}
|
||||
|
||||
it 'should return when purging is not enabled' do
|
||||
expect(subject.purge_unused_vms_and_folders).to be_nil
|
||||
expect(subject.purge_unused_vms_and_resources).to be_nil
|
||||
end
|
||||
|
||||
context 'with purging enabled globally' do
|
||||
before(:each) do
|
||||
config[:config]['purge_unconfigured_folders'] = true
|
||||
config[:config]['purge_unconfigured_resources'] = 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)
|
||||
expect(subject).to receive(:purge_vms_and_resources)
|
||||
|
||||
subject.purge_unused_vms_and_folders
|
||||
subject.purge_unused_vms_and_resources
|
||||
end
|
||||
|
||||
it 'should log when purging fails' do
|
||||
expect(subject).to receive(:purge_vms_and_folders).and_raise(RuntimeError,'MockError')
|
||||
expect(subject).to receive(:purge_vms_and_resources).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
|
||||
subject.purge_unused_vms_and_resources
|
||||
end
|
||||
end
|
||||
|
||||
context 'with purging enabled on the provider' do
|
||||
before(:each) do
|
||||
config[:providers][:mock]['purge_unconfigured_folders'] = true
|
||||
config[:providers][:mock]['purge_unconfigured_resources'] = 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)
|
||||
expect(subject).to receive(:purge_vms_and_resources)
|
||||
|
||||
subject.purge_unused_vms_and_folders
|
||||
subject.purge_unused_vms_and_resources
|
||||
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' }
|
||||
describe '#purge_vms_and_resources' do
|
||||
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
|
||||
)
|
||||
}
|
||||
|
||||
context 'when evaluating pool folders' do
|
||||
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
|
||||
|
||||
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_name)).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_name) }.to raise_error(RuntimeError, 'mockerror')
|
||||
end
|
||||
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(:allowlist) { nil }
|
||||
let(:config) { YAML.load(<<-EOT
|
||||
---
|
||||
:config: {}
|
||||
|
|
@ -1179,9 +1121,7 @@ EOT
|
|||
:mock_provider: {}
|
||||
:pools:
|
||||
- name: '#{pool}'
|
||||
folder: '#{folder}'
|
||||
size: 1
|
||||
datacenter: '#{datacenter}'
|
||||
provider: '#{provider_name}'
|
||||
EOT
|
||||
)
|
||||
|
|
@ -1194,20 +1134,18 @@ EOT
|
|||
$providers = { provider_name => provider }
|
||||
end
|
||||
|
||||
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)
|
||||
expect(provider).to receive(:provider_config).and_return({})
|
||||
it 'should run purge_unconfigured_resources' do
|
||||
expect(provider).to receive(:purge_unconfigured_resources).with(allowlist)
|
||||
allow(provider).to receive(:provider_config).and_return({})
|
||||
|
||||
subject.purge_vms_and_folders(provider_name)
|
||||
subject.purge_vms_and_resources(provider_name)
|
||||
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(provider).to receive(:provider_config).and_return({})
|
||||
expect(provider).to receive(:purge_unconfigured_resources).with(allowlist).and_raise('mockerror')
|
||||
allow(provider).to receive(:provider_config).and_return({})
|
||||
|
||||
expect{ subject.purge_vms_and_folders(provider_name) }.to raise_error(RuntimeError, 'mockerror')
|
||||
expect{ subject.purge_vms_and_resources(provider_name) }.to raise_error(RuntimeError, 'mockerror')
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -104,36 +104,36 @@ EOT
|
|||
let(:other_folder) { 'folder2' }
|
||||
let(:base_folder) { 'dc1/vm/base' }
|
||||
let(:configured_folders) { { folder_title => base_folder } }
|
||||
let(:whitelist) { nil }
|
||||
let(:allowlist) { nil }
|
||||
it 'should return true when configured_folders includes the folder_title' do
|
||||
expect(subject.folder_configured?(folder_title, base_folder, configured_folders, whitelist)).to be true
|
||||
expect(subject.folder_configured?(folder_title, base_folder, configured_folders, allowlist)).to be true
|
||||
end
|
||||
|
||||
it 'should return false when title is not in configured_folders' do
|
||||
expect(subject.folder_configured?(other_folder, base_folder, configured_folders, whitelist)).to be false
|
||||
expect(subject.folder_configured?(other_folder, base_folder, configured_folders, allowlist)).to be false
|
||||
end
|
||||
|
||||
context 'with another base folder' do
|
||||
let(:base_folder) { 'dc2/vm/base' }
|
||||
let(:configured_folders) { { folder_title => 'dc1/vm/base' } }
|
||||
it 'should return false' do
|
||||
expect(subject.folder_configured?(folder_title, base_folder, configured_folders, whitelist)).to be false
|
||||
expect(subject.folder_configured?(folder_title, base_folder, configured_folders, allowlist)).to be false
|
||||
end
|
||||
end
|
||||
|
||||
context 'with a whitelist set' do
|
||||
let(:whitelist) { [ other_folder ] }
|
||||
context 'with a allowlist set' do
|
||||
let(:allowlist) { [ other_folder ] }
|
||||
it 'should return true' do
|
||||
expect(subject.folder_configured?(other_folder, base_folder, configured_folders, whitelist)).to be true
|
||||
expect(subject.folder_configured?(other_folder, base_folder, configured_folders, allowlist)).to be true
|
||||
end
|
||||
end
|
||||
|
||||
context 'with string whitelist value' do
|
||||
let(:whitelist) { 'whitelist' }
|
||||
context 'with string allowlist value' do
|
||||
let(:allowlist) { 'allowlist' }
|
||||
it 'should raise an error' do
|
||||
expect(whitelist).to receive(:include?).and_raise('mockerror')
|
||||
expect(allowlist).to receive(:include?).and_raise('mockerror')
|
||||
|
||||
expect{ subject.folder_configured?(other_folder, base_folder, configured_folders, whitelist) }.to raise_error(RuntimeError, 'mockerror')
|
||||
expect{ subject.folder_configured?(other_folder, base_folder, configured_folders, allowlist) }.to raise_error(RuntimeError, 'mockerror')
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
@ -297,12 +297,61 @@ EOT
|
|||
end
|
||||
end
|
||||
|
||||
describe '#purge_unconfigured_folders' do
|
||||
describe '#pool_folders' do
|
||||
let(:pool) { 'pool1' }
|
||||
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}"
|
||||
}
|
||||
}
|
||||
context 'when evaluating pool folders' do
|
||||
before do
|
||||
expect(subject).not_to be_nil
|
||||
#replace top-level global config
|
||||
$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
|
||||
)
|
||||
end
|
||||
|
||||
it 'should return a list of pool folders' do
|
||||
expect(subject).to receive(:get_target_datacenter_from_config).with(pool).and_return(datacenter)
|
||||
|
||||
expect(subject.pool_folders(provider_name)).to eq(expected_response)
|
||||
end
|
||||
|
||||
it 'should raise an error when the provider fails to get the datacenter' do
|
||||
expect(subject).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
|
||||
|
||||
describe '#purge_unconfigured_resources' do
|
||||
let(:folder_title) { 'folder1' }
|
||||
let(:base_folder) { 'dc1/vm/base' }
|
||||
let(:folder_object) { mock_RbVmomi_VIM_Folder({ :name => base_folder }) }
|
||||
let(:child_folder) { mock_RbVmomi_VIM_Folder({ :name => folder_title }) }
|
||||
let(:whitelist) { nil }
|
||||
let(:allowlist) { nil }
|
||||
let(:base_folders) { [ base_folder ] }
|
||||
let(:configured_folders) { { folder_title => base_folder } }
|
||||
let(:folder_children) { [ folder_title => child_folder ] }
|
||||
|
|
@ -310,6 +359,7 @@ EOT
|
|||
|
||||
before(:each) do
|
||||
allow(subject).to receive(:connect_to_vsphere).and_return(connection)
|
||||
allow(subject).to receive(:pool_folders).and_return(configured_folders)
|
||||
end
|
||||
|
||||
context 'with an empty folder' do
|
||||
|
|
@ -317,7 +367,7 @@ EOT
|
|||
expect(subject).to receive(:get_folder_children).with(base_folder, connection).and_return(empty_list)
|
||||
expect(subject).to_not receive(:destroy_folder_and_children)
|
||||
|
||||
subject.purge_unconfigured_folders(base_folders, configured_folders, whitelist)
|
||||
subject.purge_unconfigured_resources(allowlist)
|
||||
end
|
||||
end
|
||||
|
||||
|
|
@ -325,7 +375,7 @@ EOT
|
|||
expect(subject).to receive(:get_folder_children).with(base_folder, connection).and_return(folder_children)
|
||||
allow(subject).to receive(:folder_configured?).and_return(true)
|
||||
|
||||
subject.purge_unconfigured_folders(base_folders, configured_folders, whitelist)
|
||||
subject.purge_unconfigured_resources(allowlist)
|
||||
end
|
||||
|
||||
context 'with a folder that is not configured' do
|
||||
|
|
@ -337,14 +387,14 @@ EOT
|
|||
it 'should destroy the folder and children' do
|
||||
expect(subject).to receive(:destroy_folder_and_children).with(child_folder).and_return(nil)
|
||||
|
||||
subject.purge_unconfigured_folders(base_folders, configured_folders, whitelist)
|
||||
subject.purge_unconfigured_resources(allowlist)
|
||||
end
|
||||
end
|
||||
|
||||
it 'should raise any errors' do
|
||||
expect(subject).to receive(:get_folder_children).and_throw('mockerror')
|
||||
|
||||
expect{ subject.purge_unconfigured_folders(base_folders, configured_folders, whitelist) }.to raise_error(/mockerror/)
|
||||
expect{ subject.purge_unconfigured_resources(allowlist) }.to raise_error(/mockerror/)
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue