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 eb935aa0c85d58745e312f0ee630e8689e8d91c3..4dc6903f855b85d0d91bf4646151cdc0aa412b9f 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 6d5fdeaaa5fe8a02db8fcc3388474f1b0202940e..a3cd548780de7a5f7d6ab934fe100b6f5a4fa4de 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 87b0020866b39895d02917345cda18d730d8159c..0dc7d458a9d6b86babd1e0ae01de1e84ace55373 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 5918054dbd3a1c40906b5bface1dd30c7c082d56..52063fb17a6f1465f3a38cab0af5ffc8520628f1 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 e23492a96a0eb9e9baac13c146e5b3c6442988aa..08df37af33ce01660554ce49115646d855b38c07 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);