@@ -79,6 +79,15 @@ type RoleReconciler struct {
7979 Scheme * runtime.Scheme
8080}
8181
82+ // getEffectiveRoleName returns the PostgreSQL role name to use.
83+ // If UserNameOverride is set, it takes precedence over the CRD name.
84+ func getEffectiveRoleName (role * postgresql.Role ) string {
85+ if role .Spec .UserNameOverride != nil && * role .Spec .UserNameOverride != "" {
86+ return * role .Spec .UserNameOverride
87+ }
88+ return role .Name
89+ }
90+
8291//+kubebuilder:rbac:groups=postgresql.facets.cloud,resources=roles,verbs=get;list;watch;create;update;patch;delete
8392//+kubebuilder:rbac:groups=postgresql.facets.cloud,resources=roles/status,verbs=get;update;patch
8493//+kubebuilder:rbac:groups=postgresql.facets.cloud,resources=roles/finalizers,verbs=update
@@ -179,7 +188,7 @@ func (r *RoleReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.
179188 defaultDatabase := string (connectionSecret .Data [common .ResourceCredentialsSecretDatabaseKey ])
180189 roleDB , err = common .ConnectToPostgres (connectionSecret , defaultDatabase )
181190 if err != nil {
182- reason := fmt .Sprintf ("Failed connecting to database for role `%s`" , role . Name )
191+ reason := fmt .Sprintf ("Failed connecting to database for role `%s`" , getEffectiveRoleName ( role ) )
183192 roleLogger .Error (err , reason )
184193 r .appendRoleStatusCondition (ctx , role , common .FAIL , metav1 .ConditionFalse , common .CONNECTIONFAILED , err .Error ())
185194 }
@@ -325,31 +334,31 @@ func (r *RoleReconciler) findObjectsForSecret(secret client.Object) []reconcile.
325334
326335func (r * RoleReconciler ) CreateRole (ctx context.Context , role * postgresql.Role , rolePassword string ) (string , metav1.ConditionStatus , string , string ) {
327336 privileges := strings .Join (PrivilegesToClauses (role .Spec .Privileges ), " " )
328- createRoleQuery := fmt .Sprintf ("CREATE ROLE \" %s\" WITH %s PASSWORD '%s' CONNECTION LIMIT %d" , role . Name , privileges , rolePassword , * role .Spec .ConnectionLimit )
337+ createRoleQuery := fmt .Sprintf ("CREATE ROLE \" %s\" WITH %s PASSWORD '%s' CONNECTION LIMIT %d" , getEffectiveRoleName ( role ) , privileges , rolePassword , * role .Spec .ConnectionLimit )
329338 _ , err := roleDB .Exec (createRoleQuery )
330339 if err != nil {
331- if strings .Contains (err .Error (), fmt .Sprintf ("pq: role \" %s\" already exists" , role . Name )) {
332- roleLogger .Error (err , fmt .Sprintf ("Role `%s` created outside of database operator." , role . Name ))
340+ if strings .Contains (err .Error (), fmt .Sprintf ("pq: role \" %s\" already exists" , getEffectiveRoleName ( role ) )) {
341+ roleLogger .Error (err , fmt .Sprintf ("Role `%s` created outside of database operator." , getEffectiveRoleName ( role ) ))
333342 return common .FAIL , metav1 .ConditionFalse , ROLECREATEFAILED , errRoleCreatedOutside
334343 } else {
335- roleLogger .Error (err , fmt .Sprintf ("Failed to create role `%s`, Check if the secret `%s/%s` has valid database connection details" , role . Name , role .Spec .ConnectSecretRef .Namespace , role .Spec .ConnectSecretRef .Name ))
344+ roleLogger .Error (err , fmt .Sprintf ("Failed to create role `%s`, Check if the secret `%s/%s` has valid database connection details" , getEffectiveRoleName ( role ) , role .Spec .ConnectSecretRef .Namespace , role .Spec .ConnectSecretRef .Name ))
336345 return common .FAIL , metav1 .ConditionFalse , ROLECREATEFAILED , fmt .Sprintf ("%s, Check if the secret `%s/%s` has valid database connection details" , err .Error (), role .Spec .ConnectSecretRef .Namespace , role .Spec .ConnectSecretRef .Name )
337346 }
338347 }
339348
340- roleLogger .Info (fmt .Sprintf ("Role `%s` got created successfully" , role . Name ))
349+ roleLogger .Info (fmt .Sprintf ("Role `%s` got created successfully" , getEffectiveRoleName ( role ) ))
341350 return common .CREATE , metav1 .ConditionTrue , ROLECREATED , "Role created successfully"
342351}
343352
344353func (r * RoleReconciler ) DeletRole (ctx context.Context , role * v1alpha1.Role ) (string , metav1.ConditionStatus , string , string , error ) {
345- deleteRoleQuery := fmt .Sprintf ("DROP ROLE IF EXISTS \" %s\" " , role . Name )
354+ deleteRoleQuery := fmt .Sprintf ("DROP ROLE IF EXISTS \" %s\" " , getEffectiveRoleName ( role ) )
346355 _ , err := roleDB .Exec (deleteRoleQuery )
347356 if err != nil {
348- roleLogger .Error (err , fmt .Sprintf ("Failed to delete role `%s`" , role . Name ))
357+ roleLogger .Error (err , fmt .Sprintf ("Failed to delete role `%s`" , getEffectiveRoleName ( role ) ))
349358 return common .FAIL , metav1 .ConditionFalse , ROLEDELETEFAILED , err .Error (), err
350359 }
351360
352- roleLogger .Info (fmt .Sprintf ("Role `%s` got deleted successfully" , role . Name ))
361+ roleLogger .Info (fmt .Sprintf ("Role `%s` got deleted successfully" , getEffectiveRoleName ( role ) ))
353362 return common .DELETE , metav1 .ConditionTrue , ROLEDELETED , "Role deleted successfully" , err
354363}
355364
@@ -376,23 +385,23 @@ func (r *RoleReconciler) SyncRole(ctx context.Context, role *postgresql.Role, ro
376385 }
377386 }
378387
379- alterRoleQuery := fmt .Sprintf ("ALTER ROLE \" %s\" WITH %s PASSWORD '%s' CONNECTION LIMIT %d" , role . Name , strings .Join (privileges , " " ), rolePassword , * role .Spec .ConnectionLimit )
388+ alterRoleQuery := fmt .Sprintf ("ALTER ROLE \" %s\" WITH %s PASSWORD '%s' CONNECTION LIMIT %d" , getEffectiveRoleName ( role ) , strings .Join (privileges , " " ), rolePassword , * role .Spec .ConnectionLimit )
380389 _ , err := roleDB .Exec (alterRoleQuery )
381390 if err != nil {
382- if strings .Contains (err .Error (), fmt .Sprintf ("pq: role \" %s\" does not exist" , role . Name )) {
383- roleLogger .Error (err , fmt .Sprintf ("Failed to sync role `%s`. Role deleted outside of database operator " , role . Name ))
391+ if strings .Contains (err .Error (), fmt .Sprintf ("pq: role \" %s\" does not exist" , getEffectiveRoleName ( role ) )) {
392+ roleLogger .Error (err , fmt .Sprintf ("Failed to sync role `%s`. Role deleted outside of database operator " , getEffectiveRoleName ( role ) ))
384393 return common .SYNC , metav1 .ConditionFalse , ROLESYNCFAILED , errRoleDeletedOutside
385394 } else {
386- roleLogger .Error (err , fmt .Sprintf ("Failed to sync role `%s`" , role . Name ))
395+ roleLogger .Error (err , fmt .Sprintf ("Failed to sync role `%s`" , getEffectiveRoleName ( role ) ))
387396 return common .SYNC , metav1 .ConditionFalse , ROLESYNCFAILED , err .Error ()
388397 }
389398 }
390399
391400 if isPasswordSync {
392- roleLogger .Info (fmt .Sprintf ("Role `%s` password got synced successfully" , role . Name ))
401+ roleLogger .Info (fmt .Sprintf ("Role `%s` password got synced successfully" , getEffectiveRoleName ( role ) ))
393402 return common .SYNC , metav1 .ConditionTrue , ROLEPASSWORDSYNCED , "Role password synced successfully"
394403 }
395- roleLogger .Info (fmt .Sprintf ("Role `%s` got synced successfully" , role . Name ))
404+ roleLogger .Info (fmt .Sprintf ("Role `%s` got synced successfully" , getEffectiveRoleName ( role ) ))
396405 return common .SYNC , metav1 .ConditionTrue , ROLESYNCED , "Role synced successfully"
397406}
398407
@@ -411,7 +420,7 @@ func (r *RoleReconciler) ObserveRoleState(ctx context.Context, role *postgresql.
411420
412421 err := roleDB .QueryRow (
413422 observeRoleStateQuery ,
414- role . Name ,
423+ getEffectiveRoleName ( role ) ,
415424 & role .Spec .Privileges .SuperUser ,
416425 & role .Spec .Privileges .Inherit ,
417426 & role .Spec .Privileges .CreateRole ,
@@ -422,7 +431,7 @@ func (r *RoleReconciler) ObserveRoleState(ctx context.Context, role *postgresql.
422431 & role .Spec .Privileges .BypassRls ,
423432 ).Scan (& isRoleStateChanged )
424433 if err != nil {
425- roleLogger .Error (err , fmt .Sprintf ("Failed to get role `%s` when observing " , role . Name ))
434+ roleLogger .Error (err , fmt .Sprintf ("Failed to get role `%s` when observing " , getEffectiveRoleName ( role ) ))
426435 r .appendRoleStatusCondition (ctx , role , common .FAIL , metav1 .ConditionFalse , ROLEGETFAILED , err .Error ())
427436 }
428437 return isRoleStateChanged
0 commit comments