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 a2a19c68883187f986ebc18e7e1b912a5bd563c4..4e92bd3640450d3765176046aced08900e257a79 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 6d157e2ddd8d61ae3a2cad45029659417d62a7f9..108dbd6e7a35d1aa8739d4a2c39a9514f724c960 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 f8088d59e805b0419cbef1588af4ee1e936f8b1a..1800a5a8d2d84a9e76f61d80d64288b08f024a8d 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 b96bcf8cb8d50dad6f763130a8dd3415b7f2e021..311a2e8ca95512fc2162c768d8b27ea912d95648 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);