provider_class = Puppet::Type.type(:keystone_tenant).provider(:openstack)
+class Puppet::Provider::Keystone
+ def self.reset
+ @admin_endpoint = nil
+ @tenant_hash = nil
+ @admin_token = nil
+ @keystone_file = nil
+ @domain_id_to_name = nil
+ @default_domain_id = nil
+ @domain_hash = nil
+ end
+end
+
describe provider_class do
- describe 'when updating a tenant' do
-
- let(:tenant_attrs) do
- {
- :name => 'foo',
- :description => 'foo',
- :ensure => 'present',
- :enabled => 'True',
- :auth => {
- 'username' => 'test',
- 'password' => 'abc123',
- 'tenant_name' => 'foo',
- 'auth_url' => 'http://127.0.0.1:5000/v2.0',
- }
- }
- end
+ after :each do
+ provider_class.reset
+ end
- let(:resource) do
- Puppet::Type::Keystone_tenant.new(tenant_attrs)
- end
+ let(:tenant_attrs) do
+ {
+ :name => 'foo',
+ :description => 'foo',
+ :ensure => 'present',
+ :enabled => 'True',
+ }
+ end
- let(:provider) do
- provider_class.new(resource)
- end
+ let(:resource) do
+ Puppet::Type::Keystone_tenant.new(tenant_attrs)
+ end
- describe '#create' do
- it 'creates a tenant' do
- provider.class.stubs(:openstack)
- .with('project', 'list', '--quiet', '--format', 'csv', [['--long', '--os-username', 'test', '--os-password', 'abc123', '--os-tenant-name', 'foo', '--os-auth-url', 'http://127.0.0.1:5000/v2.0']])
- .returns('"ID","Name","Description","Enabled"
-"1cb05cfed7c24279be884ba4f6520262","foo","foo",True
+ let(:provider) do
+ provider_class.new(resource)
+ end
+
+ def before_hook(domainlist)
+ if domainlist
+ provider.class.expects(:openstack).once
+ .with('domain', 'list', '--quiet', '--format', 'csv', [])
+ .returns('"ID","Name","Enabled","Description"
+"foo_domain_id","foo_domain",True,"foo domain"
+"bar_domain_id","bar_domain",True,"bar domain"
+"another_domain_id","another_domain",True,"another domain"
+"disabled_domain_id","disabled_domain",False,"disabled domain"
+"default","Default",True,"the default domain"
')
- provider.class.stubs(:openstack)
- .with('project', 'create', '--format', 'shell', [['foo', '--enable', '--description', 'foo', '--os-username', 'test', '--os-password', 'abc123', '--os-tenant-name', 'foo', '--os-auth-url', 'http://127.0.0.1:5000/v2.0']])
- .returns('description="foo"
+ end
+ end
+
+ before :each, :domainlist => true do
+ before_hook(true)
+ end
+
+ before :each, :domainlist => false do
+ before_hook(false)
+ end
+
+ shared_examples 'authenticated with environment variables' do
+ ENV['OS_USERNAME'] = 'test'
+ ENV['OS_PASSWORD'] = 'abc123'
+ ENV['OS_PROJECT_NAME'] = 'test'
+ ENV['OS_AUTH_URL'] = 'http://127.0.0.1:35357/v3'
+ end
+
+ describe 'when managing a tenant' do
+
+ it_behaves_like 'authenticated with environment variables' do
+ describe '#create', :domainlist => true do
+ it 'creates a tenant' do
+ provider.class.expects(:openstack)
+ .with('project', 'create', '--format', 'shell', ['foo', '--enable', '--description', 'foo', '--domain', 'Default'])
+ .returns('description="foo"
enabled="True"
name="foo"
+id="foo"
+domain_id="foo_domain_id"
')
- provider.create
- expect(provider.exists?).to be_truthy
+ provider.create
+ expect(provider.exists?).to be_truthy
+ end
end
- end
- describe '#destroy' do
- it 'destroys a tenant' do
- provider.class.stubs(:openstack)
- .with('project', 'list', '--quiet', '--format', 'csv', [['--long', '--os-username', 'test', '--os-password', 'abc123', '--os-tenant-name', 'foo', '--os-auth-url', 'http://127.0.0.1:5000/v2.0']])
- .returns('"ID","Name","Description","Enabled"')
- provider.class.stubs(:openstack)
- .with('project', 'delete', [['foo', '--os-username', 'test', '--os-password', 'abc123', '--os-tenant-name', 'foo', '--os-auth-url', 'http://127.0.0.1:5000/v2.0']])
- provider.destroy
- expect(provider.exists?).to be_falsey
+ describe '#destroy', :domainlist => false do
+ it 'destroys a tenant' do
+ provider.instance_variable_get('@property_hash')[:id] = 'my-project-id'
+ provider.class.expects(:openstack)
+ .with('project', 'delete', 'my-project-id')
+ provider.destroy
+ expect(provider.exists?).to be_falsey
+ end
end
- end
+ context 'when tenant does not exist', :domainlist => false do
+ subject(:response) do
+ response = provider.exists?
+ end
- describe '#exists' do
- context 'when tenant exists' do
+ it { expect(response).to be_falsey }
+ end
- subject(:response) do
- provider.class.stubs(:openstack)
- .with('project', 'list', '--quiet', '--format', 'csv', [['--long', '--os-username', 'test', '--os-password', 'abc123', '--os-tenant-name', 'foo', '--os-auth-url', 'http://127.0.0.1:5000/v2.0']])
- .returns('"ID","Name","Description","Enabled"
-"1cb05cfed7c24279be884ba4f6520262","foo","foo",True
+ describe '#instances', :domainlist => true do
+ it 'finds every tenant' do
+ provider.class.expects(:openstack)
+ .with('project', 'list', '--quiet', '--format', 'csv', '--long')
+ .returns('"ID","Name","Domain ID","Description","Enabled"
+"1cb05cfed7c24279be884ba4f6520262","foo","foo_domain_id","foo",True
+"2cb05cfed7c24279be884ba4f6520262","foo","bar_domain_id","foo",True
')
- response = provider.exists?
+ instances = provider.class.instances
+ expect(instances[0].name).to eq('foo')
+ expect(instances[0].domain).to eq('bar_domain')
+ expect(instances[1].name).to eq('foo::foo_domain')
end
+ end
+ end
+
+ describe 'v3 domains with no domain in resource', :domainlist => true do
- it { is_expected.to be_truthy }
+ let(:tenant_attrs) do
+ {
+ :name => 'foo',
+ :description => 'foo',
+ :ensure => 'present',
+ :enabled => 'True'
+ }
end
- context 'when tenant does not exist' do
+ it 'adds default domain to commands' do
+ mock = {
+ 'identity' => {'default_domain_id' => 'foo_domain_id'}
+ }
+ Puppet::Util::IniConfig::File.expects(:new).returns(mock)
+ File.expects(:exists?).with('/etc/keystone/keystone.conf').returns(true)
+ mock.expects(:read).with('/etc/keystone/keystone.conf')
+ provider.class.expects(:openstack)
+ .with('project', 'create', '--format', 'shell', ['foo', '--enable', '--description', 'foo', '--domain', 'foo_domain'])
+ .returns('description="foo"
+enabled="True"
+name="foo"
+id="project-id"
+domain_id="foo_domain_id"
+')
+ provider.create
+ expect(provider.exists?).to be_truthy
+ expect(provider.id).to eq("project-id")
+ end
- subject(:response) do
- provider.class.stubs(:openstack)
- .with('project', 'list', '--quiet', '--format', 'csv', [['--long', '--os-username', 'test', '--os-password', 'abc123', '--os-tenant-name', 'foo', '--os-auth-url', 'http://127.0.0.1:5000/v2.0']])
- .returns('"ID","Name","Description","Enabled"')
- response = provider.exists?
- end
+ end
- it { is_expected.to be_falsey }
+ describe 'v3 domains with domain in resource', :domainlist => false do
+
+ let(:tenant_attrs) do
+ {
+ :name => 'foo',
+ :description => 'foo',
+ :ensure => 'present',
+ :enabled => 'True',
+ :domain => 'foo_domain'
+ }
+ end
+
+ it 'uses given domain in commands' do
+ provider.class.expects(:openstack)
+ .with('project', 'create', '--format', 'shell', ['foo', '--enable', '--description', 'foo', '--domain', 'foo_domain'])
+ .returns('description="foo"
+enabled="True"
+name="foo"
+id="project-id"
+domain_id="foo_domain_id"
+')
+ provider.create
+ expect(provider.exists?).to be_truthy
+ expect(provider.id).to eq("project-id")
end
end
- describe '#instances' do
- it 'finds every tenant' do
- provider.class.stubs(:openstack)
- .with('project', 'list', '--quiet', '--format', 'csv', [['--long', '--os-username', 'test', '--os-password', 'abc123', '--os-tenant-name', 'foo', '--os-auth-url', 'http://127.0.0.1:5000/v2.0']])
- .returns('"ID","Name","Description","Enabled"
-"1cb05cfed7c24279be884ba4f6520262","foo","foo",True
+ describe 'v3 domains with domain in name/title', :domainlist => false do
+
+ let(:tenant_attrs) do
+ {
+ :name => 'foo::foo_domain',
+ :description => 'foo',
+ :ensure => 'present',
+ :enabled => 'True'
+ }
+ end
+
+ it 'uses given domain in commands' do
+ provider.class.expects(:openstack)
+ .with('project', 'create', '--format', 'shell', ['foo', '--enable', '--description', 'foo', '--domain', 'foo_domain'])
+ .returns('description="foo"
+enabled="True"
+name="foo"
+id="project-id"
+domain_id="foo_domain_id"
')
- instances = provider.instances
- expect(instances.count).to eq(1)
+ provider.create
+ expect(provider.exists?).to be_truthy
+ expect(provider.id).to eq("project-id")
end
end
+ describe 'v3 domains with domain in name/title and in resource', :domainlist => false do
+
+ let(:tenant_attrs) do
+ {
+ :name => 'foo::bar_domain',
+ :description => 'foo',
+ :ensure => 'present',
+ :enabled => 'True',
+ :domain => 'foo_domain'
+ }
+ end
+
+ it 'uses given domain in commands' do
+ provider.class.expects(:openstack)
+ .with('project', 'create', '--format', 'shell', ['foo', '--enable', '--description', 'foo', '--domain', 'foo_domain'])
+ .returns('description="foo"
+enabled="True"
+name="foo"
+id="project-id"
+domain_id="foo_domain_id"
+')
+ provider.create
+ expect(provider.exists?).to be_truthy
+ expect(provider.id).to eq("project-id")
+ end
+ end
end
end