diff --git a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmReconciler.java b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmReconciler.java index c17da17a68ff9510cbd0a20831847e13df594b56..81de63995e71d8a25b4daf159964b07bcde0a8f2 100644 --- a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmReconciler.java +++ b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmReconciler.java @@ -26,6 +26,7 @@ package de.ozgcloud.operator.keycloak.realm; import org.springframework.stereotype.Component; import de.ozgcloud.operator.Config; +import de.ozgcloud.operator.keycloak.KeycloakGenericRemoteService; import de.ozgcloud.operator.keycloak.OzgCloudCustomResourceStatus; import io.javaoperatorsdk.operator.api.reconciler.Cleaner; import io.javaoperatorsdk.operator.api.reconciler.Context; @@ -43,6 +44,7 @@ import lombok.extern.log4j.Log4j2; public class KeycloakRealmReconciler implements Reconciler<OzgCloudKeycloakRealm>, Cleaner<OzgCloudKeycloakRealm> { private final KeycloakRealmService service; + private final KeycloakGenericRemoteService keycloakGenericRemoteService; @Override public UpdateControl<OzgCloudKeycloakRealm> reconcile(OzgCloudKeycloakRealm resource, Context<OzgCloudKeycloakRealm> context) { @@ -69,6 +71,9 @@ public class KeycloakRealmReconciler implements Reconciler<OzgCloudKeycloakRealm LOG.info("keep data"); return DeleteControl.defaultDelete(); } + if (!keycloakGenericRemoteService.realmExists(realm.getMetadata().getName())) { + return DeleteControl.defaultDelete(); + } return deleteRealm(realm); } diff --git a/ozgcloud-keycloak-operator/src/test/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmReconcilerTest.java b/ozgcloud-keycloak-operator/src/test/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmReconcilerTest.java index 06e758f079a0e46cf2b1ceba00381683a700258f..d2c2d8b06b1a0638cea9228496b6066f918fa70d 100644 --- a/ozgcloud-keycloak-operator/src/test/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmReconcilerTest.java +++ b/ozgcloud-keycloak-operator/src/test/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmReconcilerTest.java @@ -24,6 +24,7 @@ package de.ozgcloud.operator.keycloak.realm; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; @@ -37,6 +38,7 @@ import org.mockito.Mock; import org.mockito.Spy; import de.ozgcloud.operator.Config; +import de.ozgcloud.operator.keycloak.KeycloakGenericRemoteService; import de.ozgcloud.operator.keycloak.OzgCloudCustomResourceStatus; import io.javaoperatorsdk.operator.api.reconciler.DeleteControl; @@ -49,17 +51,22 @@ class KeycloakRealmReconcilerTest { @Mock private KeycloakRealmService service; + @Mock + private KeycloakGenericRemoteService keycloakGenericRemoteService; + + private final String REALM = OzgCloudKeycloakRealmTestFactory.METADATA_NAMESPACE; + @DisplayName("Reconcile") @Nested class TestReconcile { - + @Test void shouldCallServiceCreateOrUpdateRealm() { OzgCloudKeycloakRealm realm = OzgCloudKeycloakRealmTestFactory.create(); reconciler.reconcile(realm, null); - verify(service).createOrUpdateRealm(realm.getSpec(), OzgCloudKeycloakRealmTestFactory.METADATA_NAMESPACE); + verify(service).createOrUpdateRealm(realm.getSpec(), REALM); } @Test @@ -93,7 +100,7 @@ class KeycloakRealmReconcilerTest { void shouldNotCallService() { reconciler.cleanup(realm, null); - verify(service, never()).deleteRealm(OzgCloudKeycloakRealmTestFactory.METADATA_NAMESPACE); + verify(service, never()).deleteRealm(REALM); } @Test @@ -111,21 +118,38 @@ class KeycloakRealmReconcilerTest { private final OzgCloudKeycloakRealm realm = OzgCloudKeycloakRealmTestFactory.create(); @Test - void shouldCallDeleteRealm() { + void shouldDeleteRealmIfRealmExists() { + when(keycloakGenericRemoteService.realmExists(any())).thenReturn(true); reconciler.cleanup(realm, null); verify(reconciler).deleteRealm(realm); } @Test - void shouldReturnValueFromDeleteUser() { + void shouldReturnValueFromDeleteRealm() { DeleteControl expected = DeleteControl.defaultDelete(); when(reconciler.deleteRealm(realm)).thenReturn(expected); + when(keycloakGenericRemoteService.realmExists(any())).thenReturn(true); DeleteControl response = reconciler.cleanup(realm, null); assertThat(response).isEqualTo(expected); } + @Test + void shouldCallRealmExists() { + reconciler.cleanup(realm, null); + + verify(keycloakGenericRemoteService).realmExists(null); + } + + @Test + void shouldNotDeleteRealmIfRealmNotExists() { + when(keycloakGenericRemoteService.realmExists(any())).thenReturn(false); + + reconciler.cleanup(realm, null); + + verify(reconciler, never()).deleteRealm(realm); + } } @DisplayName("test delete") @@ -138,7 +162,7 @@ class KeycloakRealmReconcilerTest { void shouldCallServiceDelete() { reconciler.deleteRealm(realm); - verify(service).deleteRealm(OzgCloudKeycloakRealmTestFactory.METADATA_NAMESPACE); + verify(service).deleteRealm(REALM); } @Test @@ -151,7 +175,7 @@ class KeycloakRealmReconcilerTest { @Test void shouldRescheduleOnError() { doThrow(RuntimeException.class).when(service) - .deleteRealm(OzgCloudKeycloakRealmTestFactory.METADATA_NAMESPACE); + .deleteRealm(REALM); var control = reconciler.deleteRealm(realm);