Skip to content

Commit 340dd70

Browse files
committed
Support setting default_privileges on all schemas
The Postgres default is for the absent specification of a schema name when altering default privileges to apply to all schemas. Support that behaviour, but keep the current default behaviour for an unset schema parameter.
1 parent ecc63f1 commit 340dd70

File tree

2 files changed

+42
-9
lines changed

2 files changed

+42
-9
lines changed

manifests/server/default_privileges.pp

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
# @param db Specifies the database to which you are granting access.
66
# @param object_type Specify target object type: 'FUNCTIONS', 'ROUTINES', 'SEQUENCES', 'TABLES', 'TYPES'.
77
# @param privilege Specifies comma-separated list of privileges to grant. Valid options: depends on object type.
8-
# @param schema Target schema. Defaults to 'public'.
8+
# @param schema Target schema. Defaults to all schemas.
99
# @param psql_db Defines the database to execute the grant against. This should not ordinarily be changed from the default.
1010
# @param psql_user Specifies the OS user for running psql. Default value: The default user for the module, usually 'postgres'.
1111
# @param psql_path Specifies the OS user for running psql. Default value: The default user for the module, usually 'postgres'.
@@ -50,11 +50,11 @@
5050
case $ensure {
5151
default: {
5252
# default is 'present'
53-
$sql_command = 'ALTER DEFAULT PRIVILEGES IN SCHEMA %s GRANT %s ON %s TO "%s"'
53+
$sql_command = 'ALTER DEFAULT PRIVILEGES%s GRANT %s ON %s TO "%s"'
5454
$unless_is = true
5555
}
5656
'absent': {
57-
$sql_command = 'ALTER DEFAULT PRIVILEGES IN SCHEMA %s REVOKE %s ON %s FROM "%s"'
57+
$sql_command = 'ALTER DEFAULT PRIVILEGES%s REVOKE %s ON %s FROM "%s"'
5858
$unless_is = false
5959
}
6060
}
@@ -70,6 +70,13 @@
7070
$port_override = $postgresql::server::port
7171
}
7272

73+
if $schema != '' {
74+
$_schema = " IN SCHEMA $schema"
75+
$_check_schema = " AND nspname = '$schema'"
76+
} else {
77+
$_schema = ''
78+
$_check_schema = ''
79+
}
7380
## Munge the input values
7481
$_object_type = upcase($object_type)
7582
$_privilege = upcase($privilege)
@@ -128,12 +135,12 @@
128135
}
129136

130137
$_unless = $ensure ? {
131-
'absent' => "SELECT 1 WHERE NOT EXISTS (SELECT * FROM pg_default_acl AS da JOIN pg_namespace AS n ON da.defaclnamespace = n.oid WHERE '%s=%s' = ANY (defaclacl) AND nspname = '%s' and defaclobjtype = '%s')",
132-
default => "SELECT 1 WHERE EXISTS (SELECT * FROM pg_default_acl AS da JOIN pg_namespace AS n ON da.defaclnamespace = n.oid WHERE '%s=%s' = ANY (defaclacl) AND nspname = '%s' and defaclobjtype = '%s')"
138+
'absent' => "SELECT 1 WHERE NOT EXISTS (SELECT * FROM pg_default_acl AS da LEFT JOIN pg_namespace AS n ON da.defaclnamespace = n.oid WHERE '%s=%s' = ANY (defaclacl)%s and defaclobjtype = '%s')",
139+
default => "SELECT 1 WHERE EXISTS (SELECT * FROM pg_default_acl AS da LEFT JOIN pg_namespace AS n ON da.defaclnamespace = n.oid WHERE '%s=%s' = ANY (defaclacl)%s and defaclobjtype = '%s')"
133140
}
134141

135-
$unless_cmd = sprintf($_unless, $role, $_check_privilege, $schema, $_check_type)
136-
$grant_cmd = sprintf($sql_command, $schema, $_privilege, $_object_type, $role)
142+
$unless_cmd = sprintf($_unless, $role, $_check_privilege, $_check_schema, $_check_type)
143+
$grant_cmd = sprintf($sql_command, $_schema, $_privilege, $_object_type, $role)
137144

138145
postgresql_psql { "default_privileges:${name}":
139146
command => $grant_cmd,

spec/unit/defines/server/default_privileges_spec.rb

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@
112112
# rubocop:disable Layout/LineLength
113113
is_expected.to contain_postgresql_psql('default_privileges:test')
114114
.with_command('ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON TABLES TO "test"')
115-
.with_unless("SELECT 1 WHERE EXISTS (SELECT * FROM pg_default_acl AS da JOIN pg_namespace AS n ON da.defaclnamespace = n.oid WHERE 'test=arwdDxt' = ANY (defaclacl) AND nspname = 'public' and defaclobjtype = 'r')")
115+
.with_unless("SELECT 1 WHERE EXISTS (SELECT * FROM pg_default_acl AS da LEFT JOIN pg_namespace AS n ON da.defaclnamespace = n.oid WHERE 'test=arwdDxt' = ANY (defaclacl) AND nspname = 'public' and defaclobjtype = 'r')")
116116
# rubocop:enable Layout/LineLength
117117
end
118118
end
@@ -222,7 +222,33 @@
222222
# rubocop:disable Layout/LineLength
223223
is_expected.to contain_postgresql_psql('default_privileges:test')
224224
.with_command('ALTER DEFAULT PRIVILEGES IN SCHEMA my_schema GRANT ALL ON TABLES TO "test"')
225-
.with_unless("SELECT 1 WHERE EXISTS (SELECT * FROM pg_default_acl AS da JOIN pg_namespace AS n ON da.defaclnamespace = n.oid WHERE 'test=arwdDxt' = ANY (defaclacl) AND nspname = 'my_schema' and defaclobjtype = 'r')")
225+
.with_unless("SELECT 1 WHERE EXISTS (SELECT * FROM pg_default_acl AS da LEFT JOIN pg_namespace AS n ON da.defaclnamespace = n.oid WHERE 'test=arwdDxt' = ANY (defaclacl) AND nspname = 'my_schema' and defaclobjtype = 'r')")
226+
# rubocop:enable Layout/LineLength
227+
end
228+
end
229+
230+
context 'with unset schema name' do
231+
let :params do
232+
{
233+
db: 'test',
234+
role: 'test',
235+
privilege: 'all',
236+
object_type: 'tables',
237+
schema: ''
238+
}
239+
end
240+
241+
let :pre_condition do
242+
"class {'postgresql::server':}"
243+
end
244+
245+
it { is_expected.to compile.with_all_deps }
246+
it { is_expected.to contain_postgresql__server__default_privileges('test') }
247+
it do
248+
# rubocop:disable Layout/LineLength
249+
is_expected.to contain_postgresql_psql('default_privileges:test')
250+
.with_command('ALTER DEFAULT PRIVILEGES GRANT ALL ON TABLES TO "test"')
251+
.with_unless("SELECT 1 WHERE EXISTS (SELECT * FROM pg_default_acl AS da LEFT JOIN pg_namespace AS n ON da.defaclnamespace = n.oid WHERE 'test=arwdDxt' = ANY (defaclacl) and defaclobjtype = 'r')")
226252
# rubocop:enable Layout/LineLength
227253
end
228254
end

0 commit comments

Comments
 (0)