Skip to content

Commit 108038c

Browse files
graindcafeDonatien26
authored andcommitted
Fix S3user update reconciliation with resource-owned secret: the secret was not deleted & recreated as needed
1 parent bb42ce3 commit 108038c

File tree

4 files changed

+22
-46
lines changed

4 files changed

+22
-46
lines changed

cmd/main.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@ func main() {
210210
Client: mgr.GetClient(),
211211
Scheme: mgr.GetScheme(),
212212
OverrideExistingSecret: overrideExistingSecret,
213-
ReadExistingSecret: readExistingSecret,
213+
ReadExistingSecret: readExistingSecret,
214214
ReconcilePeriod: reconcilePeriod,
215215
S3factory: s3Factory,
216216
ControllerHelper: controllerHelper,

internal/controller/user/finalizer.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ func (r *S3UserReconciler) handleDeletion(
7878
)
7979
}
8080

81-
userOwnedlinkedSecrets, err := r.getUserLinkedSecrets(ctx, userResource)
81+
userOwnedlinkedSecrets, _, err := r.getUserLinkedSecrets(ctx, userResource)
8282
if err != nil {
8383
logger.Error(
8484
err,

internal/controller/user/reconcile.go

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,7 @@ func (r *S3UserReconciler) handleUpdate(
248248
)
249249
}
250250
ownedSecret := true
251-
userOwnedlinkedSecrets, err := r.getUserLinkedSecrets(ctx, userResource)
251+
userOwnedlinkedSecrets, userUnlinkedSecret, err := r.getUserLinkedSecrets(ctx, userResource)
252252
if err != nil {
253253
logger.Error(
254254
err,
@@ -267,7 +267,6 @@ func (r *S3UserReconciler) handleUpdate(
267267
err,
268268
)
269269
}
270-
userUnlinkedSecret, err := r.getUserUnlinkedSecret(ctx, userResource.Namespace, userResource.Spec.SecretName, userResource.Name)
271270
if err != nil {
272271
logger.Error(
273272
err,
@@ -287,7 +286,7 @@ func (r *S3UserReconciler) handleUpdate(
287286
)
288287
}
289288
currentUserSecret := corev1.Secret{}
290-
if len(userOwnedlinkedSecrets) == 0 && userUnlinkedSecret == nil {
289+
if len(userOwnedlinkedSecrets) == 0 && userUnlinkedSecret == nil {
291290
logger.Info(
292291
"No Secret associated to user found, user will be deleted from the S3 backend, then recreated with a secret",
293292
"userResourceName",
@@ -792,7 +791,7 @@ func (r *S3UserReconciler) handleCreate(
792791
"userResource",
793792
userResource.Name,
794793
"NamespacedName",
795-
req.NamespacedName.String())
794+
req.NamespacedName.String())
796795
var cpData = *&existingK8sSecret.Data
797796
for k, v := range cpData {
798797
if k == userResource.Spec.SecretFieldNameSecretKey {
@@ -896,7 +895,7 @@ func (r *S3UserReconciler) handleCreate(
896895
req,
897896
userResource,
898897
s3v1alpha1.CreationFailure,
899-
"Creation of user on S3 instance has failed necause secret contains invalid credentials. The user's spec should be changed to target a different secret",
898+
"Creation of user on S3 instance has failed because secret contains invalid credentials. The user's spec should be changed to target a different secret",
900899
err,
901900
)
902901
}

internal/controller/user/utils.go

Lines changed: 16 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -65,76 +65,53 @@ func (r *S3UserReconciler) addPoliciesToUser(
6565
func (r *S3UserReconciler) getUserLinkedSecrets(
6666
ctx context.Context,
6767
userResource *s3v1alpha1.S3User,
68-
) ([]corev1.Secret, error) {
68+
) ([]corev1.Secret, *corev1.Secret, error) {
6969
logger := log.FromContext(ctx)
7070

7171
// Listing every secrets in the S3User's namespace, as a first step
7272
// to get the actual secret matching the S3User proper.
7373
// TODO : proper label matching ?
7474
secretsList := &corev1.SecretList{}
7575

76-
userSecretList := []corev1.Secret{}
76+
userOwnedSecretList := []corev1.Secret{}
7777

7878
err := r.List(ctx, secretsList, client.InNamespace(userResource.Namespace))
7979
if err != nil {
8080
logger.Error(err, "An error occurred while listing the secrets in user's namespace")
81-
return userSecretList, fmt.Errorf("SecretListingFailed")
81+
return userOwnedSecretList, nil, fmt.Errorf("SecretListingFailed")
8282
}
8383

8484
if len(secretsList.Items) == 0 {
8585
logger.Info("The user's namespace doesn't appear to contain any secret")
86-
return userSecretList, nil
86+
return userOwnedSecretList, nil, nil
8787
}
8888
// In all the secrets inside the S3User's namespace, one should have an owner reference
8989
// pointing to the S3User. For that specific secret, we check if its name matches the one from
9090
// the S3User, whether explicit (userResource.Spec.SecretName) or implicit (userResource.Name)
9191
// In case of mismatch, that secret is deleted (and will be recreated) ; if there is a match,
9292
// it will be used for state comparison.
93+
// We also check for secret not owned by the resource but with a name matching the configured
94+
// or default one. If such a secret is found it will be returned separately as it is to be
95+
// handled differently.
9396
uid := userResource.GetUID()
9497

98+
var secretConfiguredName string = userResource.Spec.SecretName
99+
var secretDefaultName string = userResource.Name
100+
var notOwnedConfiguredSecret *corev1.Secret
95101
// cmp.Or takes the first non "zero" value, see https://pkg.go.dev/cmp#Or
96102
for _, secret := range secretsList.Items {
97103
for _, ref := range secret.OwnerReferences {
98104
if ref.UID == uid {
99-
userSecretList = append(userSecretList, secret)
105+
userOwnedSecretList = append(userOwnedSecretList, secret)
106+
} else if secret.Name == secretConfiguredName {
107+
notOwnedConfiguredSecret = &secret
108+
} else if secret.Name == secretDefaultName && notOwnedConfiguredSecret == nil {
109+
notOwnedConfiguredSecret = &secret
100110
}
101111
}
102112
}
103113

104-
return userSecretList, nil
105-
}
106-
107-
108-
func (r *S3UserReconciler) getUserUnlinkedSecret(
109-
ctx context.Context,
110-
namespace string,
111-
secretNameA string,
112-
secretNameB string,
113-
) (*corev1.Secret, error) {
114-
logger := log.FromContext(ctx)
115-
// Listing every secrets in the S3User's namespace, as a first step
116-
// to get the actual secret matching the S3User proper.
117-
// TODO : proper label matching ?
118-
secretsList := &corev1.SecretList{}
119-
err := r.List(ctx, secretsList, client.InNamespace(namespace))
120-
if err != nil {
121-
logger.Error(err, "An error occurred while listing the secrets in user's namespace")
122-
return nil, fmt.Errorf("SecretListingFailed")
123-
}
124-
if len(secretsList.Items) == 0 {
125-
logger.Info("The user's namespace doesn't appear to contain any secret")
126-
return nil, nil
127-
}
128-
129-
var secretB *corev1.Secret
130-
for _, secret := range secretsList.Items {
131-
if secret.Name == secretNameA {
132-
return &secret, nil
133-
} else if secret.Name == secretNameB {
134-
secretB = &secret
135-
}
136-
}
137-
return secretB, nil
114+
return userOwnedSecretList, notOwnedConfiguredSecret, nil
138115
}
139116

140117
func (r *S3UserReconciler) deleteSecret(ctx context.Context, secret *corev1.Secret) error {

0 commit comments

Comments
 (0)