Skip to content
Snippets Groups Projects
Commit 7cfbd8b7 authored by OZGCloud's avatar OZGCloud
Browse files

Merge pull request 'OZG-5424 reschedule reconciler on finalizer error' (#22)...

Merge pull request 'OZG-5424 reschedule reconciler on finalizer error' (#22) from OZG-5424-reschedule-finalizer-on-errors into master

Reviewed-on: https://git.ozg-sh.de/ozgcloud-devops/operator/pulls/22


Reviewed-by: default avatarOZGCloud <ozgcloud@mgm-tp.com>
parents dcfe685c 32dc7b42
Branches
Tags
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
LOG.info("keep data");
return DeleteControl.defaultDelete();
}
return cleanup(realm);
return deleteRealm(realm);
}
DeleteControl cleanup(OzgCloudKeycloakRealm realm) {
DeleteControl deleteRealm(OzgCloudKeycloakRealm realm) {
var realmName = realm.getMetadata().getNamespace();
LOG.info("{} do cleanup...", realmName);
try {
......@@ -80,7 +80,7 @@ public class KeycloakRealmReconciler implements Reconciler<OzgCloudKeycloakRealm
return DeleteControl.defaultDelete();
} catch (Exception 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>,
LOG.info("keep data");
return DeleteControl.defaultDelete();
}
return cleanup(user);
return deleteUser(user);
}
DeleteControl cleanup(OzgCloudKeycloakUser user) {
DeleteControl deleteUser(OzgCloudKeycloakUser user) {
var userName = user.getMetadata().getName();
var namespace = user.getMetadata().getNamespace();
LOG.info("{} do cleanup...", userName);
......@@ -100,7 +100,7 @@ public class KeycloakUserReconciler implements Reconciler<OzgCloudKeycloakUser>,
return DeleteControl.defaultDelete();
} catch (Exception 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;
import org.mockito.Mock;
import org.mockito.Spy;
import de.ozgcloud.operator.Config;
import de.ozgcloud.operator.keycloak.OzgCloudCustomResourceStatus;
import io.javaoperatorsdk.operator.api.reconciler.DeleteControl;
......@@ -73,9 +74,9 @@ class KeycloakRealmReconcilerTest {
}
}
@DisplayName("Cleanup")
@DisplayName("Reconciler Cleanup")
@Nested
class TestCleanup {
class TestReconcilerCleanup {
@DisplayName("with keep_after_delete")
@Nested
......@@ -99,13 +100,60 @@ class KeycloakRealmReconcilerTest {
}
}
@DisplayName("test cleanup")
@Nested
class TestCleanup {
private final OzgCloudKeycloakRealm realm = OzgCloudKeycloakRealmTestFactory.create();
@Test
void shouldCallServiceDelete() {
var realm = OzgCloudKeycloakRealmTestFactory.create();
void shouldCallDeleteRealm() {
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);
}
@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;
import org.mockito.Mock;
import org.mockito.Spy;
import de.ozgcloud.operator.Config;
import de.ozgcloud.operator.keycloak.OzgCloudCustomResourceStatus;
import de.ozgcloud.operator.keycloak.realm.OzgCloudKeycloakRealmTestFactory;
import de.ozgcloud.operator.keycloak.user.OzgCloudKeycloakUserSpec.KeycloakUserSpecUser;
import io.javaoperatorsdk.operator.api.reconciler.DeleteControl;
......@@ -96,9 +98,9 @@ class KeycloakUserReconcilerTest {
}
}
@DisplayName("Cleanup")
@DisplayName("Reconciler Cleanup")
@Nested
class TestCleanup {
class TestReconcilerCleanup {
@DisplayName("with keep_after_delete")
@Nested
......@@ -124,13 +126,61 @@ class KeycloakUserReconcilerTest {
}
}
@DisplayName("test cleanup")
@Nested
class TestCleanup {
private final OzgCloudKeycloakUser user = OzgCloudKeycloakUserTestFactory.create();
@Test
void shouldCallServiceDelete() {
var user = OzgCloudKeycloakUserTestFactory.create();
void shouldCallDeleteUser() {
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);
}
@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