|
| 1 | +require 'spec_helper_acceptance' |
| 2 | + |
| 3 | +describe 'postgresql::server::reassign_owned_by:', :unless => UNSUPPORTED_PLATFORMS.include?(fact('osfamily')) do |
| 4 | + |
| 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' } |
| 10 | + |
| 11 | + let(:pp_setup) { pp_setup = <<-EOS.unindent |
| 12 | + $db = #{db} |
| 13 | + $old_owner = #{old_owner} |
| 14 | + $new_owner = #{new_owner} |
| 15 | + $password = #{password} |
| 16 | +
|
| 17 | + class { 'postgresql::server': } |
| 18 | +
|
| 19 | + postgresql::server::role { $old_owner: |
| 20 | + password_hash => postgresql_password($old_owner, $password), |
| 21 | + } |
| 22 | +
|
| 23 | + # Since we are not testing pg_hba or any of that, make a local user for ident auth |
| 24 | + user { $old_owner: |
| 25 | + ensure => present, |
| 26 | + } |
| 27 | +
|
| 28 | + # Create a user to reassign ownership to |
| 29 | + postgresql::server::role { $new_owner: |
| 30 | + db => $db, |
| 31 | + require => Postgresql::Server::Database[$db], |
| 32 | + } |
| 33 | +
|
| 34 | + # Make a local user for ident auth |
| 35 | + user { $new_owner: |
| 36 | + ensure => present, |
| 37 | + } |
| 38 | +
|
| 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}": |
| 41 | + role => $new_owner, |
| 42 | + group => $old_owner, |
| 43 | + } |
| 44 | +
|
| 45 | + # Grant them connect to the database |
| 46 | + postgresql::server::database_grant { "allow connect for ${old_owner}": |
| 47 | + privilege => 'CONNECT', |
| 48 | + db => $db, |
| 49 | + role => $old_owner, |
| 50 | + } |
| 51 | + EOS |
| 52 | + } |
| 53 | + |
| 54 | + let(:pp_db_old_owner) { <<-EOS.unindent |
| 55 | + postgresql::server::database { $db: |
| 56 | + owner => $old_owner, |
| 57 | + require => Postgresql::Server::Role[$old_owner], |
| 58 | + } |
| 59 | + EOS |
| 60 | + } |
| 61 | + |
| 62 | + let(:pp_db_no_owner) { <<-EOS.unindent |
| 63 | + postgresql::server::database { $db: |
| 64 | + } |
| 65 | + EOS |
| 66 | + } |
| 67 | + |
| 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' } |
| 73 | + |
| 74 | + let(:pp_setup_objects) { <<-EOS.unindent |
| 75 | + postgresql_psql { 'create test table': |
| 76 | + command => 'CREATE TABLE test_tbl (col1 integer)', |
| 77 | + db => '#{db}', |
| 78 | + psql_user => '#{old_owner}', |
| 79 | + unless => "SELECT tablename FROM pg_catalog.pg_tables WHERE tablename = 'test_tbl'", |
| 80 | + require => Postgresql::Server::Database['#{db}'], |
| 81 | + } |
| 82 | + postgresql_psql { 'create test sequence': |
| 83 | + command => 'CREATE SEQUENCE test_seq', |
| 84 | + db => '#{db}', |
| 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}'] ], |
| 88 | + } |
| 89 | + EOS |
| 90 | + } |
| 91 | + let(:pp_reassign_owned_by) { <<-EOS.unindent |
| 92 | + postgresql::server::reassign_owned_by { 'test reassign to new_owner': |
| 93 | + db => '#{db}', |
| 94 | + old_role => '#{old_owner}', |
| 95 | + new_role => '#{new_owner}', |
| 96 | + psql_user => '#{new_owner}', |
| 97 | + } |
| 98 | + EOS |
| 99 | + } |
| 100 | + |
| 101 | + it 'should reassign all objects to new_owner' do |
| 102 | + begin |
| 103 | + apply_manifest(pp_setup + pp_db_old_owner + pp_setup_objects, :catch_failures => true) |
| 104 | + |
| 105 | + #postgres version |
| 106 | + result = shell('psql --version') |
| 107 | + version = result.stdout.match(%r{\s(\d\.\d)})[1] |
| 108 | + |
| 109 | + if version >= '9.0' |
| 110 | + |
| 111 | + apply_manifest(pp_setup + pp_db_no_owner + pp_reassign_owned_by, :catch_failures => true) |
| 112 | + apply_manifest(pp_setup + pp_db_no_owner + pp_reassign_owned_by, :catch_changes => true) |
| 113 | + |
| 114 | + ## Check that the ownership was transferred |
| 115 | + 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| |
| 116 | + expect(r.stdout).to match(/test_tbl.#{new_owner}/) |
| 117 | + expect(r.stderr).to eq('') |
| 118 | + end |
| 119 | + 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| |
| 120 | + expect(r.stdout).to match(/test_seq.#{new_owner}/) |
| 121 | + expect(r.stderr).to eq('') |
| 122 | + end |
| 123 | + if version >= '9.3' |
| 124 | + psql("-d #{db} --tuples-only --no-align --command=\"SELECT pg_get_userbyid(datdba) FROM pg_database WHERE datname = current_database()\"", superuser) do |r| |
| 125 | + expect(r.stdout).to match(/#{new_owner}/) |
| 126 | + expect(r.stderr).to eq('') |
| 127 | + end |
| 128 | + end |
| 129 | + end |
| 130 | + end |
| 131 | + end # it should reassign all objects |
| 132 | + end |
| 133 | + end |
| 134 | + ##################### |
| 135 | +end |
0 commit comments