Files
puppet-nova/spec/classes/nova_api_spec.rb
Martin Schuppert 6686406bce Split off metadata vendordata plugin in own class
A recent change making nova-metadata-api work with wsgi [1] moved
the vendordata plugin parameters to the nova::metadata manifest.
While this is conceptually correct as nova-metadata is the one that
should be using this parameters. In practice the parameters are also
used in compute drivers (in the ironic driver, for instance), thats
why we should split them to be able to deploy nova-metadata-api
separate from nova-compute.

[1] https://review.openstack.org/#/c/582621/

Change-Id: Ic3654c79d8cf275f0c58d57a4b66e2598450a7ed
Related-Bug: 1799352
2018-10-29 08:27:09 +01:00

386 lines
17 KiB
Ruby

require 'spec_helper'
describe 'nova::api' do
let :pre_condition do
"include nova
class { '::nova::keystone::authtoken':
password => 'passw0rd',
}"
end
let :params do
{}
end
shared_examples 'nova-api' do
context 'with default parameters' do
it { is_expected.to contain_class('nova::keystone::authtoken') }
it { is_expected.to contain_class('cinder::client').that_notifies('Nova::Generic_service[api]') }
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 'enable metadata in evenlet configuration' do
is_expected.to contain_nova_config('DEFAULT/enabled_apis').with_value('osapi_compute,metadata')
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('wsgi/api_paste_config').with('value' => 'api-paste.ini')
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_compute_workers').with('value' => '5')
is_expected.to contain_nova_config('DEFAULT/metadata_workers').with('value' => '5')
is_expected.to contain_oslo__middleware('nova_config').with(
:enable_proxy_headers_parsing => '<SERVICE DEFAULT>',
)
is_expected.to contain_nova_config('api/metadata_cache_expiration').with('value' => '<SERVICE DEFAULT>')
is_expected.to contain_nova_config('api/max_limit').with('value' => '<SERVICE DEFAULT>')
is_expected.to contain_nova_config('api/compute_link_prefix').with('value' => '<SERVICE DEFAULT>')
is_expected.to contain_nova_config('api/glance_link_prefix').with('value' => '<SERVICE DEFAULT>')
is_expected.to contain_nova_config('api/hide_server_address_states').with('value' => '<SERVICE DEFAULT>')
is_expected.to contain_nova_config('api/allow_instance_snapshots').with('value' => '<SERVICE DEFAULT>')
is_expected.to contain_nova_config('DEFAULT/enable_network_quota').with('value' => '<SERVICE DEFAULT>')
is_expected.to contain_nova_config('api/enable_instance_password').with('value' => '<SERVICE DEFAULT>')
is_expected.to contain_nova_config('DEFAULT/password_length').with('value' => '<SERVICE DEFAULT>')
is_expected.to contain_nova_config('DEFAULT/allow_resize_to_same_host').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',
:api_bind_address => '192.168.56.210',
:metadata_listen => '127.0.0.1',
:metadata_listen_port => 8875,
:osapi_compute_listen_port => 8874,
:use_forwarded_for => false,
:ratelimits => '(GET, "*", .*, 100, MINUTE);(POST, "*", .*, 200, MINUTE)',
:neutron_metadata_proxy_shared_secret => 'secrete',
:osapi_compute_workers => 1,
:metadata_workers => 2,
:enable_proxy_headers_parsing => true,
:metadata_cache_expiration => 15,
:max_limit => 1000,
:compute_link_prefix => 'https://10.0.0.1:7777/',
:glance_link_prefix => 'https://10.0.0.1:6666/',
:hide_server_address_states => 'building',
:allow_instance_snapshots => true,
:enable_network_quota => false,
:enable_instance_password => true,
:password_length => 12,
:allow_resize_to_same_host => true,
:vendordata_jsonfile_path => '/tmp',
:vendordata_providers => ['StaticJSON', 'DynamicJSON'],
:vendordata_dynamic_targets => ['join@http://127.0.0.1:9999/v1/'],
:vendordata_dynamic_connect_timeout => 30,
:vendordata_dynamic_read_timeout => 30,
:vendordata_dynamic_failure_fatal => false,
:vendordata_dynamic_auth_auth_type => 'password',
:vendordata_dynamic_auth_auth_url => 'http://127.0.0.1:5000',
:vendordata_dynamic_auth_os_region_name => 'RegionOne',
:vendordata_dynamic_auth_password => 'secrete',
:vendordata_dynamic_auth_project_domain_name => 'Default',
:vendordata_dynamic_auth_project_name => 'project',
:vendordata_dynamic_auth_user_domain_name => 'Default',
:vendordata_dynamic_auth_username => 'user',
})
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 various stuff' do
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('api/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('api/metadata_cache_expiration').with('value' => '15')
is_expected.to contain_nova_config('api/max_limit').with('value' => '1000')
is_expected.to contain_nova_config('api/compute_link_prefix').with('value' => 'https://10.0.0.1:7777/')
is_expected.to contain_nova_config('api/glance_link_prefix').with('value' => 'https://10.0.0.1:6666/')
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').with_secret(true)
is_expected.to contain_oslo__middleware('nova_config').with(
:enable_proxy_headers_parsing => true,
)
is_expected.to contain_nova_config('api/hide_server_address_states').with('value' => 'building')
is_expected.to contain_nova_config('api/allow_instance_snapshots').with('value' => true)
is_expected.to contain_nova_config('DEFAULT/enable_network_quota').with('value' => false)
is_expected.to contain_nova_config('api/enable_instance_password').with('value' => true)
is_expected.to contain_nova_config('DEFAULT/password_length').with('value' => '12')
is_expected.to contain_nova_config('DEFAULT/allow_resize_to_same_host').with('value' => true)
is_expected.to contain_nova_config('api/vendordata_jsonfile_path').with('value' => '/tmp')
is_expected.to contain_nova_config('api/vendordata_providers').with('value' => 'StaticJSON,DynamicJSON')
is_expected.to contain_nova_config('api/vendordata_dynamic_targets').with('value' => 'join@http://127.0.0.1:9999/v1/')
is_expected.to contain_nova_config('api/vendordata_dynamic_connect_timeout').with('value' => '30')
is_expected.to contain_nova_config('api/vendordata_dynamic_read_timeout').with('value' => '30')
is_expected.to contain_nova_config('api/vendordata_dynamic_failure_fatal').with('value' => false)
is_expected.to contain_nova_config('vendordata_dynamic_auth/auth_type').with('value' => 'password')
is_expected.to contain_nova_config('vendordata_dynamic_auth/auth_url').with('value' => 'http://127.0.0.1:5000')
is_expected.to contain_nova_config('vendordata_dynamic_auth/os_region_name').with('value' => 'RegionOne')
is_expected.to contain_nova_config('vendordata_dynamic_auth/password').with('value' => 'secrete').with_secret(true)
is_expected.to contain_nova_config('vendordata_dynamic_auth/project_domain_name').with('value' => 'Default')
is_expected.to contain_nova_config('vendordata_dynamic_auth/project_name').with('value' => 'project')
is_expected.to contain_nova_config('vendordata_dynamic_auth/user_domain_name').with('value' => 'Default')
is_expected.to contain_nova_config('vendordata_dynamic_auth/username').with('value' => 'user')
end
end
context 'while validating the service with default command' do
before do
params.merge!({
:validate => true,
})
end
it { is_expected.to contain_openstacklib__service_validation('nova-api').with(
:command => 'nova --os-auth-url http://127.0.0.1:5000/ --os-project-name services --os-username nova --os-password passw0rd flavor-list',
:subscribe => 'Service[nova-api]',
)}
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_openstacklib__service_validation('nova-api').with(
:command => 'my-script',
:subscribe => 'Service[nova-api]',
)}
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
class { '::nova::keystone::authtoken':
password => 'a_big_secret',
}"
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('api_database/connection') }
it { is_expected.to_not contain_nova_config('api_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/db1',
slave_connection => 'mysql://user:pass@slave/db1',
api_database_connection => 'mysql://user:pass@db/db2',
api_slave_connection => 'mysql://user:pass@slave/db2',
database_idle_timeout => '30',
}
class { '::nova::keystone::authtoken':
password => 'passw0rd',
}
"
end
it { is_expected.to contain_nova_config('api_database/connection').with_value('mysql://user:pass@db/db2').with_secret(true) }
it { is_expected.to contain_nova_config('api_database/slave_connection').with_value('mysql://user:pass@slave/db2').with_secret(true) }
it { is_expected.to contain_oslo__db('nova_config').with(
:connection => 'mysql://user:pass@db/db1',
:slave_connection => 'mysql://user:pass@slave/db1',
:idle_timeout => '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 'when running nova API in wsgi compute, and enabling metadata' do
before do
params.merge!({ :service_name => 'httpd' })
end
let :pre_condition do
"include ::apache
include ::nova
class { '::nova::keystone::authtoken':
password => 'a_big_secret',
}"
end
it 'enable nova API service' do
is_expected.to contain_service('nova-api').with(
:ensure => 'running',
:name => platform_params[:nova_api_service],
:enable => true,
:tag => 'nova-service',
)
end
it 'enable metadata in evenlet configuration' do
is_expected.to contain_nova_config('DEFAULT/enabled_apis').with_value('metadata')
end
end
context 'when running nova API in wsgi for compute, and disabling metadata' do
before do
params.merge!({
:service_name => 'httpd',
:enabled_apis => ['osapi_compute'] })
end
let :pre_condition do
"include ::apache
include ::nova
class { '::nova::keystone::authtoken':
password => 'a_big_secret',
}"
end
it 'disable nova API service' do
is_expected.to contain_service('nova-api').with(
:ensure => 'stopped',
:name => platform_params[:nova_api_service],
:enable => false,
:tag => 'nova-service',
)
end
end
context 'when running nova API in wsgi for compute, and metadata in wsgi' do
before do
params.merge!({
:service_name => 'httpd',
:nova_metadata_wsgi_enabled => true })
end
let :pre_condition do
"include ::apache
include ::nova
class { '::nova::keystone::authtoken':
password => 'a_big_secret',
}"
end
it 'disable nova API service' do
is_expected.to contain_service('nova-api').with(
:ensure => 'stopped',
:name => platform_params[:nova_api_service],
:enable => false,
:tag => 'nova-service',
)
end
end
context 'when disabling cinder client installation' do
before do
params.merge!({ :install_cinder_client => false })
end
it { is_expected.to_not contain_class('cinder::client') }
end
context 'when service_name is not valid' do
before do
params.merge!({ :service_name => 'foobar' })
end
let :pre_condition do
"include ::apache
include ::nova
class { '::nova::keystone::authtoken':
password => 'a_big_secret',
}"
end
it_raises 'a Puppet::Error', /Invalid service_name/
end
end
on_supported_os({
:supported_os => OSDefaults.get_supported_os
}).each do |os,facts|
context "on #{os}" do
let (:facts) do
facts.merge!(OSDefaults.get_facts({ :os_workers => 5 }))
end
let (:platform_params) do
case facts[:osfamily]
when 'Debian'
{ :nova_api_package => 'nova-api',
:nova_api_service => 'nova-api' }
when 'RedHat'
{ :nova_api_package => 'openstack-nova-api',
:nova_api_service => 'openstack-nova-api' }
end
end
it_behaves_like 'nova-api'
end
end
end