Skip to content

Commit e57f3e5

Browse files
committed
Remove duplicate database code in provider logic
1 parent 4c908b6 commit e57f3e5

File tree

6 files changed

+48
-208
lines changed

6 files changed

+48
-208
lines changed

pkg/postgres/aws.go

Lines changed: 0 additions & 80 deletions
This file was deleted.

pkg/postgres/azure.go

Lines changed: 0 additions & 50 deletions
This file was deleted.

pkg/postgres/database.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,14 @@ const (
2929
)
3030

3131
func (c *pg) CreateDB(dbname, role string) error {
32-
_, err := c.db.Exec(fmt.Sprintf(CREATE_DB, dbname))
32+
// Have to add the master role to the group role before we can transfer the database owner
33+
err := c.GrantRole(role, c.user)
34+
if err != nil {
35+
return err
36+
}
37+
38+
// Create database
39+
_, err = c.db.Exec(fmt.Sprintf(CREATE_DB, dbname))
3340
if err != nil {
3441
// eat DUPLICATE DATABASE ERROR
3542
if err.(*pq.Error).Code != "42P04" {

pkg/postgres/gcp.go

Lines changed: 0 additions & 63 deletions
This file was deleted.

pkg/postgres/postgres.go

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -71,20 +71,7 @@ func NewPG(cfg *config.Cfg, logger logr.Logger) (PG, error) {
7171
default_database: cfg.PostgresDefaultDb,
7272
}
7373

74-
switch cfg.CloudProvider {
75-
case "AWS":
76-
logger.Info("Using AWS wrapper")
77-
return newAWSPG(postgres), nil
78-
case "Azure":
79-
logger.Info("Using Azure wrapper")
80-
return newAzurePG(postgres), nil
81-
case "GCP":
82-
logger.Info("Using GCP wrapper")
83-
return newGCPPG(postgres), nil
84-
default:
85-
logger.Info("Using default postgres implementation")
86-
return postgres, nil
87-
}
74+
return postgres, nil
8875
}
8976

9077
func (c *pg) GetUser() string {

pkg/postgres/role.go

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,13 @@ const (
2020
REASIGN_OBJECTS = `REASSIGN OWNED BY "%s" TO "%s"`
2121
)
2222

23+
var reservedRoles = map[string]struct{}{
24+
"alloydbsuperuser": {}, // GCP AlloyDB
25+
"cloudsqlsuperuser": {}, // GCP Cloud SQL
26+
"rdsadmin": {}, // AWS RDS
27+
"azuresu": {}, // Azure Database for PostgreSQL
28+
}
29+
2330
func (c *pg) CreateGroupRole(role string) error {
2431
// Error code 42710 is duplicate_object (role already exists)
2532
_, err := c.db.Exec(fmt.Sprintf(CREATE_GROUP_ROLE, role))
@@ -48,6 +55,11 @@ func (c *pg) CreateUserRole(role, password string) (string, error) {
4855
if err != nil {
4956
return "", err
5057
}
58+
59+
err = c.GrantRole(role, c.user)
60+
if err != nil {
61+
return "", err
62+
}
5163
return role, nil
5264
}
5365

@@ -76,6 +88,33 @@ func (c *pg) RevokeRole(role, revoked string) error {
7688
}
7789

7890
func (c *pg) DropRole(role, newOwner, database string, logger logr.Logger) error {
91+
if _, reserved := reservedRoles[role]; reserved || role == c.user {
92+
logger.Info(fmt.Sprintf("not dropping %s as it is a reserved role", role))
93+
return nil
94+
}
95+
96+
err := c.GrantRole(role, c.user)
97+
if err != nil && err.(*pq.Error).Code != "0LP01" {
98+
if err.(*pq.Error).Code == "42704" {
99+
// The group role does not exist, no point in continuing
100+
return nil
101+
}
102+
return err
103+
}
104+
defer c.RevokeRole(role, c.user)
105+
if newOwner != c.user {
106+
err = c.GrantRole(newOwner, c.user)
107+
if err != nil && err.(*pq.Error).Code != "0LP01" {
108+
if err.(*pq.Error).Code == "42704" {
109+
// The group role does not exist, no point of granting roles
110+
logger.Info(fmt.Sprintf("not granting %s to %s as %s does not exist", role, newOwner, newOwner))
111+
return nil
112+
}
113+
return err
114+
}
115+
defer c.RevokeRole(newOwner, c.user)
116+
}
117+
79118
// REASSIGN OWNED BY only works if the correct database is selected
80119
tmpDb, err := GetConnection(c.user, c.pass, c.host, database, c.args, logger)
81120
if err != nil {

0 commit comments

Comments
 (0)