From c60eaaa31432ff1164d894de013d3d5cf6ed1bd9 Mon Sep 17 00:00:00 2001
From: OZGCloud <ozgcloud@mgm-tp.com>
Date: Thu, 6 Jul 2023 07:43:57 +0200
Subject: [PATCH] OZG-3961 - use errorStatusHandler in all reconcilers

---
 .../realm/KeycloakRealmReconciler.java        | 36 ++++++++--------
 .../keycloak/user/KeycloakUserReconciler.java | 41 +++++++++----------
 .../user/KeycloakUserReconcilerTest.java      | 24 ++++++-----
 3 files changed, 51 insertions(+), 50 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 4d3a4c34..8337873c 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 aaaaa621..fcbbd939 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 acd9bbea..94e4730b 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 {
 
-- 
GitLab