Files
puppet-nova/spec/classes/nova_api_spec.rb
Clayton O'Neill cb77bc295f Add hooks for external install & svc management
This adds defined anchor points for external modules to hook into the
software install, config and service dependency chain.  This allows
external modules to manage software installation (virtualenv,
containers, etc) and service management (pacemaker) without needing rely
on resources that may change or be renamed.

Change-Id: I0b524e354b095f2642fd38a2f88536d15bcdf855
2015-12-08 10:14:11 -05:00

351 lines
15 KiB
Ruby

require 'spec_helper'
describe 'nova::api' do
let :pre_condition do
'include nova'
end
let :params do
{ :admin_password => 'passw0rd' }
end
let :facts do
@default_facts.merge({ :processorcount => 5 })
end
shared_examples 'nova-api' do
context 'with default parameters' do
it 'installs nova-api package and service' do
is_expected.to contain_service('nova-api').with(
:name => platform_params[:nova_api_service],
:ensure => 'running',
:hasstatus => true,
:enable => true,
:tag => 'nova-service',
)
is_expected.to contain_package('nova-api').with(
:name => platform_params[:nova_api_package],
:ensure => 'present',
:tag => ['openstack', 'nova-package'],
)
is_expected.to contain_package('nova-api').that_requires('Anchor[nova::install::begin]')
is_expected.to contain_package('nova-api').that_notifies('Anchor[nova::install::end]')
is_expected.to_not contain_exec('validate_nova_api')
end
it 'configures keystone_authtoken middleware' do
is_expected.to contain_nova_config(
'keystone_authtoken/auth_host').with_value('127.0.0.1')
is_expected.to contain_nova_config(
'keystone_authtoken/auth_port').with_value('35357')
is_expected.to contain_nova_config(
'keystone_authtoken/auth_protocol').with_value('http')
is_expected.to contain_nova_config(
'keystone_authtoken/auth_uri').with_value('http://127.0.0.1:5000/')
is_expected.to contain_nova_config(
'keystone_authtoken/auth_admin_prefix').with_ensure('absent')
is_expected.to contain_nova_config(
'keystone_authtoken/auth_version').with_ensure('absent')
is_expected.to contain_nova_config(
'keystone_authtoken/admin_tenant_name').with_value('services')
is_expected.to contain_nova_config(
'keystone_authtoken/admin_user').with_value('nova')
is_expected.to contain_nova_config(
'keystone_authtoken/admin_password').with_value('passw0rd').with_secret(true)
end
it { is_expected.to contain_nova_config('DEFAULT/instance_name_template').with_ensure('absent')}
it 'configures various stuff' do
is_expected.to contain_nova_config('DEFAULT/api_paste_config').with('value' => 'api-paste.ini')
is_expected.to contain_nova_config('DEFAULT/ec2_listen').with('value' => '0.0.0.0')
is_expected.to contain_nova_config('DEFAULT/ec2_listen_port').with('value' => '8773')
is_expected.to contain_nova_config('DEFAULT/osapi_compute_listen').with('value' => '0.0.0.0')
is_expected.to contain_nova_config('DEFAULT/osapi_compute_listen_port').with('value' => '8774')
is_expected.to contain_nova_config('DEFAULT/metadata_listen').with('value' => '0.0.0.0')
is_expected.to contain_nova_config('DEFAULT/metadata_listen_port').with('value' => '8775')
is_expected.to contain_nova_config('DEFAULT/osapi_volume_listen').with('value' => '0.0.0.0')
is_expected.to contain_nova_config('DEFAULT/osapi_compute_workers').with('value' => '5')
is_expected.to contain_nova_config('DEFAULT/ec2_workers').with('value' => '5')
is_expected.to contain_nova_config('DEFAULT/metadata_workers').with('value' => '5')
is_expected.to contain_nova_config('DEFAULT/default_floating_pool').with('value' => 'nova')
is_expected.to contain_nova_config('DEFAULT/fping_path').with('value' => '/usr/sbin/fping')
end
it 'do not configure v3 api' do
is_expected.to contain_nova_config('osapi_v3/enabled').with('value' => false)
end
it 'unconfigures neutron_metadata proxy' do
is_expected.to contain_nova_config('neutron/service_metadata_proxy').with(:value => false)
is_expected.to contain_nova_config('neutron/metadata_proxy_shared_secret').with(:ensure => 'absent')
end
end
context 'with overridden parameters' do
before do
params.merge!({
:enabled => false,
:ensure_package => '2012.1-2',
:auth_host => '10.0.0.1',
:auth_port => 1234,
:auth_protocol => 'https',
:auth_admin_prefix => '/keystone/admin',
:auth_uri => 'https://10.0.0.1:9999/',
:auth_version => 'v3.0',
:admin_tenant_name => 'service2',
:admin_user => 'nova2',
:admin_password => 'passw0rd2',
:api_bind_address => '192.168.56.210',
:metadata_listen => '127.0.0.1',
:metadata_listen_port => 8875,
:osapi_compute_listen_port => 8874,
:ec2_listen_port => 8873,
:volume_api_class => 'nova.volume.cinder.API',
:use_forwarded_for => false,
:ratelimits => '(GET, "*", .*, 100, MINUTE);(POST, "*", .*, 200, MINUTE)',
:neutron_metadata_proxy_shared_secret => 'secrete',
:osapi_compute_workers => 1,
:metadata_workers => 2,
:default_floating_pool => 'public',
:osapi_v3 => true,
:keystone_ec2_url => 'https://example.com:5000/v2.0/ec2tokens',
:pci_alias => "[{\"vendor_id\":\"8086\",\"product_id\":\"0126\",\"name\":\"graphic_card\"},{\"vendor_id\":\"9096\",\"product_id\":\"1520\",\"name\":\"network_card\"}]"
})
end
it 'installs nova-api package and service' do
is_expected.to contain_package('nova-api').with(
:name => platform_params[:nova_api_package],
:ensure => '2012.1-2',
:tag => ['openstack', 'nova-package'],
)
is_expected.to contain_service('nova-api').with(
:name => platform_params[:nova_api_service],
:ensure => 'stopped',
:hasstatus => true,
:enable => false,
:tag => 'nova-service',
)
end
it 'configures keystone_authtoken middleware' do
is_expected.to contain_nova_config(
'keystone_authtoken/auth_host').with_value('10.0.0.1')
is_expected.to contain_nova_config(
'keystone_authtoken/auth_port').with_value('1234')
is_expected.to contain_nova_config(
'keystone_authtoken/auth_protocol').with_value('https')
is_expected.to contain_nova_config(
'keystone_authtoken/auth_admin_prefix').with_value('/keystone/admin')
is_expected.to contain_nova_config(
'keystone_authtoken/auth_uri').with_value('https://10.0.0.1:9999/')
is_expected.to contain_nova_config(
'keystone_authtoken/auth_version').with_value('v3.0')
is_expected.to contain_nova_config(
'keystone_authtoken/admin_tenant_name').with_value('service2')
is_expected.to contain_nova_config(
'keystone_authtoken/admin_user').with_value('nova2')
is_expected.to contain_nova_config(
'keystone_authtoken/admin_password').with_value('passw0rd2').with_secret(true)
is_expected.to contain_nova_paste_api_ini(
'filter:ratelimit/limits').with_value('(GET, "*", .*, 100, MINUTE);(POST, "*", .*, 200, MINUTE)')
end
it 'configures various stuff' do
is_expected.to contain_nova_config('DEFAULT/ec2_listen').with('value' => '192.168.56.210')
is_expected.to contain_nova_config('DEFAULT/ec2_listen_port').with('value' => '8873')
is_expected.to contain_nova_config('DEFAULT/osapi_compute_listen').with('value' => '192.168.56.210')
is_expected.to contain_nova_config('DEFAULT/osapi_compute_listen_port').with('value' => '8874')
is_expected.to contain_nova_config('DEFAULT/metadata_listen').with('value' => '127.0.0.1')
is_expected.to contain_nova_config('DEFAULT/metadata_listen_port').with('value' => '8875')
is_expected.to contain_nova_config('DEFAULT/osapi_volume_listen').with('value' => '192.168.56.210')
is_expected.to contain_nova_config('DEFAULT/use_forwarded_for').with('value' => false)
is_expected.to contain_nova_config('DEFAULT/osapi_compute_workers').with('value' => '1')
is_expected.to contain_nova_config('DEFAULT/metadata_workers').with('value' => '2')
is_expected.to contain_nova_config('DEFAULT/default_floating_pool').with('value' => 'public')
is_expected.to contain_nova_config('neutron/service_metadata_proxy').with('value' => true)
is_expected.to contain_nova_config('neutron/metadata_proxy_shared_secret').with('value' => 'secrete')
is_expected.to contain_nova_config('DEFAULT/keystone_ec2_url').with('value' => 'https://example.com:5000/v2.0/ec2tokens')
end
it 'configure nova api v3' do
is_expected.to contain_nova_config('osapi_v3/enabled').with('value' => true)
end
it 'configures nova pci_alias entries' do
is_expected.to contain_nova_config('DEFAULT/pci_alias').with(
'value' => "[{\"vendor_id\":\"8086\",\"product_id\":\"0126\",\"name\":\"graphic_card\"},{\"vendor_id\":\"9096\",\"product_id\":\"1520\",\"name\":\"network_card\"}]"
)
end
end
[
'/keystone/',
'keystone/',
'keystone',
'/keystone/admin/',
'keystone/admin/',
'keystone/admin'
].each do |auth_admin_prefix|
context "with auth_admin_prefix_containing incorrect value #{auth_admin_prefix}" do
before do
params.merge!({ :auth_admin_prefix => auth_admin_prefix })
end
it { expect { is_expected.to contain_nova_config('keystone_authtoken/auth_admin_prefix') }.to \
raise_error(Puppet::Error, /validate_re\(\): "#{auth_admin_prefix}" does not match/) }
end
end
context 'while validating the service with default command' do
before do
params.merge!({
:validate => true,
})
end
it { is_expected.to contain_exec('execute nova-api validation').with(
:path => '/usr/bin:/bin:/usr/sbin:/sbin',
:provider => 'shell',
:tries => '10',
:try_sleep => '2',
:command => 'nova --os-auth-url http://127.0.0.1:5000/ --os-tenant-name services --os-username nova --os-password passw0rd flavor-list',
)}
it { is_expected.to contain_anchor('create nova-api anchor').with(
:require => 'Exec[execute nova-api validation]',
)}
end
context 'while validating the service with custom command' do
before do
params.merge!({
:validate => true,
:validation_options => { 'nova-api' => { 'command' => 'my-script' } }
})
end
it { is_expected.to contain_exec('execute nova-api validation').with(
:path => '/usr/bin:/bin:/usr/sbin:/sbin',
:provider => 'shell',
:tries => '10',
:try_sleep => '2',
:command => 'my-script',
)}
it { is_expected.to contain_anchor('create nova-api anchor').with(
:require => 'Exec[execute nova-api validation]',
)}
end
context 'while not managing service state' do
before do
params.merge!({
:enabled => false,
:manage_service => false,
})
end
it { is_expected.to contain_service('nova-api').without_ensure }
end
context 'with default database parameters' do
let :pre_condition do
"include nova"
end
it { is_expected.to_not contain_nova_config('database/connection') }
it { is_expected.to_not contain_nova_config('database/slave_connection') }
it { is_expected.to_not contain_nova_config('database/idle_timeout').with_value('<SERVICE DEFAULT>') }
end
context 'with overridden database parameters' do
let :pre_condition do
"class { 'nova':
database_connection => 'mysql://user:pass@db/db',
slave_connection => 'mysql://user:pass@slave/db',
database_idle_timeout => '30',
}
"
end
it { is_expected.to contain_nova_config('database/connection').with_value('mysql://user:pass@db/db').with_secret(true) }
it { is_expected.to contain_nova_config('database/slave_connection').with_value('mysql://user:pass@slave/db').with_secret(true) }
it { is_expected.to contain_nova_config('database/idle_timeout').with_value('30') }
end
context 'with custom instance_name_template' do
before do
params.merge!({
:instance_name_template => 'instance-%08x',
})
end
it 'configures instance_name_template' do
is_expected.to contain_nova_config('DEFAULT/instance_name_template').with_value('instance-%08x');
end
end
context 'with custom keystone identity_uri' do
before do
params.merge!({
:identity_uri => 'https://foo.bar:1234/',
})
end
it 'configures identity_uri' do
is_expected.to contain_nova_config('keystone_authtoken/identity_uri').with_value("https://foo.bar:1234/");
# since only auth_uri is set the deprecated auth parameters is_expected.to
# still get set in case they are still in use
is_expected.to contain_nova_config('keystone_authtoken/auth_host').with_value('127.0.0.1');
is_expected.to contain_nova_config('keystone_authtoken/auth_port').with_value('35357');
is_expected.to contain_nova_config('keystone_authtoken/auth_protocol').with_value('http');
end
end
context 'with custom keystone identity_uri and auth_uri' do
before do
params.merge!({
:identity_uri => 'https://foo.bar:35357/',
:auth_uri => 'https://foo.bar:5000/v2.0/',
})
end
it 'configures identity_uri' do
is_expected.to contain_nova_config('keystone_authtoken/identity_uri').with_value("https://foo.bar:35357/");
is_expected.to contain_nova_config('keystone_authtoken/auth_uri').with_value("https://foo.bar:5000/v2.0/");
is_expected.to contain_nova_config('keystone_authtoken/auth_host').with_ensure('absent')
is_expected.to contain_nova_config('keystone_authtoken/auth_port').with_ensure('absent')
is_expected.to contain_nova_config('keystone_authtoken/auth_protocol').with_ensure('absent')
is_expected.to contain_nova_config('keystone_authtoken/auth_admin_prefix').with_ensure('absent')
end
end
end
context 'on Debian platforms' do
before do
facts.merge!( :osfamily => 'Debian' )
end
let :platform_params do
{ :nova_api_package => 'nova-api',
:nova_api_service => 'nova-api' }
end
it_behaves_like 'nova-api'
end
context 'on RedHat platforms' do
before do
facts.merge!( :osfamily => 'RedHat' )
end
let :platform_params do
{ :nova_api_package => 'openstack-nova-api',
:nova_api_service => 'openstack-nova-api' }
end
it_behaves_like 'nova-api'
end
end