Merge pull request #16235 from rook/mergify/bp/release-1.18/pr-16052

object: simplify CephObjectStoreUser deletion logic (backport #16052)
This commit is contained in:
Travis Nielsen authored and GitHub committed 2025-08-04 15:58:10 -06:00
commit db3c5b6cdb
2 files changed
+47 -70

No files matched your search

+17 -15
View File
@@ -311,21 +311,6 @@ func (r *ReconcileObjectStoreUser) reconcile(request reconcile.Request) (reconci
return opcontroller.WaitForRequeueIfCephClusterNotReady, *cephObjectStoreUser, err
}
// Generate user config
userConfig := generateUserConfig(cephObjectStoreUser)
referencedSecrets := &map[types.UID]*corev1.Secret{}
// Set any provided key pair(s)
if cephObjectStoreUser.GetDeletionTimestamp().IsZero() && len(cephObjectStoreUser.Spec.Keys) > 0 {
var keys *[]admin.UserKeySpec
keys, referencedSecrets, err = r.generateUserKeySpec(cephObjectStoreUser)
if err != nil {
return reconcile.Result{}, *cephObjectStoreUser, errors.Wrapf(err, "failed to generate UserKeySpec for %q", cephObjectStoreUser.Name)
}
userConfig.Keys = *keys
}
// DELETE: the CR was deleted
if !cephObjectStoreUser.GetDeletionTimestamp().IsZero() {
logger.Debugf("deleting object store user %q", request.NamespacedName)
@@ -347,6 +332,23 @@ func (r *ReconcileObjectStoreUser) reconcile(request reconcile.Request) (reconci
return reconcile.Result{}, *cephObjectStoreUser, nil
}
// CR is not deleted, continue reconciling
// Generate user config
userConfig := generateUserConfig(cephObjectStoreUser)
referencedSecrets := &map[types.UID]*corev1.Secret{}
// Set any provided key pair(s)
if len(cephObjectStoreUser.Spec.Keys) > 0 {
var keys *[]admin.UserKeySpec
keys, referencedSecrets, err = r.generateUserKeySpec(cephObjectStoreUser)
if err != nil {
return reconcile.Result{}, *cephObjectStoreUser, errors.Wrapf(err, "failed to generate UserKeySpec for %q", cephObjectStoreUser.Name)
}
userConfig.Keys = *keys
}
// validate the user settings
err = r.validateUser(cephObjectStoreUser)
if err != nil {
@@ -649,21 +649,17 @@ func TestObjectStoreUserKeys(t *testing.T, k8sh *utils.K8sHelper, installer *ins
require.True(t, osuReady)
})
// recreate secret to allow CephObjectStoreUser to reconcile so it can be deleted
t.Run(fmt.Sprintf("create secret %q", secret1.Name), func(t *testing.T) {
_, err := k8sh.Clientset.CoreV1().Secrets(ns.Name).Create(ctx, secret1, metav1.CreateOptions{})
require.NoError(t, err)
})
t.Run("missing referenced secret should not block CephObjectStoreUser deletion", func(t *testing.T) {
t.Run(fmt.Sprintf("delete CephObjectStoreUser %q", osu1.Name), func(t *testing.T) {
err := k8sh.RookClientset.CephV1().CephObjectStoreUsers(ns.Name).Delete(ctx, osu1.Name, metav1.DeleteOptions{})
require.NoError(t, err)
t.Run(fmt.Sprintf("delete CephObjectStoreUser %q", osu1.Name), func(t *testing.T) {
err := k8sh.RookClientset.CephV1().CephObjectStoreUsers(ns.Name).Delete(ctx, osu1.Name, metav1.DeleteOptions{})
require.NoError(t, err)
absent := utils.Retry(40, time.Second, "CephObjectStoreUser is absent", func() bool {
_, err := k8sh.RookClientset.CephV1().CephObjectStoreUsers(ns.Name).Get(ctx, osu1.Name, metav1.GetOptions{})
return err != nil
absent := utils.Retry(40, time.Second, "CephObjectStoreUser is absent", func() bool {
_, err := k8sh.RookClientset.CephV1().CephObjectStoreUsers(ns.Name).Get(ctx, osu1.Name, metav1.GetOptions{})
return err != nil
})
assert.True(t, absent)
})
assert.True(t, absent)
})
t.Run(fmt.Sprintf("no CephObjectStoreUsers in ns %q", ns.Name), func(t *testing.T) {
@@ -678,51 +674,30 @@ func TestObjectStoreUserKeys(t *testing.T, k8sh *utils.K8sHelper, installer *ins
require.ErrorIs(t, err, admin.ErrNoSuchUser)
})
// CephObjectStoreUser removal did not delete any secret resources
t.Run(fmt.Sprintf("secret %q still exists", secret2.Name), func(t *testing.T) {
_, err := k8sh.Clientset.CoreV1().Secrets(ns.Name).Get(ctx, secret2.Name, metav1.GetOptions{})
require.NoError(t, err)
})
// check that CephObjectStoreUser removal did not delete any secret resources
t.Run(fmt.Sprintf("secret %q still exists", secret3.Name), func(t *testing.T) {
_, err := k8sh.Clientset.CoreV1().Secrets(ns.Name).Get(ctx, secret3.Name, metav1.GetOptions{})
require.NoError(t, err)
})
{
secrets := []*corev1.Secret{
// secret1 was deleted in a previous step
secret2,
secret3,
secret4,
secret5,
}
t.Run(fmt.Sprintf("secret %q still exists", secret4.Name), func(t *testing.T) {
_, err := k8sh.Clientset.CoreV1().Secrets(ns.Name).Get(ctx, secret4.Name, metav1.GetOptions{})
require.NoError(t, err)
})
for _, secret := range secrets {
t.Run(fmt.Sprintf("secret %q still exists", secret.Name), func(t *testing.T) {
_, err := k8sh.Clientset.CoreV1().Secrets(secret.Namespace).Get(ctx, secret.Name, metav1.GetOptions{})
require.NoError(t, err)
})
t.Run(fmt.Sprintf("secret %q still exists", secret5.Name), func(t *testing.T) {
_, err := k8sh.Clientset.CoreV1().Secrets(ns.Name).Get(ctx, secret5.Name, metav1.GetOptions{})
require.NoError(t, err)
})
t.Run(fmt.Sprintf("delete secret %q", secret5.Name), func(t *testing.T) {
err := k8sh.Clientset.CoreV1().Secrets(ns.Name).Delete(ctx, secret5.Name, metav1.DeleteOptions{})
require.NoError(t, err)
})
t.Run(fmt.Sprintf("delete secret %q", secret4.Name), func(t *testing.T) {
err := k8sh.Clientset.CoreV1().Secrets(ns.Name).Delete(ctx, secret4.Name, metav1.DeleteOptions{})
require.NoError(t, err)
})
t.Run(fmt.Sprintf("delete secret %q", secret3.Name), func(t *testing.T) {
err := k8sh.Clientset.CoreV1().Secrets(ns.Name).Delete(ctx, secret3.Name, metav1.DeleteOptions{})
require.NoError(t, err)
})
t.Run(fmt.Sprintf("delete secret %q", secret2.Name), func(t *testing.T) {
err := k8sh.Clientset.CoreV1().Secrets(ns.Name).Delete(ctx, secret2.Name, metav1.DeleteOptions{})
require.NoError(t, err)
})
t.Run(fmt.Sprintf("delete secret %q", secret1.Name), func(t *testing.T) {
err := k8sh.Clientset.CoreV1().Secrets(ns.Name).Delete(ctx, secret1.Name, metav1.DeleteOptions{})
require.NoError(t, err)
})
// cleanup the secrets created for the test
t.Run(fmt.Sprintf("delete secret %q", secret.Name), func(t *testing.T) {
err := k8sh.Clientset.CoreV1().Secrets(secret.Namespace).Delete(ctx, secret.Name, metav1.DeleteOptions{})
require.NoError(t, err)
})
}
}
t.Run(fmt.Sprintf("no secrets in ns %q", ns.Name), func(t *testing.T) {
secrets, err := k8sh.Clientset.CoreV1().Secrets(ns.Name).List(ctx, metav1.ListOptions{})