@@ -1382,42 +1382,110 @@ func (r *KeystoneAPIReconciler) ensureFernetKeys(
13821382
13831383 if err != nil && ! k8s_errors .IsNotFound (err ) {
13841384 return err
1385+ } else if k8s_errors .IsNotFound (err ) {
1386+ fernetKeys := map [string ]string {
1387+ "CredentialKeys0" : keystone .GenerateFernetKey (),
1388+ "CredentialKeys1" : keystone .GenerateFernetKey (),
1389+ }
1390+ var numberKeys int
1391+ fmt .Sscan (instance .Spec .FernetMaxActiveKeys , & numberKeys )
1392+ for i := 0 ; i < numberKeys ; i ++ {
1393+ fernetKeys [fmt .Sprintf ("FernetKeys%d" , i )] = keystone .GenerateFernetKey ()
1394+ }
1395+
1396+ tmpl := []util.Template {
1397+ {
1398+ Name : secretName ,
1399+ Namespace : instance .Namespace ,
1400+ Type : util .TemplateTypeNone ,
1401+ CustomData : fernetKeys ,
1402+ Labels : labels ,
1403+ },
1404+ }
1405+ err := oko_secret .EnsureSecrets (ctx , helper , instance , tmpl , envVars )
1406+ if err != nil {
1407+ return err
1408+ }
13851409 } else {
13861410 // add hash to envVars
13871411 (* envVars )[secret .Name ] = env .SetValue (hash )
1388- }
13891412
1390- fernetKeys := map [string ]string {
1391- "CredentialKeys0" : keystone .GenerateFernetKey (),
1392- "CredentialKeys1" : keystone .GenerateFernetKey (),
1393- }
1413+ var numberKeys int
1414+ fmt .Sscan (instance .Spec .FernetMaxActiveKeys , & numberKeys )
13941415
1395- var numberKeys int
1396- fmt .Sscan (instance .Spec .FernetMaxActiveKeys , & numberKeys )
1416+ changed_keys := false
13971417
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 ()
1418+ //
1419+ // Remove extra keys when FernetMaxActiveKeys changes
1420+ //
1421+ extra_key := fmt .Sprintf ("FernetKeys%d" , numberKeys )
1422+ for {
1423+ _ , exists := secret .Data [extra_key ]
1424+ if ! exists {
1425+ break
1426+ }
1427+ changed_keys = true
1428+ i := 1
1429+ for {
1430+ key := fmt .Sprintf ("FernetKeys%d" , i )
1431+ i += 1
1432+ next_key := fmt .Sprintf ("FernetKeys%d" , i )
1433+ _ , exists = secret .Data [next_key ]
1434+ if ! exists {
1435+ break
1436+ }
1437+ secret .Data [key ] = secret .Data [next_key ]
1438+ delete (secret .Data , next_key )
1439+ }
14051440 }
1406- }
14071441
1408- tmpl := []util.Template {
1409- {
1410- Name : secretName ,
1411- Namespace : instance .Namespace ,
1412- Type : util .TemplateTypeNone ,
1413- CustomData : fernetKeys ,
1414- Labels : labels ,
1415- },
1416- }
1442+ //
1443+ // Add extra keys when FernetMaxActiveKeys changes
1444+ //
1445+ last_key := fmt .Sprintf ("FernetKeys%d" , numberKeys - 1 )
1446+ for {
1447+ _ , exists := secret .Data [last_key ]
1448+ if exists {
1449+ break
1450+ }
1451+ changed_keys = true
1452+ i := 1
1453+ next_key_value := []byte (keystone .GenerateFernetKey ())
1454+ for {
1455+ key := fmt .Sprintf ("FernetKeys%d" , i )
1456+ i += 1
1457+ key_value , exists := secret .Data [key ]
1458+ secret .Data [key ] = next_key_value
1459+ next_key_value = key_value
1460+ if ! exists {
1461+ break
1462+ }
1463+ }
1464+ }
14171465
1418- err = oko_secret .EnsureSecrets (ctx , helper , instance , tmpl , envVars )
1419- if err != nil {
1420- return err
1466+ if ! changed_keys {
1467+ return nil
1468+ }
1469+
1470+ fernetKeys := make (map [string ]string , len (secret .Data ))
1471+ for k , v := range secret .Data {
1472+ fernetKeys [k ] = string (v [:])
1473+ }
1474+
1475+ tmpl := []util.Template {
1476+ {
1477+ Name : secretName ,
1478+ Namespace : instance .Namespace ,
1479+ Type : util .TemplateTypeNone ,
1480+ CustomData : fernetKeys ,
1481+ Labels : labels ,
1482+ },
1483+ }
1484+
1485+ err = oko_secret .EnsureSecrets (ctx , helper , instance , tmpl , envVars )
1486+ if err != nil {
1487+ return err
1488+ }
14211489 }
14221490
14231491 return nil
0 commit comments