From 7fa7dbacd5e4887d97550835064b9e059b0977f9 Mon Sep 17 00:00:00 2001
From: OZGCloud <ozgcloud@mgm-tp.com>
Date: Wed, 6 Sep 2023 08:59:14 +0200
Subject: [PATCH] OZG-3961 consider keepAfterDelete on realm resource

---
 .../realm/KeycloakRealmReconciler.java        | 15 +++++----
 .../keycloak/realm/OzgKeycloakRealmSpec.java  |  4 +++
 .../realm/KeycloakRealmReconcilerTest.java    | 32 +++++++++++++++++--
 .../OzgKeycloakRealmSpecTestFactory.java      |  2 ++
 .../realm/OzgKeycloakRealmTestFactory.java    | 10 +++++-
 5 files changed, 53 insertions(+), 10 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 eb935aa..4dc6903 100644
--- a/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmReconciler.java
+++ b/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmReconciler.java
@@ -70,16 +70,19 @@ public class KeycloakRealmReconciler implements Reconciler<OzgKeycloakRealm>, Cl
 	}
 
 	@Override
-	public DeleteControl cleanup(OzgKeycloakRealm resource, Context<OzgKeycloakRealm> context) {
-
-		String realmName = resource.getMetadata().getNamespace();
+	public DeleteControl cleanup(OzgKeycloakRealm realm, Context<OzgKeycloakRealm> context) {
+		log.info("Realm reconciler, keep after delete is set to: " + realm.getSpec().isKeepAfterDelete());
+		if (realm.getSpec().isKeepAfterDelete()) {
+			return DeleteControl.defaultDelete();
+		}
+		return cleanup(realm);
+	}
 
+	DeleteControl cleanup(OzgKeycloakRealm realm) {
+		var realmName = realm.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);
diff --git a/src/main/java/de/ozgcloud/operator/keycloak/realm/OzgKeycloakRealmSpec.java b/src/main/java/de/ozgcloud/operator/keycloak/realm/OzgKeycloakRealmSpec.java
index 6d5fdea..a3cd548 100644
--- a/src/main/java/de/ozgcloud/operator/keycloak/realm/OzgKeycloakRealmSpec.java
+++ b/src/main/java/de/ozgcloud/operator/keycloak/realm/OzgKeycloakRealmSpec.java
@@ -24,6 +24,7 @@
 package de.ozgcloud.operator.keycloak.realm;
 
 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
 
 import lombok.AllArgsConstructor;
 import lombok.Builder;
@@ -39,5 +40,8 @@ import lombok.Setter;
 @JsonIgnoreProperties(ignoreUnknown = true)
 class OzgKeycloakRealmSpec {
 
+	@JsonProperty("keep_after_delete")
+	private boolean keepAfterDelete;
+
 	private String displayName;
 }
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 87b0020..0dc7d45 100644
--- a/src/test/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmReconcilerTest.java
+++ b/src/test/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmReconcilerTest.java
@@ -26,6 +26,7 @@ package de.ozgcloud.operator.keycloak.realm;
 import static org.assertj.core.api.Assertions.*;
 import static org.mockito.Mockito.*;
 
+import org.junit.jupiter.api.DisplayName;
 import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
 import org.mockito.InjectMocks;
@@ -33,6 +34,7 @@ import org.mockito.Mock;
 import org.mockito.Spy;
 
 import de.ozgcloud.operator.keycloak.OzgCustomResourceStatus;
+import io.javaoperatorsdk.operator.api.reconciler.DeleteControl;
 
 class KeycloakRealmReconcilerTest {
 
@@ -43,6 +45,7 @@ class KeycloakRealmReconcilerTest {
 	@Mock
 	private KeycloakRealmService service;
 
+	@DisplayName("Reconcile")
 	@Nested
 	class TestReconcile {
 
@@ -70,14 +73,37 @@ class KeycloakRealmReconcilerTest {
 		}
 	}
 
+	@DisplayName("Cleanup")
 	@Nested
-	class TestDelete {
+	class TestCleanup {
+
+		@DisplayName("with keep_after_delete")
+		@Nested
+		class TestWithKeepAfterDelete {
+
+			private final OzgKeycloakRealmSpec realmSpec = OzgKeycloakRealmSpecTestFactory.createBuilder().keepAfterDelete(true).build();
+			private final OzgKeycloakRealm realm = OzgKeycloakRealmTestFactory.create(realmSpec);
+
+			@Test
+			void shouldNotCallService() {
+				reconciler.cleanup(realm, null);
+
+				verify(service, never()).deleteRealm(OzgKeycloakRealmTestFactory.METADATA_NAMESPACE);
+			}
+
+			@Test
+			void shouldReturnDeleteControl() {
+				var control = reconciler.cleanup(realm, null);
+
+				assertThat(control).usingRecursiveComparison().isEqualTo(DeleteControl.defaultDelete());
+			}
+		}
 
 		@Test
 		void shouldCallServiceDelete() {
-			OzgKeycloakRealm realm = OzgKeycloakRealmTestFactory.create();
+			var realm = OzgKeycloakRealmTestFactory.create();
 
-			reconciler.cleanup(realm, null);
+			reconciler.cleanup(realm);
 
 			verify(service).deleteRealm(OzgKeycloakRealmTestFactory.METADATA_NAMESPACE);
 		}
diff --git a/src/test/java/de/ozgcloud/operator/keycloak/realm/OzgKeycloakRealmSpecTestFactory.java b/src/test/java/de/ozgcloud/operator/keycloak/realm/OzgKeycloakRealmSpecTestFactory.java
index 5918054..52063fb 100644
--- a/src/test/java/de/ozgcloud/operator/keycloak/realm/OzgKeycloakRealmSpecTestFactory.java
+++ b/src/test/java/de/ozgcloud/operator/keycloak/realm/OzgKeycloakRealmSpecTestFactory.java
@@ -26,6 +26,7 @@ package de.ozgcloud.operator.keycloak.realm;
 public class OzgKeycloakRealmSpecTestFactory {
 
 	public final static String DISPLAY_NAME = "TestDisplayName";
+	public final static boolean KEEP_AFTER_DELETE = false;
 
 	public static OzgKeycloakRealmSpec create() {
 		return createBuilder().build();
@@ -33,6 +34,7 @@ public class OzgKeycloakRealmSpecTestFactory {
 
 	public static OzgKeycloakRealmSpec.OzgKeycloakRealmSpecBuilder createBuilder() {
 		return OzgKeycloakRealmSpec.builder()
+				.keepAfterDelete(KEEP_AFTER_DELETE)
 				.displayName(DISPLAY_NAME);
 	}
 }
diff --git a/src/test/java/de/ozgcloud/operator/keycloak/realm/OzgKeycloakRealmTestFactory.java b/src/test/java/de/ozgcloud/operator/keycloak/realm/OzgKeycloakRealmTestFactory.java
index e23492a..08df37a 100644
--- a/src/test/java/de/ozgcloud/operator/keycloak/realm/OzgKeycloakRealmTestFactory.java
+++ b/src/test/java/de/ozgcloud/operator/keycloak/realm/OzgKeycloakRealmTestFactory.java
@@ -28,8 +28,16 @@ public class OzgKeycloakRealmTestFactory {
 	public static final String METADATA_NAMESPACE = "TestNamespace";
 
 	public static OzgKeycloakRealm create() {
+		return createWithSpec(OzgKeycloakRealmSpecTestFactory.create());
+	}
+
+	public static OzgKeycloakRealm create(OzgKeycloakRealmSpec spec) {
+		return createWithSpec(spec);
+	}
+
+	private static OzgKeycloakRealm createWithSpec(OzgKeycloakRealmSpec spec) {
 		var realm = new OzgKeycloakRealm();
-		realm.setSpec(OzgKeycloakRealmSpecTestFactory.create());
+		realm.setSpec(spec);
 		realm.setStatus(OzgKeycloakRealmStatusTestFactory.create());
 		realm.getMetadata().setNamespace(METADATA_NAMESPACE);
 
-- 
GitLab