nova_flavor: Fix broken idempotency with properties

Make sure that nova_flavor resource is idempotent when the "properties"
property is set. Also fix the typo causing undefined method error.

Closes-Bug: #2059949
Change-Id: I17a9d92c44b8dfe329b22b309d7a0408df707d1a
This commit is contained in:
Takashi Kajinami 2024-04-02 00:18:03 +09:00
parent 5eacb81147
commit 820695b463
3 changed files with 51 additions and 3 deletions

View File

@ -27,7 +27,7 @@ Puppet::Type.type(:nova_flavor).provide(
(opts << '--swap' << @resource[:swap]) if @resource[:swap] (opts << '--swap' << @resource[:swap]) if @resource[:swap]
(opts << '--rxtx-factor' << @resource[:rxtx_factor]) if @resource[:rxtx_factor] (opts << '--rxtx-factor' << @resource[:rxtx_factor]) if @resource[:rxtx_factor]
@property_hash = self.class.request('flavor', 'create', opts) @property_hash = self.class.request('flavor', 'create', opts)
if @resource[:properties] and !(@resources[:properties].empty?) if @resource[:properties] and !(@resource[:properties].empty?)
prop_opts = [@resource[:name]] prop_opts = [@resource[:name]]
prop_opts << props_to_s(@resource[:properties]) prop_opts << props_to_s(@resource[:properties])
self.class.request('flavor', 'set', prop_opts) self.class.request('flavor', 'set', prop_opts)
@ -118,7 +118,7 @@ Puppet::Type.type(:nova_flavor).provide(
project_name = '' project_name = ''
end end
properties = Hash[attrs[:properties].scan(/(\S+)='([^']*)'/)] rescue nil properties = JSON.parse(attrs[:properties].gsub(/'/, '"'))
new( new(
:ensure => :present, :ensure => :present,
:name => attrs[:name], :name => attrs[:name],

View File

@ -40,7 +40,8 @@ describe 'basic nova' do
disk => '1', disk => '1',
vcpus => '1', vcpus => '1',
is_public => 'False', is_public => 'False',
project_name => 'services' project_name => 'services',
properties => {'foo' => 'bar'}
} }
EOS EOS

View File

@ -138,6 +138,53 @@ domain_id="domain_one_id"
end end
end end
describe '#instances' do
it 'finds existing services' do
expect(described_class).to receive(:openstack)
.with('flavor', 'list', '--quiet', '--format', 'csv', ['--long', '--all'])
.and_return('"ID","Name","RAM","Disk","Ephemeral","VCPUs","Is Public","Swap","RXTX Factor","Properties"
"1","m1.tiny",128,2,0,1,True,0,1.0,"{}"
"42","m1.nano",256,2,0,1,False,0,1.0,"{\'key1\': \'val1\', \'key2\': \'val2\'}"
')
expect(described_class).to receive(:openstack)
.with('flavor', 'show', '--format', 'shell', ['1', '-c', 'access_project_ids'])
.and_return('access_project_ids="None"
')
expect(described_class).to receive(:openstack)
.with('flavor', 'show', '--format', 'shell', ['42', '-c', 'access_project_ids'])
.and_return('access_project_ids="None"
')
instances = described_class.instances
expect(instances.count).to eq(2)
expect(instances[0].name).to eq('m1.tiny')
expect(instances[0].id).to eq('1')
expect(instances[0].ram).to eq('128')
expect(instances[0].disk).to eq('2')
expect(instances[0].ephemeral).to eq('0')
expect(instances[0].vcpus).to eq('1')
expect(instances[0].is_public).to eq(true)
expect(instances[0].swap).to eq('0')
expect(instances[0].rxtx_factor).to eq('1.0')
expect(instances[0].properties).to eq({})
expect(instances[0].project).to eq('')
expect(instances[0].project_name).to eq('')
expect(instances[1].name).to eq('m1.nano')
expect(instances[1].id).to eq('42')
expect(instances[1].ram).to eq('256')
expect(instances[1].disk).to eq('2')
expect(instances[1].ephemeral).to eq('0')
expect(instances[1].vcpus).to eq('1')
expect(instances[1].is_public).to eq(false)
expect(instances[1].swap).to eq('0')
expect(instances[1].rxtx_factor).to eq('1.0')
expect(instances[1].properties).to eq({'key1' => 'val1', 'key2' => 'val2'})
expect(instances[1].project).to eq('')
expect(instances[1].project_name).to eq('')
end
end
describe '#flush' do describe '#flush' do
context '.project' do context '.project' do
it 'updates flavor' do it 'updates flavor' do