@@ -43,6 +43,8 @@ func TestAccPostgresqlDatabase_Basic(t *testing.T) {
43
43
"postgresql_database.default_opts" , "connection_limit" , "-1" ),
44
44
resource .TestCheckResourceAttr (
45
45
"postgresql_database.default_opts" , "is_template" , "false" ),
46
+ resource .TestCheckResourceAttr (
47
+ "postgresql_database.default_opts" , "alter_object_ownership" , "false" ),
46
48
47
49
resource .TestCheckResourceAttr (
48
50
"postgresql_database.modified_opts" , "owner" , "myrole" ),
@@ -62,6 +64,8 @@ func TestAccPostgresqlDatabase_Basic(t *testing.T) {
62
64
"postgresql_database.modified_opts" , "connection_limit" , "10" ),
63
65
resource .TestCheckResourceAttr (
64
66
"postgresql_database.modified_opts" , "is_template" , "true" ),
67
+ resource .TestCheckResourceAttr (
68
+ "postgresql_database.modified_opts" , "alter_object_ownership" , "true" ),
65
69
66
70
resource .TestCheckResourceAttr (
67
71
"postgresql_database.pathological_opts" , "owner" , "myrole" ),
@@ -266,6 +270,78 @@ resource postgresql_database "test_db" {
266
270
})
267
271
}
268
272
273
+ // Test the case where the owned objects by the previous database owner are altered.
274
+ func TestAccPostgresqlDatabase_AlterObjectOwnership (t * testing.T ) {
275
+ skipIfNotAcc (t )
276
+
277
+ const (
278
+ databaseSuffix = "ownership"
279
+ tableName = "testtable1"
280
+ previous_owner = "previous_owner"
281
+ new_owner = "new_owner"
282
+ )
283
+
284
+ databaseName := fmt .Sprintf ("%s_%s" , dbNamePrefix , databaseSuffix )
285
+
286
+ config := getTestConfig (t )
287
+ dsn := config .connStr ("postgres" )
288
+
289
+ for _ , role := range []string {previous_owner , new_owner } {
290
+ dbExecute (
291
+ t , dsn ,
292
+ fmt .Sprintf ("CREATE ROLE %s;" , role ),
293
+ )
294
+ defer func (role string ) {
295
+ dbExecute (t , dsn , fmt .Sprintf ("DROP ROLE %s" , role ))
296
+ }(role )
297
+
298
+ }
299
+
300
+ resource .Test (t , resource.TestCase {
301
+ PreCheck : func () {
302
+ testAccPreCheck (t )
303
+ testSuperuserPreCheck (t )
304
+ },
305
+ Providers : testAccProviders ,
306
+ CheckDestroy : testAccCheckPostgresqlDatabaseDestroy ,
307
+ Steps : []resource.TestStep {
308
+ {
309
+ Config : `
310
+ resource postgresql_database "test_db" {
311
+ name = "tf_tests_db_ownership"
312
+ owner = "previous_owner"
313
+ alter_object_ownership = true
314
+ }
315
+ ` ,
316
+ Check : func (* terraform.State ) error {
317
+ // To test default privileges, we need to create a table
318
+ // after having apply the state.
319
+ _ = createTestTables (t , databaseSuffix , []string {tableName }, previous_owner )
320
+ return nil
321
+ },
322
+ },
323
+ {
324
+ Config : `
325
+ resource postgresql_database "test_db" {
326
+ name = "tf_tests_db_ownership"
327
+ owner = "new_owner"
328
+ alter_object_ownership = true
329
+ }
330
+ ` ,
331
+ Check : resource .ComposeTestCheckFunc (
332
+ testAccCheckPostgresqlDatabaseExists ("postgresql_database.test_db" ),
333
+ resource .TestCheckResourceAttr ("postgresql_database.test_db" , "name" , databaseName ),
334
+ resource .TestCheckResourceAttr ("postgresql_database.test_db" , "owner" , new_owner ),
335
+ resource .TestCheckResourceAttr ("postgresql_database.test_db" , "alter_object_ownership" , "true" ),
336
+
337
+ checkTableOwnership (t , config .connStr (databaseName ), new_owner , tableName ),
338
+ ),
339
+ },
340
+ },
341
+ })
342
+
343
+ }
344
+
269
345
func checkUserMembership (
270
346
t * testing.T , dsn , member , role string , shouldHaveRole bool ,
271
347
) resource.TestCheckFunc {
@@ -306,6 +382,38 @@ func checkUserMembership(
306
382
}
307
383
}
308
384
385
+ func checkTableOwnership (
386
+ t * testing.T , dsn , owner , tableName string ,
387
+ ) resource.TestCheckFunc {
388
+ return func (s * terraform.State ) error {
389
+ db , err := sql .Open ("postgres" , dsn )
390
+ if err != nil {
391
+ t .Fatalf ("could not create connection pool: %v" , err )
392
+ }
393
+ defer db .Close ()
394
+
395
+ var _rez int
396
+
397
+ err = db .QueryRow (`
398
+ SELECT 1 FROM pg_tables
399
+ WHERE tablename = $1 AND tableowner = $2
400
+ ` , tableName , owner ).Scan (& _rez )
401
+
402
+ switch {
403
+ case err == sql .ErrNoRows :
404
+ return fmt .Errorf (
405
+ "User %s should be owner of %s but is not" , owner , tableName ,
406
+ )
407
+ case err != nil :
408
+ t .Fatalf ("Error checking table ownership. %v" , err )
409
+
410
+ }
411
+
412
+ return nil
413
+
414
+ }
415
+ }
416
+
309
417
func testAccCheckPostgresqlDatabaseDestroy (s * terraform.State ) error {
310
418
client := testAccProvider .Meta ().(* Client )
311
419
@@ -396,6 +504,7 @@ resource "postgresql_database" "default_opts" {
396
504
lc_ctype = "C"
397
505
connection_limit = -1
398
506
is_template = false
507
+ alter_object_ownership = false
399
508
}
400
509
401
510
resource "postgresql_database" "modified_opts" {
@@ -407,6 +516,7 @@ resource "postgresql_database" "modified_opts" {
407
516
lc_ctype = "en_US.UTF-8"
408
517
connection_limit = 10
409
518
is_template = true
519
+ alter_object_ownership = true
410
520
}
411
521
412
522
resource "postgresql_database" "pathological_opts" {
0 commit comments