Initial Percona cluster support added

This change adds two new custom_setup_class options to the mysql class.
With this change, we now support 'percona' and 'percona_packages' to
be passed to the mysql::server class that will cause percona to be
used.

This change adds the use_percona and use_percona_packages params to
the existing galera class. The 'use_percona' option will cause the
configuration to use the Linux distrubution classes for the Percona
installation. This only works with Ubuntu. By setting both 'use_percona'
and 'use_percona_packages' to true, the puppet configuration will
use the Percona provided packages for installation. This assumes that
the Percona packages are available to the system.

Additionally tests have been added to the galera
class to ensure that expected resources are configured for both
the regular packages and the percona packages.  By default, the
existing galera configuration remains the same and assumes the
use of existing packages.

Partial blueprint: detach-components-from-controllers
DocImpact

Change-Id: I972698a8b2dae4caca6101db6d48bab405e40eae
Co-Authored-By: Nikita Koshikov <nkoshikov@mirantis.com>
Co-Authored-By: Alex Schultz <aschultz@mirantis.com>
This commit is contained in:
Mykyta Koshykov 2015-06-04 10:53:18 -05:00 committed by Alex Schultz
parent 435805b0c1
commit 20b5983868
15 changed files with 552 additions and 94 deletions

View File

@ -0,0 +1,8 @@
fixtures:
forge_modules:
firewall: "puppetlabs/firewall"
stdlib: "puppetlabs/stdlib"
symlinks:
galera: "#{source_dir}"
pacemaker: "#{source_dir}/../pacemaker"
tweaks: "#{source_dir}/../tweaks"

View File

@ -3,3 +3,4 @@ pkg/
.DS_Store .DS_Store
coverage/ coverage/
fixtures/modules/

View File

@ -1,10 +1,20 @@
source ENV['GEM_SOURCE'] || 'https://rubygems.org' source ENV['GEM_SOURCE'] || "https://rubygems.org"
group :development, :test do group :development, :unit_tests do
gem 'puppetlabs_spec_helper', :require => false gem 'rake', :require => false
gem 'puppet-lint', '~> 0.3.2' gem 'rspec-core', '3.1.7', :require => false
gem 'rake', '~> 10.1.1', :require => false
gem 'rspec-puppet', :require => false gem 'rspec-puppet', :require => false
gem 'puppetlabs_spec_helper', :require => false
gem 'puppet-lint', :require => false
gem 'simplecov', :require => false
gem 'puppet_facts', :require => false
gem 'json', :require => false
end
if facterversion = ENV['FACTER_GEM_VERSION']
gem 'facter', facterversion, :require => false
else
gem 'facter', :require => false
end end
if puppetversion = ENV['PUPPET_GEM_VERSION'] if puppetversion = ENV['PUPPET_GEM_VERSION']

View File

@ -1,17 +1,10 @@
require 'puppetlabs_spec_helper/rake_tasks' require 'puppetlabs_spec_helper/rake_tasks'
require 'puppet-lint/tasks/puppet-lint' require 'puppet-lint/tasks/puppet-lint'
PuppetLint.configuration.send('disable_80chars')
PuppetLint.configuration.ignore_paths = ["spec/**/*.pp", "pkg/**/*.pp"]
desc "Run puppet in noop mode and check for syntax errors." PuppetLint.configuration.fail_on_warnings
task :validate do PuppetLint.configuration.send('relative')
Dir['manifests/**/*.pp'].each do |manifest| PuppetLint.configuration.send('disable_80chars')
sh "puppet parser validate --noop #{manifest}" PuppetLint.configuration.send('disable_class_inherits_from_params_class')
end PuppetLint.configuration.send('disable_documentation')
Dir['spec/**/*.rb','lib/**/*.rb'].each do |ruby_file| PuppetLint.configuration.send('disable_single_quote_string_with_variables')
sh "ruby -c #{ruby_file}" unless ruby_file =~ /spec\/fixtures/ PuppetLint.configuration.ignore_paths = ["spec/**/*.pp", "pkg/**/*.pp"]
end
Dir['templates/**/*.erb'].each do |template|
sh "erb -P -x -T '-' #{template} | ruby -c"
end
end

View File

@ -48,24 +48,40 @@
# (optional) The method for state snapshot transfer between nodes # (optional) The method for state snapshot transfer between nodes
# Defaults to xtrabackup-v2 # Defaults to xtrabackup-v2
# xtrabackup, xtrabackup-v2, mysqldump are supported # xtrabackup, xtrabackup-v2, mysqldump are supported
#
# [*use_percona*]
# Boolean. Set this value to true if you want to use percona instead of
# the mysql packages.
#
# [*use_percona_packages*]
# Boolean. Set this value to true to use the Percona distrubuted packages.
# This requires that these packages are available via a repository for the
# system at install time. NOTE: use_percona must be set to true for this to
# be used.
#
class galera ( class galera (
$cluster_name = 'openstack', $cluster_name = 'openstack',
$primary_controller = false, $primary_controller = false,
$node_address = $ipaddress_eth0, $node_address = $ipaddress_eth0,
$setup_multiple_gcomm = true, $setup_multiple_gcomm = true,
$skip_name_resolve = false, $skip_name_resolve = false,
$node_addresses = $ipaddress_eth0, $node_addresses = [ $ipaddress_eth0 ],
$use_syslog = false, $use_syslog = false,
$gcomm_port = '4567', $gcomm_port = '4567',
$status_check = true, $status_check = true,
$wsrep_sst_method = 'xtrabackup-v2', $wsrep_sst_method = 'xtrabackup-v2',
$wsrep_sst_password = undef, $wsrep_sst_password = undef,
$use_percona = false,
$use_percona_packages = false,
) { ) {
include galera::params include galera::params
anchor {'galera': } validate_array($node_addresses)
validate_bool($use_percona)
validate_bool($use_percona_packages)
anchor {'database-cluster': }
$mysql_user = $::galera::params::mysql_user $mysql_user = $::galera::params::mysql_user
$mysql_password = $wsrep_sst_password ? { $mysql_password = $wsrep_sst_password ? {
@ -80,10 +96,10 @@ class galera (
$key_buffer_size = $::galera::params::key_buffer_size $key_buffer_size = $::galera::params::key_buffer_size
$myisam_sort_buffer_size = $::galera::params::myisam_sort_buffer_size $myisam_sort_buffer_size = $::galera::params::myisam_sort_buffer_size
$wait_timeout = $::galera::params::wait_timeout $wait_timeout = $::galera::params::wait_timeout
$open_files_limit= $::galera::params::open_files_limit $open_files_limit = $::galera::params::open_files_limit
$datadir=$::mysql::params::datadir $datadir = $::mysql::params::datadir
$service_name=$::galera::params::service_name $service_name = $::galera::params::service_name
$innodb_flush_method=$::galera::params::innodb_flush_method $innodb_flush_method = $::galera::params::innodb_flush_method
package { ['wget', package { ['wget',
'perl']: 'perl']:
@ -94,7 +110,24 @@ class galera (
file { '/etc/my.cnf': file { '/etc/my.cnf':
ensure => present, ensure => present,
content => template('galera/my.cnf.erb'), content => template('galera/my.cnf.erb'),
# before => File['mysql-wss-ocf'] }
if ($use_percona and $::operatingsystem == 'Ubuntu') {
# Disable service autostart
file { '/usr/sbin/policy-rc.d':
ensure => present,
content => inline_template("#!/bin/sh\nexit 101\n"),
mode => '0755',
before => Package['MySQL-server']
}
#FIXME:
#Remove this after https://bugs.launchpad.net/bugs/1461304 will be fixed
file {'/etc/apt/apt.conf.d/99tmp':
ensure => present,
content => inline_template("Dpkg::Options {\n\t\"--force-overwrite\";\n}"),
before => Package['MySQL-server']
}
} }
package { 'mysql-client': package { 'mysql-client':
@ -109,13 +142,16 @@ class galera (
before => Package['MySQL-server'] before => Package['MySQL-server']
} }
if !($use_percona) {
package { $::galera::params::libaio_package: package { $::galera::params::libaio_package:
ensure => present, ensure => present,
before => Package['galera', 'MySQL-server'] before => Package['galera', 'MySQL-server']
} }
}
package { 'galera': package { 'galera':
ensure => present, ensure => present,
name => $::galera::params::libgalera_package,
before => Package['MySQL-server'] before => Package['MySQL-server']
} }
@ -156,15 +192,12 @@ class galera (
ensure => present, ensure => present,
mode => '0644', mode => '0644',
require => Package['MySQL-server'], require => Package['MySQL-server'],
# before => File['mysql-wss-ocf']
} }
if $primary_controller { if $primary_controller {
$galera_socket = $::osfamily ? { $galera_socket = $::galera::params::database_socket
'RedHat' => '/var/lib/mysql/mysql.sock',
'Debian' => '/var/run/mysqld/mysqld.sock',
}
# TODO(bogdando) move to extras as a wrapper class # TODO(bogdando) move to extras as a wrapper class
cs_resource { "p_${service_name}": cs_resource { "p_${service_name}":
ensure => present, ensure => present,
@ -173,9 +206,9 @@ class galera (
primitive_type => 'mysql-wss', primitive_type => 'mysql-wss',
complex_type => 'clone', complex_type => 'clone',
parameters => { parameters => {
'test_user' => "${mysql_user}", 'test_user' => $mysql_user,
'test_passwd' => "${mysql_password}", 'test_passwd' => $mysql_password,
'socket' => "${galera_socket}", 'socket' => $galera_socket,
}, },
operations => { operations => {
'monitor' => { 'monitor' => {
@ -190,29 +223,15 @@ class galera (
}, },
}, },
} }
Anchor['galera'] -> Anchor['database-cluster'] ->
#File['mysql-wss-ocf'] ->
Cs_resource["p_${service_name}"] -> Cs_resource["p_${service_name}"] ->
Service['mysql'] -> Service['mysql'] ->
Exec['wait-for-synced-state'] Exec['wait-for-synced-state']
} else { } else {
Anchor['galera'] -> Anchor['database-cluster'] ->
#File['mysql-wss-ocf'] ->
Service['mysql'] Service['mysql']
} }
#file { 'mysql-wss-ocf':
# path => '/usr/lib/ocf/resource.d/fuel/mysql-wss',
# mode => '0755',
# owner => root,
# group => root,
# source => 'puppet:///modules/galera/ocf/mysql-wss',
#}
#File<| title == 'ocf-fuel-path' |> -> File['mysql-wss-ocf']
# Package['MySQL-server', 'galera'] -> File['mysql-wss-ocf']
tweaks::ubuntu_service_override { 'mysql': tweaks::ubuntu_service_override { 'mysql':
package_name => 'MySQL-server', package_name => 'MySQL-server',
} }
@ -224,9 +243,11 @@ class galera (
provider => 'pacemaker', provider => 'pacemaker',
} }
Service['mysql'] -> Anchor['galera-done'] Service['mysql'] -> Anchor['database-cluster-done']
# lint:ignore:quoted_booleans
if $::galera_gcomm_empty == 'true' { if $::galera_gcomm_empty == 'true' {
# lint:endignore
#FIXME(bogdando): dirtyhack to pervert imperative puppet nature. #FIXME(bogdando): dirtyhack to pervert imperative puppet nature.
if $::mysql_log_file_size_real != $mysql_log_file_size { if $::mysql_log_file_size_real != $mysql_log_file_size {
# delete MySQL ib_logfiles, if log file size does not match the one # delete MySQL ib_logfiles, if log file size does not match the one
@ -279,6 +300,20 @@ class galera (
tries => 60, tries => 60,
} }
if ($use_percona and $::operatingsystem == 'Ubuntu') {
#Clean tmp files:
exec { 'rm-policy-rc.d':
command => '/bin/rm /usr/sbin/policy-rc.d',
}
exec {'rm-99tmp':
command => '/bin/rm /etc/apt/apt.conf.d/99tmp',
}
Exec['wait-for-synced-state'] ->
Exec['rm-policy-rc.d']
Exec['wait-for-synced-state'] ->
Exec['rm-99tmp']
}
File['/tmp/wsrep-init-file'] -> File['/tmp/wsrep-init-file'] ->
Service['mysql'] -> Service['mysql'] ->
Exec['wait-initial-sync'] -> Exec['wait-initial-sync'] ->
@ -286,5 +321,5 @@ class galera (
Exec ['rm-init-file'] Exec ['rm-init-file']
Package['MySQL-server'] ~> Exec['wait-initial-sync'] Package['MySQL-server'] ~> Exec['wait-initial-sync']
anchor {'galera-done': } anchor {'database-cluster-done': }
} }

View File

@ -35,22 +35,59 @@ class galera::params {
$innodb_flush_method = 'O_DIRECT' $innodb_flush_method = 'O_DIRECT'
$max_connections = '4096' $max_connections = '4096'
if ($::galera::use_percona) {
case $::osfamily { case $::osfamily {
'RedHat': { 'RedHat': {
$libaio_package = 'libaio' if ($::galera::use_percona_packages) {
$mysql_server_name = 'MySQL-server-wsrep' $mysql_server_name = 'Percona-XtraDB-Cluster-server-56'
$mysql_client_name = 'MySQL-client-wsrep' $mysql_client_name = 'Percona-XtraDB-Cluster-client-56'
$libgalera_prefix = '/usr/lib64' $libgalera_package = 'Percona-XtraDB-Cluster-galera-3'
$libgalera_prefix = '/usr/lib64/galera3'
} else {
fail("Unsupported osfamily: ${::osfamily} operatingsystem: ${::operatingsystem}, module ${module_name} only supports Debian when not using the Percona packages")
}
$database_socket = '/var/lib/mysql/mysql.sock'
} }
'Debian': { 'Debian': {
$libaio_package = 'libaio1' if ($::galera::use_percona_packages) {
$mysql_server_name = 'mysql-server-wsrep-5.6' $mysql_server_name = 'percona-xtradb-cluster-server-5.6'
$mysql_client_name = 'mysql-client-5.6' $mysql_client_name = 'percona-xtradb-cluster-client-5.6'
$libgalera_package = 'percona-xtradb-cluster-galera-3.x'
$libgalera_prefix = '/usr/lib/galera3'
} else {
$mysql_server_name = 'percona-xtradb-cluster-server-5.5'
$mysql_client_name = 'percona-xtradb-cluster-client-5.5'
$libgalera_package = 'percona-xtradb-cluster-galera-2.x'
$libgalera_prefix = '/usr/lib' $libgalera_prefix = '/usr/lib'
} }
$database_socket = '/var/run/mysqld/mysqld.sock'
}
default: { default: {
fail("Unsupported osfamily: ${::osfamily} operatingsystem: ${::operatingsystem}, module ${module_name} only support osfamily RedHat and Debian") fail("Unsupported osfamily: ${::osfamily} operatingsystem: ${::operatingsystem}, module ${module_name} only support osfamily RedHat and Debian")
} }
} }
} else {
case $::osfamily {
'RedHat': {
$libaio_package = 'libaio'
$mysql_server_name = 'MySQL-server-wsrep'
$mysql_client_name = 'MySQL-client-wsrep'
$libgalera_package = 'galera'
$libgalera_prefix = '/usr/lib64/galera'
$database_socket = '/var/lib/mysql/mysql.sock'
}
'Debian': {
$libaio_package = 'libaio1'
$mysql_server_name = 'mysql-server-wsrep-5.6'
$mysql_client_name = 'mysql-client-5.6'
$libgalera_package = 'galera'
$libgalera_prefix = '/usr/lib/galera'
$database_socket = '/var/run/mysqld/mysqld.sock'
}
default: {
fail("Unsupported osfamily: ${::osfamily} operatingsystem: ${::operatingsystem}, module ${module_name} only support osfamily RedHat and Debian")
}
}
}
} }

View File

@ -0,0 +1,195 @@
# this is a basic example that just checks there are no puppet syntax issues or
# compile errors
shared_examples 'compile' do
it {
should compile
}
end
# this example checks all of the expected items for the galera::init class
shared_examples 'galera-init' do |params|
params = {} if params.nil?
it {
should contain_class('galera')
should contain_class('galera::params')
should contain_tweaks__ubuntu_service_override('mysql')
}
it_behaves_like 'compile'
it_behaves_like 'test-packages', params
it_behaves_like 'test-files', params
it_behaves_like 'test-services', params
it_behaves_like 'test-primary-controller', params
it_behaves_like 'test-backup', params
end
# this example checks for the existance of the expected files for the galera
# class
shared_examples 'test-files' do |params|
params = {} if params.nil?
p = {
:use_percona_packages => false
}.merge(params)
let (:params) { p }
it {
should contain_file('/etc/my.cnf')
should contain_file('/etc/mysql')
should contain_file('/etc/mysql/conf.d')
should contain_file('/etc/init.d/mysql')
should contain_file('/etc/mysql/conf.d/wsrep.cnf')
should contain_file('/tmp/wsrep-init-file')
if params[:use_percona_packages] and facts[:operatingsystem] == 'Ubuntu'
should contain_file('/usr/sbin/policy-rc.d')
should contain_file('/etc/apt/apt.conf.d/99tmp')
end
}
end
# this example checks for the definition of the specific packages expected for
# the galera class
shared_examples 'test-packages' do |params|
params = {} if params.nil?
p = {
:wsrep_sst_method => 'xtrabackup-v2',
:use_percona => false,
:use_percona_packages => false
}.merge(params)
let (:params) { p }
if params[:use_percona]
if params[:use_percona_packages]
it_behaves_like 'percona-packages'
else
it_behaves_like 'percona-distro-packages'
end
else
it_behaves_like 'mysql-packages'
end
end
# this example checks for the percona packages
shared_examples 'percona-packages' do |params|
it {
case facts[:operatingsystem]
when 'Ubuntu'
mysql_server_name = 'percona-xtradb-cluster-server-5.6'
mysql_client_name = 'percona-xtradb-cluster-client-5.6'
libgalera_package = 'percona-xtradb-cluster-galera-3.x'
when 'CentOS'
mysql_server_name = 'Percona-XtraDB-Cluster-server-56'
mysql_client_name = 'Percona-XtraDB-Cluster-client-56'
libgalera_package = 'Percona-XtraDB-Cluster-galera-3'
end
should contain_package('MySQL-server').with_name(mysql_server_name)
should contain_package('mysql-client').with_name(mysql_client_name)
should contain_package('galera').with_name(libgalera_package)
}
end
# this example checks for the percona packages
shared_examples 'percona-distro-packages' do |params|
it {
case facts[:operatingsystem]
when 'Ubuntu'
mysql_server_name = 'percona-xtradb-cluster-server-5.5'
mysql_client_name = 'percona-xtradb-cluster-client-5.5'
libgalera_package = 'percona-xtradb-cluster-galera-2.x'
should contain_package('MySQL-server').with_name(mysql_server_name)
should contain_package('mysql-client').with_name(mysql_client_name)
should contain_package('galera').with_name(libgalera_package)
when 'CentOS'
should raise_error(Puppet::Error, /Unsupported/)
end
}
end
# this example checks for the use of the mysql classes
shared_examples 'mysql-packages' do
it {
case facts[:operatingsystem]
when 'Ubuntu'
mysql_server_name = 'mysql-server-wsrep-5.6'
mysql_client_name = 'mysql-client-5.6'
libgalera_package = 'galera'
libaio_package = 'libaio1'
when 'CentOS'
mysql_server_name = 'MySQL-server-wsrep'
mysql_client_name = 'MySQL-client-wsrep'
libgalera_package = 'galera'
libaio_package = 'libaio'
end
should contain_package('MySQL-server').with_name(mysql_server_name)
should contain_package('mysql-client').with_name(mysql_client_name)
should contain_package('galera').with_name(libgalera_package)
should contain_package(libaio_package)
}
end
# this example checks for the expected services for the galera class
shared_examples 'test-services' do |params|
params = {} if params.nil?
p = {}.merge(params)
let (:params) { p }
it {
should contain_service('mysql').with({
'ensure' => 'running',
'name' => 'p_mysql',
'provider' => 'pacemaker'
})
}
end
# this example checks for the cluster resource definitions for a primary
# controller. This should probably not live in the galera class.
shared_examples 'test-primary-controller' do |params|
params = {} if params.nil?
p = {
:primary_controller => false
}.merge(params)
let (:params) { p }
it {
if params[:primary_controller]
should contain_cs_resource('p_mysql')
else
should_not contain_cs_resource('p_mysql')
end
}
end
# this example checks for the catalog items around the backup option
shared_examples 'test-backup' do |params|
params = {} if params.nil?
p = {
:wsrep_sst_method => 'xtrabackup-v2',
}.merge(params)
let (:params) { p }
if p.has_key?(:wsrep_sst_method) and ['xtrabackup', 'xtrabackup-v2'].include?(p[:wsrep_sst_method])
it {
should contain_firewall('101 xtrabackup').with_port(4444)
should contain_package('percona-xtrabackup')
should contain_file('/etc/mysql/conf.d/wsrep.cnf').with_content(/xtrabackup/)
}
else
it {
should_not contain_firewall('101 xtrabackup').with_port(4444)
should_not contain_package('percona-xtrabackup')
should_not contain_file('/etc/mysql/conf.d/wsrep.cnf').with_content(/xtrabackup/)
}
end
end
# vim: set ts=2 sw=2 et :

View File

@ -1,5 +0,0 @@
shared_examples_for "a Puppet::Error" do |description|
it "with message matching #{description.inspect}" do
expect { should have_class_count(1) }.to raise_error(Puppet::Error, description)
end
end

View File

@ -0,0 +1,6 @@
--format
s
--colour
--loadby
mtime
--backtrace

View File

@ -1,6 +1,55 @@
require 'rubygems'
require 'puppetlabs_spec_helper/module_spec_helper' require 'puppetlabs_spec_helper/module_spec_helper'
RSpec.configure do |c| module Facts
c.alias_it_should_behave_like_to :it_configures, 'configures' def self.fqdn
c.alias_it_should_behave_like_to :it_raises, 'raises' 'server.example.com'
end
def self.hostname
self.fqdn.split('.').first
end
def self.ipaddress
'10.0.0.1'
end
def self.ubuntu_facts
{
:fqdn => fqdn,
:hostname => hostname,
:processorcount => '4',
:memorysize_mb => '32138.66',
:memorysize => '31.39 GB',
:kernel => 'Linux',
:osfamily => 'Debian',
:operatingsystem => 'Ubuntu',
:operatingsystemrelease => '14.04',
:lsbdistid => 'Ubuntu',
:concat_basedir => '/tmp/',
:ipaddress_eth0 => ipaddress
}
end
def self.centos_facts
{
:fqdn => fqdn,
:hostname => hostname,
:processorcount => '4',
:memorysize_mb => '32138.66',
:memorysize => '31.39 GB',
:kernel => 'Linux',
:osfamily => 'RedHat',
:operatingsystem => 'CentOS',
:operatingsystemrelease => '6.5',
:lsbdistid => 'CentOS',
:concat_basedir => '/tmp/',
:ipaddress_eth0 => ipaddress
}
end
end end
# Generage coverage report at the end of a run
at_exit { RSpec::Puppet::Coverage.report! }
# vim: set ts=2 sw=2 et :

View File

@ -0,0 +1,89 @@
require 'spec_helper.rb'
require 'shared-examples'
describe 'galera', :type => :class do
context 'Defaults on CentOS' do
let(:facts) { Facts.centos_facts }
it_behaves_like 'galera-init'
end
context 'Defaults on Ubuntu' do
let(:facts) { Facts.ubuntu_facts }
it_behaves_like 'galera-init'
end
context 'Percona on CentOS' do
let(:facts) { Facts.centos_facts }
p = {
:use_percona => true,
:use_percona_packages => false
}
# we only test compile and packages because this configuration should
# result in a puppet error indicating no support
it_behaves_like 'compile', p
it_behaves_like 'test-packages', p
end
context 'Percona on Ubuntu' do
let(:facts) { Facts.ubuntu_facts }
p = {
:use_percona => true,
:use_percona_packages => false
}
it_behaves_like 'galera-init', p
# these are extra things that should be expected on Ubuntu to work around
# the package installation on Ubuntu
let(:params) { p }
it {
should contain_exec('rm-policy-rc.d')
should contain_exec('rm-99tmp')
}
end
context 'Percona Packages on CentOS' do
let(:facts) { Facts.centos_facts }
p = {
:use_percona => true,
:use_percona_packages => true
}
it_behaves_like 'galera-init', p
end
context 'Percona Packages on Ubuntu' do
let(:facts) { Facts.ubuntu_facts }
p = {
:use_percona => true,
:use_percona_packages => true
}
it_behaves_like 'galera-init', p
# these are extra things that should be expected on Ubuntu to work around
# the package installation on Ubuntu
let(:params) { p }
it {
should contain_exec('rm-policy-rc.d')
should contain_exec('rm-99tmp')
}
end
context 'Primary Controller on CentOS' do
let(:facts) { Facts.centos_facts }
p = { :primary_controller => true }
it_behaves_like 'galera-init', p
end
context 'Primary Controller on Ubuntu' do
let(:facts) { Facts.ubuntu_facts }
p = { :primary_controller => true }
it_behaves_like 'galera-init', p
end
context 'wsrep_sst_method mysqldump on CentOS' do
let(:facts) { Facts.centos_facts }
p = { :wsrep_sst_method => 'undef' }
it_behaves_like 'galera-init', p
end
context 'wsrep_sst_method mysqldump on Ubuntu' do
let(:facts) { Facts.ubuntu_facts }
p = { :wsrep_sst_method => 'mysqldump' }
it_behaves_like 'galera-init', p
end
end
# vim: set ts=2 sw=2 et :

View File

@ -51,7 +51,7 @@ wsrep_cluster_address="gcomm://<%= @node_addresses.collect {|ip| ip + ':' + @gco
<% else -%> <% else -%>
wsrep_cluster_address="gcomm://<%= @node_addresses.first %>:<%= @gcomm_port.to_s %>?pc.wait_prim=no" wsrep_cluster_address="gcomm://<%= @node_addresses.first %>:<%= @gcomm_port.to_s %>?pc.wait_prim=no"
<% end -%> <% end -%>
wsrep_provider=<%= @libgalera_prefix %>/galera/libgalera_smm.so wsrep_provider=<%= @libgalera_prefix %>/libgalera_smm.so
wsrep_cluster_name="<%= @cluster_name -%>" wsrep_cluster_name="<%= @cluster_name -%>"
wsrep_slave_threads=<%= [[@processorcount.to_i*2, 4].max, 12].min %> wsrep_slave_threads=<%= [[@processorcount.to_i*2, 4].max, 12].min %>

View File

@ -45,7 +45,7 @@ class mysql::password (
File['mysql_password'] -> Database_grant <| provider=='mysql' |> File['mysql_password'] -> Database_grant <| provider=='mysql' |>
File['mysql_password'] -> Database_user <| provider=='mysql' |> File['mysql_password'] -> Database_user <| provider=='mysql' |>
Anchor <| title == 'galera' |> -> Class['mysql::password'] -> Anchor <| title == 'galera-done' |> Anchor <| title == 'database-cluster' |> -> Class['mysql::password'] -> Anchor <| title == 'database-cluster-done' |>
Exec <| title == 'wait-for-synced-state' |> -> Exec['set_mysql_rootpw'] Exec <| title == 'wait-for-synced-state' |> -> Exec['set_mysql_rootpw']
Exec <| title == 'wait-initial-sync' |> -> Exec['set_mysql_rootpw'] Exec <| title == 'wait-initial-sync' |> -> Exec['set_mysql_rootpw']

View File

@ -226,6 +226,32 @@ class mysql::server (
wsrep_sst_password => $root_password, wsrep_sst_password => $root_password,
} }
}
elsif ($custom_setup_class == 'percona') {
Class['galera'] -> Class['mysql::server']
class { 'galera':
cluster_name => $galera_cluster_name,
primary_controller => $primary_controller,
node_address => $galera_node_address,
node_addresses => $galera_nodes,
skip_name_resolve => $mysql_skip_name_resolve,
use_syslog => $use_syslog,
wsrep_sst_password => $root_password,
use_percona => true,
}
} elsif ($custom_setup_class == 'percona_packages') {
Class['galera'] -> Class['mysql::server']
class { 'galera':
cluster_name => $galera_cluster_name,
primary_controller => $primary_controller,
node_address => $galera_node_address,
node_addresses => $galera_nodes,
skip_name_resolve => $mysql_skip_name_resolve,
use_syslog => $use_syslog,
wsrep_sst_password => $root_password,
use_percona => true,
use_percona_packages => true
}
} }
else { else {

View File

@ -76,6 +76,20 @@ if $mysql_database_enabled {
command => '/bin/ln -sf /etc/mysql/conf.d/password.cnf /root/.my.cnf', command => '/bin/ln -sf /etc/mysql/conf.d/password.cnf /root/.my.cnf',
} }
if ($custom_mysql_setup_class == 'percona_packages' and $::osfamily == 'RedHat') {
# This is a work around to prevent the conflict between the
# MySQL-shared-wsrep package (included as a dependency for MySQL-python) and
# the Percona shared package Percona-XtraDB-Cluster-shared-56. They both
# provide the libmysql client libraries. Since we are requiring the
# installation of the Percona package here before mysql::python, the python
# client is happy and the server installation won't fail due to the
# installation of our shared package
package { 'Percona-XtraDB-Cluster-shared-56':
ensure => 'present',
before => Class['mysql::python'],
}
}
class { 'openstack::galera::status': class { 'openstack::galera::status':
status_user => $status_user, status_user => $status_user,
status_password => $status_password, status_password => $status_password,