Nate Potter 22231b2d66 Implement multiple store configuration
This patch moves the default_store config option to the glance::api
class, and makes it possible to configure more than one store while
supplying a value for the default store to be used. If only one store
is given for glance_store/stores, the default store is automatically
set to be the same value. If multiple stores are given and no default
store is explicitly set, the config will fail and ask the user to
provide a default store.

Change-Id: I28a79ae36e673a3537ea16910d338666b65c80f7
Closes-bug: #1481460
Co-Authored-By: Alex Schultz <aschultz@mirantis.com>
2016-03-05 00:32:39 +00:00

414 lines
15 KiB
Ruby

require 'spec_helper'
describe 'glance::api' do
let :default_params do
{
:verbose => false,
:debug => false,
:use_stderr => true,
:bind_host => '0.0.0.0',
:bind_port => '9292',
:registry_host => '0.0.0.0',
:registry_port => '9191',
:registry_client_protocol => 'http',
:log_file => '/var/log/glance/api.log',
:log_dir => '/var/log/glance',
:auth_type => 'keystone',
:auth_region => '<SERVICE DEFAULT>',
:enabled => true,
:manage_service => true,
:backlog => '4096',
:workers => '7',
:keystone_tenant => 'services',
:keystone_user => 'glance',
:keystone_password => 'ChangeMe',
:token_cache_time => '<SERVICE DEFAULT>',
:memcached_servers => '<SERVICE DEFAULT>',
:show_image_direct_url => false,
:show_multiple_locations => '<SERVICE DEFAULT>',
:location_strategy => '<SERVICE DEFAULT>',
:purge_config => false,
:known_stores => false,
:delayed_delete => '<SERVICE DEFAULT>',
:scrub_time => '<SERVICE DEFAULT>',
:default_store => false,
:image_cache_dir => '/var/lib/glance/image-cache',
:image_cache_stall_time => '<SERVICE DEFAULT>',
:image_cache_max_size => '<SERVICE DEFAULT>',
:os_region_name => 'RegionOne',
:signing_dir => '<SERVICE DEFAULT>',
:pipeline => 'keystone',
:auth_uri => 'http://127.0.0.1:5000/',
:identity_uri => 'http://127.0.0.1:35357/',
}
end
shared_examples_for 'glance::api' do
[{:keystone_password => 'ChangeMe'},
{
:verbose => true,
:debug => true,
:bind_host => '127.0.0.1',
:bind_port => '9222',
:registry_host => '127.0.0.1',
:registry_port => '9111',
:registry_client_protocol => 'https',
:auth_type => 'not_keystone',
:auth_region => 'RegionOne2',
:enabled => false,
:backlog => '4095',
:workers => '5',
:keystone_tenant => 'admin2',
:keystone_user => 'admin2',
:keystone_password => 'ChangeMe2',
:token_cache_time => '300',
:show_image_direct_url => true,
:show_multiple_locations => true,
:location_strategy => 'store_type',
:delayed_delete => 'true',
:scrub_time => '10',
:image_cache_dir => '/tmp/glance',
:image_cache_stall_time => '10',
:image_cache_max_size => '10737418240',
:os_region_name => 'RegionOne2',
:signing_dir => '/path/to/dir',
:pipeline => 'keystone2',
:auth_uri => 'http://127.0.0.1:5000/v2.0',
:identity_uri => 'http://127.0.0.1:35357/v2.0',
}
].each do |param_set|
describe "when #{param_set == {:keystone_password => 'ChangeMe'} ? "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::logging' }
it { is_expected.to contain_class 'glance::api::db' }
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_not contain_exec('validate_nova_api') }
it { is_expected.to contain_glance_api_config("paste_deploy/flavor").with_value(param_hash[:pipeline]) }
it 'is_expected.to lay down default api config' do
[
'use_stderr',
'bind_host',
'bind_port',
'registry_host',
'registry_port',
'registry_client_protocol',
'show_image_direct_url',
'show_multiple_locations',
'location_strategy',
'delayed_delete',
'scrub_time',
'image_cache_dir',
'auth_region'
].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 cache config' do
[
'registry_host',
'registry_port',
'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 and cache config' do
[
'os_region_name',
].each do |config|
is_expected.to contain_glance_cache_config("glance_store/#{config}").with_value(param_hash[config.intern])
is_expected.to contain_glance_api_config("glance_store/#{config}").with_value(param_hash[config.intern])
end
end
it 'is_expected.to have no ssl options' do
is_expected.to contain_glance_api_config('DEFAULT/ca_file').with_ensure('absent')
is_expected.to contain_glance_api_config('DEFAULT/cert_file').with_ensure('absent')
is_expected.to contain_glance_api_config('DEFAULT/key_file').with_ensure('absent')
end
it 'is_expected.to configure itself for keystone if that is the auth_type' do
if params[:auth_type] == 'keystone'
is_expected.to contain('paste_deploy/flavor').with_value('keystone+cachemanagement')
is_expected.to contain_glance_api_config('keystone_authtoken/memcached_servers').with_value(param_hash[:memcached_servers])
['admin_tenant_name', 'admin_user', 'admin_password', 'token_cache_time', 'signing_dir', 'auth_uri', 'identity_uri'].each do |config|
is_expected.to contain_glance_api_config("keystone_authtoken/#{config}").with_value(param_hash[config.intern])
end
is_expected.to contain_glance_api_config('keystone_authtoken/admin_password').with_value(param_hash[:keystone_password]).with_secret(true)
['admin_tenant_name', 'admin_user', 'admin_password'].each do |config|
is_expected.to contain_glance_cache_config("keystone_authtoken/#{config}").with_value(param_hash[config.intern])
end
is_expected.to contain_glance_cache_config('keystone_authtoken/admin_password').with_value(param_hash[:keystone_password]).with_secret(true)
end
end
end
end
describe 'with disabled service managing' do
let :params do
{
:keystone_password => 'ChangeMe',
:manage_service => false,
:enabled => false,
}
end
it { is_expected.to contain_service('glance-api').with(
'ensure' => nil,
'enable' => false,
'hasstatus' => true,
'hasrestart' => true,
'tag' => 'glance-service',
) }
end
describe 'with overridden pipeline' do
let :params do
{
:keystone_password => 'ChangeMe',
:pipeline => 'something',
}
end
it { is_expected.to contain_glance_api_config('paste_deploy/flavor').with_value('something') }
end
describe 'with blank pipeline' do
let :params do
{
:keystone_password => 'ChangeMe',
:pipeline => '',
}
end
it { is_expected.to contain_glance_api_config('paste_deploy/flavor').with_ensure('absent') }
end
[
'keystone/',
'keystone+',
'+keystone',
'keystone+cachemanagement+',
'+'
].each do |pipeline|
describe "with pipeline incorrect value #{pipeline}" do
let :params do
{
:keystone_password => 'ChangeMe',
:pipeline => pipeline
}
end
it { expect { is_expected.to contain_glance_api_config('filter:paste_deploy/flavor') }.to\
raise_error(Puppet::Error, /validate_re\(\): .* does not match/) }
end
end
describe 'with ssl options' do
let :params do
default_params.merge({
:ca_file => '/tmp/ca_file',
:cert_file => '/tmp/cert_file',
:key_file => '/tmp/key_file'
})
end
context 'with ssl options' do
it { is_expected.to contain_glance_api_config('DEFAULT/ca_file').with_value('/tmp/ca_file') }
it { is_expected.to contain_glance_api_config('DEFAULT/cert_file').with_value('/tmp/cert_file') }
it { is_expected.to contain_glance_api_config('DEFAULT/key_file').with_value('/tmp/key_file') }
end
end
describe 'with stores by default' do
let :params do
default_params
end
it { is_expected.to_not contain_glance_api_config('glance_store/stores').with_value('false') }
end
describe 'with stores override' do
let :params do
default_params.merge({
:default_store => 'glance.store.filesystem.Store',
:stores => ['glance.store.filesystem.Store','glance.store.http.Store'],
:multi_store => true,
})
end
it { is_expected.to contain_glance_api_config('glance_store/default_store').with_value('glance.store.filesystem.Store') }
it { is_expected.to contain_glance_api_config('glance_store/stores').with_value('glance.store.filesystem.Store,glance.store.http.Store') }
end
describe 'with single store override and no default store' do
let :params do
default_params.merge({
:stores => ['glance.store.filesystem.Store'],
:multi_store => true,
})
end
it { is_expected.to contain_glance_api_config('glance_store/default_store').with_value('glance.store.filesystem.Store') }
it { is_expected.to contain_glance_api_config('glance_store/stores').with_value('glance.store.filesystem.Store') }
end
describe 'with multiple stores override and no default store' do
let :params do
default_params.merge({
:stores => ['glance.store.filesystem.Store', 'glance.store.http.Store'],
:multi_store => true,
})
end
it { is_expected.to contain_glance_api_config('glance_store/default_store').with_value('glance.store.filesystem.Store') }
it { is_expected.to contain_glance_api_config('glance_store/stores').with_value('glance.store.filesystem.Store,glance.store.http.Store') }
end
describe 'with both stores and known_stores provided' do
let :params do
default_params.merge({
:stores => ['glance.store.filesystem.Store'],
:known_stores => ['glance.store.http.store'],
})
end
it { is_expected.to raise_error(Puppet::Error, /known_stores and stores cannot both be assigned values/) }
end
describe 'with known_stores not set but with default_store' do
let :params do
default_params.merge({
:default_store => 'glance.store.filesystem.Store',
:multi_store => true,
})
end
it { is_expected.to contain_glance_api_config('glance_store/default_store').with_value('glance.store.filesystem.Store') }
it { is_expected.to contain_glance_api_config('glance_store/stores').with_value('glance.store.filesystem.Store') }
end
describe 'while validating the service with default command' do
let :params do
default_params.merge({
:validate => true,
})
end
it { is_expected.to contain_exec('execute glance-api validation').with(
:path => '/usr/bin:/bin:/usr/sbin:/sbin',
:provider => 'shell',
:tries => '10',
:try_sleep => '2',
:command => 'glance --os-auth-url http://127.0.0.1:5000/ --os-tenant-name services --os-username glance --os-password ChangeMe image-list',
)}
it { is_expected.to contain_anchor('create glance-api anchor').with(
:require => 'Exec[execute glance-api validation]',
)}
end
describe 'Support IPv6' do
let :params do
default_params.merge({
:registry_host => '2001::1',
})
end
it { is_expected.to contain_glance_api_config('DEFAULT/registry_host').with(
:value => '[2001::1]'
)}
end
describe 'while validating the service with custom command' do
let :params do
default_params.merge({
:validate => true,
:validation_options => { 'glance-api' => { 'command' => 'my-script' } }
})
end
it { is_expected.to contain_exec('execute glance-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 glance-api anchor').with(
:require => 'Exec[execute glance-api validation]',
)}
end
end
shared_examples_for 'glance::api Debian' do
let(:params) { default_params }
# 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) { default_params.merge({ :package_ensure => package_ensure }) }
it { is_expected.to contain_package('glance-api').with(
:ensure => package_ensure,
:tag => ['openstack', 'glance-package']
)}
end
end
end
shared_examples_for 'glance::api RedHat' do
let(:params) { default_params }
it { is_expected.to contain_package('openstack-glance').with(
:tag => ['openstack', 'glance-package'],
)}
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
it_configures 'glance::api'
it_configures "glance::api #{facts[:osfamily]}"
end
end
describe 'on unknown platforms' do
let :facts do
{ :osfamily => 'unknown' }
end
let(:params) { default_params }
it_raises 'a Puppet::Error', /module glance only support osfamily RedHat and Debian/
end
end