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 4d3a4c34b0920d6e817b731fc8f2a95fcb6c7d93..8337873c8e2701d59d7313e19d4b14b1346100c6 100644 --- a/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmReconciler.java +++ b/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmReconciler.java @@ -10,6 +10,8 @@ import io.javaoperatorsdk.operator.api.reconciler.Cleaner; import io.javaoperatorsdk.operator.api.reconciler.Context; import io.javaoperatorsdk.operator.api.reconciler.ControllerConfiguration; import io.javaoperatorsdk.operator.api.reconciler.DeleteControl; +import io.javaoperatorsdk.operator.api.reconciler.ErrorStatusHandler; +import io.javaoperatorsdk.operator.api.reconciler.ErrorStatusUpdateControl; import io.javaoperatorsdk.operator.api.reconciler.Reconciler; import io.javaoperatorsdk.operator.api.reconciler.UpdateControl; import lombok.extern.java.Log; @@ -17,7 +19,7 @@ import lombok.extern.java.Log; @ControllerConfiguration @Component @Log -public class KeycloakRealmReconciler implements Reconciler<OzgKeycloakRealm>, Cleaner<OzgKeycloakRealm> { +public class KeycloakRealmReconciler implements Reconciler<OzgKeycloakRealm>, Cleaner<OzgKeycloakRealm>, ErrorStatusHandler<OzgKeycloakRealm> { @Autowired private KeycloakRealmService service; @@ -25,23 +27,14 @@ public class KeycloakRealmReconciler implements Reconciler<OzgKeycloakRealm>, Cl @Override public UpdateControl<OzgKeycloakRealm> reconcile(OzgKeycloakRealm resource, Context<OzgKeycloakRealm> context) { - try { - - String realmName = resource.getMetadata().getNamespace(); - - log.info("Reconcile KeycloakRealm " + realmName + " (crd name " + resource.getMetadata().getName() + ")"); + String realmName = resource.getMetadata().getNamespace(); - service.createRealm(resource.getSpec(), realmName); + log.info("Reconcile KeycloakRealm " + realmName + " (crd name " + resource.getMetadata().getName() + ")"); - resource.setStatus(OzgKeycloakRealmStatus.builder().status(OzgCustomResourceStatus.OK).message(null).build()); - return UpdateControl.updateStatus(resource); + service.createRealm(resource.getSpec(), realmName); - } catch (Exception e) { - log.log(Level.SEVERE, - "Could not reconcile realm " + resource.getMetadata().getName() + " in namespace " + resource.getMetadata().getNamespace(), e); - resource.setStatus(OzgKeycloakRealmStatus.builder().status(OzgCustomResourceStatus.ERROR).message(e.getMessage()).build()); - return UpdateControl.updateStatus(resource); - } + resource.setStatus(OzgKeycloakRealmStatus.builder().status(OzgCustomResourceStatus.OK).message(null).build()); + return UpdateControl.updateStatus(resource); } @Override @@ -58,9 +51,16 @@ public class KeycloakRealmReconciler implements Reconciler<OzgKeycloakRealm>, Cl return DeleteControl.defaultDelete(); } catch (Exception e) { log.log(Level.SEVERE, "Could not delete KeycloakRealm " + realmName, e); - resource.setStatus(OzgKeycloakRealmStatus.builder().status(OzgCustomResourceStatus.ERROR).message(e.getMessage()).build()); - UpdateControl.updateStatus(resource); - return DeleteControl.noFinalizerRemoval(); + return DeleteControl.defaultDelete(); } } + + @Override + public ErrorStatusUpdateControl<OzgKeycloakRealm> updateErrorStatus(OzgKeycloakRealm resource, Context<OzgKeycloakRealm> context, + Exception e) { + log.log(Level.SEVERE, + "Could not reconcile realm " + resource.getMetadata().getName() + " in namespace " + resource.getMetadata().getNamespace(), e); + resource.setStatus(OzgKeycloakRealmStatus.builder().status(OzgCustomResourceStatus.ERROR).message(e.getMessage()).build()); + return ErrorStatusUpdateControl.updateStatus(resource); + } } 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 aaaaa6211563562bbf7ab024d7a7110a921fabd6..fcbbd939a41195369ba8fa202e41814b8401273d 100644 --- a/src/main/java/de/ozgcloud/operator/keycloak/user/KeycloakUserReconciler.java +++ b/src/main/java/de/ozgcloud/operator/keycloak/user/KeycloakUserReconciler.java @@ -13,6 +13,8 @@ import io.javaoperatorsdk.operator.api.reconciler.Cleaner; import io.javaoperatorsdk.operator.api.reconciler.Context; import io.javaoperatorsdk.operator.api.reconciler.ControllerConfiguration; import io.javaoperatorsdk.operator.api.reconciler.DeleteControl; +import io.javaoperatorsdk.operator.api.reconciler.ErrorStatusHandler; +import io.javaoperatorsdk.operator.api.reconciler.ErrorStatusUpdateControl; import io.javaoperatorsdk.operator.api.reconciler.Reconciler; import io.javaoperatorsdk.operator.api.reconciler.UpdateControl; import lombok.extern.java.Log; @@ -20,7 +22,7 @@ import lombok.extern.java.Log; @ControllerConfiguration @Component @Log -public class KeycloakUserReconciler implements Reconciler<OzgKeycloakUser>, Cleaner<OzgKeycloakUser> { +public class KeycloakUserReconciler implements Reconciler<OzgKeycloakUser>, Cleaner<OzgKeycloakUser>, ErrorStatusHandler<OzgKeycloakUser> { @Autowired private KeycloakUserService keycloakUserService; @@ -31,30 +33,17 @@ public class KeycloakUserReconciler implements Reconciler<OzgKeycloakUser>, Clea @Override public UpdateControl<OzgKeycloakUser> reconcile(OzgKeycloakUser resource, Context<OzgKeycloakUser> context) { - try { - - log.info("Reconciling KeycloakUser " + resource.getMetadata().getName()); - String namespace = resource.getMetadata().getNamespace(); - - Optional<String> preconditionError = preconditionService.getReconcilePreconditionErrors(resource); - if (preconditionError.isPresent()) { - return buildStatusInProgress(resource, preconditionError.get()); - } - - keycloakUserService.createOrUpdateUser(resource.getSpec(), namespace); - - return buildStatusOk(resource); + log.info("Reconciling KeycloakUser " + resource.getMetadata().getName()); + String namespace = resource.getMetadata().getNamespace(); - } catch (Exception e) { - return buildStatusError(resource, e); + Optional<String> preconditionError = preconditionService.getReconcilePreconditionErrors(resource); + if (preconditionError.isPresent()) { + return buildStatusInProgress(resource, preconditionError.get()); } - } - private UpdateControl<OzgKeycloakUser> buildStatusError(OzgKeycloakUser resource, Exception 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).message(e.getMessage()).build()); - return UpdateControl.updateStatus(resource); + keycloakUserService.createOrUpdateUser(resource.getSpec(), namespace); + + return buildStatusOk(resource); } private UpdateControl<OzgKeycloakUser> buildStatusOk(OzgKeycloakUser resource) { @@ -84,4 +73,12 @@ public class KeycloakUserReconciler implements Reconciler<OzgKeycloakUser>, Clea return DeleteControl.defaultDelete(); } } + + @Override + public ErrorStatusUpdateControl<OzgKeycloakUser> updateErrorStatus(OzgKeycloakUser resource, Context<OzgKeycloakUser> context, Exception 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).message(e.getMessage()).build()); + return ErrorStatusUpdateControl.updateStatus(resource); + } } diff --git a/src/test/java/de/ozgcloud/operator/keycloak/user/KeycloakUserReconcilerTest.java b/src/test/java/de/ozgcloud/operator/keycloak/user/KeycloakUserReconcilerTest.java index acd9bbeaaec2c3e90c8422a83a32c3cd0c0f9234..94e4730b3bfaa6a36785f8080f8314b50df42367 100644 --- a/src/test/java/de/ozgcloud/operator/keycloak/user/KeycloakUserReconcilerTest.java +++ b/src/test/java/de/ozgcloud/operator/keycloak/user/KeycloakUserReconcilerTest.java @@ -53,16 +53,6 @@ class KeycloakUserReconcilerTest { assertThat(user.getStatus().getStatus()).isEqualTo(OzgCustomResourceStatus.OK); } - @Test - void shouldSetErrorStatusOnException() { - OzgKeycloakUser user = OzgKeycloakUserTestFactory.create(); - doThrow(new RuntimeException()).when(userService).createOrUpdateUser(any(), any()); - - conciler.reconcile(user, null); - - assertThat(user.getStatus().getStatus()).isEqualTo(OzgCustomResourceStatus.ERROR); - } - @Nested class TestPreconditionError { @@ -80,6 +70,20 @@ class KeycloakUserReconcilerTest { } } + @Nested + class TestErrorStatusUpdateControl { + + @Test + void shouldSetErrorStatusOnException() { + OzgKeycloakUser user = OzgKeycloakUserTestFactory.create(); +// doThrow(new RuntimeException()).when(userService).createOrUpdateUser(any(), any()); + + conciler.updateErrorStatus(user, null, new RuntimeException()); + + assertThat(user.getStatus().getStatus()).isEqualTo(OzgCustomResourceStatus.ERROR); + } + } + @Nested class TestDeleteUser {