From 3c3bb416c2ec969c9386879c033a043fbf05c384 Mon Sep 17 00:00:00 2001
From: OZGCloud <ozgcloud@mgm-tp.com>
Date: Mon, 15 Apr 2024 12:26:13 +0200
Subject: [PATCH] OZG-5424 do not delete user if realm already deleted

---
 .../user/KeycloakUserPreconditionService.java |  6 +++-
 .../keycloak/user/KeycloakUserReconciler.java |  5 +++
 .../KeycloakUserPreconditionServiceTest.java  | 33 ++++++++++++++++++-
 .../user/KeycloakUserReconcilerTest.java      | 31 +++++++++++++++++
 4 files changed, 73 insertions(+), 2 deletions(-)

diff --git a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/user/KeycloakUserPreconditionService.java b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/user/KeycloakUserPreconditionService.java
index a2a19c6..4e92bd3 100644
--- a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/user/KeycloakUserPreconditionService.java
+++ b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/user/KeycloakUserPreconditionService.java
@@ -41,7 +41,7 @@ class KeycloakUserPreconditionService {
 	public Optional<String> getPreconditionErrors(OzgCloudKeycloakUser user) {
 		var namespace = user.getMetadata().getNamespace();
 
-		if (!keycloakGenericRemoteService.realmExists(namespace)) {
+		if (!realmExists(namespace)) {
 			return Optional.of(String.format("Realm %s does not yet exist", namespace));
 		}
 
@@ -58,6 +58,10 @@ class KeycloakUserPreconditionService {
 		return Optional.empty();
 	}
 
+	boolean realmExists(String realmName) {
+		return keycloakGenericRemoteService.realmExists(realmName);
+	}
+
 	Optional<String> clientsExists(OzgCloudKeycloakUser user, String realm) {
 		return user.getSpec().getKeycloakUser().getClientRoles().stream()
 				.map(KeycloakUserSpecClientRole::getClientId)
diff --git a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/user/KeycloakUserReconciler.java b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/user/KeycloakUserReconciler.java
index 6d157e2..108dbd6 100644
--- a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/user/KeycloakUserReconciler.java
+++ b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/user/KeycloakUserReconciler.java
@@ -88,6 +88,11 @@ public class KeycloakUserReconciler implements Reconciler<OzgCloudKeycloakUser>,
 			LOG.info("keep data");
 			return DeleteControl.defaultDelete();
 		}
+
+		if (!preconditionService.realmExists(user.getMetadata().getNamespace())) {
+			return DeleteControl.defaultDelete();
+		}
+
 		return deleteUser(user);
 	}
 
diff --git a/ozgcloud-keycloak-operator/src/test/java/de/ozgcloud/operator/keycloak/user/KeycloakUserPreconditionServiceTest.java b/ozgcloud-keycloak-operator/src/test/java/de/ozgcloud/operator/keycloak/user/KeycloakUserPreconditionServiceTest.java
index f8088d5..1800a5a 100644
--- a/ozgcloud-keycloak-operator/src/test/java/de/ozgcloud/operator/keycloak/user/KeycloakUserPreconditionServiceTest.java
+++ b/ozgcloud-keycloak-operator/src/test/java/de/ozgcloud/operator/keycloak/user/KeycloakUserPreconditionServiceTest.java
@@ -44,6 +44,8 @@ import de.ozgcloud.operator.keycloak.KeycloakGenericRemoteService;
 
 class KeycloakUserPreconditionServiceTest {
 
+	private String REALM = OzgCloudKeycloakUserTestFactory.METADATA_NAMESPACE;
+
 	@Spy
 	@InjectMocks
 	private KeycloakUserPreconditionService service;
@@ -70,9 +72,18 @@ class KeycloakUserPreconditionServiceTest {
 			verify(keycloakGenericRemoteService).realmExists(OzgCloudKeycloakUserTestFactory.METADATA_NAMESPACE);
 		}
 
+		@Test
+		void shouldReturnResponseFromRealmExists() {
+			when(service.realmExists(REALM)).thenReturn(true);
+
+			var response = service.getPreconditionErrors(OzgCloudKeycloakUserTestFactory.create());
+
+			assertThat(response).isPresent();
+		}
+
 		@Test
 		void shouldReturnErrorIfRealmNotExists() {
-			doReturn(false).when(keycloakGenericRemoteService).realmExists(anyString());
+			doReturn(false).when(service).realmExists(REALM);
 
 			var response = service.getPreconditionErrors(OzgCloudKeycloakUserTestFactory.create());
 
@@ -113,6 +124,26 @@ class KeycloakUserPreconditionServiceTest {
 		}
 	}
 
+	@Nested
+	class TestRealmExists {
+
+		@Test
+		void shouleCallRemoteService() {
+			service.realmExists(REALM);
+
+			verify(keycloakGenericRemoteService).realmExists(REALM);
+		}
+
+		@Test
+		void shouldReturnResponseFromRemoteService() {
+			when(keycloakGenericRemoteService.realmExists(REALM)).thenReturn(true);
+
+			var response = service.realmExists(REALM);
+
+			assertThat(response).isTrue();
+		}
+	}
+
 	@Nested
 	class TestClientExists {
 
diff --git a/ozgcloud-keycloak-operator/src/test/java/de/ozgcloud/operator/keycloak/user/KeycloakUserReconcilerTest.java b/ozgcloud-keycloak-operator/src/test/java/de/ozgcloud/operator/keycloak/user/KeycloakUserReconcilerTest.java
index b96bcf8..311a2e8 100644
--- a/ozgcloud-keycloak-operator/src/test/java/de/ozgcloud/operator/keycloak/user/KeycloakUserReconcilerTest.java
+++ b/ozgcloud-keycloak-operator/src/test/java/de/ozgcloud/operator/keycloak/user/KeycloakUserReconcilerTest.java
@@ -45,6 +45,8 @@ import io.javaoperatorsdk.operator.api.reconciler.DeleteControl;
 
 class KeycloakUserReconcilerTest {
 
+	private final String REALM = OzgCloudKeycloakUserTestFactory.METADATA_NAMESPACE;
+
 	@Spy
 	@InjectMocks
 	private KeycloakUserReconciler reconciler;
@@ -134,6 +136,8 @@ class KeycloakUserReconcilerTest {
 
 			@Test
 			void shouldCallDeleteUser() {
+				when(preconditionService.realmExists(REALM)).thenReturn(true);
+
 				reconciler.cleanup(user, null);
 
 				verify(reconciler).deleteUser(user);
@@ -143,11 +147,37 @@ class KeycloakUserReconcilerTest {
 			void shouldReturnValueFromDeleteUser() {
 				DeleteControl expected = DeleteControl.defaultDelete();
 				when(reconciler.deleteUser(user)).thenReturn(expected);
+				when(preconditionService.realmExists(REALM)).thenReturn(true);
 
 				DeleteControl response = reconciler.cleanup(user, null);
 
 				assertThat(response).isEqualTo(expected);
 			}
+
+			@Test
+			void shouldCallRealmExists() {
+				reconciler.cleanup(user, null);
+
+				verify(preconditionService).realmExists(REALM);
+			}
+
+			@Test
+			void shouldDeleteUserIfRealmExists() {
+				when(preconditionService.realmExists(REALM)).thenReturn(true);
+
+				reconciler.cleanup(user, null);
+
+				verify(reconciler).deleteUser(user);
+			}
+
+			@Test
+			void shouldNotDeleteUserIfRealmNotExists() {
+				when(preconditionService.realmExists(REALM)).thenReturn(false);
+
+				reconciler.cleanup(user, null);
+
+				verify(reconciler, never()).deleteUser(user);
+			}
 		}
 
 		@DisplayName("test delete")
@@ -172,6 +202,7 @@ class KeycloakUserReconcilerTest {
 
 			@Test
 			void shouldRescheduleOnError() {
+				when(preconditionService.realmExists(REALM)).thenReturn(true);
 				doThrow(RuntimeException.class).when(service)
 						.deleteUser(user.getSpec(), OzgCloudKeycloakRealmTestFactory.METADATA_NAMESPACE);
 
-- 
GitLab