cinder_qos: Handle python dict for properties

osc changed how dict values are formatted in outputs in 4.0.0 . This
imports the change we earlier made in cinder_type to fix compatibility
between cinder_qos and osc>=4.0.0.

Closes-Bug: #2083822
Change-Id: I74e4f706304ecb07188fc3ae45ea218795efb05c
(cherry picked from commit 3fcf9d907f)
This commit is contained in:
Takashi Kajinami 2024-10-07 16:28:07 +09:00
parent b135e88834
commit d6ca0f7c41
3 changed files with 56 additions and 11 deletions

View File

@ -72,7 +72,7 @@ Puppet::Type.type(:cinder_qos).provide(
:name => qos[:name],
:ensure => :present,
:id => qos[:id],
:properties => string2array(properties),
:properties => parsestring(properties),
:consumer => qos[:consumer],
:associations => string2array(qos[:associations])
})
@ -91,4 +91,23 @@ Puppet::Type.type(:cinder_qos).provide(
def self.string2array(input)
return input.delete("'").split(/,\s/)
end
def self.pythondict2array(input)
json_input = JSON.parse(input.gsub(/'/, '"'))
output = []
json_input.each do | k, v |
output = output + ["#{k}=#{v}"]
end
return output
end
def self.parsestring(input)
if input[0] == '{'
# 4.0.0+ output, python dict
return self.pythondict2array(input)
else
# Pre-4.0.0 output, key=value
return self.string2array(input)
end
end
end

View File

@ -57,7 +57,7 @@ properties="key1=\'value1\', key2=\'value2\'"
it 'finds qos' do
expect(provider_class).to receive(:openstack)
.with('volume qos', 'list', '--quiet', '--format', 'csv', [])
.and_return('"ID","Name","Consumer","Associations","Specs"
.and_return('"ID","Name","Consumer","Associations","Properties"
"28b632e8-6694-4bba-bf68-67b19f619019","qos-1","front-end","my_type1, my_type2","read_iops=\'value1\', write_iops=\'value2\'"
"4f992f69-14ec-4132-9313-55cc06a6f1f6","qos-2","both","",""
')
@ -72,14 +72,26 @@ properties="key1=\'value1\', key2=\'value2\'"
expect(instances[1].associations).to eq([])
expect(instances[1].properties).to eq([])
end
end
#Test with python-openstackclient => 3.8.0 output (column header change from 'Specs' to 'Properties')
describe '#instances' do
it 'finds qos' do
it 'finds qos with a Properties hash' do
expect(provider_class).to receive(:openstack)
.with('volume qos', 'list', '--quiet', '--format', 'csv', [])
.and_return('"ID","Name","Consumer","Associations","Properties"
"28b632e8-6694-4bba-bf68-67b19f619019","qos-1","front-end","my_type1, my_type2","{\'read_iops\': \'value1\', \'write_iops\': \'value2\'}"
"4f992f69-14ec-4132-9313-55cc06a6f1f6","qos-2","both","","{}"
')
instances = provider_class.instances
expect(instances.count).to eq(2)
expect(instances[0].properties).to eq(['read_iops=value1', 'write_iops=value2'])
expect(instances[1].properties).to eq([])
end
#Test with python-openstackclient < 3.8.0 output
#(column header change from 'Specs' to 'Properties')
it 'finds qos with old field name' do
expect(provider_class).to receive(:openstack)
.with('volume qos', 'list', '--quiet', '--format', 'csv', [])
.and_return('"ID","Name","Consumer","Associations","Specs"
"28b632e8-6694-4bba-bf68-67b19f619019","qos-1","front-end","my_type1","read_iops=\'value1\'"
')
instances = provider_class.instances
@ -97,5 +109,24 @@ properties="key1=\'value1\', key2=\'value2\'"
expect(provider_class.string2array(s)).to eq(['key=value', 'key2=value2'])
end
end
describe '#pythondict2array' do
it 'should return an array with key-value when provided with a python dict' do
s = "{'key': 'value', 'key2': 'value2'}"
expect(provider_class.pythondict2array(s)).to eq(['key=value', 'key2=value2'])
end
end
describe '#parsestring' do
it 'should call string2array when provided with a string' do
s = "key='value', key2='value2'"
expect(provider_class.parsestring(s)).to eq(['key=value', 'key2=value2'])
end
it 'should call pythondict2array when provided with a hash' do
s = "{'key': 'value', 'key2': 'value2'}"
expect(provider_class.parsestring(s)).to eq(['key=value', 'key2=value2'])
end
end
end
end

View File

@ -116,11 +116,6 @@ access_project_ids="54f4d231201b4944a5fa4587a09bda23, 54f4d231201b4944a5fa4587a0
end
describe '#pythondict2array' do
it 'should return an array with key-value when provided with a unicode python dict' do
s = "{'key': 'value', 'key2': 'value2'}"
expect(provider_class.pythondict2array(s)).to eq(['key=value', 'key2=value2'])
end
it 'should return an array with key-value when provided with a python dict' do
s = "{'key': 'value', 'key2': 'value2'}"
expect(provider_class.pythondict2array(s)).to eq(['key=value', 'key2=value2'])