
This change enforces usage of system scope credentials to manage flavors, aggregates, and services, following the new policy rules for SRBAC support in nova. The logic to look up credential for the nova service user from [keystone_authtoken] is left to keep backward compatibility but is deprecated and will be removed. Depends-on: https://review.opendev.org/806474 Depends-on: https://review.opendev.org/828025 Depends-on: https://review.opendev.org/828874 Change-Id: I71779f0f1459d64914589a94a440336386266306
223 lines
6.6 KiB
Ruby
223 lines
6.6 KiB
Ruby
require 'puppet'
|
|
require 'spec_helper'
|
|
require 'puppet/provider/nova_aggregate/openstack'
|
|
|
|
describe Puppet::Type.type(:nova_aggregate).provider(:openstack) do
|
|
|
|
let(:set_env) do
|
|
ENV['OS_USERNAME'] = 'test'
|
|
ENV['OS_PASSWORD'] = 'abc123'
|
|
ENV['OS_SYSTEM_SCOPE'] = 'all'
|
|
ENV['OS_AUTH_URL'] = 'http://127.0.0.1:5000/v3'
|
|
end
|
|
|
|
describe 'managing aggregates' do
|
|
|
|
let(:aggregate_attrs) do
|
|
{
|
|
:name => 'just',
|
|
:availability_zone => 'simple',
|
|
:hosts => ['example'],
|
|
:ensure => 'present',
|
|
:metadata => 'nice=cookie',
|
|
}
|
|
end
|
|
|
|
let(:resource) do
|
|
Puppet::Type::Nova_aggregate.new(aggregate_attrs)
|
|
end
|
|
|
|
let(:provider) do
|
|
described_class.new(resource)
|
|
end
|
|
|
|
before(:each) do
|
|
set_env
|
|
end
|
|
|
|
describe '#instances' do
|
|
it 'finds existing aggregates' do
|
|
described_class.expects(:openstack)
|
|
.with('aggregate', 'list', '--quiet', '--format', 'csv', [])
|
|
.returns('"ID","Name","Availability Zone"
|
|
just,"simple","just"
|
|
')
|
|
described_class.expects(:openstack)
|
|
.with('aggregate', 'show', '--format', 'shell', 'simple')
|
|
.returns('"id="just"
|
|
name="simple"
|
|
availability_zone=just"
|
|
properties="key1=\'tomato\', key2=\'mushroom\'"
|
|
hosts="[]"
|
|
')
|
|
instances = described_class.instances
|
|
expect(instances.count).to eq(1)
|
|
expect(instances[0].name).to eq('simple')
|
|
expect(instances[0].metadata).to eq({"key1"=>"tomato", "key2"=>"mushroom"})
|
|
end
|
|
end
|
|
|
|
describe '#create' do
|
|
it 'creates aggregate' do
|
|
described_class.expects(:openstack)
|
|
.with('aggregate', 'create', '--format', 'shell',
|
|
['just', '--zone', 'simple', '--property', 'nice=cookie' ])
|
|
.returns('name="just"
|
|
id="just"
|
|
availability_zone="simple"
|
|
properties="{u\'nice\': u\'cookie\'}"
|
|
hosts="[]"
|
|
')
|
|
described_class.expects(:openstack)
|
|
.with('aggregate', 'add host', ['just', 'example'])
|
|
.returns('name="just"
|
|
id="just"
|
|
availability_zone="simple"
|
|
properties="{u\'nice\': u\'cookie\'}"
|
|
hosts="[u\'example\']"
|
|
')
|
|
|
|
provider.create
|
|
expect(provider.exists?).to be_truthy
|
|
end
|
|
end
|
|
|
|
describe '#destroy' do
|
|
it 'removes aggregate with hosts' do
|
|
described_class.expects(:openstack)
|
|
.with('aggregate', 'remove host', ['just', 'example'])
|
|
described_class.expects(:openstack)
|
|
.with('aggregate', 'delete', 'just')
|
|
provider.instance_variable_set(:@property_hash, aggregate_attrs)
|
|
provider.destroy
|
|
expect(provider.exists?).to be_falsey
|
|
end
|
|
end
|
|
|
|
describe '#pythondict2hash' do
|
|
it 'should return a hash with key-value when provided with a unicode python dict' do
|
|
s = "{u'key': 'value', u'key2': 'value2'}"
|
|
expect(described_class.pythondict2hash(s)).to eq({"key"=>"value", "key2"=>"value2"})
|
|
end
|
|
|
|
it 'should return a hash with key-value when provided with a python dict' do
|
|
s = "{'key': 'value', 'key2': 'value2'}"
|
|
expect(described_class.pythondict2hash(s)).to eq({"key"=>"value", "key2"=>"value2"})
|
|
end
|
|
end
|
|
|
|
describe '#parsestring' do
|
|
it 'should call string2hash when provided with a string' do
|
|
s = "key='value', key2='value2'"
|
|
expect(described_class.parsestring(s)).to eq({"key"=>"value", "key2"=>"value2"})
|
|
end
|
|
|
|
it 'should call pythondict2hash when provided with a hash' do
|
|
s = "{u'key': 'value', u'key2': 'value2'}"
|
|
expect(described_class.parsestring(s)).to eq({"key"=>"value", "key2"=>"value2"})
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
describe 'managing aggregates with filter_hosts toggled' do
|
|
|
|
# instantiation attributes for the provider with filter_hosts set.
|
|
let(:aggregate_attrs) do
|
|
{
|
|
:name => 'just',
|
|
:availability_zone => 'simple',
|
|
:hosts => ['known'],
|
|
:ensure => 'present',
|
|
:metadata => 'nice=cookie',
|
|
:filter_hosts => 'true'
|
|
}
|
|
end
|
|
|
|
let(:resource) do
|
|
Puppet::Type::Nova_aggregate.new(aggregate_attrs)
|
|
end
|
|
|
|
let(:provider) do
|
|
described_class.new(resource)
|
|
end
|
|
|
|
before(:each) do
|
|
set_env
|
|
end
|
|
|
|
# create an aggregate and actually aggregate hosts to it
|
|
describe 'create aggregate and add/remove hosts with filter_hosts toggled' do
|
|
|
|
it 'creates aggregate with filter_hosts toggled' do
|
|
|
|
provider.class.stubs(:get_known_hosts)
|
|
.returns(['known', 'known_too'])
|
|
|
|
# these expectations are the actual tests that check the provider's behaviour
|
|
# and make sure only known hosts ('known' is the only known host) will be
|
|
# aggregated.
|
|
|
|
described_class.expects(:openstack)
|
|
.with('aggregate', 'create', '--format', 'shell', ['just', '--zone', 'simple', "--property", "nice=cookie"])
|
|
.once
|
|
.returns('name="just"
|
|
id="just"
|
|
availability_zone="simple"
|
|
properties="{u\'nice\': u\'cookie\'}"
|
|
hosts="[]"
|
|
')
|
|
|
|
described_class.expects(:openstack)
|
|
.with('aggregate', 'add host', ['just', 'known'])
|
|
.once
|
|
.returns('name="just"
|
|
id="just"
|
|
availability_zone="simple"
|
|
properties="{u\'nice\': u\'cookie\'}"
|
|
hosts="[u\'known\']"
|
|
')
|
|
|
|
described_class.expects(:openstack)
|
|
.with('aggregate', 'add host', ['just', 'known_too'])
|
|
.once
|
|
.returns('name="just"
|
|
id="just"
|
|
availability_zone="simple"
|
|
properties="{u\'nice\': u\'cookie\'}"
|
|
hosts="[u\'known\', u\'known_too\']"
|
|
')
|
|
|
|
described_class.expects(:openstack)
|
|
.with('aggregate', 'remove host', ['just', 'known'])
|
|
.once
|
|
.returns('name="just"
|
|
id="just"
|
|
availability_zone="simple"
|
|
properties="{u\'nice\': u\'cookie\'}"
|
|
hosts="[u\'known_too\']"
|
|
')
|
|
|
|
# this creates a provider with the attributes defined above as 'aggregate_attrs'
|
|
# and tries to add some hosts and then to remove some hosts.
|
|
# the hosts will be filtered against known active hosts and the expectations
|
|
# described above are the actual tests that check the provider's behaviour
|
|
|
|
provider.create
|
|
property_hash = provider.instance_variable_get(:@property_hash)
|
|
property_hash[:hosts] = ['known']
|
|
provider.instance_variable_set(:@property_hash, property_hash)
|
|
|
|
provider.hosts = ['known', 'known_too', 'unknown']
|
|
property_hash = provider.instance_variable_get(:@property_hash)
|
|
property_hash[:hosts] = ['known', 'known_too']
|
|
provider.instance_variable_set(:@property_hash, property_hash)
|
|
|
|
provider.hosts = ['known_too']
|
|
|
|
end
|
|
end
|
|
end
|
|
|
|
end
|