Skip to content
Snippets Groups Projects
Commit 32dc7b42 authored by OZGCloud's avatar OZGCloud
Browse files

OZG-5424 reschedule reconciler on finalizer error

parent dcfe685c
No related branches found
No related tags found
No related merge requests found
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<Appenders>
<Console name="LogInJSON" target="SYSTEM_OUT">
<!-- <JsonLayout compact="true" properties="true" eventEol="true"></JsonLayout> -->
<JsonTemplateLayout
eventTemplateUri="classpath:EcsLayout.json"
maxStringLength="65536" />
</Console>
</Appenders>
<Loggers>
<Root level="INFO">
<appender-ref ref="LogInJSON" />
</Root>
</Loggers>
</configuration>
\ No newline at end of file
...@@ -69,10 +69,10 @@ public class KeycloakRealmReconciler implements Reconciler<OzgCloudKeycloakRealm ...@@ -69,10 +69,10 @@ public class KeycloakRealmReconciler implements Reconciler<OzgCloudKeycloakRealm
LOG.info("keep data"); LOG.info("keep data");
return DeleteControl.defaultDelete(); return DeleteControl.defaultDelete();
} }
return cleanup(realm); return deleteRealm(realm);
} }
DeleteControl cleanup(OzgCloudKeycloakRealm realm) { DeleteControl deleteRealm(OzgCloudKeycloakRealm realm) {
var realmName = realm.getMetadata().getNamespace(); var realmName = realm.getMetadata().getNamespace();
LOG.info("{} do cleanup...", realmName); LOG.info("{} do cleanup...", realmName);
try { try {
...@@ -80,7 +80,7 @@ public class KeycloakRealmReconciler implements Reconciler<OzgCloudKeycloakRealm ...@@ -80,7 +80,7 @@ public class KeycloakRealmReconciler implements Reconciler<OzgCloudKeycloakRealm
return DeleteControl.defaultDelete(); return DeleteControl.defaultDelete();
} catch (Exception e) { } catch (Exception e) {
LOG.warn(realmName + " could not delete.", e); LOG.warn(realmName + " could not delete.", e);
return DeleteControl.defaultDelete(); return DeleteControl.noFinalizerRemoval().rescheduleAfter(Config.RECONCILER_RETRY_SECONDS_ON_ERROR);
} }
} }
} }
...@@ -88,10 +88,10 @@ public class KeycloakUserReconciler implements Reconciler<OzgCloudKeycloakUser>, ...@@ -88,10 +88,10 @@ public class KeycloakUserReconciler implements Reconciler<OzgCloudKeycloakUser>,
LOG.info("keep data"); LOG.info("keep data");
return DeleteControl.defaultDelete(); return DeleteControl.defaultDelete();
} }
return cleanup(user); return deleteUser(user);
} }
DeleteControl cleanup(OzgCloudKeycloakUser user) { DeleteControl deleteUser(OzgCloudKeycloakUser user) {
var userName = user.getMetadata().getName(); var userName = user.getMetadata().getName();
var namespace = user.getMetadata().getNamespace(); var namespace = user.getMetadata().getNamespace();
LOG.info("{} do cleanup...", userName); LOG.info("{} do cleanup...", userName);
...@@ -100,7 +100,7 @@ public class KeycloakUserReconciler implements Reconciler<OzgCloudKeycloakUser>, ...@@ -100,7 +100,7 @@ public class KeycloakUserReconciler implements Reconciler<OzgCloudKeycloakUser>,
return DeleteControl.defaultDelete(); return DeleteControl.defaultDelete();
} catch (Exception e) { } catch (Exception e) {
LOG.warn(userName + " could not delete user in namespace " + namespace, e); LOG.warn(userName + " could not delete user in namespace " + namespace, e);
return DeleteControl.defaultDelete(); return DeleteControl.noFinalizerRemoval().rescheduleAfter(Config.RECONCILER_RETRY_SECONDS_ON_ERROR);
} }
} }
} }
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<Appenders>
<Console name="LogInJSON" target="SYSTEM_OUT">
<!-- <JsonLayout compact="true" properties="true" eventEol="true"></JsonLayout> -->
<JsonTemplateLayout
eventTemplateUri="classpath:EcsLayout.json"
maxStringLength="65536" />
</Console>
</Appenders>
<Loggers>
<Root level="INFO">
<appender-ref ref="LogInJSON" />
</Root>
</Loggers>
</configuration>
\ No newline at end of file
...@@ -33,6 +33,7 @@ import org.mockito.InjectMocks; ...@@ -33,6 +33,7 @@ import org.mockito.InjectMocks;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.Spy; import org.mockito.Spy;
import de.ozgcloud.operator.Config;
import de.ozgcloud.operator.keycloak.OzgCloudCustomResourceStatus; import de.ozgcloud.operator.keycloak.OzgCloudCustomResourceStatus;
import io.javaoperatorsdk.operator.api.reconciler.DeleteControl; import io.javaoperatorsdk.operator.api.reconciler.DeleteControl;
...@@ -73,9 +74,9 @@ class KeycloakRealmReconcilerTest { ...@@ -73,9 +74,9 @@ class KeycloakRealmReconcilerTest {
} }
} }
@DisplayName("Cleanup") @DisplayName("Reconciler Cleanup")
@Nested @Nested
class TestCleanup { class TestReconcilerCleanup {
@DisplayName("with keep_after_delete") @DisplayName("with keep_after_delete")
@Nested @Nested
...@@ -99,13 +100,60 @@ class KeycloakRealmReconcilerTest { ...@@ -99,13 +100,60 @@ class KeycloakRealmReconcilerTest {
} }
} }
@DisplayName("test cleanup")
@Nested
class TestCleanup {
private final OzgCloudKeycloakRealm realm = OzgCloudKeycloakRealmTestFactory.create();
@Test @Test
void shouldCallServiceDelete() { void shouldCallDeleteRealm() {
var realm = OzgCloudKeycloakRealmTestFactory.create(); reconciler.cleanup(realm, null);
verify(reconciler).deleteRealm(realm);
}
@Test
void shouldReturnValueFromDeleteUser() {
DeleteControl expected = DeleteControl.defaultDelete();
when(reconciler.deleteRealm(realm)).thenReturn(expected);
DeleteControl response = reconciler.cleanup(realm, null);
assertThat(response).isEqualTo(expected);
}
}
@DisplayName("test delete")
@Nested
class TestDelete {
private final OzgCloudKeycloakRealm realm = OzgCloudKeycloakRealmTestFactory.create();
reconciler.cleanup(realm); @Test
void shouldCallServiceDelete() {
reconciler.deleteRealm(realm);
verify(service).deleteRealm(OzgCloudKeycloakRealmTestFactory.METADATA_NAMESPACE); verify(service).deleteRealm(OzgCloudKeycloakRealmTestFactory.METADATA_NAMESPACE);
} }
@Test
void shouldReturnDeleteControl() {
var control = reconciler.deleteRealm(realm);
assertThat(control).usingRecursiveComparison().isEqualTo(DeleteControl.defaultDelete());
}
@Test
void shouldRescheduleOnError() {
doThrow(RuntimeException.class).when(service)
.deleteRealm(OzgCloudKeycloakRealmTestFactory.METADATA_NAMESPACE);
var control = reconciler.deleteRealm(realm);
assertThat(control).usingRecursiveComparison()
.isEqualTo(DeleteControl.noFinalizerRemoval().rescheduleAfter(Config.RECONCILER_RETRY_SECONDS_ON_ERROR));
}
}
} }
} }
...@@ -37,7 +37,9 @@ import org.mockito.InjectMocks; ...@@ -37,7 +37,9 @@ import org.mockito.InjectMocks;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.Spy; import org.mockito.Spy;
import de.ozgcloud.operator.Config;
import de.ozgcloud.operator.keycloak.OzgCloudCustomResourceStatus; import de.ozgcloud.operator.keycloak.OzgCloudCustomResourceStatus;
import de.ozgcloud.operator.keycloak.realm.OzgCloudKeycloakRealmTestFactory;
import de.ozgcloud.operator.keycloak.user.OzgCloudKeycloakUserSpec.KeycloakUserSpecUser; import de.ozgcloud.operator.keycloak.user.OzgCloudKeycloakUserSpec.KeycloakUserSpecUser;
import io.javaoperatorsdk.operator.api.reconciler.DeleteControl; import io.javaoperatorsdk.operator.api.reconciler.DeleteControl;
...@@ -96,9 +98,9 @@ class KeycloakUserReconcilerTest { ...@@ -96,9 +98,9 @@ class KeycloakUserReconcilerTest {
} }
} }
@DisplayName("Cleanup") @DisplayName("Reconciler Cleanup")
@Nested @Nested
class TestCleanup { class TestReconcilerCleanup {
@DisplayName("with keep_after_delete") @DisplayName("with keep_after_delete")
@Nested @Nested
...@@ -124,13 +126,61 @@ class KeycloakUserReconcilerTest { ...@@ -124,13 +126,61 @@ class KeycloakUserReconcilerTest {
} }
} }
@DisplayName("test cleanup")
@Nested
class TestCleanup {
private final OzgCloudKeycloakUser user = OzgCloudKeycloakUserTestFactory.create();
@Test @Test
void shouldCallServiceDelete() { void shouldCallDeleteUser() {
var user = OzgCloudKeycloakUserTestFactory.create(); reconciler.cleanup(user, null);
verify(reconciler).deleteUser(user);
}
@Test
void shouldReturnValueFromDeleteUser() {
DeleteControl expected = DeleteControl.defaultDelete();
when(reconciler.deleteUser(user)).thenReturn(expected);
DeleteControl response = reconciler.cleanup(user, null);
assertThat(response).isEqualTo(expected);
}
}
@DisplayName("test delete")
@Nested
class TestDeleteUser {
reconciler.cleanup(user); private final OzgCloudKeycloakUser user = OzgCloudKeycloakUserTestFactory.create();
@Test
void shouldCallServiceDelete() {
reconciler.deleteUser(user);
verify(service).deleteUser(user.getSpec(), OzgCloudKeycloakUserTestFactory.METADATA_NAMESPACE); verify(service).deleteUser(user.getSpec(), OzgCloudKeycloakUserTestFactory.METADATA_NAMESPACE);
} }
@Test
void shouldReturnDeleteControl() {
var control = reconciler.deleteUser(user);
assertThat(control).usingRecursiveComparison().isEqualTo(DeleteControl.defaultDelete());
}
@Test
void shouldRescheduleOnError() {
doThrow(RuntimeException.class).when(service)
.deleteUser(user.getSpec(), OzgCloudKeycloakRealmTestFactory.METADATA_NAMESPACE);
var control = reconciler.cleanup(user, null);
assertThat(control).usingRecursiveComparison()
.isEqualTo(DeleteControl.noFinalizerRemoval().rescheduleAfter(Config.RECONCILER_RETRY_SECONDS_ON_ERROR));
}
}
} }
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment