# ROLE: primary-controller # ROLE: controller require 'spec_helper' require 'shared-examples' manifest = 'database/database.pp' describe manifest do before(:each) do Noop.puppet_function_load :is_pkg_installed MockFunction.new(:is_pkg_installed) do |function| allow(function).to receive(:call).and_return false end end shared_examples 'catalog' do let(:facts) { Noop.ubuntu_facts.merge({ :mounts => ['/', '/boot', '/var/log', '/var/lib/glance', '/var/lib/mysql', '/var/lib/horizon'], :root_home => '/root' }) } let(:network_scheme) do Noop.hiera_hash('network_scheme', {}) end let(:endpoints) do network_scheme.fetch('endpoints', {}) end let(:other_networks) do Noop.puppet_function 'direct_networks', endpoints, 'br-mgmt', 'netmask' end let(:access_networks) do (['240.0.0.0/255.255.0.0'] + other_networks.split(' ')).uniq end let(:mysql_hash) do Noop.hiera 'mysql', {} end let(:debug) do Noop.puppet_function 'pick', mysql_hash['debug'], Noop.hiera('debug', false) end let(:database_nodes) do Noop.hiera('database_nodes') end let(:galera_node_address) do Noop.puppet_function 'get_network_role_property', 'mgmt/database', 'ipaddr' end let(:galera_nodes) do (Noop.puppet_function 'get_node_to_ipaddr_map_by_network_role', database_nodes, 'mgmt/database').values end let(:galera_gcache_size) do Noop.puppet_function 'pick', mysql_hash['galera_gcache_size'], '512M' end let(:mysql_binary_logs) do Noop.hiera 'mysql_binary_logs', false end let(:log_bin) do Noop.puppet_function 'pick', mysql_hash['log_bin'], 'mysql-bin' end let(:expire_logs_days) do Noop.puppet_function 'pick', mysql_hash['expire_logs_days'], '1' end let(:max_binlog_size) do Noop.puppet_function 'pick', mysql_hash['max_binlog_size'], '64M' end let(:primary_db) do Noop.puppet_function 'has_primary_role', Noop.hiera('database_roles') & Noop.hiera('roles') end let(:mysql_database_password) do Noop.hiera_hash('mysql', {}).fetch('root_password', '') end let(:mysql_database_password_hash) do Noop.puppet_function 'mysql_password', mysql_database_password end let(:deb_sysmaint_password) do Noop.hiera_hash('mysql', {}).fetch('wsrep_password', '') end let(:deb_sysmaint_password_hash) do Noop.puppet_function 'mysql_password', deb_sysmaint_password end let(:status_database_password) do Noop.hiera_hash('mysql', {}).fetch('wsrep_password', '') end let(:galera_node_address) do Noop.puppet_function 'get_network_role_property', 'mgmt/database', 'ipaddr' end let(:management_networks) do Noop.puppet_function 'get_routable_networks_for_network_role', network_scheme, 'mgmt/database', ' ' end let(:custom_setup_class) do Noop.hiera('mysql_custom_setup_class', 'galera') end let(:mysql_socket) do case custom_setup_class when 'percona' '/var/lib/mysqld/mysqld.sock' when 'percona_packages' case facts[:osfamily] when 'Debian' '/var/run/mysqld/mysqld.sock' when 'RedHat' '/var/lib/mysql/mysql.sock' end else '/var/run/mysqld/mysqld.sock' end end let(:mysql_client_pkg) do 'mysql-wsrep-client-5.6' end let(:mysql_server_pkg) do 'mysql-wsrep-server-5.6' end it 'should contain galera' do should contain_class('galera').with( :vendor_type => 'MOS', :mysql_package_name => mysql_server_pkg, :galera_package_name => 'galera-3', :client_package_name => mysql_client_pkg, :galera_servers => galera_nodes, :galera_master => false, :mysql_port => '3307', :root_password => mysql_database_password, :create_root_my_cnf => primary_db, :create_root_user => primary_db, :validate_connection => false, :status_check => false, :wsrep_group_comm_port => '4567', :bind_address => galera_node_address, :local_ip => galera_node_address, :wsrep_sst_method => 'xtrabackup-v2' ) # TODO: check the dynamic override options end it 'should contain galera with undefined pid-file in override-options' do #OCF controls PID file thus it should be undefined override_options = Noop.resource_parameter_value self, 'class', 'galera', 'override_options' expect(override_options['mysqld']['pid-file']).to eq :undef end it 'should have explicit ordering galera status and LB status' do expect(graph).to ensure_transitive_dependency("Class[cluster::galera_status]", "Haproxy_backend_status[mysql]") end it 'should have explicit ordering between the client binary and additional packages' do expect(graph).to ensure_transitive_dependency("Class[mysql::client]", "Package[percona-xtrabackup]") end it 'should setup the /root/.my.cnf' do should contain_class('osnailyfacter::mysql_access').with( :db_password => mysql_database_password ) end it 'should setup additional root grants from other hosts only on primary db' do if primary_db should contain_class('osnailyfacter::mysql_user_access').with( :db_user => 'root', :db_password_hash => mysql_database_password_hash, :access_networks => access_networks ) else should_not contain_class('osnailyfacter::mysql_user_access') end end it 'should remove package provided wsrep.cnf' do should contain_file('/etc/mysql/conf.d/wsrep.cnf').with( :ensure => 'absent', ).that_comes_before('Class[mysql::server::installdb]') end it 'should configure galera status service' do should contain_class('cluster::galera_status').with( :backend_host => galera_node_address, :backend_port => '3307', :backend_timeout => '10', :only_from => "127.0.0.1 240.0.0.2 #{management_networks}" ) end it 'should install mysql client package' do should contain_class('openstack::galera::client') end it 'should configure pacemaker with mysql service' do should contain_class('cluster::mysql').with( :mysql_user => 'clustercheck', :mysql_password => status_database_password, :mysql_config => '/etc/mysql/my.cnf', :mysql_socket => mysql_socket, ) end it "should configure Galera to use mgmt/database network for replication" do should contain_class('galera').with( 'galera_servers' => galera_nodes, ) end it "should configure mysql to ignore lost+found directory" do should contain_class('galera').with_override_options( /"ignore-db-dir"=>\["lost\+found"\]/ ) end it "should configure mysql to innodb-data-home-dir" do should contain_class('galera').with_override_options( /"innodb-data-home-dir"=>"\/var\/lib\/mysql"/ ) end it "should configure mysql to evaluate time of SST operations" do should contain_class('galera').with_override_options( debug ? /"time"=>"1"/ : /"time"=>"0"/ ) end if Noop.hiera('external_lb', false) database_vip = Noop.hiera('database_vip', Noop.hiera('management_vip')) url = "http://#{database_vip}:49000" provider = 'http' else url = 'http://' + Noop.hiera('service_endpoint').to_s + ':10000/;csv' Puppet::Type.typeloader.load :haproxy_backend_status unless Puppet::Type.typeloader.loaded? :haproxy_backend_status type = Puppet::Type.type :haproxy_backend_status provider = type.defaultprovider.name end it 'should wait for mysql backend to be ready' do should contain_class('osnailyfacter::database::database_backend_wait') should contain_haproxy_backend_status('mysql').with( :url => url, :provider => provider ) end it 'should not configure mysql binary logging by default' do expect(subject).to contain_class('galera').with_override_options( /"log_bin"=>:undef/ ) expect(subject).to contain_class('galera').with_override_options( /"expire_logs_days"=>:undef/ ) expect(subject).to contain_class('galera').with_override_options( /"max_binlog_size"=>:undef/ ) end it "should contain gcache.size" do expect(subject).to contain_class('galera').with_override_options( /gcache.size=#{galera_gcache_size}/ ) end it 'should configure logging' do expect(subject).to contain_class('galera').with_override_options( Noop.hiera('use_syslog', true) ? /"syslog"=>true/ : /"log-error"=>"\/\S+"/ ) end it 'should have correct permissions for logging directory' do should contain_file('fix-log-dir').with( :ensure => 'directory', :path => '/var/log/mysql', :mode => '0770', ).that_requires('Package[mysql-server]') should contain_file('fix-log-dir').that_comes_before('Service[mysqld]') end it 'should configure galera grants service and proper flow' do if primary_db should contain_class('cluster::galera_grants').with( :status_user => 'clustercheck', :status_password => status_database_password, :status_allow => galera_node_address ) if facts[:osfamily] == 'Debian' should contain_mysql_user('debian-sys-maint@localhost').with( :ensure => 'present', :password_hash => deb_sysmaint_password_hash, :provider => 'mysql', ).that_requires('File[/root/.my.cnf]') end end end end test_ubuntu_and_centos manifest end