From b642f02ee69d1f80e83825d1e13e7778b74fdfa4 Mon Sep 17 00:00:00 2001
From: OZGCloud <ozgcloud@mgm-tp.com>
Date: Tue, 27 Jun 2023 17:12:19 +0200
Subject: [PATCH] OZG-3961 - add delete realm cleaner

---
 .../realm/KeycloakRealmReconciler.java        | 25 ++++++++--
 .../realm/KeycloakRealmRemoteService.java     |  4 ++
 .../keycloak/realm/KeycloakRealmService.java  |  4 ++
 .../keycloak/user/KeycloakUserReconciler.java |  5 +-
 .../realm/KeycloakRealmReconcilerTest.java    | 46 +++++++++++++------
 .../realm/KeycloakRealmRemoteServiceTest.java | 16 +++++++
 .../realm/KeycloakRealmServiceTest.java       | 11 +++++
 7 files changed, 91 insertions(+), 20 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 7cf22057..a576ebaa 100644
--- a/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmReconciler.java
+++ b/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmReconciler.java
@@ -26,9 +26,12 @@ public class KeycloakRealmReconciler implements Reconciler<OzgKeycloakRealm>, Cl
 	public UpdateControl<OzgKeycloakRealm> reconcile(OzgKeycloakRealm resource, Context<OzgKeycloakRealm> context) {
 
 		try {
-			log.info("Create KeycloakRealm " + resource.getMetadata().getName());
 
-			service.createRealm(resource.getSpec(), resource.getMetadata().getNamespace());
+			String realmName = resource.getMetadata().getNamespace();
+
+			log.info("Create KeycloakRealm " + realmName + " (crd name " + resource.getMetadata().getName() + ")");
+
+			service.createRealm(resource.getSpec(), realmName);
 
 			resource.setStatus(OzgKeycloakRealmStatus.builder().status(OzgCustomResourceStatus.OK).errorMessage(null).build());
 			return UpdateControl.updateStatus(resource);
@@ -43,7 +46,21 @@ public class KeycloakRealmReconciler implements Reconciler<OzgKeycloakRealm>, Cl
 
 	@Override
 	public DeleteControl cleanup(OzgKeycloakRealm resource, Context<OzgKeycloakRealm> context) {
-		// TODO Auto-generated method stub
-		return null;
+
+		String realmName = resource.getMetadata().getNamespace();
+
+		try {
+
+			log.info("Deleting KeycloakRealm " + realmName);
+
+			service.deleteRealm(realmName);
+
+			return DeleteControl.defaultDelete();
+		} catch (Exception e) {
+			log.log(Level.SEVERE, "Could not delete KeycloakRealm " + realmName, e);
+			resource.setStatus(OzgKeycloakRealmStatus.builder().status(OzgCustomResourceStatus.ERROR).errorMessage(e.getMessage()).build());
+			UpdateControl.updateStatus(resource);
+			return DeleteControl.noFinalizerRemoval();
+		}
 	}
 }
diff --git a/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmRemoteService.java b/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmRemoteService.java
index 24c8fe6e..6c9f12a9 100644
--- a/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmRemoteService.java
+++ b/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmRemoteService.java
@@ -21,4 +21,8 @@ class KeycloakRealmRemoteService {
 		return keycloakClient.getKeycloak().realms().findAll().stream()
 				.anyMatch(realmExisting -> realmExisting.getRealm().equals(newRealm.getRealm()));
 	}
+
+	void deleteRealm(String realmName) {
+		keycloakClient.getKeycloak().realm(realmName).remove();
+	}
 }
diff --git a/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmService.java b/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmService.java
index 0f722349..feea4fe8 100644
--- a/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmService.java
+++ b/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmService.java
@@ -27,4 +27,8 @@ class KeycloakRealmService {
 		realm.setRealm(realmName);
 		return realm;
 	}
+
+	public void deleteRealm(String realmName) {
+		remoteService.deleteRealm(realmName);
+	}
 }
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 47c8a711..57546d48 100644
--- a/src/main/java/de/ozgcloud/operator/keycloak/user/KeycloakUserReconciler.java
+++ b/src/main/java/de/ozgcloud/operator/keycloak/user/KeycloakUserReconciler.java
@@ -41,7 +41,8 @@ public class KeycloakUserReconciler implements Reconciler<OzgKeycloakUser>, Clea
 			return UpdateControl.updateStatus(resource);
 
 		} catch (Exception e) {
-			log.log(Level.SEVERE, "Could not reconcile user " + resource.getMetadata().getName() + " in namespace " + resource.getMetadata().getNamespace(), e);
+			log.log(Level.SEVERE,
+					"Could not reconcile user " + resource.getMetadata().getName() + " in namespace " + resource.getMetadata().getNamespace(), e);
 			resource.setStatus(OzgKeycloakUserStatus.builder().status(OzgCustomResourceStatus.ERROR).errorMessage(e.getMessage()).build());
 			return UpdateControl.updateStatus(resource);
 		}
@@ -60,7 +61,7 @@ public class KeycloakUserReconciler implements Reconciler<OzgKeycloakUser>, Clea
 			log.log(Level.SEVERE, "Could not delete user " + crd.getMetadata().getName() + " in namespace " + crd.getMetadata().getNamespace(), e);
 			crd.setStatus(OzgKeycloakUserStatus.builder().status(OzgCustomResourceStatus.ERROR).errorMessage(e.getMessage()).build());
 			UpdateControl.updateStatus(crd);
-			return DeleteControl.defaultDelete();
+			return DeleteControl.noFinalizerRemoval();
 		}
 	}
 }
diff --git a/src/test/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmReconcilerTest.java b/src/test/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmReconcilerTest.java
index 9f247e7b..5fd0842c 100644
--- a/src/test/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmReconcilerTest.java
+++ b/src/test/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmReconcilerTest.java
@@ -3,6 +3,7 @@ package de.ozgcloud.operator.keycloak.realm;
 import static org.assertj.core.api.Assertions.*;
 import static org.mockito.Mockito.*;
 
+import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
 import org.mockito.InjectMocks;
 import org.mockito.Mock;
@@ -19,27 +20,44 @@ class KeycloakRealmReconcilerTest {
 	@Mock
 	private KeycloakRealmService service;
 
-	@Test
-	void shouldCallServiceAddRealm() {
+	@Nested
+	class TestReconcile {
 
-		OzgKeycloakRealm realm = OzgKeycloakRealmTestFactory.create();
+		@Test
+		void shouldCallServiceAddRealm() {
 
-		conciler.reconcile(realm, null);
+			OzgKeycloakRealm realm = OzgKeycloakRealmTestFactory.create();
 
-		verify(service).createRealm(realm.getSpec(), OzgKeycloakRealmTestFactory.METADATA_NAMESPACE);
-	}
+			conciler.reconcile(realm, null);
+
+			verify(service).createRealm(realm.getSpec(), OzgKeycloakRealmTestFactory.METADATA_NAMESPACE);
+		}
+
+		@Test
+		void shouldReturnUpdateStatus() {
+			var response = conciler.reconcile(OzgKeycloakRealmTestFactory.create(), null);
 
-	@Test
-	void shouldReturnUpdateStatus() {
-		var response = conciler.reconcile(OzgKeycloakRealmTestFactory.create(), null);
+			assertThat(response.getResource()).isNotNull();
+		}
 
-		assertThat(response.getResource()).isNotNull();
+		@Test
+		void shouldSetStatusOk() {
+			var response = conciler.reconcile(OzgKeycloakRealmTestFactory.create(), null);
+
+			assertThat(response.getResource().getStatus().getStatus()).isEqualTo(OzgCustomResourceStatus.OK);
+		}
 	}
 
-	@Test
-	void shouldSetStatusOk() {
-		var response = conciler.reconcile(OzgKeycloakRealmTestFactory.create(), null);
+	@Nested
+	class TestDelete {
+
+		@Test
+		void shouldCallServiceDelete() {
+			OzgKeycloakRealm realm = OzgKeycloakRealmTestFactory.create();
+
+			conciler.cleanup(realm, null);
 
-		assertThat(response.getResource().getStatus().getStatus()).isEqualTo(OzgCustomResourceStatus.OK);
+			verify(service).deleteRealm(OzgKeycloakRealmTestFactory.METADATA_NAMESPACE);
+		}
 	}
 }
diff --git a/src/test/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmRemoteServiceTest.java b/src/test/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmRemoteServiceTest.java
index e2a7aeb0..53e35617 100644
--- a/src/test/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmRemoteServiceTest.java
+++ b/src/test/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmRemoteServiceTest.java
@@ -72,4 +72,20 @@ class KeycloakRealmRemoteServiceTest {
 			assertThat(response).isTrue();
 		}
 	}
+
+	@Nested
+	class TestDeleteRealm {
+
+		private static final String REALM_NAME = "TestRealmName";
+
+		@Test
+		void shouldDeleteRealm() {
+			when(keycloak.realm(REALM_NAME)).thenReturn(realmResource);
+
+
+			remoteService.deleteRealm(REALM_NAME);
+
+			verify(realmResource).remove();
+		}
+	}
 }
diff --git a/src/test/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmServiceTest.java b/src/test/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmServiceTest.java
index 0c223864..75515521 100644
--- a/src/test/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmServiceTest.java
+++ b/src/test/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmServiceTest.java
@@ -86,4 +86,15 @@ class KeycloakRealmServiceTest {
 
 		verify(realmRepresentation).setRealm(REALM_NAME);
 	}
+
+	@Nested
+	class TestDeleteRealm {
+
+		@Test
+		void shouldCallRemoteServiceDelete() {
+			service.deleteRealm(REALM_NAME);
+
+			verify(remoteService).deleteRealm(REALM_NAME);
+		}
+	}
 }
-- 
GitLab