
The changes in Ie27dbbc510c73c685b239a9be4af2700a0eb42f0 did not appear to fix the handling of the nova pci_* params. The config being written to nova.conf remains in the ListOpt format. As support for MultiStrOpt was added to nova_config in I6be7bb4cea1906bd98c513bd2d01153e4643e3ac we just need to pass an array of strings to nova_config to set these MultiStrOpt params. Nova expects the string values to be JSON encoded so that is what the parser function now returns. This function has also been renamed from 'check_array_of_hash' (which it never did) to 'to_array_of_json_strings'. The acceptable input formats are a JSON array of objects or a puppet Array of Hashes. Perviously a "JSON with single quotes" format was used but should now be considered deprecated as it could corrupt data. This also removes any pci_alias entries from nova.conf when the param is not set. Change-Id: Ida3ecab717bc3113ba23553c559263f35c49c46a Closes-bug: #1696955
313 lines
12 KiB
Ruby
313 lines
12 KiB
Ruby
require 'spec_helper'
|
|
|
|
describe 'nova::compute' do
|
|
|
|
let :pre_condition do
|
|
'include nova'
|
|
end
|
|
|
|
shared_examples 'nova-compute' do
|
|
|
|
context 'with default parameters' do
|
|
|
|
it 'installs nova-compute package and service' do
|
|
is_expected.to contain_service('nova-compute').with({
|
|
:name => platform_params[:nova_compute_service],
|
|
:ensure => 'running',
|
|
:hasstatus => true,
|
|
:enable => true,
|
|
:tag => 'nova-service'
|
|
})
|
|
is_expected.to contain_package('nova-compute').with({
|
|
:name => platform_params[:nova_compute_package],
|
|
:tag => ['openstack', 'nova-package']
|
|
})
|
|
end
|
|
|
|
it { is_expected.to contain_nova_config('DEFAULT/allow_resize_to_same_host').with(:value => 'false') }
|
|
it { is_expected.to contain_nova_config('DEFAULT/resize_confirm_window').with_value('<SERVICE DEFAULT>') }
|
|
it { is_expected.to contain_nova_config('DEFAULT/vcpu_pin_set').with(:value => '<SERVICE DEFAULT>') }
|
|
it { is_expected.to contain_nova_config('DEFAULT/resume_guests_state_on_host_boot').with_value('<SERVICE DEFAULT>') }
|
|
it { is_expected.to_not contain_nova_config('vnc/novncproxy_base_url') }
|
|
it { is_expected.to contain_nova_config('key_manager/api_class').with_value('<SERVICE DEFAULT>') }
|
|
it { is_expected.to contain_nova_config('barbican/barbican_endpoint').with_value('<SERVICE DEFAULT>') }
|
|
it { is_expected.to contain_nova_config('barbican/barbican_api_version').with_value('<SERVICE DEFAULT>') }
|
|
it { is_expected.to contain_nova_config('barbican/auth_endpoint').with_value('<SERVICE DEFAULT>') }
|
|
it { is_expected.to contain_nova_config('DEFAULT/max_concurrent_live_migrations').with_value('<SERVICE DEFAULT>') }
|
|
it { is_expected.to contain_nova_config('pci/passthrough_whitelist').with(:value => '<SERVICE DEFAULT>') }
|
|
|
|
it { is_expected.to_not contain_package('cryptsetup').with( :ensure => 'present' )}
|
|
|
|
it { is_expected.to_not contain_package('bridge-utils').with(
|
|
:ensure => 'present',
|
|
) }
|
|
|
|
it { is_expected.to contain_nova_config('DEFAULT/force_raw_images').with(:value => true) }
|
|
|
|
it 'configures availability zones' do
|
|
is_expected.to contain_nova_config('DEFAULT/default_availability_zone').with_value('<SERVICE DEFAULT>')
|
|
is_expected.to contain_nova_config('DEFAULT/default_schedule_zone').with_value('<SERVICE DEFAULT>')
|
|
is_expected.to contain_nova_config('DEFAULT/internal_service_availability_zone').with_value('<SERVICE DEFAULT>')
|
|
end
|
|
|
|
it { is_expected.to contain_nova_config('DEFAULT/heal_instance_info_cache_interval').with_value('60') }
|
|
|
|
it 'installs genisoimage package and sets config_drive_format' do
|
|
is_expected.to contain_nova_config('DEFAULT/config_drive_format').with(:value => '<SERVICE DEFAULT>')
|
|
is_expected.to contain_package('genisoimage').with(
|
|
:ensure => 'present',
|
|
)
|
|
is_expected.to contain_package('genisoimage').that_requires('Anchor[nova::install::begin]')
|
|
is_expected.to contain_package('genisoimage').that_comes_before('Anchor[nova::install::end]')
|
|
end
|
|
end
|
|
|
|
context 'with overridden parameters' do
|
|
let :params do
|
|
{ :enabled => false,
|
|
:ensure_package => '2012.1-2',
|
|
:vncproxy_host => '127.0.0.1',
|
|
:force_raw_images => false,
|
|
:reserved_host_memory => '0',
|
|
:heal_instance_info_cache_interval => '120',
|
|
:config_drive_format => 'vfat',
|
|
:resize_confirm_window => '3',
|
|
:vcpu_pin_set => ['4-12','^8','15'],
|
|
:resume_guests_state_on_host_boot => true,
|
|
:keymgr_api_class => 'castellan.key_manager.barbican_key_manager.BarbicanKeyManager',
|
|
:barbican_endpoint => 'http://localhost',
|
|
:barbican_api_version => 'v1',
|
|
:barbican_auth_endpoint => 'http://127.0.0.1:5000/v3',
|
|
:max_concurrent_live_migrations => '4',
|
|
}
|
|
end
|
|
|
|
it 'installs nova-compute package and service' do
|
|
is_expected.to contain_service('nova-compute').with({
|
|
:name => platform_params[:nova_compute_service],
|
|
:ensure => 'stopped',
|
|
:hasstatus => true,
|
|
:enable => false,
|
|
:tag => 'nova-service'
|
|
})
|
|
is_expected.to contain_package('nova-compute').with({
|
|
:name => platform_params[:nova_compute_package],
|
|
:ensure => '2012.1-2',
|
|
:tag => ['openstack', 'nova-package']
|
|
})
|
|
end
|
|
|
|
it 'configures ironic in nova.conf' do
|
|
is_expected.to contain_nova_config('DEFAULT/reserved_host_memory_mb').with_value('0')
|
|
end
|
|
|
|
it 'configures barbican service' do
|
|
is_expected.to contain_nova_config('key_manager/api_class').with_value('castellan.key_manager.barbican_key_manager.BarbicanKeyManager')
|
|
is_expected.to contain_nova_config('barbican/barbican_endpoint').with_value('http://localhost')
|
|
is_expected.to contain_nova_config('barbican/barbican_api_version').with_value('v1')
|
|
is_expected.to contain_nova_config('barbican/auth_endpoint').with_value('http://127.0.0.1:5000/v3')
|
|
is_expected.to contain_package('cryptsetup').with( :ensure => 'present' )
|
|
end
|
|
|
|
it 'configures vnc in nova.conf' do
|
|
is_expected.to contain_nova_config('vnc/enabled').with_value(true)
|
|
is_expected.to contain_nova_config('vnc/vncserver_proxyclient_address').with_value('127.0.0.1')
|
|
is_expected.to contain_nova_config('vnc/keymap').with_value('en-us')
|
|
is_expected.to contain_nova_config('vnc/novncproxy_base_url').with_value(
|
|
'http://127.0.0.1:6080/vnc_auto.html'
|
|
)
|
|
end
|
|
|
|
it { is_expected.to contain_nova_config('DEFAULT/heal_instance_info_cache_interval').with_value('120') }
|
|
|
|
it { is_expected.to contain_nova_config('DEFAULT/force_raw_images').with(:value => false) }
|
|
|
|
it { is_expected.to contain_nova_config('DEFAULT/resize_confirm_window').with_value('3') }
|
|
|
|
it { is_expected.to contain_nova_config('DEFAULT/vcpu_pin_set').with(:value => '4-12,^8,15') }
|
|
|
|
it { is_expected.to contain_nova_config('DEFAULT/max_concurrent_live_migrations').with_value('4') }
|
|
|
|
it { is_expected.to contain_nova_config('DEFAULT/resume_guests_state_on_host_boot').with_value(true) }
|
|
|
|
it 'configures nova config_drive_format to vfat' do
|
|
is_expected.to contain_nova_config('DEFAULT/config_drive_format').with_value('vfat')
|
|
is_expected.to_not contain_package('genisoimage').with(
|
|
:ensure => 'present',
|
|
)
|
|
end
|
|
end
|
|
|
|
context 'with pci_passthrough array' do
|
|
let :params do
|
|
{
|
|
:pci_passthrough => [
|
|
{
|
|
"vendor_id" => "8086",
|
|
"product_id" => "0126"
|
|
},
|
|
{
|
|
"vendor_id" => "9096",
|
|
"product_id" => "1520",
|
|
"physical_network" => "physnet1"
|
|
}
|
|
]
|
|
}
|
|
end
|
|
|
|
it 'configures nova pci_passthrough_whitelist entries' do
|
|
is_expected.to contain_nova_config('pci/passthrough_whitelist').with(
|
|
'value' => ['{"vendor_id":"8086","product_id":"0126"}','{"vendor_id":"9096","product_id":"1520","physical_network":"physnet1"}']
|
|
)
|
|
end
|
|
end
|
|
|
|
context 'with pci_passthrough JSON encoded string (deprecated)' do
|
|
let :params do
|
|
{
|
|
:pci_passthrough => "[{\"vendor_id\":\"8086\",\"product_id\":\"0126\"},{\"vendor_id\":\"9096\",\"product_id\":\"1520\",\"physical_network\":\"physnet1\"}]"
|
|
}
|
|
end
|
|
|
|
it 'configures nova pci_passthrough_whitelist entries' do
|
|
is_expected.to contain_nova_config('pci/passthrough_whitelist').with(
|
|
'value' => ['{"vendor_id":"8086","product_id":"0126"}','{"vendor_id":"9096","product_id":"1520","physical_network":"physnet1"}']
|
|
)
|
|
end
|
|
end
|
|
|
|
context 'when vcpu_pin_set and pci_passthrough are empty' do
|
|
let :params do
|
|
{ :vcpu_pin_set => "",
|
|
:pci_passthrough => "" }
|
|
end
|
|
|
|
it 'clears vcpu_pin_set configuration' do
|
|
is_expected.to contain_nova_config('DEFAULT/vcpu_pin_set').with(:value => '<SERVICE DEFAULT>')
|
|
end
|
|
it 'clears pci_passthrough configuration' do
|
|
is_expected.to contain_nova_config('pci/passthrough_whitelist').with(:value => '<SERVICE DEFAULT>')
|
|
end
|
|
end
|
|
|
|
context 'with neutron_enabled set to false' do
|
|
let :params do
|
|
{ :neutron_enabled => false }
|
|
end
|
|
|
|
it 'installs bridge-utils package for nova-network' do
|
|
is_expected.to contain_package('bridge-utils').with(
|
|
:ensure => 'present',
|
|
)
|
|
is_expected.to contain_package('bridge-utils').that_requires('Anchor[nova::install::begin]')
|
|
is_expected.to contain_package('bridge-utils').that_comes_before('Anchor[nova::install::end]')
|
|
end
|
|
|
|
end
|
|
|
|
context 'with install_bridge_utils set to false' do
|
|
let :params do
|
|
{ :install_bridge_utils => false }
|
|
end
|
|
|
|
it 'does not install bridge-utils package for nova-network' do
|
|
is_expected.to_not contain_package('bridge-utils').with(
|
|
:ensure => 'present',
|
|
)
|
|
end
|
|
|
|
end
|
|
|
|
context 'with vnc_enabled set to false' do
|
|
let :params do
|
|
{ :vnc_enabled => false }
|
|
end
|
|
|
|
it 'disables vnc in nova.conf' do
|
|
is_expected.to contain_nova_config('vnc/enabled').with_value(false)
|
|
is_expected.to contain_nova_config('vnc/vncserver_proxyclient_address').with_ensure('absent')
|
|
is_expected.to contain_nova_config('vnc/keymap').with_ensure('absent')
|
|
is_expected.to_not contain_nova_config('vnc/novncproxy_base_url')
|
|
end
|
|
end
|
|
|
|
context 'with force_config_drive parameter set to true' do
|
|
let :params do
|
|
{ :force_config_drive => true }
|
|
end
|
|
|
|
it { is_expected.to contain_nova_config('DEFAULT/force_config_drive').with_value(true) }
|
|
end
|
|
|
|
context 'while not managing service state' do
|
|
let :params do
|
|
{ :enabled => false,
|
|
:manage_service => false,
|
|
}
|
|
end
|
|
|
|
it { is_expected.to contain_service('nova-compute').without_ensure }
|
|
end
|
|
|
|
context 'with instance_usage_audit parameter set to false' do
|
|
let :params do
|
|
{ :instance_usage_audit => false, }
|
|
end
|
|
|
|
it { is_expected.to contain_nova_config('DEFAULT/instance_usage_audit').with_ensure('absent') }
|
|
it { is_expected.to contain_nova_config('DEFAULT/instance_usage_audit_period').with_ensure('absent') }
|
|
end
|
|
|
|
context 'with instance_usage_audit parameter and wrong period' do
|
|
let :params do
|
|
{ :instance_usage_audit => true,
|
|
:instance_usage_audit_period => 'fake', }
|
|
end
|
|
|
|
it { is_expected.to contain_nova_config('DEFAULT/instance_usage_audit').with_ensure('absent') }
|
|
it { is_expected.to contain_nova_config('DEFAULT/instance_usage_audit_period').with_ensure('absent') }
|
|
end
|
|
|
|
context 'with instance_usage_audit parameter and period' do
|
|
let :params do
|
|
{ :instance_usage_audit => true,
|
|
:instance_usage_audit_period => 'year', }
|
|
end
|
|
|
|
it { is_expected.to contain_nova_config('DEFAULT/instance_usage_audit').with_value(true) }
|
|
it { is_expected.to contain_nova_config('DEFAULT/instance_usage_audit_period').with_value('year') }
|
|
end
|
|
|
|
context 'with vnc_keymap set to fr' do
|
|
let :params do
|
|
{ :vnc_keymap => 'fr', }
|
|
end
|
|
|
|
it { is_expected.to contain_nova_config('vnc/keymap').with_value('fr') }
|
|
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())
|
|
end
|
|
|
|
let (:platform_params) do
|
|
case facts[:osfamily]
|
|
when 'Debian'
|
|
{ :nova_compute_package => 'nova-compute',
|
|
:nova_compute_service => 'nova-compute' }
|
|
when 'RedHat'
|
|
{ :nova_compute_package => 'openstack-nova-compute',
|
|
:nova_compute_service => 'openstack-nova-compute' }
|
|
end
|
|
end
|
|
it_behaves_like 'nova-compute'
|
|
end
|
|
end
|
|
|
|
end
|