@@ -270,13 +270,29 @@ func TestUpdateSecret(t *testing.T) {
270
270
271
271
clusterName := "acid-test-cluster"
272
272
namespace := "default"
273
- username := "foo"
273
+ dbname := "app"
274
+ dbowner := "appowner"
274
275
secretTemplate := config .StringTemplate ("{username}.{cluster}.credentials" )
275
276
rotationUsers := make (spec.PgUserMap )
276
277
retentionUsers := make ([]string , 0 )
277
- yesterday := time .Now ().AddDate (0 , 0 , - 1 )
278
278
279
- // new cluster with pvc storage resize mode and configured labels
279
+ // define manifest users and enable rotation for dbowner
280
+ pg := acidv1.Postgresql {
281
+ ObjectMeta : metav1.ObjectMeta {
282
+ Name : clusterName ,
283
+ Namespace : namespace ,
284
+ },
285
+ Spec : acidv1.PostgresSpec {
286
+ Databases : map [string ]string {dbname : dbowner },
287
+ Users : map [string ]acidv1.UserFlags {"foo" : {}, dbowner : {}},
288
+ UsersWithInPlaceSecretRotation : []string {dbowner },
289
+ Volume : acidv1.Volume {
290
+ Size : "1Gi" ,
291
+ },
292
+ },
293
+ }
294
+
295
+ // new cluster with enabled password rotation
280
296
var cluster = New (
281
297
Config {
282
298
OpConfig : config.Config {
@@ -291,44 +307,61 @@ func TestUpdateSecret(t *testing.T) {
291
307
ClusterNameLabel : "cluster-name" ,
292
308
},
293
309
},
294
- }, client , acidv1. Postgresql {} , logger , eventRecorder )
310
+ }, client , pg , logger , eventRecorder )
295
311
296
312
cluster .Name = clusterName
297
313
cluster .Namespace = namespace
298
314
cluster .pgUsers = map [string ]spec.PgUser {}
299
- cluster .Spec .Users = map [string ]acidv1.UserFlags {username : {}}
300
315
cluster .initRobotUsers ()
301
316
302
- // create a secret for user foo
317
+ // create secrets
318
+ cluster .syncSecrets ()
319
+ // initialize rotation with current time
303
320
cluster .syncSecrets ()
304
321
305
- secret , err := cluster .KubeClient .Secrets (namespace ).Get (context .TODO (), secretTemplate .Format ("username" , username , "cluster" , clusterName ), metav1.GetOptions {})
306
- assert .NoError (t , err )
307
- generatedSecret := cluster .Secrets [secret .UID ]
322
+ dayAfterTomorrow := time .Now ().AddDate (0 , 0 , 2 )
308
323
309
- // now update the secret setting next rotation date (yesterday + interval)
310
- cluster .updateSecret (username , generatedSecret , & rotationUsers , & retentionUsers , yesterday )
311
- updatedSecret , err := cluster .KubeClient .Secrets (namespace ).Get (context .TODO (), secretTemplate .Format ("username" , username , "cluster" , clusterName ), metav1.GetOptions {})
312
- assert .NoError (t , err )
324
+ for username := range cluster .Spec .Users {
325
+ pgUser := cluster .pgUsers [username ]
313
326
314
- nextRotation := string (updatedSecret .Data ["nextRotation" ])
315
- _ , nextRotationDate := cluster .getNextRotationDate (yesterday )
316
- if nextRotation != nextRotationDate {
317
- t .Errorf ("%s: updated secret does not contain correct rotation date: expected %s, got %s" , testName , nextRotationDate , nextRotation )
318
- }
327
+ // first, get the secret
328
+ secret , err := cluster .KubeClient .Secrets (namespace ).Get (context .TODO (), secretTemplate .Format ("username" , username , "cluster" , clusterName ), metav1.GetOptions {})
329
+ assert .NoError (t , err )
330
+ secretPassword := string (secret .Data ["password" ])
319
331
320
- // update secret again but use current time to trigger rotation
321
- cluster .updateSecret (username , generatedSecret , & rotationUsers , & retentionUsers , time . Now () )
322
- updatedSecret , err = cluster .KubeClient .Secrets (namespace ).Get (context .TODO (), secretTemplate .Format ("username" , username , "cluster" , clusterName ), metav1.GetOptions {})
323
- assert .NoError (t , err )
332
+ // now update the secret setting a next rotation date (tomorrow + interval)
333
+ cluster .updateSecret (username , secret , & rotationUsers , & retentionUsers , dayAfterTomorrow )
334
+ updatedSecret , err : = cluster .KubeClient .Secrets (namespace ).Get (context .TODO (), secretTemplate .Format ("username" , username , "cluster" , clusterName ), metav1.GetOptions {})
335
+ assert .NoError (t , err )
324
336
325
- if len (rotationUsers ) != 1 && len (retentionUsers ) != 1 {
326
- t .Errorf ("%s: unexpected number of users to rotate - expected only foo, found %d" , testName , len (rotationUsers ))
327
- }
337
+ // check that passwords are different
338
+ rotatedPassword := string (updatedSecret .Data ["password" ])
339
+ if secretPassword == rotatedPassword {
340
+ t .Errorf ("%s: password unchanged in updated secret for %s" , testName , username )
341
+ }
328
342
329
- secretUsername := string (updatedSecret .Data ["username" ])
330
- rotatedUsername := username + time .Now ().Format ("060102" )
331
- if secretUsername != rotatedUsername {
332
- t .Errorf ("%s: updated secret does not contain correct username: expected %s, got %s" , testName , rotatedUsername , secretUsername )
343
+ // check that next rotation date is tomorrow + interval, not date in secret + interval
344
+ nextRotation := string (updatedSecret .Data ["nextRotation" ])
345
+ _ , nextRotationDate := cluster .getNextRotationDate (dayAfterTomorrow )
346
+ if nextRotation != nextRotationDate {
347
+ t .Errorf ("%s: updated secret of %s does not contain correct rotation date: expected %s, got %s" , testName , username , nextRotationDate , nextRotation )
348
+ }
349
+
350
+ // compare username, when it's dbowner they should be equal because of UsersWithInPlaceSecretRotation
351
+ secretUsername := string (updatedSecret .Data ["username" ])
352
+ if pgUser .IsDbOwner {
353
+ if secretUsername != username {
354
+ t .Errorf ("%s: username differs in updated secret: expected %s, got %s" , testName , username , secretUsername )
355
+ }
356
+ } else {
357
+ rotatedUsername := username + dayAfterTomorrow .Format ("060102" )
358
+ if secretUsername != rotatedUsername {
359
+ t .Errorf ("%s: updated secret does not contain correct username: expected %s, got %s" , testName , rotatedUsername , secretUsername )
360
+ }
361
+
362
+ if len (rotationUsers ) != 1 && len (retentionUsers ) != 1 {
363
+ t .Errorf ("%s: unexpected number of users to rotate - expected only %s, found %d" , testName , username , len (rotationUsers ))
364
+ }
365
+ }
333
366
}
334
367
}
0 commit comments