@@ -119,12 +119,25 @@ func (r *S3UserReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctr
119119 }
120120}
121121
122+ func deleteSecret (ctx context.Context , r * S3UserReconciler , secret corev1.Secret , logger logr.Logger ) {
123+ logger .Info ("the secret named " + secret .Name + " will be deleted" )
124+ err := r .Delete (ctx , & secret )
125+ if err != nil {
126+ logger .Error (err , "an error occurred while deleting a secret" )
127+ }
128+ }
129+
122130func handleReconcileS3User (ctx context.Context , err error , r * S3UserReconciler , userResource * s3v1alpha1.S3User , logger logr.Logger ) (reconcile.Result , error ) {
123- secret := & corev1.Secret {}
124- err = r .Get (ctx , types.NamespacedName {Name : userResource .Name , Namespace : userResource .Namespace }, secret )
125- if err != nil && errors .IsNotFound (err ) {
131+ //secret := &corev1.Secret{}
132+ secretsList := & corev1.SecretList {}
133+ uiid := userResource .GetUID ()
134+ secretNameFromUser := userResource .Spec .SecretName
135+
136+ err = r .List (ctx , secretsList , client .InNamespace (userResource .Namespace ), client.MatchingLabels {"app.kubernetes.io/created-by" : "s3-operator" }) // Use r.Client.List instead of r.List
137+
138+ if err != nil && (errors .IsNotFound (err ) || len (secretsList .Items ) == 0 ) {
126139 logger .Info ("Secret associated to user not found, user will be deleted and recreated" , "user" , userResource .Name )
127- err = r .S3Client .DeleteUser (userResource .Name )
140+ err = r .S3Client .DeleteUser (userResource .Spec . AccessKey )
128141 if err != nil {
129142 logger .Error (err , "Could not delete user on S3 server" , "user" , userResource .Name )
130143 return r .setS3UserStatusConditionAndUpdate (ctx , userResource , "OperatorFailed" , metav1 .ConditionFalse , "S3UserDeletionFailed" ,
@@ -137,14 +150,51 @@ func handleReconcileS3User(ctx context.Context, err error, r *S3UserReconciler,
137150 fmt .Sprintf ("Cannot locate k8s secrets [%s]" , userResource .Name ), err )
138151 }
139152
140- secretKeyValid , err := r .S3Client .CheckUserCredentialsValid (userResource .Name , userResource .Spec .AccessKey , string (secret .Data ["secretKey" ]))
153+ secretToTest := & corev1.Secret {}
154+ for _ , secret := range secretsList .Items {
155+ for _ , ref := range secret .OwnerReferences {
156+ if ref .UID == uiid {
157+ // i do have a spec.secretName i compar with the secret Name
158+ if secretNameFromUser != "" {
159+ if secret .Name != secretNameFromUser {
160+ deleteSecret (ctx , r , secret , logger )
161+ } else {
162+ logger .Info ("A secret named after the userResource.Spec.SecretName was found " + secret .Name )
163+ secretToTest = & secret
164+ }
165+ // else old case i dont have a spec.SecretName i compar with the s3user.name
166+ } else {
167+ if secret .Name != userResource .Name {
168+ deleteSecret (ctx , r , secret , logger )
169+ } else {
170+ logger .Info ("A secret named after the userResource.Spec.SecretName was found " + secret .Name )
171+ secretToTest = & secret
172+ }
173+ }
174+ }
175+
176+ }
177+ }
178+ if secretToTest .Name == "" {
179+ logger .Info ("Could not locate any secret " , "secret" , userResource .Name )
180+ logger .Info ("Secret associated to user not found, user will be deleted and recreated" , "user" , userResource .Name )
181+ err = r .S3Client .DeleteUser (userResource .Spec .AccessKey )
182+ if err != nil {
183+ logger .Error (err , "Could not delete user on S3 server" , "user" , userResource .Name )
184+ return r .setS3UserStatusConditionAndUpdate (ctx , userResource , "OperatorFailed" , metav1 .ConditionFalse , "S3UserDeletionFailed" ,
185+ fmt .Sprintf ("Deletion of S3user %s on S3 server has failed" , userResource .Name ), err )
186+ }
187+ return handleS3UserCreation (ctx , userResource , r )
188+ }
189+
190+ secretKeyValid , err := r .S3Client .CheckUserCredentialsValid (userResource .Name , userResource .Spec .AccessKey , string (secretToTest .Data ["secretKey" ]))
141191 if err != nil {
142192 logger .Error (err , "Something went wrong while checking user credential" )
143193 }
144194
145195 if ! secretKeyValid {
146196 logger .Info ("Secret for user is invalid" )
147- err = r .S3Client .DeleteUser (userResource .Name )
197+ err = r .S3Client .DeleteUser (userResource .Spec . AccessKey )
148198 if err != nil {
149199 logger .Error (err , "Could not delete user on S3 server" , "user" , userResource .Name )
150200 return r .setS3UserStatusConditionAndUpdate (ctx , userResource , "OperatorFailed" , metav1 .ConditionFalse , "S3UserDeletionFailed" ,
@@ -176,7 +226,7 @@ func handleReconcileS3User(ctx context.Context, err error, r *S3UserReconciler,
176226 if len (policyToDelete ) > 0 {
177227 r .S3Client .RemovePoliciesFromUser (userResource .Spec .AccessKey , policyToDelete )
178228 }
179-
229+
180230 if len (policyToAdd ) > 0 {
181231 r .S3Client .AddPoliciesToUser (userResource .Spec .AccessKey , policyToAdd )
182232 }
@@ -357,9 +407,13 @@ func (r *S3UserReconciler) newSecretForCR(ctx context.Context, userResource *s3v
357407 annotations [k ] = v
358408 }
359409
410+ secretName := userResource .Name
411+ if userResource .Spec .SecretName != "" {
412+ secretName = userResource .Spec .SecretName
413+ }
360414 secret := & corev1.Secret {
361415 ObjectMeta : metav1.ObjectMeta {
362- Name : userResource . Name ,
416+ Name : secretName ,
363417 Namespace : userResource .Namespace ,
364418 Labels : labels ,
365419 Annotations : annotations ,
0 commit comments