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