diff --git a/lib/puppet/provider/cs_clone/pcs.rb b/lib/puppet/provider/cs_clone/pcs.rb index 814f5d21..81d153d0 100644 --- a/lib/puppet/provider/cs_clone/pcs.rb +++ b/lib/puppet/provider/cs_clone/pcs.rb @@ -28,7 +28,7 @@ def change_clone_id(type, primitive, id, cib) return unless doc.root.attributes['id'] != id doc.root.attributes['id'] = id - cmd = [command(:cibadmin), '--replace', '--xpath', xpath, '--xml-text', doc.to_s.chop] + cmd = [command(:cibadmin), '--replace', '--xpath', xpath, '--xml-text', doc.to_s.chomp] self.class.run_command_in_cib(cmd, cib) end diff --git a/spec/classes/corosync_spec.rb b/spec/classes/corosync_spec.rb index ec970c27..32b978c5 100644 --- a/spec/classes/corosync_spec.rb +++ b/spec/classes/corosync_spec.rb @@ -17,12 +17,6 @@ ) end - it 'validates the corosync configuration' do - is_expected.to contain_file('/etc/corosync/corosync.conf').with_validate_cmd( - '/usr/bin/env COROSYNC_MAIN_CONFIG_FILE=% /usr/sbin/corosync -t' - ) - end - context 'validates the corosncy configuration when config_validate_cmd is set' do let(:params) do super().merge( @@ -68,13 +62,13 @@ %r{nodelist} ) is_expected.to contain_file('/etc/corosync/corosync.conf').with_content( - %r{ring0_addr: node1\.test\.org\n\s*nodeid: 1} + %r{^\s*ring0_addr:\s*node1\.test\.org\s*(?:\r\n|\n)\s*nodeid:\s*1\s*} ) is_expected.to contain_file('/etc/corosync/corosync.conf').with_content( - %r{ring0_addr: node2\.test\.org\n\s*nodeid: 2} + %r{^\s*ring0_addr:\s*node2\.test\.org\s*(?:\r\n|\n)\s*nodeid:\s*2\s*} ) is_expected.to contain_file('/etc/corosync/corosync.conf').with_content( - %r{two_node: 1\n} + %r{^\s*two_node:\s*1} ) end @@ -86,10 +80,10 @@ %r{nodelist} ) is_expected.to contain_file('/etc/corosync/corosync.conf').with_content( - %r{ring0_addr: node1\.test\.org\n\s*nodeid: 3} + %r{^\s*ring0_addr:\s*node1\.test\.org\s*(?:\r\n|\n)\s*nodeid:\s*3} ) is_expected.to contain_file('/etc/corosync/corosync.conf').with_content( - %r{ring0_addr: node2\.test\.org\n\s*nodeid: 11} + %r{^\s*ring0_addr:\s*node2\.test\.org\s*(?:\r\n|\n)\s*nodeid:\s*11} ) end end @@ -107,10 +101,10 @@ %r{nodelist} ) is_expected.to contain_file('/etc/corosync/corosync.conf').with_content( - %r{ring0_addr: 192\.168\.0\.1\n\s*nodeid: 1\n\s*name: node1\.test\.org} + %r{^\s*ring0_addr:\s*192\.168\.0\.1(?:\r\n|\n)\s*nodeid:\s*1(?:\r\n|\n)\s*name:\s*node1\.test\.org} ) is_expected.to contain_file('/etc/corosync/corosync.conf').with_content( - %r{ring0_addr: 192\.168\.0\.2\n\s*nodeid: 2\n\s*name: node2\.test\.org} + %r{^\s*ring0_addr:\s*192\.168\.0\.2(?:\r\n|\n)\s*nodeid:\s*2(?:\r\n|\n)\s*name:\s*node2\.test\.org} ) end end @@ -126,7 +120,7 @@ it 'does not configure two_nodes option' do is_expected.not_to contain_file('/etc/corosync/corosync.conf').with_content( - %r{two_node: 1\n} + %r{^\s*two_node:\s*1} ) end end @@ -140,7 +134,7 @@ it 'configures two_node' do is_expected.to contain_file('/etc/corosync/corosync.conf').with_content( - %r{two_node: 1\n} + %r{^\s*two_node:\s*1} ) end end @@ -158,13 +152,13 @@ %r{nodelist} ) is_expected.to contain_file('/etc/corosync/corosync.conf').with_content( - %r{ring0_addr: node1\.test\.org\n\s*nodeid: 1} + %r{^\s*ring0_addr:\s*node1\.test\.org(?:\r\n|\n)\s*nodeid:\s*1} ) is_expected.to contain_file('/etc/corosync/corosync.conf').with_content( - %r{ring0_addr: node2\.test\.org\n\s*nodeid: 2} + %r{^\s*ring0_addr:\s*node2\.test\.org(?:\r\n|\n)\s*nodeid:\s*2} ) is_expected.to contain_file('/etc/corosync/corosync.conf').with_content( - %r{two_node: 1\n} + %r{^\s*two_node:\s*1} ) end end @@ -184,14 +178,14 @@ (1..4).each do |node_id| it "configures rings for host #{node_id} correctly" do is_expected.to contain_file('/etc/corosync/corosync.conf').with_content( - %r{ring0_addr: 172.31.10.#{node_id}\n\s*ring1_addr: 172.31.11.#{node_id}\n\s*ring2_addr: 172.31.12.#{node_id}\n\s*nodeid: #{node_id}} + %r{ring0_addr: 172.31.10.#{node_id}(?:\r\n|\n)\s*ring1_addr: 172.31.11.#{node_id}(?:\r\n|\n)\s*ring2_addr: 172.31.12.#{node_id}(?:\r\n|\n)\s*nodeid: #{node_id}} ) end end it 'does not configure two_nodes option' do is_expected.not_to contain_file('/etc/corosync/corosync.conf').with_content( - %r{two_node: 1\n} + %r{^\s*two_node:\s*1} ) end end @@ -209,14 +203,14 @@ (1..2).each do |node_id| it "configures rings for host #{node_id} correctly" do is_expected.to contain_file('/etc/corosync/corosync.conf').with_content( - %r{ring0_addr: 172.31.10.#{node_id}\n\s*ring1_addr: 172.31.11.#{node_id}\n\s*ring2_addr: 172.31.12.#{node_id}\n\s*nodeid: #{node_id}} + %r{ring0_addr: 172.31.10.#{node_id}(?:\r\n|\n)\s*ring1_addr: 172.31.11.#{node_id}(?:\r\n|\n)\s*ring2_addr: 172.31.12.#{node_id}(?:\r\n|\n)\s*nodeid: #{node_id}} ) end end it 'configures two_node' do is_expected.to contain_file('/etc/corosync/corosync.conf').with_content( - %r{two_node: 1\n} + %r{^\s*two_node:\s*1} ) end end @@ -243,13 +237,13 @@ %r{nodelist} ) is_expected.to contain_file('/etc/corosync/corosync.conf').with_content( - %r{ring0_addr: node1\.test\.org\n\s*nodeid: 1} + %r{^\s*ring0_addr: node1\.test\.org(?:\r\n|\n)\s*nodeid:\s*1} ) is_expected.to contain_file('/etc/corosync/corosync.conf').with_content( - %r{ring0_addr: node2\.test\.org\n\s*nodeid: 2} + %r{^\s*ring0_addr: node2\.test\.org(?:\r\n|\n)\s*nodeid:\s*2} ) is_expected.to contain_file('/etc/corosync/corosync.conf').with_content( - %r{two_node: 1\n} + %r{^\s*two_node:\s*1} ) end @@ -259,10 +253,10 @@ %r{nodelist} ) is_expected.to contain_file('/etc/corosync/corosync.conf').with_content( - %r{ring0_addr: node1\.test\.org\n\s*nodeid: 3} + %r{^\s*ring0_addr:\s*node1\.test\.org(?:\r\n|\n)\s*nodeid:\s*3} ) is_expected.to contain_file('/etc/corosync/corosync.conf').with_content( - %r{ring0_addr: node2\.test\.org\n\s*nodeid: 11} + %r{^\s*ring0_addr:\s*node2\.test\.org(?:\r\n|(?:\r\n|\n))\s*nodeid:\s*11} ) end @@ -273,10 +267,10 @@ %r{nodelist} ) is_expected.to contain_file('/etc/corosync/corosync.conf').with_content( - %r{ring0_addr: 192\.168\.0\.1\n\s*nodeid: 1\n\s*name: node1\.test\.org} + %r{^\s*ring0_addr: 192\.168\.0\.1(?:\r\n|\n)\s*nodeid:\s*1(?:\r\n|\n)\s*name:\s*node1\.test\.org} ) is_expected.to contain_file('/etc/corosync/corosync.conf').with_content( - %r{ring0_addr: 192\.168\.0\.2\n\s*nodeid: 2\n\s*name: node2\.test\.org} + %r{^\s*ring0_addr: 192\.168\.0\.2(?:\r\n|\n)\s*nodeid:\s*2(?:\r\n|\n)\s*name:\s*node2\.test\.org} ) end end @@ -337,7 +331,7 @@ it 'configures cluster_name' do is_expected.to contain_file('/etc/corosync/corosync.conf').with_content( - %r{cluster_name:\s*hacell$} + %r{^\s*cluster_name:\s*hacell} ) end end @@ -541,9 +535,7 @@ end it 'is set in corosync.conf' do - is_expected.to contain_file('/etc/corosync/corosync.conf').with_content( - %r{#{optional_parameter}:\s*#{possible_value}\n} - ) + is_expected.to contain_file('/etc/corosync/corosync.conf').with_content(%r{#{optional_parameter}:\s*#{Regexp.escape(possible_value.to_s)}\s*\n}) end end end @@ -730,6 +722,27 @@ it_configures 'corosync' + # Check the correct validation command is used for each OS + it 'validates the corosync configuration' do + case os_facts[:os]['family'] + when 'RedHat' + case os_facts[:os]['release']['major'].to_i + when 0..7 + is_expected.to contain_file('/etc/corosync/corosync.conf').with_validate_cmd( + '/usr/bin/env COROSYNC_MAIN_CONFIG_FILE=% /usr/sbin/corosync -t' + ) + else + is_expected.to contain_file('/etc/corosync/corosync.conf').with_validate_cmd( + '/usr/sbin/corosync -c % -t' + ) + end + else + is_expected.to contain_file('/etc/corosync/corosync.conf').with_validate_cmd( + '/usr/bin/env COROSYNC_MAIN_CONFIG_FILE=% /usr/sbin/corosync -t' + ) + end + end + # Check default package installations per platform case os_facts[:os]['family'] when 'RedHat' @@ -942,9 +955,7 @@ it 'does not contain the quorum device config in corosync.conf' do is_expected.to contain_file('/etc/corosync/corosync.conf').with_content( - %r!quorum { - provider: corosync_votequorum -}$!m + %r{quorum\s*\{\s*provider:\s*corosync_votequorum\s*\}\s*} ) end @@ -963,18 +974,20 @@ it 'contains the quorum configuration' do is_expected.to contain_file('/etc/corosync/corosync.conf').with_content( - %r!quorum { - provider: corosync_votequorum - device { - model: net - votes: 1 - - net { - algorithm: ffsplit - host: quorum1[.]test[.]org - } - } -}!m + %r{ + quorum\s*\{ + \s*provider:\s*corosync_votequorum + \s*device\s*\{ + \s*model:\s*net + \s*votes:\s*1 + \s* + \s*net\s*\{ + \s*algorithm:\s*ffsplit + \s*host:\s*quorum1\.test\.org + \s*\} + \s*\} + \s*\} + }x ) end @@ -1050,18 +1063,19 @@ it 'contains the quorum configuration' do is_expected.to contain_file('/etc/corosync/corosync.conf').with_content( - %r!quorum { - provider: corosync_votequorum - device { - model: net - votes: 1 - - net { - algorithm: ffsplit - host: quorum1[.]test[.]org - } - } -}!m + %r{ + quorum\s*\{ + \s*provider:\s*corosync_votequorum # Match 'provider: corosync_votequorum' + \s*device\s*\{ + \s*model:\s*net + \s*votes:\s*1 + \s*net\s*\{ + \s*algorithm:\s*ffsplit + \s*host:\s*quorum1\.test\.org + \s*\} + \s*\} + \s*\} + }x ) end end @@ -1079,7 +1093,7 @@ it 'does not configure two node' do is_expected.not_to contain_file('/etc/corosync/corosync.conf').with_content( - %r{two_node: 1\n} + %r{^\s*two_node:\s*1} ) end # else - to implement diff --git a/spec/unit/puppet/provider/cs_clone_pcs_spec.rb b/spec/unit/puppet/provider/cs_clone_pcs_spec.rb index f4782389..290c8f9e 100644 --- a/spec/unit/puppet/provider/cs_clone_pcs_spec.rb +++ b/spec/unit/puppet/provider/cs_clone_pcs_spec.rb @@ -245,7 +245,7 @@ def clone_xml(name) Puppet::Util::Execution.expects(:execute).with(['cibadmin', '--query', '--xpath', xpath], failonfail: true, combine: true).at_least_once.returns( Puppet::Util::Execution::ProcessOutput.new(clone_xml('apache_service-clone'), 0) ) - Puppet::Util::Execution.expects(:execute).with(['cibadmin', '--replace', '--xpath', xpath, '--xml-text', clone_xml('apache_service-newclone').chop], failonfail: true, combine: true).at_least_once.returns( + Puppet::Util::Execution.expects(:execute).with(['cibadmin', '--replace', '--xpath', xpath, '--xml-text', clone_xml('apache_service-newclone').chomp], failonfail: true, combine: true).at_least_once.returns( Puppet::Util::Execution::ProcessOutput.new('', 0) ) instance.change_clone_id('primitive', 'apache_service', 'apache_service-newclone', nil)