From 4d72c6ceec902596586509d77e9cf833c2428803 Mon Sep 17 00:00:00 2001 From: Yanis Guenane Date: Thu, 24 Sep 2015 10:35:23 +0200 Subject: [PATCH] Update ceilometer::db class to match other module pattern This review aims to update the ceilometer::db class to standardize it with the other modules db classes[1][2]. It now offers the same parameters to customize database connection behavior. [1] https://github.com/openstack/puppet-neutron/blob/master/manifests/db.pp [2] https://github.com/openstack/puppet-sahara/blob/master/manifests/db.pp Change-Id: Ic5ca33f862da300f4f429524ba488568d0608cf3 --- manifests/db.pp | 64 +++++++++--- spec/classes/ceilometer_db_spec.rb | 158 +++++++++++------------------ 2 files changed, 110 insertions(+), 112 deletions(-) diff --git a/manifests/db.pp b/manifests/db.pp index a6acd77..99fb1d6 100644 --- a/manifests/db.pp +++ b/manifests/db.pp @@ -1,10 +1,39 @@ -# Configures the ceilometer database -# This class will install the required libraries depending on the driver -# specified in the connection_string parameter +# == Class: ceilometer::db +# +# Configures the ceilometer database +# This class will install the required libraries depending on the driver +# specified in the connection_string parameter # # == Parameters -# [*database_connection*] -# the connection string. format: [driver]://[user]:[password]@[host]/[database] + +# [*database_connection*] +# Url used to connect to database. +# (Optional) Defaults to 'mysql://ceilometer:ceilometer@localhost/ceilometer'. +# +# [*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. # # [*sync_db*] # enable dbsync. @@ -13,9 +42,15 @@ # (optional) Deprecated. Does nothing. # class ceilometer::db ( - $database_connection = 'mysql://ceilometer:ceilometer@localhost/ceilometer', - $sync_db = true, - $mysql_module = undef, + $database_connection = 'mysql://ceilometer:ceilometer@localhost/ceilometer', + $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, + $sync_db = true, + $mysql_module = undef, ) { include ::ceilometer::params @@ -32,9 +67,8 @@ class ceilometer::db ( case $database_connection { /^mysql:\/\//: { $backend_package = false - - include ::mysql::bindings::python - Package<| title == 'python-mysqldb' |> -> Class['ceilometer::db'] + require 'mysql::bindings' + require 'mysql::bindings::python' } /^postgresql:\/\//: { $backend_package = $::ceilometer::params::psycopg_package_name @@ -59,7 +93,13 @@ class ceilometer::db ( } ceilometer_config { - 'database/connection': value => $database_connection, secret => true; + 'database/connection': value => $database_connection, secret => true; + 'database/idle_timeout': value => $database_idle_timeout; + 'database/min_pool_size': value => $database_min_pool_size; + 'database/max_retries': value => $database_max_retries; + 'database/retry_interval': value => $database_retry_interval; + 'database/max_pool_size': value => $database_max_pool_size; + 'database/max_overflow': value => $database_max_overflow; } if $sync_db { diff --git a/spec/classes/ceilometer_db_spec.rb b/spec/classes/ceilometer_db_spec.rb index da580ec..a52ff0a 100644 --- a/spec/classes/ceilometer_db_spec.rb +++ b/spec/classes/ceilometer_db_spec.rb @@ -2,137 +2,95 @@ require 'spec_helper' describe 'ceilometer::db' do - # debian has "python-pymongo" - context 'on Debian platforms' do - let :facts do - { :osfamily => 'Debian' } - end + shared_examples 'ceilometer::db' do - let :params do - { :database_connection => 'mongodb://localhost:1234/ceilometer', - :sync_db => true } - end + context 'with default parameters' do - it { is_expected.to contain_class('ceilometer::params') } + it { is_expected.to contain_class('ceilometer::params') } + it { is_expected.to contain_class('ceilometer::db::sync') } + it { is_expected.to contain_ceilometer_config('database/connection').with_value('mysql://ceilometer:ceilometer@localhost/ceilometer').with_secret(true) } + it { is_expected.to contain_ceilometer_config('database/idle_timeout').with_value('3600') } + it { is_expected.to contain_ceilometer_config('database/min_pool_size').with_value('1') } + it { is_expected.to contain_ceilometer_config('database/max_retries').with_value('10') } + it { is_expected.to contain_ceilometer_config('database/retry_interval').with_value('10') } - it 'installs python-mongodb package' do - is_expected.to contain_package('ceilometer-backend-package').with( - :ensure => 'present', - :name => 'python-pymongo', - :tag => 'openstack' - ) - is_expected.to contain_ceilometer_config('database/connection').with_value('mongodb://localhost:1234/ceilometer') - is_expected.to contain_ceilometer_config('database/connection').with_value( params[:database_connection] ).with_secret(true) end - it 'includes ceilometer::db::sync' do - is_expected.to contain_class('ceilometer::db::sync') - end - end + context 'with specific parameters' do + let :params do + { :database_connection => 'mongodb://localhost:1234/ceilometer', + :database_idle_timeout => '3601', + :database_min_pool_size => '2', + :database_max_retries => '11', + :database_retry_interval => '11', + :sync_db => false } + end - context 'on Redhat platforms' do - let :facts do - { :osfamily => 'Redhat', - :operatingsystem => 'Fedora', - :operatingsystemrelease => 21 - } - end + it { is_expected.to contain_class('ceilometer::params') } + it { is_expected.not_to contain_class('ceilometer::db::sync') } + it { is_expected.to contain_ceilometer_config('database/connection').with_value('mongodb://localhost:1234/ceilometer').with_secret(true) } + it { is_expected.to contain_ceilometer_config('database/idle_timeout').with_value('3601') } + it { is_expected.to contain_ceilometer_config('database/min_pool_size').with_value('2') } + it { is_expected.to contain_ceilometer_config('database/max_retries').with_value('11') } + it { is_expected.to contain_ceilometer_config('database/retry_interval').with_value('11') } - let :params do - { :database_connection => 'mongodb://localhost:1234/ceilometer', - :sync_db => false } end - it { is_expected.to contain_class('ceilometer::params') } - - it 'installs pymongo package' do - is_expected.to contain_package('ceilometer-backend-package').with( - :ensure => 'present', - :name => 'python-pymongo') - is_expected.to contain_ceilometer_config('database/connection').with_value('mongodb://localhost:1234/ceilometer') - is_expected.to contain_ceilometer_config('database/connection').with_value( params[:database_connection] ).with_secret(true) - end + context 'with mongodb backend' do + let :params do + { :database_connection => 'mongodb://localhost:1234/ceilometer', } + end - it 'does not include ceilometer::db::sync' do - is_expected.not_to contain_class('ceilometer::db::sync') - end - end + it 'install the proper backend package' do + is_expected.to contain_package('ceilometer-backend-package').with( + :ensure => 'present', + :name => 'python-pymongo', + :tag => 'openstack' + ) + end - # RHEL has python-pymongo too - context 'on Redhat platforms' do - let :facts do - { :osfamily => 'Redhat', - :operatingsystem => 'CentOS', - :operatingsystemrelease => 6.4 - } end - let :params do - { :database_connection => 'mongodb://localhost:1234/ceilometer', - :sync_db => true } - end - it { is_expected.to contain_class('ceilometer::params') } + context 'with incorrect database_connection string' do + let :params do + { :database_connection => 'redis://ceilometer:ceilometer@localhost/ceilometer', } + end - it 'installs pymongo package' do - is_expected.to contain_package('ceilometer-backend-package').with( - :ensure => 'present', - :name => 'python-pymongo') + it_raises 'a Puppet::Error', /validate_re/ end - it 'includes ceilometer::db::sync' do - is_expected.to contain_class('ceilometer::db::sync') - end end - # RHEL has python-sqlite2 - context 'on Redhat platforms' do + context 'on Debian platforms' do let :facts do - { :osfamily => 'Redhat', - :operatingsystem => 'CentOS', - :operatingsystemrelease => 6.4 - } + { :osfamily => 'Debian' } end - let :params do - { :database_connection => 'sqlite:///var/lib/ceilometer.db', - :sync_db => false } - end + it_configures 'ceilometer::db' - it { is_expected.to contain_class('ceilometer::params') } + context 'with sqlite backend' do + let :params do + { :database_connection => 'sqlite:///var/lib/ceilometer.db', } + end - it 'installs pymongo package' do - is_expected.to contain_ceilometer_config('database/connection').with_value('sqlite:///var/lib/ceilometer.db') - is_expected.to contain_ceilometer_config('database/connection').with_value( params[:database_connection] ).with_secret(true) - end + it 'install the proper backend package' do + is_expected.to contain_package('ceilometer-backend-package').with( + :ensure => 'present', + :name => 'python-pysqlite2', + :tag => 'openstack' + ) + end - it 'does not include ceilomter::db::sync' do - is_expected.not_to contain_class('ceilometer::db::sync') end end - # debian has "python-pysqlite2" - context 'on Debian platforms' do + context 'on Redhat platforms' do let :facts do - { :osfamily => 'Debian' } - end - - let :params do - { :database_connection => 'sqlite:///var/lib/ceilometer.db', - :sync_db => true } + { :osfamily => 'RedHat' } end - it { is_expected.to contain_class('ceilometer::params') } - - it 'installs python-mongodb package' do - is_expected.to contain_package('ceilometer-backend-package').with( - :ensure => 'present', - :name => 'python-pysqlite2') - end - - it 'includes ceilometer::db::sync' do - is_expected.to contain_class('ceilometer::db::sync') - end + it_configures 'ceilometer::db' end end -- 2.45.2