@@ -1378,46 +1378,117 @@ func (r *KeystoneAPIReconciler) ensureFernetKeys(
13781378 // check if secret already exist
13791379 //
13801380 secretName := keystone .ServiceName
1381+
1382+ var numberKeys int
1383+ _ , err := fmt .Sscan (instance .Spec .FernetMaxActiveKeys , & numberKeys )
1384+ if err != nil {
1385+ return err
1386+ }
1387+
13811388 secret , hash , err := oko_secret .GetSecret (ctx , helper , secretName , instance .Namespace )
13821389
13831390 if err != nil && ! k8s_errors .IsNotFound (err ) {
13841391 return err
1392+ } else if k8s_errors .IsNotFound (err ) {
1393+ fernetKeys := map [string ]string {
1394+ "CredentialKeys0" : keystone .GenerateFernetKey (),
1395+ "CredentialKeys1" : keystone .GenerateFernetKey (),
1396+ }
1397+
1398+ for i := 0 ; i < numberKeys ; i ++ {
1399+ fernetKeys [fmt .Sprintf ("FernetKeys%d" , i )] = keystone .GenerateFernetKey ()
1400+ }
1401+
1402+ tmpl := []util.Template {
1403+ {
1404+ Name : secretName ,
1405+ Namespace : instance .Namespace ,
1406+ Type : util .TemplateTypeNone ,
1407+ CustomData : fernetKeys ,
1408+ Labels : labels ,
1409+ },
1410+ }
1411+ err := oko_secret .EnsureSecrets (ctx , helper , instance , tmpl , envVars )
1412+ if err != nil {
1413+ return err
1414+ }
13851415 } else {
13861416 // add hash to envVars
13871417 (* envVars )[secret .Name ] = env .SetValue (hash )
1388- }
13891418
1390- fernetKeys := map [string ]string {
1391- "CredentialKeys0" : keystone .GenerateFernetKey (),
1392- "CredentialKeys1" : keystone .GenerateFernetKey (),
1393- }
1419+ changedKeys := false
13941420
1395- var numberKeys int
1396- fmt .Sscan (instance .Spec .FernetMaxActiveKeys , & numberKeys )
1421+ //
1422+ // Remove extra keys when FernetMaxActiveKeys changes
1423+ //
1424+ extraKey := fmt .Sprintf ("FernetKeys%d" , numberKeys )
1425+ for {
1426+ _ , exists := secret .Data [extraKey ]
1427+ if ! exists {
1428+ break
1429+ }
1430+ changedKeys = true
1431+ i := 1
1432+ for {
1433+ key := fmt .Sprintf ("FernetKeys%d" , i )
1434+ i ++
1435+ nextKey := fmt .Sprintf ("FernetKeys%d" , i )
1436+ _ , exists = secret .Data [nextKey ]
1437+ if ! exists {
1438+ break
1439+ }
1440+ secret .Data [key ] = secret .Data [nextKey ]
1441+ delete (secret .Data , nextKey )
1442+ }
1443+ }
13971444
1398- for i := 0 ; i < numberKeys ; i ++ {
1399- key := fmt .Sprintf ("FernetKeys%d" , i )
1400- v , exists := secret .Data [key ]
1401- if exists {
1402- fernetKeys [key ] = string (v [:])
1403- } else {
1404- fernetKeys [key ] = keystone .GenerateFernetKey ()
1445+ //
1446+ // Add extra keys when FernetMaxActiveKeys changes
1447+ //
1448+ lastKey := fmt .Sprintf ("FernetKeys%d" , numberKeys - 1 )
1449+ for {
1450+ _ , exists := secret .Data [lastKey ]
1451+ if exists {
1452+ break
1453+ }
1454+ changedKeys = true
1455+ i := 1
1456+ nextKeyValue := []byte (keystone .GenerateFernetKey ())
1457+ for {
1458+ key := fmt .Sprintf ("FernetKeys%d" , i )
1459+ i ++
1460+ keyValue , exists := secret .Data [key ]
1461+ secret .Data [key ] = nextKeyValue
1462+ nextKeyValue = keyValue
1463+ if ! exists {
1464+ break
1465+ }
1466+ }
14051467 }
1406- }
14071468
1408- tmpl := []util.Template {
1409- {
1410- Name : secretName ,
1411- Namespace : instance .Namespace ,
1412- Type : util .TemplateTypeNone ,
1413- CustomData : fernetKeys ,
1414- Labels : labels ,
1415- },
1416- }
1469+ if ! changedKeys {
1470+ return nil
1471+ }
14171472
1418- err = oko_secret .EnsureSecrets (ctx , helper , instance , tmpl , envVars )
1419- if err != nil {
1420- return err
1473+ fernetKeys := make (map [string ]string , len (secret .Data ))
1474+ for k , v := range secret .Data {
1475+ fernetKeys [k ] = string (v [:])
1476+ }
1477+
1478+ tmpl := []util.Template {
1479+ {
1480+ Name : secretName ,
1481+ Namespace : instance .Namespace ,
1482+ Type : util .TemplateTypeNone ,
1483+ CustomData : fernetKeys ,
1484+ Labels : labels ,
1485+ },
1486+ }
1487+
1488+ err = oko_secret .EnsureSecrets (ctx , helper , instance , tmpl , envVars )
1489+ if err != nil {
1490+ return err
1491+ }
14211492 }
14221493
14231494 return nil
0 commit comments