Files
puppet-glance/spec/classes/glance_api_spec.rb
Takashi Kajinami fa5fcb4ab5 Add support for [paste_deploy] config_file
... so that users can customize that option using the native interface.
In TripleO we append additional arguments(to load glance-cache.conf)
and we need to set the option explicitly to ensure the correct file
path is used.

Also, the pipeline parameter is confusing because of its naming
different from the actual parameter in Glance, so this change renames
the parameter as well.

Change-Id: I3d6ce07f44ae526207a30d4b57c2fec7cd6fa3ca
2022-07-14 13:47:13 +00:00

539 lines
20 KiB
Ruby

require 'spec_helper'
describe 'glance::api' do
let :pre_condition do
"class { 'glance::api::authtoken':
password => 'ChangeMe',
}"
end
let :default_params do
{
:bind_host => '<SERVICE DEFAULT>',
:bind_port => '9292',
:auth_strategy => 'keystone',
:enabled => true,
:manage_service => true,
:backlog => '<SERVICE DEFAULT>',
:workers => '7',
:show_image_direct_url => '<SERVICE DEFAULT>',
:show_multiple_locations => '<SERVICE DEFAULT>',
:filesystem_store_metadata_file => '<SERVICE DEFAULT>',
:filesystem_store_file_perm => '<SERVICE DEFAULT>',
:location_strategy => '<SERVICE DEFAULT>',
:purge_config => false,
:delayed_delete => '<SERVICE DEFAULT>',
:enforce_secure_rbac => '<SERVICE DEFAULT>',
:use_keystone_limits => '<SERVICE DEFAULT>',
:image_cache_dir => '/var/lib/glance/image-cache',
:image_import_plugins => '<SERVICE DEFAULT>',
:image_conversion_output_format => '<SERVICE DEFAULT>',
:inject_metadata_properties => '<SERVICE DEFAULT>',
:ignore_user_roles => '<SERVICE DEFAULT>',
:enabled_import_methods => '<SERVICE DEFAULT>',
:node_staging_uri => '<SERVICE DEFAULT>',
:worker_self_reference_url => '<SERVICE DEFAULT>',
:image_member_quota => '<SERVICE DEFAULT>',
:image_property_quota => '<SERVICE DEFAULT>',
:image_tag_quota => '<SERVICE DEFAULT>',
:image_location_quota => '<SERVICE DEFAULT>',
:image_size_cap => '<SERVICE DEFAULT>',
:user_storage_quota => '<SERVICE DEFAULT>',
:image_cache_stall_time => '<SERVICE DEFAULT>',
:image_cache_max_size => '<SERVICE DEFAULT>',
:cache_prefetcher_interval => '<SERVICE DEFAULT>',
:disk_formats => '<SERVICE DEFAULT>',
:paste_deploy_flavor => 'keystone',
:paste_deploy_config_file => '<SERVICE DEFAULT>',
:task_time_to_live => '<SERVICE DEFAULT>',
:task_executor => '<SERVICE DEFAULT>',
:task_work_dir => '<SERVICE DEFAULT>',
:taskflow_engine_mode => '<SERVICE DEFAULT>',
:taskflow_max_workers => '<SERVICE DEFAULT>',
:conversion_format => '<SERVICE DEFAULT>',
:sync_db => true,
:limit_param_default => '<SERVICE DEFAULT>',
:api_limit_max => '<SERVICE DEFAULT>',
}
end
shared_examples_for 'glance::api' do
[{
:bind_host => '127.0.0.1',
:bind_port => '9222',
:auth_strategy => 'not_keystone',
:enabled => false,
:backlog => '4095',
:workers => '5',
:show_image_direct_url => true,
:show_multiple_locations => true,
:filesystem_store_metadata_file => '/etc/glance/glance-metadata-file.conf',
:filesystem_store_file_perm => '0644',
:location_strategy => 'store_type',
:delayed_delete => 'true',
:enforce_secure_rbac => 'true',
:use_keystone_limits => 'true',
:image_cache_dir => '/tmp/glance',
:image_import_plugins => 'image_conversion',
:image_conversion_output_format => 'raw',
:inject_metadata_properties => 'key:val',
:ignore_user_roles => 'admin',
:enabled_import_methods => 'glance-direct,web-download',
:node_staging_uri => '/tmp/staging',
:worker_self_reference_url => 'http://worker1',
:image_member_quota => 128,
:image_property_quota => 129,
:image_tag_quota => 130,
:image_location_quota => 10,
:image_size_cap => 1099511627776,
:user_storage_quota => 0,
:image_cache_stall_time => '10',
:image_cache_max_size => '10737418240',
:cache_prefetcher_interval => '300',
:paste_deploy_flavor => 'keystone+caching',
:paste_deploy_config_file => 'glance-api-paste.ini',
:sync_db => false,
:limit_param_default => '10',
:api_limit_max => '10',
}
].each do |param_set|
describe "when #{param_set.empty? ? "using default" : "specifying"} class parameters" do
let :param_hash do
default_params.merge(param_set)
end
let :params do
param_set
end
it { is_expected.to contain_class 'glance' }
it { is_expected.to contain_class 'glance::policy' }
it { is_expected.to contain_class 'glance::api::db' }
it 'is_expected.to not sync the db if sync_db is set to false' do
if !param_hash[:sync_db]
is_expected.not_to contain_exec('glance-manage db_sync')
end
end
it { is_expected.to contain_service('glance-api').with(
'ensure' => (param_hash[:manage_service] && param_hash[:enabled]) ? 'running': 'stopped',
'enable' => param_hash[:enabled],
'hasstatus' => true,
'hasrestart' => true,
'tag' => 'glance-service',
) }
it { is_expected.to contain_glance_api_config('paste_deploy/flavor').with_value(param_hash[:paste_deploy_flavor]) }
it { is_expected.to contain_glance_api_config('paste_deploy/config_file').with_value(param_hash[:paste_deploy_config_file]) }
it 'is_expected.to lay down default api config' do
[
'bind_host',
'bind_port',
'show_image_direct_url',
'show_multiple_locations',
'location_strategy',
'delayed_delete',
'enforce_secure_rbac',
'use_keystone_limits',
'image_cache_dir',
'image_cache_stall_time',
'image_cache_max_size',
'cache_prefetcher_interval',
'node_staging_uri',
'worker_self_reference_url',
'image_member_quota',
'image_property_quota',
'image_tag_quota',
'image_location_quota',
'image_size_cap',
'user_storage_quota',
'limit_param_default',
'api_limit_max',
].each do |config|
is_expected.to contain_glance_api_config("DEFAULT/#{config}").with_value(param_hash[config.intern])
end
end
it 'is_expected.to lay down default enabled_import_methods config' do
# Verify brackets "[]" are added to satisfy the ListOpt syntax.
is_expected.to contain_glance_api_config("DEFAULT/enabled_import_methods").with_value(
"[%s]" % param_hash[:enabled_import_methods])
end
it 'is_expected.to lay down default image_import_plugins config' do
# Verify brackets "[]" are added to satisfy the ListOpt syntax.
is_expected.to contain_glance_image_import_config("image_import_opts/image_import_plugins").with_value(
"[%s]" % param_hash[:image_import_plugins])
end
it 'is_expected.to lay down default image_conversion & inject_metadata image_import config' do
is_expected.to contain_glance_image_import_config("image_conversion/output_format").with_value(param_hash[:image_conversion_output_format])
is_expected.to contain_glance_image_import_config("inject_metadata_properties/inject").with_value(param_hash[:inject_metadata_properties])
is_expected.to contain_glance_image_import_config("inject_metadata_properties/ignore_user_roles").with_value(param_hash[:ignore_user_roles])
end
it 'is_expected.to lay down default cache config' do
[
'image_cache_dir',
'image_cache_stall_time',
'image_cache_max_size',
].each do |config|
is_expected.to contain_glance_cache_config("DEFAULT/#{config}").with_value(param_hash[config.intern])
end
end
it 'is_expected.to lay down default glance_store api config' do
[
'filesystem_store_metadata_file',
'filesystem_store_file_perm',
].each do |config|
is_expected.to contain_glance_api_config("glance_store/#{config}").with_value(param_hash[config.intern])
end
end
it 'is_expected.to lay down default task & taskflow_executor config' do
is_expected.to contain_glance_api_config('task/task_time_to_live').with_value(param_hash[:task_time_to_live])
is_expected.to contain_glance_api_config('task/task_executor').with_value(param_hash[:task_executor])
is_expected.to contain_glance_api_config('task/work_dir').with_value(param_hash[:task_work_dir])
is_expected.to contain_glance_api_config('taskflow_executor/engine_mode').with_value(param_hash[:taskflow_engine_mode])
is_expected.to contain_glance_api_config('taskflow_executor/max_workers').with_value(param_hash[:taskflow_max_workers])
is_expected.to contain_glance_api_config('taskflow_executor/conversion_format').with_value(param_hash[:conversion_format])
end
it 'is_expected.to have no formats set' do
is_expected.to contain_glance_api_config('image_format/container_formats').with_value('<SERVICE DEFAULT>')
is_expected.to contain_glance_api_config('image_format/disk_formats').with_value('<SERVICE DEFAULT>')
end
it 'passes purge to resource' do
is_expected.to contain_resources('glance_api_config').with({
:purge => false
})
end
end
end
describe 'with disabled service managing' do
let :params do
{
:manage_service => false,
:enabled => false,
}
end
it { is_expected.to_not contain_service('glance-api') }
end
describe 'with overridden flavor' do
let :params do
{
:paste_deploy_flavor => 'something',
}
end
it { is_expected.to contain_glance_api_config('paste_deploy/flavor').with_value('something') }
end
describe 'with flavor overridden by the deprecated pipeline parameter' do
let :params do
{
:pipeline => 'something',
}
end
it { is_expected.to contain_glance_api_config('paste_deploy/flavor').with_value('something') }
end
describe 'with blank flavor' do
let :params do
{
:paste_deploy_flavor => '',
}
end
it { is_expected.to contain_glance_api_config('paste_deploy/flavor').with_ensure('absent') }
end
[
'keystone/',
'keystone+',
'+keystone',
'keystone+cachemanagement+',
'+'
].each do |flavor|
describe "with flavor set by incorrect value #{flavor}" do
let :params do
{
:flavor => flavor
}
end
it { expect { is_expected.to contain_glance_api_config('filter:paste_deploy/flavor') }.to\
raise_error(Puppet::Error) }
end
end
describe 'with platform default oslo concurrency lock_path' do
it { is_expected.to contain_oslo__concurrency('glance_api_config').with(
:lock_path => platform_params[:lock_path]
)}
end
describe 'with overridden oslo concurrency lock_path' do
let :params do
{:lock_path => '/glance/lock/path' }
end
it { is_expected.to contain_oslo__concurrency('glance_api_config').with(
:lock_path => '/glance/lock/path',
)}
end
describe 'setting enable_proxy_headers_parsing' do
let :params do
{:enable_proxy_headers_parsing => true }
end
it { is_expected.to contain_oslo__middleware('glance_api_config').with(
:enable_proxy_headers_parsing => true,
)}
end
describe 'setting max_request_body_size' do
let :params do
{:max_request_body_size => '102400' }
end
it { is_expected.to contain_oslo__middleware('glance_api_config').with(
:max_request_body_size => '102400',
)}
end
describe 'with formats options with strings' do
let :params do
{
:container_formats => 'ami,ari',
:disk_formats => 'raw,iso',
}
end
context 'with disk_formats option' do
it { is_expected.to contain_glance_api_config('image_format/container_formats').with_value('ami,ari') }
it { is_expected.to contain_glance_api_config('image_format/disk_formats').with_value('raw,iso') }
end
end
describe 'with formats options with arrays' do
let :params do
{
:container_formats => ['ami', 'ari'],
:disk_formats => ['raw', 'iso'],
}
end
context 'with disk_formats option' do
it { is_expected.to contain_glance_api_config('image_format/container_formats').with_value('ami,ari') }
it { is_expected.to contain_glance_api_config('image_format/disk_formats').with_value('raw,iso') }
end
end
describe 'with enabled_backends and stores by default' do
it { is_expected.to_not contain_glance_api_config('DEFAULT/enabled_backends').with_value('<SERVICE DEFAULT>') }
it { is_expected.to_not contain_glance_api_config('glance_store/stores').with_value('<SERVICE DEFAULT>') }
end
describe 'with enabled_backends' do
let :params do
{
:enabled_backends => ['file1:file','http1:http'],
:default_backend => 'file1',
:stores => ['file','http'],
:default_store => 'file',
}
end
it { is_expected.to contain_glance_api_config('DEFAULT/enabled_backends').with_value('file1:file,http1:http') }
it { is_expected.to contain_glance_api_config('glance_store/default_backend').with_value('file1') }
it { is_expected.to contain_glance_api_config('glance_store/stores').with_ensure('absent') }
it { is_expected.to contain_glance_api_config('glance_store/default_store').with_ensure('absent') }
end
describe 'with invalid backend type' do
let :params do
{
:enabled_backends => ['file1:file','bad1:mybad'],
:default_backend => 'file',
}
end
it_raises 'a Puppet::Error', / is not a valid backend type./
end
describe 'with enabled_backends but no default_backend' do
let :params do
{
:enabled_backends => ['file1:file','http1:http'],
}
end
it_raises 'a Puppet::Error', /A glance default_backend must be specified./
end
describe 'with duplicate backend identifiers' do
let :params do
{
:enabled_backends => ['file1:file','file1:http'],
:default_backend => 'file1',
}
end
it_raises 'a Puppet::Error', /All backend identifiers in enabled_backends must be unique./
end
describe 'with invalid default_backend' do
let :params do
{
:enabled_backends => ['file1:file','http1:http'],
:default_backend => 'file2',
}
end
it_raises 'a Puppet::Error', / is not a valid backend identifier./
end
describe 'with stores override' do
let :params do
{
:default_store => 'file',
:stores => ['file','http'],
:multi_store => true,
}
end
it { is_expected.to contain_glance_api_config('glance_store/default_store').with_value('file') }
it { is_expected.to contain_glance_api_config('glance_store/stores').with_value('file,http') }
end
describe 'with single store override and no default store' do
let :params do
{
:stores => ['file'],
:multi_store => true,
}
end
it { is_expected.to contain_glance_api_config('glance_store/default_store').with_value('file') }
it { is_expected.to contain_glance_api_config('glance_store/stores').with_value('file') }
end
describe 'with multiple stores override and no default store' do
let :params do
{
:stores => ['file', 'http'],
:multi_store => true,
}
end
it { is_expected.to contain_glance_api_config('glance_store/default_store').with_value('file') }
it { is_expected.to contain_glance_api_config('glance_store/stores').with_value('file,http') }
end
describe 'with default_store' do
let :params do
{
:default_store => 'file',
:multi_store => true,
}
end
it { is_expected.to contain_glance_api_config('glance_store/default_store').with_value('file') }
it { is_expected.to contain_glance_api_config('glance_store/stores').with_value('file') }
end
describe 'with task & taskflow configuration' do
let :params do
{
:task_time_to_live => 72,
:task_executor => 'taskflow-next-gen',
:task_work_dir => '/tmp/large',
:taskflow_engine_mode => 'serial',
:taskflow_max_workers => 1,
:conversion_format => 'raw',
}
end
it 'is_expected.to lay down default task & taskflow_executor config' do
is_expected.to contain_glance_api_config('task/task_time_to_live').with_value(72)
is_expected.to contain_glance_api_config('task/task_executor').with_value('taskflow-next-gen')
is_expected.to contain_glance_api_config('task/work_dir').with_value('/tmp/large')
is_expected.to contain_glance_api_config('taskflow_executor/engine_mode').with_value('serial')
is_expected.to contain_glance_api_config('taskflow_executor/max_workers').with_value(1)
is_expected.to contain_glance_api_config('taskflow_executor/conversion_format').with_value('raw')
end
end
describe 'with barbican parameters' do
let :params do
{
:keymgr_backend => 'castellan.key_manager.barbican_key_manager.BarbicanKeyManager',
:keymgr_encryption_api_url => 'https://localhost:9311/v1',
:keymgr_encryption_auth_url => 'https://localhost:5000/v3',
}
end
it 'should set keymgr parameters' do
is_expected.to contain_glance_api_config('key_manager/backend').with_value('castellan.key_manager.barbican_key_manager.BarbicanKeyManager')
is_expected.to contain_glance_api_config('barbican/barbican_endpoint').with_value('https://localhost:9311/v1')
is_expected.to contain_glance_api_config('barbican/auth_endpoint').with_value('https://localhost:5000/v3')
end
end
end
shared_examples_for 'glance::api on Debian' do
# We only test this on Debian platforms, since on RedHat there isn't a
# separate package for glance API.
['present', 'latest'].each do |package_ensure|
context "with package_ensure '#{package_ensure}'" do
let(:params) do
{ :package_ensure => package_ensure }
end
it { is_expected.to contain_package('glance-api').with(
:ensure => package_ensure,
:tag => ['openstack', 'glance-package']
)}
end
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'
{ :lock_path => '/var/lock/glance' }
when 'RedHat'
{ :lock_path => '/var/lib/glance/tmp' }
end
end
it_configures 'glance::api'
if facts[:osfamily] == 'Debian'
it_configures "glance::api on #{facts[:osfamily]}"
end
end
end
end