Skip to content

Commit 9cdc19a

Browse files
committed
feat: External-Postgres-Operator 2.3.3 build
1 parent 67fd3fa commit 9cdc19a

File tree

4 files changed

+53
-3
lines changed

4 files changed

+53
-3
lines changed

internal/controller/postgres_controller.go

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,22 @@ func (r *PostgresReconciler) Reconcile(ctx context.Context, req ctrl.Request) (c
168168
instance.Status.Roles.Writer = writer
169169
instance.Status.Succeeded = true
170170
}
171+
172+
desiredOwner := instance.Spec.MasterRole
173+
// handle owner rename if was previously set by instance.Spec.MasterRole then was removed
174+
if desiredOwner == "" {
175+
desiredOwner = fmt.Sprintf("%s-group", instance.Spec.Database)
176+
}
177+
// rename owner role if instance.Spec.MasterRole was changed
178+
ownerChanged := instance.Status.Roles.Owner != "" && instance.Status.Roles.Owner != desiredOwner
179+
if ownerChanged {
180+
err = r.pg.RenameGroupRole(instance.Status.Roles.Owner, desiredOwner)
181+
if err != nil {
182+
return requeue(errors.NewInternalError(err))
183+
}
184+
instance.Status.Roles.Owner = desiredOwner
185+
}
186+
171187
// create extensions
172188
for _, extension := range instance.Spec.Extensions {
173189
// Check if extension is already added. Skip if already is added.
@@ -192,7 +208,7 @@ func (r *PostgresReconciler) Reconcile(ctx context.Context, req ctrl.Request) (c
192208
writerPrivs = "SELECT,INSERT,DELETE,UPDATE"
193209
writerSequencePrivs = "USAGE,SELECT"
194210
writerFunctionPrivs = "EXECUTE"
195-
ownerPrivs = "ALL"
211+
ownerPrivs = "ALL,MAINTAIN"
196212
ownerFunctionPrivs = "ALL"
197213
ownerSequencePrivs = "ALL"
198214
)
@@ -208,6 +224,11 @@ func (r *PostgresReconciler) Reconcile(ctx context.Context, req ctrl.Request) (c
208224
reqLogger.Error(err, fmt.Sprintf("Could not create schema %s", schema))
209225
continue
210226
}
227+
instance.Status.Schemas = append(instance.Status.Schemas, schema)
228+
}
229+
230+
// Set privileges on schemas during every reconcile to ensure privileges are correct
231+
for _, schema := range instance.Spec.Schemas {
211232

212233
// Set privileges on schema
213234
schemaPrivilegesReader := postgres.PostgresSchemaPrivileges{
@@ -250,9 +271,8 @@ func (r *PostgresReconciler) Reconcile(ctx context.Context, req ctrl.Request) (c
250271
reqLogger.Error(err, fmt.Sprintf("Could not give %s permissions \"%s\", sequence privileges \"%s\", and function privileges \"%s\"", owner, ownerPrivs, ownerSequencePrivs, ownerFunctionPrivs))
251272
continue
252273
}
253-
254-
instance.Status.Schemas = append(instance.Status.Schemas, schema)
255274
}
275+
256276
err = r.Status().Patch(ctx, instance, client.MergeFrom(before))
257277
if err != nil {
258278
return requeue(err)

pkg/postgres/mock/postgres.go

Lines changed: 14 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/postgres/postgres.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ type PG interface {
1414
CreateSchema(db, role, schema string, logger logr.Logger) error
1515
CreateExtension(db, extension string, logger logr.Logger) error
1616
CreateGroupRole(role string) error
17+
RenameGroupRole(currentRole, newRole string) error
1718
CreateUserRole(role, password string) (string, error)
1819
UpdatePassword(role, password string) error
1920
GrantRole(role, grantee string) error

pkg/postgres/role.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99

1010
const (
1111
CREATE_GROUP_ROLE = `CREATE ROLE "%s"`
12+
RENAME_GROUP_ROLE = `ALTER ROLE "%s" RENAME TO "%s"`
1213
CREATE_USER_ROLE = `CREATE ROLE "%s" WITH LOGIN PASSWORD '%s'`
1314
GRANT_ROLE = `GRANT "%s" TO "%s"`
1415
ALTER_USER_SET_ROLE = `ALTER USER "%s" SET ROLE "%s"`
@@ -28,6 +29,20 @@ func (c *pg) CreateGroupRole(role string) error {
2829
return nil
2930
}
3031

32+
func (c *pg) RenameGroupRole(currentRole, newRole string) error {
33+
_, err := c.db.Exec(fmt.Sprintf(RENAME_GROUP_ROLE, currentRole, newRole))
34+
if err != nil {
35+
if pqErr, ok := err.(*pq.Error); ok {
36+
// 42704 => role does not exist; treat as success so caller can recreate
37+
if pqErr.Code == "42704" {
38+
return nil
39+
}
40+
}
41+
return err
42+
}
43+
return nil
44+
}
45+
3146
func (c *pg) CreateUserRole(role, password string) (string, error) {
3247
_, err := c.db.Exec(fmt.Sprintf(CREATE_USER_ROLE, role, password))
3348
if err != nil {

0 commit comments

Comments
 (0)