diff --git a/manifests/db.pp b/manifests/db.pp index 71e9e493..9a139790 100644 --- a/manifests/db.pp +++ b/manifests/db.pp @@ -61,13 +61,17 @@ class ceilometer::db ( Package<| title == 'ceilometer-common' |> -> Class['ceilometer::db'] validate_re($database_connection, - '(sqlite|mysql|postgresql|mongodb):\/\/(\S+:\S+@\S+\/\S+)?') + '^(sqlite|mysql(\+pymysql)?|postgresql|mongodb):\/\/(\S+:\S+@\S+\/\S+)?') case $database_connection { - /^mysql:\/\//: { - $backend_package = false + /^mysql(\+pymysql)?:\/\//: { require 'mysql::bindings' require 'mysql::bindings::python' + if $database_connection =~ /^mysql\+pymysql/ { + $backend_package = $::ceilometer::params::pymysql_package_name + } else { + $backend_package = false + } } /^postgresql:\/\//: { $backend_package = false diff --git a/manifests/params.pp b/manifests/params.pp index 61bba122..b209a5e4 100644 --- a/manifests/params.pp +++ b/manifests/params.pp @@ -31,6 +31,7 @@ class ceilometer::params { $ceilometer_wsgi_script_path = '/var/www/cgi-bin/ceilometer' $ceilometer_wsgi_script_source = '/usr/lib/python2.7/site-packages/ceilometer/api/app.wsgi' $sqlite_package_name = undef + $pymysql_package_name = undef } 'Debian': { # package names @@ -55,6 +56,7 @@ class ceilometer::params { # db packages $pymongo_package_name = 'python-pymongo' $sqlite_package_name = 'python-pysqlite2' + $pymysql_package_name = 'python-pymysql' # Operating system specific case $::operatingsystem { diff --git a/spec/acceptance/ceilometer_with_mysql_spec.rb b/spec/acceptance/ceilometer_with_mysql_spec.rb index 27ce7974..70fa9ce3 100644 --- a/spec/acceptance/ceilometer_with_mysql_spec.rb +++ b/spec/acceptance/ceilometer_with_mysql_spec.rb @@ -40,7 +40,7 @@ describe 'ceilometer with mysql' do class { '::keystone': verbose => true, debug => true, - database_connection => 'mysql://keystone:keystone@127.0.0.1/keystone', + database_connection => 'mysql+pymysql://keystone:keystone@127.0.0.1/keystone', admin_token => 'admin_token', enabled => true, } @@ -66,7 +66,7 @@ describe 'ceilometer with mysql' do password => 'a_big_secret', } class { '::ceilometer::db': - database_connection => 'mysql://ceilometer:a_big_secret@127.0.0.1/ceilometer?charset=utf8', + database_connection => 'mysql+pymysql://ceilometer:a_big_secret@127.0.0.1/ceilometer?charset=utf8', } class { '::ceilometer::keystone::auth': password => 'a_big_secret', diff --git a/spec/acceptance/ceilometer_wsgi_apache_spec.rb b/spec/acceptance/ceilometer_wsgi_apache_spec.rb index 16e000ac..d2ba7c26 100644 --- a/spec/acceptance/ceilometer_wsgi_apache_spec.rb +++ b/spec/acceptance/ceilometer_wsgi_apache_spec.rb @@ -38,7 +38,7 @@ describe 'ceilometer with mysql' do password => 'a_big_secret', } class { '::ceilometer::db': - database_connection => 'mysql://ceilometer:a_big_secret@127.0.0.1/ceilometer?charset=utf8', + database_connection => 'mysql+pymysql://ceilometer:a_big_secret@127.0.0.1/ceilometer?charset=utf8', } class { '::ceilometer::keystone::auth': password => 'a_big_secret', diff --git a/spec/classes/ceilometer_db_spec.rb b/spec/classes/ceilometer_db_spec.rb index f8242164..58dee2e4 100644 --- a/spec/classes/ceilometer_db_spec.rb +++ b/spec/classes/ceilometer_db_spec.rb @@ -38,6 +38,16 @@ describe 'ceilometer::db' do end + context 'with pymysql connection' do + let :params do + { :database_connection => 'mysql+pymysql://ceilometer:ceilometer@localhost/ceilometer' } + end + + 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+pymysql://ceilometer:ceilometer@localhost/ceilometer').with_secret(true) } + end + context 'with mongodb backend and replica set' do let :params do { :database_connection => 'mongodb://localhost:1234/ceilometer', @@ -75,6 +85,14 @@ describe 'ceilometer::db' do end end + context 'with incorrect pymysql database_connection string' do + let :params do + { :database_connection => 'foo+pymysql://ceilometer:ceilometer@localhost/ceilometer', } + end + + it_raises 'a Puppet::Error', /validate_re/ + end + end context 'on Debian platforms' do @@ -87,6 +105,20 @@ describe 'ceilometer::db' do it_configures 'ceilometer::db' + context 'using pymysql driver' do + let :params do + { :database_connection => 'mysql+pymysql:///ceilometer:ceilometer@localhost/ceilometer', } + end + + it 'install the proper backend package' do + is_expected.to contain_package('ceilometer-backend-package').with( + :ensure => 'present', + :name => 'python-pymysql', + :tag => 'openstack' + ) + end + end + context 'with sqlite backend' do let :params do { :database_connection => 'sqlite:///var/lib/ceilometer.db', } @@ -111,6 +143,14 @@ describe 'ceilometer::db' do end it_configures 'ceilometer::db' + + context 'using pymysql driver' do + let :params do + { :database_connection => 'mysql+pymysql:///ceilometer:ceilometer@localhost/ceilometer', } + end + + it { is_expected.not_to contain_package('ceilometer-backend-package') } + end end end