diff --git a/manifests/db.pp b/manifests/db.pp index 690714c1..c50f5d07 100644 --- a/manifests/db.pp +++ b/manifests/db.pp @@ -57,13 +57,17 @@ class designate::db ( include ::designate::params validate_re($database_connection, - '(mysql):\/\/(\S+:\S+@\S+\/\S+)?') + '(mysql(\+pymysql)?):\/\/(\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 = $::designate::params::pymysql_package_name + } else { + $backend_package = false + } } default: { fail('Unsupported backend configured') diff --git a/manifests/params.pp b/manifests/params.pp index 922fd06e..bd0ac53b 100644 --- a/manifests/params.pp +++ b/manifests/params.pp @@ -22,6 +22,7 @@ class designate::params { $api_service_name = 'openstack-designate-api' $central_service_name = 'openstack-designate-central' $sink_service_name = 'openstack-designate-sink' + $pymysql_package_name = undef } 'Debian': { # package name @@ -35,6 +36,7 @@ class designate::params { $api_service_name = 'designate-api' $central_service_name = 'designate-central' $sink_service_name = 'designate-sink' + $pymysql_package_name = 'python-pymysql' } default: { fail("Unsupported osfamily: ${::osfamily} operatingsystem") diff --git a/spec/acceptance/basic_designate_spec.rb b/spec/acceptance/basic_designate_spec.rb index 7155e06c..a4645466 100644 --- a/spec/acceptance/basic_designate_spec.rb +++ b/spec/acceptance/basic_designate_spec.rb @@ -55,7 +55,7 @@ describe 'basic designate' do include ::designate::client class { '::designate::agent': } class { '::designate::db': - database_connection => 'mysql://designate:a_big_secret@127.0.0.1/designate?charset=utf8', + database_connection => 'mysql+pymysql://designate:a_big_secret@127.0.0.1/designate?charset=utf8', } include ::designate::dns } diff --git a/spec/classes/designate_db_spec.rb b/spec/classes/designate_db_spec.rb index 7b238b53..a63e651c 100644 --- a/spec/classes/designate_db_spec.rb +++ b/spec/classes/designate_db_spec.rb @@ -42,6 +42,22 @@ describe 'designate::db' do it_raises 'a Puppet::Error', /validate_re/ end + context 'with specific parameters' do + let :params do + { :database_connection => 'mysql+pymysql://designate:designate@localhost/designate', + } + end + + it { is_expected.to contain_designate_config('storage:sqlalchemy/connection').with_value('mysql+pymysql://designate:designate@localhost/designate').with_secret(true) } + end + + context 'with MySQL-python library as backend package' do + let :params do + { :database_connection => 'mysql://designate:designate@localhost/designate', } + end + + it { is_expected.to contain_package('python-mysqldb').with(:ensure => 'present') } + end end context 'on Debian platforms' do @@ -50,6 +66,20 @@ describe 'designate::db' do end it_configures 'designate::db' + + context 'using pymysql driver' do + let :params do + { :database_connection => 'mysql+pymysql://designate:designate@localhost/designate', } + end + + it 'install the proper backend package' do + is_expected.to contain_package('designate-backend-package').with( + :ensure => 'present', + :name => 'python-pymysql', + :tag => 'openstack' + ) + end + end end context 'on RedHat platforms' do @@ -58,6 +88,14 @@ describe 'designate::db' do end it_configures 'designate::db' + + context 'using pymysql driver' do + let :params do + { :database_connection => 'mysql+pymysql://designate:designate@localhost/designate', } + end + + it { is_expected.not_to contain_package('designate-backend-package') } + end end end