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