1 require 'spec_helper_acceptance'
3 describe 'postgresql::server::reassign_owned_by:', :unless => UNSUPPORTED_PLATFORMS.include?(fact('osfamily')) do
5 let(:db) { 'reassign_test' }
6 let(:old_owner) { 'psql_reassign_old_owner' }
7 let(:new_owner) { 'psql_reassign_new_owner' }
8 let(:password) { 'psql_reassign_pw' }
9 let(:superuser) { 'postgres' }
11 let(:pp_setup) { pp_setup = <<-EOS.unindent
13 $old_owner = #{old_owner}
14 $new_owner = #{new_owner}
15 $password = #{password}
17 class { 'postgresql::server': }
19 postgresql::server::role { $old_owner:
20 password_hash => postgresql_password($old_owner, $password),
23 # Since we are not testing pg_hba or any of that, make a local user for ident auth
28 # Create a user to reassign ownership to
29 postgresql::server::role { $new_owner:
31 require => Postgresql::Server::Database[$db],
34 # Make a local user for ident auth
39 # Grant the new owner membership of the old owner (must have both for REASSIGN OWNED BY to work)
40 postgresql::server::grant_role { "grant_role to ${new_owner}":
45 # Grant them connect to the database
46 postgresql::server::database_grant { "allow connect for ${old_owner}":
47 privilege => 'CONNECT',
54 let(:pp_db_old_owner) { <<-EOS.unindent
55 postgresql::server::database { $db:
57 require => Postgresql::Server::Role[$old_owner],
62 let(:pp_db_no_owner) { <<-EOS.unindent
63 postgresql::server::database { $db:
68 context 'reassign_owned_by' do
69 describe 'REASSIGN OWNED BY tests' do
70 let(:db) { 'reassign_test' }
71 let(:old_owner) { 'psql_reassign_old_owner' }
72 let(:new_owner) { 'psql_reassign_new_owner' }
74 let(:pp_setup_objects) { <<-EOS.unindent
75 postgresql_psql { 'create test table':
76 command => 'CREATE TABLE test_tbl (col1 integer)',
78 psql_user => '#{old_owner}',
79 unless => "SELECT tablename FROM pg_catalog.pg_tables WHERE tablename = 'test_tbl'",
80 require => Postgresql::Server::Database['#{db}'],
82 postgresql_psql { 'create test sequence':
83 command => 'CREATE SEQUENCE test_seq',
85 psql_user => '#{old_owner}',
86 unless => "SELECT relname FROM pg_catalog.pg_class WHERE relkind='S' AND relname = 'test_seq'",
87 require => [ Postgresql_psql['create test table'], Postgresql::Server::Database['#{db}'] ],
91 let(:pp_reassign_owned_by) { <<-EOS.unindent
92 postgresql::server::reassign_owned_by { 'test reassign to new_owner':
94 old_role => '#{old_owner}',
95 new_role => '#{new_owner}',
96 psql_user => '#{new_owner}',
101 it 'should reassign all objects to new_owner' do
104 result = shell('psql --version')
105 version = result.stdout.match(%r{\s(\d\.\d)})[1]
108 apply_manifest(pp_setup + pp_db_old_owner + pp_setup_objects, :catch_failures => true)
110 apply_manifest(pp_setup + pp_db_no_owner + pp_reassign_owned_by, :catch_failures => true)
111 apply_manifest(pp_setup + pp_db_no_owner + pp_reassign_owned_by, :catch_changes => true)
113 ## Check that the ownership was transferred
114 psql("-d #{db} --tuples-only --no-align --command=\"SELECT tablename,tableowner FROM pg_catalog.pg_tables WHERE schemaname NOT IN ('pg_catalog', 'information_schema')\"", superuser) do |r|
115 expect(r.stdout).to match(/test_tbl.#{new_owner}/)
116 expect(r.stderr).to eq('')
118 psql("-d #{db} --tuples-only --no-align --command=\"SELECT relname,pg_get_userbyid(relowner) FROM pg_catalog.pg_class c WHERE relkind='S'\"", superuser) do |r|
119 expect(r.stdout).to match(/test_seq.#{new_owner}/)
120 expect(r.stderr).to eq('')
123 psql("-d #{db} --tuples-only --no-align --command=\"SELECT pg_get_userbyid(datdba) FROM pg_database WHERE datname = current_database()\"", superuser) do |r|
124 expect(r.stdout).to match(/#{new_owner}/)
125 expect(r.stderr).to eq('')
130 end # it should reassign all objects
133 #####################