diff --git a/manifests/api.pp b/manifests/api.pp index 619168b..4d3b360 100644 --- a/manifests/api.pp +++ b/manifests/api.pp @@ -113,28 +113,12 @@ class tuskar::api( require ::keystone::python include ::tuskar::logging + include ::tuskar::db include ::tuskar::params Tuskar_config<||> ~> Exec['post-tuskar_config'] Tuskar_config<||> ~> Service['tuskar-api'] - if $::tuskar::database_connection { - if($::tuskar::database_connection =~ /mysql:\/\/\S+:\S+@\S+\/\S+/) { - require 'mysql::bindings' - require 'mysql::bindings::python' - } elsif($::tuskar::database_connection =~ /postgresql:\/\/\S+:\S+@\S+\/\S+/) { - - } elsif($::tuskar::database_connection =~ /sqlite:\/\//) { - - } else { - fail("Invalid db connection ${::tuskar::database_connection}") - } - tuskar_config { - 'database/connection': value => $::tuskar::database_connection, secret => true; - 'database/sql_idle_timeout': value => $::tuskar::database_idle_timeoutl; - } - } - # basic service config tuskar_config { 'DEFAULT/tuskar_api_bind_ip': value => $bind_host; diff --git a/manifests/db.pp b/manifests/db.pp new file mode 100644 index 0000000..2a46fb6 --- /dev/null +++ b/manifests/db.pp @@ -0,0 +1,97 @@ +# == Class: tuskar::db +# +# Configure the Neutron database +# +# === Parameters +# +# [*database_connection*] +# Url used to connect to database. +# (Optional) Defaults to 'sqlite:////var/lib/tuskar/tuskar.sqlite'. +# +# [*database_idle_timeout*] +# Timeout when db connections should be reaped. +# (Optional) Defaults to 3600. +# +# [*database_min_pool_size*] +# Minimum number of SQL connections to keep open in a pool. +# (Optional) Defaults to 1. +# +# [*database_max_pool_size*] +# Maximum number of SQL connections to keep open in a pool. +# (Optional) Defaults to 10. +# +# [*database_max_retries*] +# Maximum db connection retries during startup. +# Setting -1 implies an infinite retry count. +# (Optional) Defaults to 10. +# +# [*database_retry_interval*] +# Interval between retries of opening a sql connection. +# (Optional) Defaults to 10. +# +# [*database_max_overflow*] +# If set, use this value for max_overflow with sqlalchemy. +# (Optional) Defaults to 20. +# +class tuskar::db ( + $database_connection = 'sqlite:////var/lib/tuskar/tuskar.sqlite', + $database_idle_timeout = 3600, + $database_min_pool_size = 1, + $database_max_pool_size = 10, + $database_max_retries = 10, + $database_retry_interval = 10, + $database_max_overflow = 20, +) { + + # NOTE(spredzy): In order to keep backward compatibility we rely on the pick function + # to use tuskar:: if tuskar::db:: isn't specified. + $database_connection_real = pick($::tuskar::database_connection, $database_connection) + $database_idle_timeout_real = pick($::tuskar::database_idle_timeout, $database_idle_timeout) + $database_min_pool_size_real = pick($::tuskar::database_min_pool_size, $database_min_pool_size) + $database_max_pool_size_real = pick($::tuskar::database_max_pool_size, $database_max_pool_size) + $database_max_retries_real = pick($::tuskar::database_max_retries, $database_max_retries) + $database_retry_interval_real = pick($::tuskar::database_retry_interval, $database_retry_interval) + $database_max_overflow_real = pick($::tuskar::database_max_overflow, $database_max_overflow) + + validate_re($database_connection_real, + '(sqlite|mysql|postgresql):\/\/(\S+:\S+@\S+\/\S+)?') + + if $database_connection_real { + case $database_connection_real { + /^mysql:\/\//: { + $backend_package = false + require 'mysql::bindings' + require 'mysql::bindings::python' + } + /^postgresql:\/\//: { + $backend_package = $::tuskar::params::psycopg_package_name + } + /^sqlite:\/\//: { + $backend_package = $::tuskar::params::sqlite_package_name + } + default: { + fail('Unsupported backend configured') + } + } + + if $backend_package and !defined(Package[$backend_package]) { + package {'tuskar-backend-package': + ensure => present, + name => $backend_package, + tag => 'openstack', + } + } + + tuskar_config { + 'database/connection': value => $database_connection_real, secret => true; + 'database/idle_timeout': value => $database_idle_timeout_real; + 'database/min_pool_size': value => $database_min_pool_size_real; + 'database/max_retries': value => $database_max_retries_real; + 'database/retry_interval': value => $database_retry_interval_real; + 'database/max_pool_size': value => $database_max_pool_size_real; + 'database/max_overflow': value => $database_max_overflow_real; + } + + } + +} diff --git a/manifests/init.pp b/manifests/init.pp index 8d79d74..b0d5f67 100644 --- a/manifests/init.pp +++ b/manifests/init.pp @@ -15,23 +15,48 @@ # License for the specific language governing permissions and limitations # under the License. -# tuskar::init +# == Class: tuskar # # Tuskar base config # # == Parameters # # [*database_connection*] -# (optional) Connection url to connect to tuskar database. -# Defaults to 'sqlite:////var/lib/tuskar/tuskar.sqlite' +# (optional) Connection url for the heat database. +# Defaults to undef. +# +# [*database_max_retries*] +# (optional) Maximum database connection retries during startup. +# Defaults to undef. # # [*database_idle_timeout*] -# (optional) Timeout before idle db connections are reaped. -# Defaults to 3600 +# (optional) Timeout before idle database connections are reaped. +# Defaults to undef. +# +# [*database_retry_interval*] +# (optional) Interval between retries of opening a database connection. +# Defaults to undef. +# +# [*database_min_pool_size*] +# (optional) Minimum number of SQL connections to keep open in a pool. +# Defaults to undef. +# +# [*database_max_pool_size*] +# (optional) Maximum number of SQL connections to keep open in a pool. +# Defaults to undef. +# +# [*database_max_overflow*] +# (optional) If set, use this value for max_overflow with sqlalchemy. +# Defaults to: undef. # class tuskar( - $database_connection = 'sqlite:////var/lib/tuskar/tuskar.sqlite', - $database_idle_timeout = 3600, + $database_connection = undef, + $database_max_retries = undef, + $database_idle_timeout = undef, + $database_retry_interval = undef, + $database_min_pool_size = undef, + $database_max_pool_size = undef, + $database_max_overflow = undef, ) { include ::tuskar::params diff --git a/manifests/params.pp b/manifests/params.pp index fe844a9..86f3751 100644 --- a/manifests/params.pp +++ b/manifests/params.pp @@ -9,6 +9,8 @@ class tuskar::params { $api_service_name = 'openstack-tuskar-api' $ui_package_name = 'openstack-tuskar-ui' $ui_extras_package_name = 'openstack-tuskar-ui-extras' + $psycopg_package_name = 'python-psycopg2' + $sqlite_package_name = undef } 'Debian': { $client_package_name = 'python-tuskarclient' @@ -16,6 +18,8 @@ class tuskar::params { $api_service_name = 'tuskar-api' $ui_package_name = 'tuskar-ui' $ui_extras_package_name = 'tuskar-ui-extras' + $psycopg_package_name = 'python-psycopg2' + $sqlite_package_name = 'python-pysqlite2' } default: { fail("Unsupported osfamily: ${::osfamily} operatingsystem") diff --git a/spec/classes/tuskar_db_spec.rb b/spec/classes/tuskar_db_spec.rb new file mode 100644 index 0000000..0c74c6b --- /dev/null +++ b/spec/classes/tuskar_db_spec.rb @@ -0,0 +1,60 @@ +require 'spec_helper' + +describe 'tuskar::db' do + + shared_examples 'tuskar::db' do + + context 'with default parameters' do + + it { is_expected.to contain_tuskar_config('database/connection').with_value('sqlite:////var/lib/tuskar/tuskar.sqlite').with_secret(true) } + it { is_expected.to contain_tuskar_config('database/idle_timeout').with_value('3600') } + it { is_expected.to contain_tuskar_config('database/min_pool_size').with_value('1') } + it { is_expected.to contain_tuskar_config('database/max_retries').with_value('10') } + it { is_expected.to contain_tuskar_config('database/retry_interval').with_value('10') } + + end + + context 'with specific parameters' do + let :params do + { :database_connection => 'mysql://tuskar:tuskar@localhost/tuskar', + :database_idle_timeout => '3601', + :database_min_pool_size => '2', + :database_max_retries => '11', + :database_retry_interval => '11', } + end + + it { is_expected.to contain_tuskar_config('database/connection').with_value('mysql://tuskar:tuskar@localhost/tuskar').with_secret(true) } + it { is_expected.to contain_tuskar_config('database/idle_timeout').with_value('3601') } + it { is_expected.to contain_tuskar_config('database/min_pool_size').with_value('2') } + it { is_expected.to contain_tuskar_config('database/max_retries').with_value('11') } + it { is_expected.to contain_tuskar_config('database/retry_interval').with_value('11') } + + end + + context 'with incorrect database_connection string' do + let :params do + { :database_connection => 'redis://tuskar:tuskar@localhost/tuskar', } + end + + it_raises 'a Puppet::Error', /validate_re/ + end + + end + + context 'on Debian platforms' do + let :facts do + { :osfamily => 'Debian' } + end + + it_configures 'tuskar::db' + end + + context 'on Redhat platforms' do + let :facts do + { :osfamily => 'RedHat' } + end + + it_configures 'tuskar::db' + end + +end