diff --git a/manifests/server/schema.pp b/manifests/server/schema.pp index 971dfcc..fb7bb31 100644 --- a/manifests/server/schema.pp +++ b/manifests/server/schema.pp @@ -1,58 +1,61 @@ # = Type: postgresql::server::schema # # Create a new schema. See README.md for more details. # # == Requires: # # The database must exist and the PostgreSQL user should have enough privileges # # == Sample Usage: # # postgresql::server::schema {'private': # db => 'template1', # } # define postgresql::server::schema( - $db = $postgresql::server::default_database, - $owner = undef, - $schema = $title, + $db = $postgresql::server::default_database, + $owner = undef, + $schema = $title, $connect_settings = $postgresql::server::default_connect_settings, ) { $user = $postgresql::server::user $group = $postgresql::server::group $psql_path = $postgresql::server::psql_path $version = $postgresql::server::_version $module_workdir = $postgresql::server::module_workdir # If the connection settings do not contain a port, then use the local server port if $connect_settings != undef and has_key( $connect_settings, 'PGPORT') { $port = undef } else { $port = $postgresql::server::port } Postgresql_psql { db => $db, psql_user => $user, psql_group => $group, psql_path => $psql_path, port => $port, cwd => $module_workdir, connect_settings => $connect_settings, } - $authorization = $owner ? { - undef => '', - default => "AUTHORIZATION \"${owner}\"", - } - postgresql_psql { "${db}: CREATE SCHEMA \"${schema}\"": - command => "CREATE SCHEMA \"${schema}\" ${authorization}", + command => "CREATE SCHEMA \"${schema}\"", unless => "SELECT 1 FROM pg_namespace WHERE nspname = '${schema}'", require => Class['postgresql::server'], } - if $owner != undef and defined(Postgresql::Server::Role[$owner]) { - Postgresql::Server::Role[$owner]->Postgresql_psql["${db}: CREATE SCHEMA \"${schema}\""] + if $owner { + postgresql_psql { "${db}: ALTER SCHEMA \"${schema}\" OWNER TO \"${owner}\"": + command => "ALTER SCHEMA \"${schema}\" OWNER TO ${owner}", + unless => "SELECT 1 FROM pg_namespace JOIN pg_roles rol ON nspowner = rol.oid WHERE nspname = '${schema}' AND rolname = '${owner}'", + require => Postgresql_psql["${db}: CREATE SCHEMA \"${schema}\""], + } + + if defined(Postgresql::Server::Role[$owner]) { + Postgresql::Server::Role[$owner]->Postgresql_psql["${db}: ALTER SCHEMA \"${schema}\" OWNER TO \"${owner}\""] + } } } diff --git a/spec/unit/defines/server/schema_spec.rb b/spec/unit/defines/server/schema_spec.rb index f5d106f..c8fa3d9 100644 --- a/spec/unit/defines/server/schema_spec.rb +++ b/spec/unit/defines/server/schema_spec.rb @@ -1,32 +1,43 @@ require 'spec_helper' describe 'postgresql::server::schema', :type => :define do let :facts do { :osfamily => 'Debian', :operatingsystem => 'Debian', :operatingsystemrelease => '6.0', :kernel => 'Linux', :concat_basedir => tmpfilename('schema'), :id => 'root', :path => '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin', } end let :title do 'test' end let :params do { :owner => 'jane', :db => 'janedb', } end let :pre_condition do "class {'postgresql::server':}" end it { should contain_postgresql__server__schema('test') } + + context "with different owner" do + let :params do + { + :owner => 'nate', + :db => 'natedb', + } + end + + it { is_expected.to contain_postgresql_psql('natedb: ALTER SCHEMA "test" OWNER TO "nate"') } + end end