@@ -1059,40 +1059,52 @@ func (c *Cluster) syncStandbyClusterConfiguration() error {
10591059func (c * Cluster ) syncSecrets () error {
10601060 c .logger .Debug ("syncing secrets" )
10611061 c .setProcessName ("syncing secrets" )
1062+ errors := make ([]string , 0 )
10621063 generatedSecrets := c .generateUserSecrets ()
10631064 retentionUsers := make ([]string , 0 )
10641065 currentTime := time .Now ()
10651066
10661067 for secretUsername , generatedSecret := range generatedSecrets {
1067- secret , err := c .KubeClient .Secrets (generatedSecret .Namespace ).Create (context .TODO (), generatedSecret , metav1.CreateOptions {})
1068+ pgUserDegraded := false
1069+ createdSecret , err := c .KubeClient .Secrets (generatedSecret .Namespace ).Create (context .TODO (), generatedSecret , metav1.CreateOptions {})
10681070 if err == nil {
1069- c .Secrets [secret .UID ] = secret
1070- c .logger .Infof ("created new secret %s, namespace: %s, uid: %s" , util .NameFromMeta (secret .ObjectMeta ), generatedSecret .Namespace , secret .UID )
1071+ c .Secrets [createdSecret .UID ] = createdSecret
1072+ c .logger .Infof ("created new secret %s, namespace: %s, uid: %s" , util .NameFromMeta (createdSecret .ObjectMeta ), generatedSecret .Namespace , createdSecret .UID )
10711073 continue
10721074 }
10731075 if k8sutil .ResourceAlreadyExists (err ) {
1074- if err = c .updateSecret (secretUsername , generatedSecret , & retentionUsers , currentTime ); err != nil {
1075- c .logger .Warningf ("syncing secret %s failed: %v" , util .NameFromMeta (secret .ObjectMeta ), err )
1076+ updatedSecret , err := c .updateSecret (secretUsername , generatedSecret , & retentionUsers , currentTime )
1077+ if err == nil {
1078+ c .Secrets [updatedSecret .UID ] = updatedSecret
1079+ continue
10761080 }
1081+ errors = append (errors , fmt .Sprintf ("syncing secret %s failed: %v" , util .NameFromMeta (updatedSecret .ObjectMeta ), err ))
1082+ pgUserDegraded = true
10771083 } else {
1078- return fmt .Errorf ("could not create secret for user %s: in namespace %s: %v" , secretUsername , generatedSecret .Namespace , err )
1084+ errors = append (errors , fmt .Sprintf ("could not create secret for user %s: in namespace %s: %v" , secretUsername , generatedSecret .Namespace , err ))
1085+ pgUserDegraded = true
10791086 }
1087+ c .updatePgUser (secretUsername , pgUserDegraded )
10801088 }
10811089
10821090 // remove rotation users that exceed the retention interval
10831091 if len (retentionUsers ) > 0 {
10841092 err := c .initDbConn ()
10851093 if err != nil {
1086- return fmt .Errorf ("could not init db connection: %v" , err )
1094+ errors = append ( errors , fmt .Sprintf ("could not init db connection: %v" , err ) )
10871095 }
10881096 if err = c .cleanupRotatedUsers (retentionUsers , c .pgDb ); err != nil {
1089- return fmt .Errorf ("error removing users exceeding configured retention interval: %v" , err )
1097+ errors = append ( errors , fmt .Sprintf ("error removing users exceeding configured retention interval: %v" , err ) )
10901098 }
10911099 if err := c .closeDbConn (); err != nil {
1092- c . logger . Errorf ("could not close database connection after removing users exceeding configured retention interval: %v" , err )
1100+ errors = append ( errors , fmt . Sprintf ("could not close database connection after removing users exceeding configured retention interval: %v" , err ) )
10931101 }
10941102 }
10951103
1104+ if len (errors ) > 0 {
1105+ return fmt .Errorf ("%v" , strings .Join (errors , `', '` ))
1106+ }
1107+
10961108 return nil
10971109}
10981110
@@ -1105,7 +1117,7 @@ func (c *Cluster) updateSecret(
11051117 secretUsername string ,
11061118 generatedSecret * v1.Secret ,
11071119 retentionUsers * []string ,
1108- currentTime time.Time ) error {
1120+ currentTime time.Time ) ( * v1. Secret , error ) {
11091121 var (
11101122 secret * v1.Secret
11111123 err error
@@ -1115,7 +1127,7 @@ func (c *Cluster) updateSecret(
11151127
11161128 // get the secret first
11171129 if secret , err = c .KubeClient .Secrets (generatedSecret .Namespace ).Get (context .TODO (), generatedSecret .Name , metav1.GetOptions {}); err != nil {
1118- return fmt .Errorf ("could not get current secret: %v" , err )
1130+ return generatedSecret , fmt .Errorf ("could not get current secret: %v" , err )
11191131 }
11201132 c .Secrets [secret .UID ] = secret
11211133
@@ -1211,24 +1223,22 @@ func (c *Cluster) updateSecret(
12111223 if updateSecret {
12121224 c .logger .Infof ("%s" , updateSecretMsg )
12131225 if secret , err = c .KubeClient .Secrets (secret .Namespace ).Update (context .TODO (), secret , metav1.UpdateOptions {}); err != nil {
1214- return fmt .Errorf ("could not update secret %s: %v" , secretName , err )
1226+ return secret , fmt .Errorf ("could not update secret %s: %v" , secretName , err )
12151227 }
1216- c .Secrets [secret .UID ] = secret
12171228 }
12181229
12191230 if changed , _ := c .compareAnnotations (secret .Annotations , generatedSecret .Annotations , nil ); changed {
12201231 patchData , err := metaAnnotationsPatch (generatedSecret .Annotations )
12211232 if err != nil {
1222- return fmt .Errorf ("could not form patch for secret %q annotations: %v" , secret .Name , err )
1233+ return secret , fmt .Errorf ("could not form patch for secret %q annotations: %v" , secret .Name , err )
12231234 }
12241235 secret , err = c .KubeClient .Secrets (secret .Namespace ).Patch (context .TODO (), secret .Name , types .MergePatchType , []byte (patchData ), metav1.PatchOptions {})
12251236 if err != nil {
1226- return fmt .Errorf ("could not patch annotations for secret %q: %v" , secret .Name , err )
1237+ return secret , fmt .Errorf ("could not patch annotations for secret %q: %v" , secret .Name , err )
12271238 }
1228- c .Secrets [secret .UID ] = secret
12291239 }
12301240
1231- return nil
1241+ return secret , nil
12321242}
12331243
12341244func (c * Cluster ) rotatePasswordInSecret (
@@ -1334,6 +1344,23 @@ func (c *Cluster) rotatePasswordInSecret(
13341344 return updateSecretMsg , nil
13351345}
13361346
1347+ func (c * Cluster ) updatePgUser (secretUsername string , degraded bool ) {
1348+ for key , pgUser := range c .pgUsers {
1349+ if pgUser .Name == secretUsername {
1350+ pgUser .Degraded = degraded
1351+ c .pgUsers [key ] = pgUser
1352+ return
1353+ }
1354+ }
1355+ for key , pgUser := range c .systemUsers {
1356+ if pgUser .Name == secretUsername {
1357+ pgUser .Degraded = degraded
1358+ c .systemUsers [key ] = pgUser
1359+ return
1360+ }
1361+ }
1362+ }
1363+
13371364func (c * Cluster ) syncRoles () (err error ) {
13381365 c .setProcessName ("syncing roles" )
13391366
0 commit comments