]> review.fuel-infra Code Review - puppet-modules/puppet-ceilometer.git/commitdiff
Support of PyMySQL driver for MySQL backend
authoriberezovskiy <iberezovskiy@mirantis.com>
Thu, 19 Nov 2015 12:17:03 +0000 (15:17 +0300)
committerEmilien Macchi <emilien@redhat.com>
Fri, 26 Feb 2016 12:37:48 +0000 (12:37 +0000)
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)

manifests/db.pp
manifests/params.pp
spec/acceptance/ceilometer_with_mysql_spec.rb
spec/acceptance/ceilometer_wsgi_apache_spec.rb
spec/classes/ceilometer_db_spec.rb

index 6ac0218f517e73cf7b08a92bffc78b0b35e8e281..816fd59b372a294f1b6e74fb75c683e4d3ec1211 100644 (file)
@@ -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
index 61bba1229d20271e88c8aedb3e5639e4cc12bc7c..b209a5e4682556e6a43389a0bfeacba1e044c5ee 100644 (file)
@@ -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 {
index 27ce79745a63e0d8d3752eb03b1c46a5bd555c97..70fa9ce378435a8507f8e52a8e63b8e5c2e6d9c6 100644 (file)
@@ -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',
index 16e000ac0d14dac68272b638715e240778000533..d2ba7c2684f728eb638ef26c00c16511c40423de 100644 (file)
@@ -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',
index ab352032c21a3370cca78858673ff60974f44d75..5543b4509ccc4958e642892cc692952e5f0cc65f 100644 (file)
@@ -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