@@ -638,7 +638,6 @@ func (c *Cluster) syncSecrets() error {
638638 c .logger .Info ("syncing secrets" )
639639 c .setProcessName ("syncing secrets" )
640640 generatedSecrets := c .generateUserSecrets ()
641- rotationUsers := make (spec.PgUserMap )
642641 retentionUsers := make ([]string , 0 )
643642 currentTime := time .Now ()
644643
@@ -650,29 +649,14 @@ func (c *Cluster) syncSecrets() error {
650649 continue
651650 }
652651 if k8sutil .ResourceAlreadyExists (err ) {
653- if err = c .updateSecret (secretUsername , generatedSecret , & rotationUsers , & retentionUsers , currentTime ); err != nil {
652+ if err = c .updateSecret (secretUsername , generatedSecret , & retentionUsers , currentTime ); err != nil {
654653 c .logger .Warningf ("syncing secret %s failed: %v" , util .NameFromMeta (secret .ObjectMeta ), err )
655654 }
656655 } else {
657656 return fmt .Errorf ("could not create secret for user %s: in namespace %s: %v" , secretUsername , generatedSecret .Namespace , err )
658657 }
659658 }
660659
661- // add new user with date suffix and use it in the secret of the original user
662- if len (rotationUsers ) > 0 {
663- err := c .initDbConn ()
664- if err != nil {
665- return fmt .Errorf ("could not init db connection: %v" , err )
666- }
667- pgSyncRequests := c .userSyncStrategy .ProduceSyncRequests (spec.PgUserMap {}, rotationUsers )
668- if err = c .userSyncStrategy .ExecuteSyncRequests (pgSyncRequests , c .pgDb ); err != nil {
669- return fmt .Errorf ("error creating database roles for password rotation: %v" , err )
670- }
671- if err := c .closeDbConn (); err != nil {
672- c .logger .Errorf ("could not close database connection after creating users for password rotation: %v" , err )
673- }
674- }
675-
676660 // remove rotation users that exceed the retention interval
677661 if len (retentionUsers ) > 0 {
678662 err := c .initDbConn ()
@@ -698,7 +682,6 @@ func (c *Cluster) getNextRotationDate(currentDate time.Time) (time.Time, string)
698682func (c * Cluster ) updateSecret (
699683 secretUsername string ,
700684 generatedSecret * v1.Secret ,
701- rotationUsers * spec.PgUserMap ,
702685 retentionUsers * []string ,
703686 currentTime time.Time ) error {
704687 var (
@@ -757,7 +740,7 @@ func (c *Cluster) updateSecret(
757740 rotationAllowed := ! pwdUser .IsDbOwner && util .SliceContains (allowedRoleTypes , pwdUser .Origin )
758741
759742 if (c .OpConfig .EnablePasswordRotation && rotationAllowed ) || rotationEnabledInManifest {
760- updateSecretMsg , err = c .rotatePasswordInSecret (secret , pwdUser , secretUsername , currentTime , rotationUsers , retentionUsers )
743+ updateSecretMsg , err = c .rotatePasswordInSecret (secret , secretUsername , pwdUser . Origin , currentTime , retentionUsers )
761744 if err != nil {
762745 c .logger .Warnf ("password rotation failed for user %s: %v" , secretUsername , err )
763746 }
@@ -782,8 +765,13 @@ func (c *Cluster) updateSecret(
782765 updateSecret = true
783766 updateSecretMsg = fmt .Sprintf ("updating the secret %s from the infrastructure roles" , secretName )
784767 } else {
785- // for non-infrastructure role - update the role with the password from the secret
768+ // for non-infrastructure role - update the role with username and password from secret
769+ pwdUser .Name = string (secret .Data ["username" ])
786770 pwdUser .Password = string (secret .Data ["password" ])
771+ // update membership if we deal with a rotation user
772+ if secretUsername != pwdUser .Name {
773+ pwdUser .MemberOf = []string {secretUsername }
774+ }
787775 userMap [userKey ] = pwdUser
788776 }
789777
@@ -800,10 +788,9 @@ func (c *Cluster) updateSecret(
800788
801789func (c * Cluster ) rotatePasswordInSecret (
802790 secret * v1.Secret ,
803- secretPgUser spec.PgUser ,
804791 secretUsername string ,
792+ roleOrigin spec.RoleOrigin ,
805793 currentTime time.Time ,
806- rotationUsers * spec.PgUserMap ,
807794 retentionUsers * []string ) (string , error ) {
808795 var (
809796 err error
@@ -833,18 +820,14 @@ func (c *Cluster) rotatePasswordInSecret(
833820 if currentTime .After (nextRotationDate ) {
834821 // create rotation user if role is not listed for in-place password update
835822 if ! util .SliceContains (c .Spec .UsersWithInPlaceSecretRotation , secretUsername ) {
836- rotationUser := secretPgUser
837- newRotationUsername := fmt .Sprintf ("%s%s" , secretUsername , currentTime .Format ("060102" ))
838- rotationUser .Name = newRotationUsername
839- rotationUser .MemberOf = []string {secretUsername }
840- (* rotationUsers )[newRotationUsername ] = rotationUser
841- secret .Data ["username" ] = []byte (newRotationUsername )
842-
823+ rotationUsername := fmt .Sprintf ("%s%s" , secretUsername , currentTime .Format ("060102" ))
824+ secret .Data ["username" ] = []byte (rotationUsername )
825+ c .logger .Infof ("updating username in secret %s and creating rotation user %s in the database" , secretName , rotationUsername )
843826 // whenever there is a rotation, check if old rotation users can be deleted
844827 * retentionUsers = append (* retentionUsers , secretUsername )
845828 } else {
846829 // when passwords of system users are rotated in place, pods have to be replaced
847- if secretPgUser . Origin == spec .RoleOriginSystem {
830+ if roleOrigin == spec .RoleOriginSystem {
848831 pods , err := c .listPods ()
849832 if err != nil {
850833 return "" , fmt .Errorf ("could not list pods of the statefulset: %v" , err )
@@ -858,7 +841,7 @@ func (c *Cluster) rotatePasswordInSecret(
858841 }
859842
860843 // when password of connection pooler is rotated in place, pooler pods have to be replaced
861- if secretPgUser . Origin == spec .RoleOriginConnectionPooler {
844+ if roleOrigin == spec .RoleOriginConnectionPooler {
862845 listOptions := metav1.ListOptions {
863846 LabelSelector : c .poolerLabelsSet (true ).String (),
864847 }
@@ -875,8 +858,8 @@ func (c *Cluster) rotatePasswordInSecret(
875858 }
876859
877860 // when password of stream user is rotated in place, it should trigger rolling update in FES deployment
878- if secretPgUser . Origin == spec .RoleOriginStream {
879- c .logger .Warnf ("secret of stream user %s changed" , constants .EventStreamSourceSlotPrefix + constants .UserRoleNameSuffix )
861+ if roleOrigin == spec .RoleOriginStream {
862+ c .logger .Warnf ("password in secret of stream user %s changed" , constants .EventStreamSourceSlotPrefix + constants .UserRoleNameSuffix )
880863 }
881864 }
882865 secret .Data ["password" ] = []byte (util .RandomPassword (constants .PasswordLength ))
0 commit comments