From 75d74b92a88faa5d7c99d56d4799ee1e679d396c Mon Sep 17 00:00:00 2001 From: OZGCloud <ozgcloud@mgm-tp.com> Date: Wed, 6 Sep 2023 09:39:17 +0200 Subject: [PATCH] OZG-3961 consider keepAfterDelete on user resource --- .../realm/KeycloakRealmReconciler.java | 4 +- .../keycloak/user/KeycloakUserReconciler.java | 21 +++++--- .../user/KeycloakUserReconcilerTest.java | 51 ++++++++++++++----- .../user/OzgKeycloakUserTestFactory.java | 13 +++-- 4 files changed, 63 insertions(+), 26 deletions(-) diff --git a/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmReconciler.java b/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmReconciler.java index 4dc6903..f565154 100644 --- a/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmReconciler.java +++ b/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmReconciler.java @@ -71,7 +71,7 @@ public class KeycloakRealmReconciler implements Reconciler<OzgKeycloakRealm>, Cl @Override public DeleteControl cleanup(OzgKeycloakRealm realm, Context<OzgKeycloakRealm> context) { - log.info("Realm reconciler, keep after delete is set to: " + realm.getSpec().isKeepAfterDelete()); + log.info("Realm reconciler cleanup, keep after delete is set to: " + realm.getSpec().isKeepAfterDelete()); if (realm.getSpec().isKeepAfterDelete()) { return DeleteControl.defaultDelete(); } @@ -80,8 +80,8 @@ public class KeycloakRealmReconciler implements Reconciler<OzgKeycloakRealm>, Cl DeleteControl cleanup(OzgKeycloakRealm realm) { var realmName = realm.getMetadata().getNamespace(); + log.info("Deleting KeycloakRealm " + realmName); try { - log.info("Deleting KeycloakRealm " + realmName); service.deleteRealm(realmName); return DeleteControl.defaultDelete(); } catch (Exception e) { diff --git a/src/main/java/de/ozgcloud/operator/keycloak/user/KeycloakUserReconciler.java b/src/main/java/de/ozgcloud/operator/keycloak/user/KeycloakUserReconciler.java index 2647a00..dd63f8a 100644 --- a/src/main/java/de/ozgcloud/operator/keycloak/user/KeycloakUserReconciler.java +++ b/src/main/java/de/ozgcloud/operator/keycloak/user/KeycloakUserReconciler.java @@ -44,7 +44,7 @@ import lombok.extern.java.Log; public class KeycloakUserReconciler implements Reconciler<OzgKeycloakUser>, Cleaner<OzgKeycloakUser> { @Autowired - private KeycloakUserService keycloakUserService; + private KeycloakUserService service; @Autowired private KeycloakUserPreconditionService preconditionService; @@ -69,7 +69,7 @@ public class KeycloakUserReconciler implements Reconciler<OzgKeycloakUser>, Clea .build(); } - keycloakUserService.createOrUpdateUser(resource.getSpec(), namespace); + service.createOrUpdateUser(resource.getSpec(), namespace); return UserUpdateControlBuilder.fromResource(resource).withStatus(OzgCustomResourceStatus.OK).build(); @@ -87,15 +87,20 @@ public class KeycloakUserReconciler implements Reconciler<OzgKeycloakUser>, Clea } @Override - public DeleteControl cleanup(OzgKeycloakUser resource, Context<OzgKeycloakUser> context) { - var userName = resource.getMetadata().getName(); - var namespace = resource.getMetadata().getNamespace(); + public DeleteControl cleanup(OzgKeycloakUser user, Context<OzgKeycloakUser> context) { + log.info("User reconciler cleanup, keep after delete is set to: " + user.getSpec().isKeepAfterDelete()); + if (user.getSpec().isKeepAfterDelete()) { + return DeleteControl.defaultDelete(); + } + return cleanup(user); + } + DeleteControl cleanup(OzgKeycloakUser user) { + var userName = user.getMetadata().getName(); + var namespace = user.getMetadata().getNamespace(); log.info(String.format("Deleting KeycloakUser %s", userName)); - try { - keycloakUserService.deleteUser(resource.getSpec(), namespace); - + service.deleteUser(user.getSpec(), namespace); return DeleteControl.defaultDelete(); } catch (Exception e) { log.log(Level.SEVERE, String.format("Could not delete user %s in namespace %s", userName, namespace), e); diff --git a/src/test/java/de/ozgcloud/operator/keycloak/user/KeycloakUserReconcilerTest.java b/src/test/java/de/ozgcloud/operator/keycloak/user/KeycloakUserReconcilerTest.java index 08e00e7..349a10e 100644 --- a/src/test/java/de/ozgcloud/operator/keycloak/user/KeycloakUserReconcilerTest.java +++ b/src/test/java/de/ozgcloud/operator/keycloak/user/KeycloakUserReconcilerTest.java @@ -31,6 +31,7 @@ import java.util.Optional; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; @@ -38,15 +39,16 @@ import org.mockito.Mock; import org.mockito.Spy; import de.ozgcloud.operator.keycloak.OzgCustomResourceStatus; +import io.javaoperatorsdk.operator.api.reconciler.DeleteControl; class KeycloakUserReconcilerTest { @Spy @InjectMocks - private KeycloakUserReconciler conciler; + private KeycloakUserReconciler reconciler; @Mock - private KeycloakUserService userService; + private KeycloakUserService service; @Mock private KeycloakUserPreconditionService preconditionService; @@ -63,16 +65,16 @@ class KeycloakUserReconcilerTest { void shouldCallServiceAddUser() { OzgKeycloakUser user = OzgKeycloakUserTestFactory.create(); - conciler.reconcile(user, null); + reconciler.reconcile(user, null); - verify(userService).createOrUpdateUser(user.getSpec(), OzgKeycloakUserTestFactory.METADATA_NAMESPACE); + verify(service).createOrUpdateUser(user.getSpec(), OzgKeycloakUserTestFactory.METADATA_NAMESPACE); } @Test void shouldUpdateStatus() { OzgKeycloakUser user = OzgKeycloakUserTestFactory.create(); - conciler.reconcile(user, null); + reconciler.reconcile(user, null); assertThat(user.getStatus().getStatus()).isEqualTo(OzgCustomResourceStatus.OK); } @@ -87,7 +89,7 @@ class KeycloakUserReconcilerTest { when(preconditionService.getPreconditionErrors(any())).thenReturn(Optional.of(ERROR_MESSAGE)); OzgKeycloakUser user = OzgKeycloakUserTestFactory.create(); - conciler.reconcile(user, null); + reconciler.reconcile(user, null); assertThat(user.getStatus().getMessage()).isEqualTo(ERROR_MESSAGE); } @@ -101,24 +103,47 @@ class KeycloakUserReconcilerTest { @Test void shouldSetErrorStatusOnException() { OzgKeycloakUser user = OzgKeycloakUserTestFactory.create(); - doThrow(new RuntimeException()).when(userService).createOrUpdateUser(any(), any()); + doThrow(new RuntimeException()).when(service).createOrUpdateUser(any(), any()); - conciler.reconcile(user, null); + reconciler.reconcile(user, null); assertThat(user.getStatus().getStatus()).isEqualTo(OzgCustomResourceStatus.ERROR); } } + @DisplayName("Cleanup") @Nested - class TestDeleteUser { + class TestCleanup { + + @DisplayName("with keep_after_delete") + @Nested + class TestWithKeepAfterDelete { + + private final OzgKeycloakUserSpec userSpec = OzgKeycloakUserSpecTestFactory.createBuilder().keepAfterDelete(true).build(); + private final OzgKeycloakUser user = OzgKeycloakUserTestFactory.create(userSpec); + + @Test + void shouldNotCallService() { + reconciler.cleanup(user, null); + + verify(service, never()).deleteUser(userSpec, OzgKeycloakUserTestFactory.METADATA_NAMESPACE); + } + + @Test + void shouldReturnDeleteControl() { + var control = reconciler.cleanup(user, null); + + assertThat(control).usingRecursiveComparison().isEqualTo(DeleteControl.defaultDelete()); + } + } @Test - void shouldCallServiceDeleteUser() { - OzgKeycloakUser user = OzgKeycloakUserTestFactory.create(); + void shouldCallServiceDelete() { + var user = OzgKeycloakUserTestFactory.create(); - conciler.cleanup(user, null); + reconciler.cleanup(user); - verify(userService).deleteUser(user.getSpec(), OzgKeycloakUserTestFactory.METADATA_NAMESPACE); + verify(service).deleteUser(user.getSpec(), OzgKeycloakUserTestFactory.METADATA_NAMESPACE); } } } diff --git a/src/test/java/de/ozgcloud/operator/keycloak/user/OzgKeycloakUserTestFactory.java b/src/test/java/de/ozgcloud/operator/keycloak/user/OzgKeycloakUserTestFactory.java index 32cdc69..79677c8 100644 --- a/src/test/java/de/ozgcloud/operator/keycloak/user/OzgKeycloakUserTestFactory.java +++ b/src/test/java/de/ozgcloud/operator/keycloak/user/OzgKeycloakUserTestFactory.java @@ -28,12 +28,19 @@ class OzgKeycloakUserTestFactory { public static final String METADATA_NAMESPACE = "TestNamespace"; public static OzgKeycloakUser create() { + return createWithSpec(OzgKeycloakUserSpecTestFactory.create()); + } + + public static OzgKeycloakUser create(OzgKeycloakUserSpec spec) { + return createWithSpec(spec); + } + + private static OzgKeycloakUser createWithSpec(OzgKeycloakUserSpec spec) { var keycloakUser = new OzgKeycloakUser(); + keycloakUser.setSpec(spec); keycloakUser.setStatus(OzgKeycloakUserStatusTestFactory.create()); - keycloakUser.setSpec(OzgKeycloakUserSpecTestFactory.create()); keycloakUser.getMetadata().setNamespace(METADATA_NAMESPACE); return keycloakUser; } - -} +} \ No newline at end of file -- GitLab