From: iberezovskiy Date: Thu, 19 Nov 2015 12:17:03 +0000 (+0300) Subject: Support of PyMySQL driver for MySQL backend X-Git-Tag: 7.1.0~4 X-Git-Url: https://review.fuel-infra.org/gitweb?a=commitdiff_plain;h=23102fbff3e8b7e45e20d0d82dd6cedb6bd54bb1;p=puppet-modules%2Fpuppet-ceilometer.git Support of PyMySQL driver for MySQL backend Add ability to use python-pymysql library as backend for MySQL connections. Update acceptance tests to use pyMySQL. Docs: https://wiki.openstack.org/wiki/PyMySQL_evaluation The same implementation as it's done for keystone: https://review.openstack.org/#/c/242134/ Change-Id: If41a86abc3090dfb439d09cd63ae2ecb9a0b9598 (cherry picked from commit ae60c149f299c7e623726906bdc7b25856061233) --- diff --git a/manifests/db.pp b/manifests/db.pp index 6ac0218..816fd59 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 61bba12..b209a5e 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 27ce797..70fa9ce 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 16e000a..d2ba7c2 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 ab35203..5543b45 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