diff --git a/application/src/main/java/run/halo/app/core/extension/reconciler/UserReconciler.java b/application/src/main/java/run/halo/app/core/extension/reconciler/UserReconciler.java index f54ad2ae8..5e540d85a 100644 --- a/application/src/main/java/run/halo/app/core/extension/reconciler/UserReconciler.java +++ b/application/src/main/java/run/halo/app/core/extension/reconciler/UserReconciler.java @@ -1,13 +1,15 @@ package run.halo.app.core.extension.reconciler; import java.util.HashSet; +import java.util.List; import java.util.Set; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.context.ApplicationEventPublisher; +import org.springframework.retry.support.RetryTemplate; import org.springframework.stereotype.Component; import run.halo.app.core.extension.User; +import run.halo.app.core.extension.UserConnection; import run.halo.app.extension.ExtensionClient; import run.halo.app.extension.controller.Controller; import run.halo.app.extension.controller.ControllerBuilder; @@ -23,8 +25,12 @@ import run.halo.app.infra.utils.PathUtils; public class UserReconciler implements Reconciler { private static final String FINALIZER_NAME = "user-protection"; private final ExtensionClient client; - private final ApplicationEventPublisher eventPublisher; private final ExternalUrlSupplier externalUrlSupplier; + private final RetryTemplate retryTemplate = RetryTemplate.builder() + .maxAttempts(20) + .fixedBackoff(300) + .retryOn(IllegalStateException.class) + .build(); @Override public Result reconcile(Request request) { @@ -85,6 +91,10 @@ public class UserReconciler implements Reconciler { private void cleanUpResourcesAndRemoveFinalizer(String userName) { client.fetch(User.class, userName).ifPresent(user -> { + // wait for dependent resources to be deleted + deleteUserConnections(userName); + + // remove finalizer if (user.getMetadata().getFinalizers() != null) { user.getMetadata().getFinalizers().remove(FINALIZER_NAME); } @@ -92,6 +102,22 @@ public class UserReconciler implements Reconciler { }); } + void deleteUserConnections(String userName) { + listConnectionsByUsername(userName).forEach(client::delete); + // wait for user connection to be deleted + retryTemplate.execute(callback -> { + if (listConnectionsByUsername(userName).size() > 0) { + throw new IllegalStateException("User connection is not deleted yet"); + } + return null; + }); + } + + List listConnectionsByUsername(String username) { + return client.list(UserConnection.class, + connection -> connection.getSpec().getUsername().equals(username), null); + } + @Override public Controller setupWith(ControllerBuilder builder) { return builder