Skip to content

Commit ccd36fa

Browse files
JackLemaitreLemaitre Jacques
andauthored
add secretName in spec to choose the secretName (#45)
* secretName s3User * testRate * gestion du secret * we are good need a bit of cleaning * suprresion log * reorganize log --------- Co-authored-by: Lemaitre Jacques <[email protected]>
1 parent 1cd93b5 commit ccd36fa

File tree

3 files changed

+69
-8
lines changed

3 files changed

+69
-8
lines changed

api/v1alpha1/s3user_types.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,10 @@ type S3UserSpec struct {
3333
// Policies associated to the S3User
3434
// +kubebuilder:validation:Optional
3535
Policies []string `json:"policies,omitempty"`
36+
37+
// SecretName associated to the S3User
38+
// +kubebuilder:validation:Optional
39+
SecretName string `json:"secretName"`
3640
}
3741

3842
// S3UserStatus defines the observed state of S3User

config/crd/bases/s3.onyxia.sh_s3users.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,9 @@ spec:
4343
items:
4444
type: string
4545
type: array
46+
secretName:
47+
description: SecretName associated to the S3User
48+
type: string
4649
required:
4750
- accessKey
4851
type: object

controllers/user_controller.go

Lines changed: 62 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
122130
func 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

Comments
 (0)