puppet-horizon/spec/classes/horizon_wsgi_apache_spec.rb
Tobias Urdin bb54858824 apache wsgi: Exchange defaults for workers and threads
Due to Python's GIL [1], we can't use multiple threads for running
 OpenStack services without a performance penalty, since the execution
 ends up serialized, which defeats the purpose.

 Instead, we should use several processes, since this approach doesn't
 have this limitation.

 See the same kind of change here [2]

 [1] https://wiki.python.org/moin/GlobalInterpreterLock
 [2] https://review.openstack.org/#/c/505192/

Change-Id: I9c1ef8991d63b18a0ec106a05576b74ab457a2a0
2018-08-12 21:02:29 +00:00

544 lines
18 KiB
Ruby

require 'spec_helper'
describe 'horizon::wsgi::apache' do
let :params do
{
:servername => 'some.host.tld',
}
end
let :pre_condition do
"include apache
class { 'horizon': secret_key => 's3cr3t', configure_apache => false }"
end
let :fixtures_path do
File.expand_path(File.join(__FILE__, '..', '..', 'fixtures'))
end
shared_examples 'horizon::wsgi::apache' do
context 'with default parameters' do
it { should contain_class('horizon::params') }
it { should contain_class('apache') }
it { should contain_class('apache::mod::wsgi') }
it { should contain_service('httpd').with_name(platforms_params[:http_service]) }
it { should contain_package('httpd').with_name(platforms_params[:http_service]) }
it { should contain_file(platforms_params[:httpd_config_file]) }
it { should contain_package('horizon').with_ensure('present') }
it { should contain_apache__vhost('horizon_vhost').with(
:servername => 'some.host.tld',
:access_log_file => 'horizon_access.log',
:error_log_file => 'horizon_error.log',
:priority => '15',
:serveraliases => ['some.host.tld'],
:docroot => '/var/www/',
:ssl => 'false',
:port => '80',
:redirectmatch_status => 'permanent',
:redirectmatch_regexp => '^/$',
:redirectmatch_dest => platforms_params[:root_url],
:wsgi_script_aliases => { platforms_params[:root_url] => '/usr/share/openstack-dashboard/openstack_dashboard/wsgi/django.wsgi' },
:wsgi_process_group => platforms_params[:wsgi_group],
:wsgi_daemon_process => platforms_params[:wsgi_group],
:wsgi_application_group => '%{GLOBAL}',
:wsgi_daemon_process_options => {
'processes' => facts[:os_workers],
'threads' => '1',
'user' => platforms_params[:unix_user],
'group' => platforms_params[:unix_group],
'display-name' => 'horizon'
}
)}
end
context 'with overridden parameters' do
before do
params.merge!({
:priority => '10',
:redirect_type => 'temp',
:wsgi_processes => '13',
:wsgi_threads => '3'
})
end
it { should contain_class('horizon::params') }
it { should contain_class('apache') }
it { should contain_class('apache::mod::wsgi') }
it { should contain_service('httpd').with_name(platforms_params[:http_service]) }
it { should contain_package('httpd').with_name(platforms_params[:http_service]) }
it { should contain_file(platforms_params[:httpd_config_file]) }
it { should contain_package('horizon').with_ensure('present') }
it { should contain_apache__vhost('horizon_vhost').with(
:servername => 'some.host.tld',
:access_log_file => 'horizon_access.log',
:error_log_file => 'horizon_error.log',
:priority => params[:priority],
:serveraliases => ['some.host.tld'],
:docroot => '/var/www/',
:ssl => 'false',
:port => '80',
:redirectmatch_status => 'temp',
:redirectmatch_regexp => '^/$',
:redirectmatch_dest => platforms_params[:root_url],
:wsgi_script_aliases => { platforms_params[:root_url] => '/usr/share/openstack-dashboard/openstack_dashboard/wsgi/django.wsgi' },
:wsgi_process_group => platforms_params[:wsgi_group],
:wsgi_daemon_process => platforms_params[:wsgi_group],
:wsgi_application_group => '%{GLOBAL}',
:wsgi_daemon_process_options => {
'processes' => '13',
'threads' => '3',
'user' => platforms_params[:unix_user],
'group' => platforms_params[:unix_group],
'display-name' => 'horizon'
}
)}
end
context 'with custom_custom_wsgi_options' do
before do
params.merge!({
:custom_wsgi_process_options => {
'user' => 'myuser',
'python_path' => '/my/python/admin/path',
},
})
end
it { should contain_apache__vhost('horizon_vhost').with(
:wsgi_daemon_process_options => {
'processes' => facts[:os_workers],
'threads' => '1',
'user' => 'myuser',
'group' => platforms_params[:unix_group],
'display-name' => 'horizon',
'python_path' => '/my/python/admin/path'
}
)}
end
context 'with ssl enabled' do
before do
params.merge!({
:listen_ssl => true,
:ssl_redirect => true,
:horizon_cert => '/etc/pki/tls/certs/httpd.crt',
:horizon_key => '/etc/pki/tls/private/httpd.key',
:horizon_ca => '/etc/pki/tls/certs/ca.crt',
})
end
it { should contain_class('apache::mod::ssl') }
it { should contain_apache__vhost('horizon_ssl_vhost').with(
:servername => 'some.host.tld',
:access_log_file => 'horizon_ssl_access.log',
:error_log_file => 'horizon_ssl_error.log',
:priority => '15',
:serveraliases => ['some.host.tld'],
:docroot => '/var/www/',
:ssl => 'true',
:port => '443',
:ssl_cert => '/etc/pki/tls/certs/httpd.crt',
:ssl_key => '/etc/pki/tls/private/httpd.key',
:ssl_ca => '/etc/pki/tls/certs/ca.crt',
:redirectmatch_status => 'permanent',
:redirectmatch_regexp => '^/$',
:redirectmatch_dest => platforms_params[:root_url],
:wsgi_process_group => 'horizon-ssl',
:wsgi_daemon_process => 'horizon-ssl',
:wsgi_application_group => '%{GLOBAL}',
:wsgi_script_aliases => {
platforms_params[:root_url] => '/usr/share/openstack-dashboard/openstack_dashboard/wsgi/django.wsgi'
}
)}
it { should contain_apache__vhost('horizon_vhost').with(
:servername => 'some.host.tld',
:access_log_file => 'horizon_access.log',
:error_log_file => 'horizon_error.log',
:priority => '15',
:serveraliases => ['some.host.tld'],
:docroot => '/var/www/',
:ssl => 'false',
:port => '80',
:redirectmatch_status => 'permanent',
:redirectmatch_regexp => '(.*)',
:redirectmatch_dest => 'https://some.host.tld',
:wsgi_process_group => platforms_params[:wsgi_group],
:wsgi_daemon_process => platforms_params[:wsgi_group],
:wsgi_application_group => '%{GLOBAL}',
:wsgi_script_aliases => {
platforms_params[:root_url] => '/usr/share/openstack-dashboard/openstack_dashboard/wsgi/django.wsgi'
}
)}
end
context 'without horizon_cert parameter' do
before do
params.merge!( :listen_ssl => true )
end
it { should raise_error(Puppet::Error, /The horizon_cert parameter is required when listen_ssl is true/) }
end
context 'without horizon_key parameter' do
before do
params.merge!( :listen_ssl => true,
:horizon_cert => '/etc/pki/tls/certs/httpd.crt' )
end
it { should raise_error(Puppet::Error, /The horizon_key parameter is required when listen_ssl is true/) }
end
context 'with extra parameters' do
before do
params.merge!({
:extra_params => {
'add_listen' => false,
'docroot' => '/tmp'
},
})
end
it { should contain_apache__vhost('horizon_vhost').with(
:add_listen => false,
:docroot => '/tmp'
)}
end
context 'with root_url set to /' do
before do
params.merge!({
:root_url => '/',
:root_path => '/tmp/horizon'
})
end
it { should contain_apache__vhost('horizon_vhost').with(
:aliases => [
{ 'alias' => '/static', 'path' => '/tmp/horizon/static' }
],
:wsgi_script_aliases => {
'/' => '/usr/share/openstack-dashboard/openstack_dashboard/wsgi/django.wsgi'
}
)}
it { should_not contain_apache__vhost('horizon_vhost').with(
:redirectmatch_regexp => '^/$',
:redirectmatch_dest => '/'
)}
it { should_not contain_apache__vhost('horizon_ssl_vhost').with(
:redirectmatch_regexp => '^/$',
:redirectmatch_dest => '/'
)}
end
context 'with root_url set to empty' do
before do
params.merge!({
:root_url => '',
})
end
it { should_not contain_apache__vhost('horizon_vhost').with(
:redirectmatch_regexp => '(.*)',
:redirectmatch_dest => '/'
)}
it { should_not contain_apache__vhost('horizon_ssl_vhost').with(
:redirectmatch_regexp => '^/$',
:redirectmatch_dest => ''
)}
end
context 'without ssl and custom root_url' do
before do
params.merge!({
:listen_ssl => false,
:root_url => '/custom',
})
end
it { should contain_apache__vhost('horizon_vhost').with(
:redirectmatch_regexp => '^/$',
:redirectmatch_dest => '/custom',
)}
end
context 'without ssl and slash root_url' do
before do
params.merge!({
:listen_ssl => false,
:root_url => '/',
})
end
it { should contain_apache__vhost('horizon_vhost').with(
:redirectmatch_regexp => nil,
:redirectmatch_dest => nil,
)}
end
context 'with listen_ssl and ssl_redirect set to true' do
before do
params.merge!({
:listen_ssl => true,
:ssl_redirect => true,
:horizon_cert => '/etc/pki/tls/certs/httpd.crt',
:horizon_key => '/etc/pki/tls/private/httpd.key',
:horizon_ca => '/etc/pki/tls/certs/ca.crt',
})
end
it { should contain_apache__vhost('horizon_vhost').with(
:redirectmatch_regexp => '(.*)',
:redirectmatch_dest => 'https://some.host.tld',
)}
it { should contain_apache__vhost('horizon_ssl_vhost').with(
:redirectmatch_regexp => '^/$',
:redirectmatch_dest => platforms_params[:root_url],
)}
end
context 'with listen_ssl and ssl_redirect with a slash root_url' do
before do
params.merge!({
:listen_ssl => true,
:ssl_redirect => true,
:horizon_cert => '/etc/pki/tls/certs/httpd.crt',
:horizon_key => '/etc/pki/tls/private/httpd.key',
:horizon_ca => '/etc/pki/tls/certs/ca.crt',
:root_url => '/',
})
end
it { should contain_apache__vhost('horizon_vhost').with(
:redirectmatch_regexp => '(.*)',
:redirectmatch_dest => 'https://some.host.tld',
)}
it { should contain_apache__vhost('horizon_ssl_vhost').with(
:redirectmatch_regexp => nil,
:redirectmatch_dest => nil,
)}
end
context 'with listen_ssl and ssl_redirect with a empty root_url' do
before do
params.merge!({
:listen_ssl => true,
:ssl_redirect => true,
:horizon_cert => '/etc/pki/tls/certs/httpd.crt',
:horizon_key => '/etc/pki/tls/private/httpd.key',
:horizon_ca => '/etc/pki/tls/certs/ca.crt',
:root_url => '',
})
end
it { should contain_apache__vhost('horizon_vhost').with(
:redirectmatch_regexp => '(.*)',
:redirectmatch_dest => 'https://some.host.tld',
)}
it { should contain_apache__vhost('horizon_ssl_vhost').with(
:redirectmatch_regexp => nil,
:redirectmatch_dest => nil,
)}
end
context 'with listen_ssl and ssl_redirect disabled' do
before do
params.merge!({
:listen_ssl => true,
:ssl_redirect => false,
:horizon_cert => '/etc/pki/tls/certs/httpd.crt',
:horizon_key => '/etc/pki/tls/private/httpd.key',
:horizon_ca => '/etc/pki/tls/certs/ca.crt',
})
end
it { should contain_apache__vhost('horizon_vhost').with(
:redirectmatch_regexp => '^/$',
:redirectmatch_dest => platforms_params[:root_url],
)}
it { should contain_apache__vhost('horizon_ssl_vhost').with(
:redirectmatch_regexp => '^/$',
:redirectmatch_dest => platforms_params[:root_url],
)}
end
context 'with listen_ssl and ssl_redirect disabled with custom root_url' do
before do
params.merge!({
:listen_ssl => true,
:ssl_redirect => false,
:horizon_cert => '/etc/pki/tls/certs/httpd.crt',
:horizon_key => '/etc/pki/tls/private/httpd.key',
:horizon_ca => '/etc/pki/tls/certs/ca.crt',
:root_url => '/custom',
})
end
it { should contain_apache__vhost('horizon_vhost').with(
:redirectmatch_regexp => '^/$',
:redirectmatch_dest => '/custom',
)}
it { should contain_apache__vhost('horizon_ssl_vhost').with(
:redirectmatch_regexp => '^/$',
:redirectmatch_dest => '/custom',
)}
end
end
shared_examples 'horizon::wsgi::apache on RedHat' do
it { should contain_class('apache::mod::wsgi').with(
:wsgi_socket_prefix => '/var/run/wsgi'
)}
if (Gem::Version.new(Puppet.version) >= Gem::Version.new('4.0'))
it { should contain_apache__vhost('horizon_vhost').with(
:aliases => [
{ 'alias' => '/dashboard/static', 'path' => '/usr/share/openstack-dashboard/static' }
],
)}
else
it { should contain_apache__vhost('horizon_vhost').with(
:aliases => [
['alias', '/dashboard/static'],
['path', '/usr/share/openstack-dashboard/static']
],
)}
end
context 'with root_path set to /tmp/horizon' do
before do
params.merge!({
:root_path => '/tmp/horizon',
})
end
if (Gem::Version.new(Puppet.version) >= Gem::Version.new('4.0'))
it { should contain_apache__vhost('horizon_vhost').with(
:aliases => [
{ 'alias' => '/dashboard/static', 'path' => '/tmp/horizon/static' }
],
)}
else
it { should contain_apache__vhost('horizon_vhost').with(
:aliases => [
['alias', '/dashboard/static'],
['path', '/tmp/horizon/static']
],
)}
end
end
end
shared_examples 'horizon::wsgi::apache on Debian' do
if (Gem::Version.new(Puppet.version) >= Gem::Version.new('4.0'))
it { should contain_apache__vhost('horizon_vhost').with(
:aliases => [
{ 'alias' => '/horizon/static', 'path' => '/var/lib/openstack-dashboard/static' }
],
)}
else
it { should contain_apache__vhost('horizon_vhost').with(
:aliases => [
['alias', '/horizon/static'],
['path', '/var/lib/openstack-dashboard/static']
],
)}
end
context 'with root_path set to /tmp/horizon' do
before do
params.merge!({
:root_path => '/tmp/horizon',
})
end
if (Gem::Version.new(Puppet.version) >= Gem::Version.new('4.0'))
it { should contain_apache__vhost('horizon_vhost').with(
:aliases => [
{ 'alias' => '/horizon/static', 'path' => '/tmp/horizon/static' }
],
)}
else
it { should contain_apache__vhost('horizon_vhost').with(
:aliases => [
['alias', '/horizon/static'],
['path', '/tmp/horizon/static']
],
)}
end
end
end
on_supported_os({
:supported_os => OSDefaults.get_supported_os
}).each do |os,facts|
context "on #{os}" do
let (:facts) do
if facts[:operatingsystem] == 'Debian'
facts.merge!( :os_package_type => 'debian' )
end
facts.merge!(OSDefaults.get_facts({
:fqdn => 'some.host.tld',
:concat_basedir => '/var/lib/puppet/concat',
:os_workers => '6'
}))
end
let(:platforms_params) do
case facts[:osfamily]
when 'Debian'
case facts[:operatingsystem]
when 'Debian'
{ :http_service => 'apache2',
:httpd_config_file => '/etc/apache2/sites-available/openstack-dashboard-alias-only.conf',
:root_url => '/horizon',
:apache_user => 'www-data',
:apache_group => 'www-data',
:wsgi_user => 'horizon',
:wsgi_group => 'horizon',
:unix_user => 'horizon',
:unix_group => 'horizon' }
when 'Ubuntu'
{ :http_service => 'apache2',
:httpd_config_file => '/etc/apache2/conf-available/openstack-dashboard.conf',
:root_url => '/horizon',
:apache_user => 'www-data',
:apache_group => 'www-data',
:wsgi_user => 'horizon',
:wsgi_group => 'horizon',
:unix_user => 'horizon',
:unix_group => 'horizon' }
end
when 'RedHat'
{ :http_service => 'httpd',
:httpd_config_file => '/etc/httpd/conf.d/openstack-dashboard.conf',
:root_url => '/dashboard',
:apache_user => 'apache',
:apache_group => 'apache',
:wsgi_user => 'apache',
:wsgi_group => 'apache',
:unix_user => 'apache',
:unix_group => 'apache' }
end
end
it_behaves_like 'horizon::wsgi::apache'
it_behaves_like "horizon::wsgi::apache on #{facts[:osfamily]}"
end
end
end