@@ -247,7 +247,7 @@ func (r *S3UserReconciler) handleUpdate(
247247 err ,
248248 )
249249 }
250-
250+ ownedSecret := true
251251 userOwnedlinkedSecrets , err := r .getUserLinkedSecrets (ctx , userResource )
252252 if err != nil {
253253 logger .Error (
@@ -267,8 +267,27 @@ func (r *S3UserReconciler) handleUpdate(
267267 err ,
268268 )
269269 }
270+ userUnlinkedSecret , err := r .getUserUnlinkedSecret (ctx , userResource .Namespace , userResource .Spec .SecretName , userResource .Name )
271+ if err != nil {
272+ logger .Error (
273+ err ,
274+ "An error occurred while listing the user's secret" ,
275+ "userResourceName" ,
276+ userResource .Name ,
277+ "NamespacedName" ,
278+ req .NamespacedName .String (),
279+ )
280+ return r .SetReconciledCondition (
281+ ctx ,
282+ req ,
283+ userResource ,
284+ s3v1alpha1 .Unreachable ,
285+ "Impossible to list the user's secret" ,
286+ err ,
287+ )
288+ }
270289 currentUserSecret := corev1.Secret {}
271- if len (userOwnedlinkedSecrets ) == 0 {
290+ if len (userOwnedlinkedSecrets ) == 0 && userUnlinkedSecret == nil {
272291 logger .Info (
273292 "No Secret associated to user found, user will be deleted from the S3 backend, then recreated with a secret" ,
274293 "userResourceName" ,
@@ -298,6 +317,9 @@ func (r *S3UserReconciler) handleUpdate(
298317 )
299318 }
300319 return r .handleCreate (ctx , req , userResource )
320+ } else if userUnlinkedSecret != nil {
321+ currentUserSecret = * userUnlinkedSecret
322+ ownedSecret = false
301323 } else {
302324 foundSecret := false
303325 for _ , linkedsecret := range userOwnedlinkedSecrets {
@@ -473,31 +495,42 @@ func (r *S3UserReconciler) handleUpdate(
473495 }
474496
475497 if ! credentialsValid {
476- logger .Info (
477- "The secret containing the credentials will be deleted, and the user will be deleted from the S3 backend, then recreated (through another reconcile)" ,
478- "userResource" ,
479- userResource .Name ,
480- "NamespacedName" ,
481- req .NamespacedName .String (),
482- )
483- err = r .deleteSecret (ctx , & currentUserSecret )
484- if err != nil {
485- logger .Error (err , "Deletion of secret associated to user have failed" , "userResource" ,
486- userResource .Name ,
487- "userResourceName" ,
498+ if ownedSecret {
499+ logger .Info (
500+ "The secret containing the credentials will be deleted, and the user will be deleted from the S3 backend, then recreated (through another reconcile)" ,
501+ "userResource" ,
488502 userResource .Name ,
489503 "NamespacedName" ,
490- req .NamespacedName .String ())
491- return r .SetReconciledCondition (
492- ctx ,
493- req ,
494- userResource ,
495- s3v1alpha1 .Unreachable ,
496- "Deletion of secret associated to user have failed" ,
497- err ,
504+ req .NamespacedName .String (),
498505 )
506+ err = r .deleteSecret (ctx , & currentUserSecret )
507+ if err != nil {
508+ logger .Error (err , "Deletion of secret associated to user have failed" , "userResource" ,
509+ userResource .Name ,
510+ "userResourceName" ,
511+ userResource .Name ,
512+ "NamespacedName" ,
513+ req .NamespacedName .String ())
514+ return r .SetReconciledCondition (
515+ ctx ,
516+ req ,
517+ userResource ,
518+ s3v1alpha1 .Unreachable ,
519+ "Deletion of secret associated to user have failed" ,
520+ err ,
521+ )
499522
523+ }
524+ } else {
525+ logger .Info (
526+ "The user will be deleted from the S3 backend, then recreated (through another reconcile), the secret will be kept." ,
527+ "userResource" ,
528+ userResource .Name ,
529+ "NamespacedName" ,
530+ req .NamespacedName .String (),
531+ )
500532 }
533+
501534 err = s3Client .DeleteUser (userResource .Spec .AccessKey )
502535 if err != nil {
503536 logger .Error (err , "Could not delete user on S3 server" , "userResource" ,
@@ -751,15 +784,30 @@ func (r *S3UserReconciler) handleCreate(
751784 }
752785 }
753786
754- if r .OverrideExistingSecret {
755- // Case 3.2 : they are not valid, but the operator is configured to overwrite it
756- logger .Info (fmt .Sprintf ("A secret with the name %s already exists ; it will be overwritten because of operator configuration" , secret .Name ), "secretName" ,
757- secret .Name ,
758- "userResource" ,
759- userResource .Name ,
760- "NamespacedName" ,
787+ if r .OverrideExistingSecret || r .ReadExistingSecret {
788+ if r .ReadExistingSecret {
789+ // Case 3.2a : read existing secret instead of updating it
790+ logger .Info (fmt .Sprintf ("The secret key will be retrieved from the secret named %s." , secret .Name ), "secretName" ,
791+ secret .Name ,
792+ "userResource" ,
793+ userResource .Name ,
794+ "NamespacedName" ,
761795 req .NamespacedName .String ())
762-
796+ var cpData = * & existingK8sSecret .Data
797+ for k , v := range cpData {
798+ if k == userResource .Spec .SecretFieldNameSecretKey {
799+ secretKey = string (v )
800+ }
801+ }
802+ } else {
803+ // Case 3.2b : they are not valid, but the operator is configured to overwrite it
804+ logger .Info (fmt .Sprintf ("A secret with the name %s already exists ; it will be overwritten because of operator configuration" , secret .Name ), "secretName" ,
805+ secret .Name ,
806+ "userResource" ,
807+ userResource .Name ,
808+ "NamespacedName" ,
809+ req .NamespacedName .String ())
810+ }
763811 // Creating the user
764812 err = s3Client .CreateUser (userResource .Spec .AccessKey , secretKey )
765813 if err != nil {
@@ -780,32 +828,33 @@ func (r *S3UserReconciler) handleCreate(
780828 err ,
781829 )
782830 }
783-
784- // Updating the secret
785- logger .Info ("Updating the pre-existing secret with new credentials" ,
786- "secretName" ,
787- secret .Name ,
788- "userResource" ,
789- userResource .Name ,
790- "NamespacedName" ,
791- req .NamespacedName .String (),
792- )
793- err = r .Update (ctx , secret )
794- if err != nil {
795- logger .Error (err , "Could not update secret" , "secretName" ,
831+ if r .OverrideExistingSecret {
832+ // Updating the secret
833+ logger .Info ("Updating the pre-existing secret with new credentials" ,
834+ "secretName" ,
796835 secret .Name ,
797836 "userResource" ,
798837 userResource .Name ,
799838 "NamespacedName" ,
800- req .NamespacedName .String ())
801- return r .SetReconciledCondition (
802- ctx ,
803- req ,
804- userResource ,
805- s3v1alpha1 .Unreachable ,
806- "Update of secret have failed" ,
807- err ,
839+ req .NamespacedName .String (),
808840 )
841+ err = r .Update (ctx , secret )
842+ if err != nil {
843+ logger .Error (err , "Could not update secret" , "secretName" ,
844+ secret .Name ,
845+ "userResource" ,
846+ userResource .Name ,
847+ "NamespacedName" ,
848+ req .NamespacedName .String ())
849+ return r .SetReconciledCondition (
850+ ctx ,
851+ req ,
852+ userResource ,
853+ s3v1alpha1 .Unreachable ,
854+ "Update of secret have failed" ,
855+ err ,
856+ )
857+ }
809858 }
810859
811860 // Add policies
0 commit comments