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:
parent
435805b0c1
commit
20b5983868
8
deployment/puppet/galera/.fixtures.yml
Normal file
8
deployment/puppet/galera/.fixtures.yml
Normal 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"
|
1
deployment/puppet/galera/.gitignore
vendored
1
deployment/puppet/galera/.gitignore
vendored
@ -3,3 +3,4 @@ pkg/
|
|||||||
.DS_Store
|
.DS_Store
|
||||||
|
|
||||||
coverage/
|
coverage/
|
||||||
|
fixtures/modules/
|
||||||
|
@ -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']
|
||||||
|
@ -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
|
|
||||||
|
@ -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': }
|
||||||
}
|
}
|
||||||
|
@ -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")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
195
deployment/puppet/galera/spec/shared-examples.rb
Normal file
195
deployment/puppet/galera/spec/shared-examples.rb
Normal 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 :
|
@ -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
|
|
6
deployment/puppet/galera/spec/spec.opts
Normal file
6
deployment/puppet/galera/spec/spec.opts
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
--format
|
||||||
|
s
|
||||||
|
--colour
|
||||||
|
--loadby
|
||||||
|
mtime
|
||||||
|
--backtrace
|
@ -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 :
|
||||||
|
89
deployment/puppet/galera/spec/unit/classes/init_spec.rb
Normal file
89
deployment/puppet/galera/spec/unit/classes/init_spec.rb
Normal 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 :
|
@ -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 %>
|
||||||
|
@ -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']
|
||||||
|
|
||||||
|
@ -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 {
|
||||||
|
@ -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,
|
||||||
|
Loading…
Reference in New Issue
Block a user