cookbook-openstack-image/spec/registry_spec.rb

285 lines
10 KiB
Ruby

# encoding: UTF-8
require_relative 'spec_helper'
describe 'openstack-image::registry' do
describe 'ubuntu' do
before do
# Lame we must still stub this, since the recipe contains shell
# guards. Need to work on a way to resolve this.
stub_command('glance-manage db_version').and_return(true)
end
let(:runner) { ChefSpec::SoloRunner.new(UBUNTU_OPTS) }
let(:node) { runner.node }
let(:chef_run) do
runner.converge(described_recipe)
end
include Helpers
include_context 'image-stubs'
include_examples 'common-logging-recipe'
include_examples 'common-packages'
include_examples 'glance-directory'
it do
expect(chef_run).to create_directory('/var/cache/glance/registry').with(
user: 'glance',
group: 'glance',
mode: 00700
)
end
it 'converges when configured to use sqlite' do
node.set['openstack']['db']['image']['service_type'] = 'sqlite'
expect { chef_run }.to_not raise_error
end
it 'upgrades mysql python package' do
expect(chef_run).to upgrade_package('python-mysqldb')
end
it 'honors package name and option overrides for mysql python packages' do
node.set['openstack']['image']['platform']['package_overrides'] = '-o Dpkg::Options::=\'--force-confold\' -o Dpkg::Options::=\'--force-confdef\' --force-yes'
node.set['openstack']['db']['python_packages']['mysql'] = ['my-mysql-py']
expect(chef_run).to upgrade_package('my-mysql-py').with(options: '-o Dpkg::Options::=\'--force-confold\' -o Dpkg::Options::=\'--force-confdef\' --force-yes')
end
%w(db2 postgresql).each do |service_type|
it "upgrades #{service_type} python packages if chosen" do
node.set['openstack']['db']['image']['service_type'] = service_type
node.set['openstack']['db']['python_packages'][service_type] = ["my-#{service_type}-py"]
expect(chef_run).to upgrade_package("my-#{service_type}-py")
end
end
it 'starts glance registry on boot' do
expect(chef_run).to enable_service('glance-registry')
end
describe 'version_control' do
let(:cmd) { 'glance-manage version_control 0' }
it 'versions the database' do
stub_command('glance-manage db_version').and_return(false)
expect(chef_run).to run_execute(cmd).with(user: 'glance', group: 'glance')
end
it 'does not version when glance-manage db_version false' do
stub_command('glance-manage db_version').and_return(true)
expect(chef_run).not_to run_execute(cmd)
end
end
it 'deletes glance.sqlite' do
expect(chef_run).to delete_file('/var/lib/glance/glance.sqlite')
end
it 'does not delete glance.sqlite when configured to use sqlite' do
node.set['openstack']['db']['image']['service_type'] = 'sqlite'
expect(chef_run).not_to delete_file('/var/lib/glance/glance.sqlite')
end
describe 'glance-registry.conf' do
let(:file) { chef_run.template('/etc/glance/glance-registry.conf') }
it 'creates glance-registry.conf' do
expect(chef_run).to create_template(file.name).with(
user: 'glance',
group: 'glance',
mode: 00640
)
end
context 'template contents' do
include_context 'endpoint-stubs'
include_context 'sql-stubs'
it_behaves_like 'custom template banner displayer' do
let(:file_name) { file.name }
end
%w(verbose debug data_api).each do |attr|
it "sets the #{attr} attribute" do
node.set['openstack']['image'][attr] = "#{attr}_value"
expect(chef_run).to render_file(file.name).with_content(/^#{attr} = #{attr}_value$/)
end
end
it 'sets port and host attributes' do
[
/^bind_port = 9191$/,
/^bind_host = 127.0.0.1$/
].each do |line|
expect(chef_run).to render_config_file(file.name)\
.with_section_content('DEFAULT', line)
end
end
it 'sets the workers attribute' do
node.set['openstack']['image']['registry']['workers'] = 123
expect(chef_run).to render_file(file.name).with_content(/^workers = 123$/)
end
it 'sets the connection attribute' do
expect(chef_run).to render_file(file.name).with_content(/^connection = sql_connection_value$/)
end
it_behaves_like 'syslog use' do
let(:log_file_name) { 'registry.log' }
end
it_behaves_like 'messaging' do
let(:file_name) { file.name }
end
it_behaves_like 'keystone attribute setter', 'registry'
context 'keystone authtoken attributes with default values' do
it 'sets memcached server(s)' do
expect(chef_run).not_to render_file(file.name).with_content(/^memcached_servers = $/)
end
it 'sets memcache security strategy' do
expect(chef_run).not_to render_file(file.name).with_content(/^memcache_security_strategy = $/)
end
it 'sets memcache secret key' do
expect(chef_run).not_to render_file(file.name).with_content(/^memcache_secret_key = $/)
end
it 'sets cafile' do
expect(chef_run).not_to render_file(file.name).with_content(/^cafile = $/)
end
it 'sets insecure' do
expect(chef_run).to render_file(file.name).with_content(/^insecure = false$/)
end
it 'sets registry auth version to the default v2.0' do
expect(chef_run).to render_file(file.name).with_content(/^auth_version = v2.0$/)
end
it 'sets token hash algorithms' do
expect(chef_run).to render_file(file.name).with_content(/^hash_algorithms = md5$/)
end
end
context 'keystone authtoken attributes with new values' do
it 'sets memcached server(s)' do
node.set['openstack']['image']['registry']['auth']['memcached_servers'] = 'localhost:11211'
expect(chef_run).to render_file(file.name).with_content(/^memcached_servers = localhost:11211$/)
end
it 'sets memcache security strategy' do
node.set['openstack']['image']['registry']['auth']['memcache_security_strategy'] = 'MAC'
expect(chef_run).to render_file(file.name).with_content(/^memcache_security_strategy = MAC$/)
end
it 'sets memcache secret key' do
node.set['openstack']['image']['registry']['auth']['memcache_secret_key'] = '0123456789ABCDEF'
expect(chef_run).to render_file(file.name).with_content(/^memcache_secret_key = 0123456789ABCDEF$/)
end
it 'sets cafile' do
node.set['openstack']['image']['registry']['auth']['cafile'] = 'dir/to/path'
expect(chef_run).to render_file(file.name).with_content(%r{^cafile = dir/to/path$})
end
it 'sets registry auth version' do
node.set['openstack']['image']['registry']['auth']['version'] = 'v3.0'
expect(chef_run).to render_file(file.name).with_content(/^auth_version = v3.0$/)
end
it 'sets insecure' do
node.set['openstack']['image']['registry']['auth']['insecure'] = true
expect(chef_run).to render_file(file.name).with_content(/^insecure = true$/)
end
it 'sets token hash algorithms' do
node.set['openstack']['image']['registry']['auth']['hash_algorithms'] = 'sha2'
expect(chef_run).to render_file(file.name).with_content(/^hash_algorithms = sha2$/)
end
end
context 'glance-registry configuration with ssl disabled' do
default_opts = {
cert_file: '/etc/glance/ssl/certs/sslcert.pem',
key_file: '/etc/glance/ssl/private/sslkey.pem'
}
it 'does not set cert or key file' do
default_opts.each do |key, val|
r = line_regexp("#{key} = #{val}")
expect(chef_run).not_to render_config_file(file.name).with_section_content('DEFAULT', r)
end
end
end
context 'glance-registry configuration with ssl enabled' do
default_opts = {
cert_file: '/etc/glance/ssl/certs/sslcert.pem',
key_file: '/etc/glance/ssl/private/sslkey.pem'
}
cert = { 'ca_file' => '/etc/glance/ssl/certs/sslca.pem' }
it 'configures SSL cert and key file when api is enabled for ssl' do
node.set['openstack']['image']['ssl']['registry']['enabled'] = true
default_opts.each do |key, val|
r = line_regexp("#{key} = #{val}")
expect(chef_run).to render_config_file(file.name).with_section_content('DEFAULT', r)
end
end
it 'configures SSL cert and key file when glance is enabled ssl' do
node.set['openstack']['image']['ssl']['enabled'] = true
default_opts.each do |key, val|
r = line_regexp("#{key} = #{val}")
expect(chef_run).to render_config_file(file.name).with_section_content('DEFAULT', r)
end
end
context 'with cert required' do
it 'configures CA cert ' do
node.set['openstack']['image']['ssl']['registry']['enabled'] = true
node.set['openstack']['image']['ssl']['cert_required'] = true
r = line_regexp("ca_file = #{cert['ca_file']}")
expect(chef_run).to render_config_file(file.name).with_section_content('DEFAULT', r)
end
end
context 'with cert not required' do
it 'configures CA cert ' do
node.set['openstack']['image']['ssl']['registry']['enabled'] = true
node.set['openstack']['image']['ssl']['cert_required'] = false
r = line_regexp("ca_file = #{cert['ca_file']}")
expect(chef_run).not_to render_config_file(file.name).with_section_content('DEFAULT', r)
end
end
end
end
it 'notifies glance-registry restart' do
expect(file).to notify('service[glance-registry]').to(:restart)
end
end
describe 'db_sync' do
let(:cmd) { 'glance-manage db_sync' }
it 'runs migrations' do
expect(chef_run).to run_execute(cmd).with(user: 'glance', group: 'glance')
end
it 'does not run migrations when openstack/image/db/migrate is false' do
node.set['openstack']['db']['image']['migrate'] = false
stub_command('glance-manage db_version').and_return(false)
expect(chef_run).not_to run_execute(cmd)
end
end
end
end