|
1 | 1 | package io.javaoperatorsdk.operator.processing;
|
2 | 2 |
|
| 3 | +import java.util.Optional; |
| 4 | + |
3 | 5 | import org.junit.jupiter.api.Test;
|
| 6 | +import org.junit.jupiter.params.ParameterizedTest; |
| 7 | +import org.junit.jupiter.params.provider.CsvSource; |
4 | 8 |
|
5 | 9 | import io.fabric8.kubernetes.api.model.Secret;
|
6 | 10 | import io.javaoperatorsdk.operator.MockKubernetesClient;
|
7 | 11 | import io.javaoperatorsdk.operator.api.config.BaseConfigurationService;
|
8 | 12 | import io.javaoperatorsdk.operator.api.config.ConfigurationService;
|
9 | 13 | import io.javaoperatorsdk.operator.api.config.MockControllerConfiguration;
|
| 14 | +import io.javaoperatorsdk.operator.api.config.workflow.WorkflowSpec; |
10 | 15 | import io.javaoperatorsdk.operator.api.reconciler.Cleaner;
|
| 16 | +import io.javaoperatorsdk.operator.api.reconciler.DefaultContext; |
| 17 | +import io.javaoperatorsdk.operator.api.reconciler.DeleteControl; |
11 | 18 | import io.javaoperatorsdk.operator.api.reconciler.Reconciler;
|
| 19 | +import io.javaoperatorsdk.operator.processing.dependent.workflow.ManagedWorkflow; |
| 20 | +import io.javaoperatorsdk.operator.processing.dependent.workflow.ManagedWorkflowFactory; |
| 21 | +import io.javaoperatorsdk.operator.processing.dependent.workflow.Workflow; |
| 22 | +import io.javaoperatorsdk.operator.processing.dependent.workflow.WorkflowCleanupResult; |
12 | 23 | import io.javaoperatorsdk.operator.sample.simple.TestCustomResource;
|
13 | 24 |
|
| 25 | +import static io.javaoperatorsdk.operator.api.monitoring.Metrics.NOOP; |
14 | 26 | import static org.assertj.core.api.Assertions.assertThat;
|
| 27 | +import static org.mockito.ArgumentMatchers.any; |
15 | 28 | import static org.mockito.Mockito.mock;
|
16 | 29 | import static org.mockito.Mockito.never;
|
| 30 | +import static org.mockito.Mockito.times; |
17 | 31 | import static org.mockito.Mockito.verify;
|
18 | 32 | import static org.mockito.Mockito.when;
|
19 | 33 | import static org.mockito.Mockito.withSettings;
|
@@ -61,4 +75,59 @@ void usesFinalizerIfThereIfReconcilerImplementsCleaner() {
|
61 | 75 |
|
62 | 76 | assertThat(controller.useFinalizer()).isTrue();
|
63 | 77 | }
|
| 78 | + |
| 79 | + @ParameterizedTest |
| 80 | + @CsvSource({ |
| 81 | + "true, true, true, false", |
| 82 | + "true, true, false, true", |
| 83 | + "false, true, true, true", |
| 84 | + "false, true, false, true", |
| 85 | + "true, false, true, false", |
| 86 | + }) |
| 87 | + void callsCleanupOnWorkflowWhenHasCleanerAndReconcilerIsNotCleaner(boolean reconcilerIsCleaner, |
| 88 | + boolean workflowIsCleaner, |
| 89 | + boolean isExplicitWorkflowInvocation, |
| 90 | + boolean workflowCleanerExecuted) throws Exception { |
| 91 | + |
| 92 | + Reconciler reconciler; |
| 93 | + if (reconcilerIsCleaner) { |
| 94 | + reconciler = mock(Reconciler.class, withSettings().extraInterfaces(Cleaner.class)); |
| 95 | + } else { |
| 96 | + reconciler = mock(Reconciler.class); |
| 97 | + } |
| 98 | + |
| 99 | + final var configuration = MockControllerConfiguration.forResource(Secret.class); |
| 100 | + |
| 101 | + if (reconciler instanceof Cleaner<?> cleaner) { |
| 102 | + when(cleaner.cleanup(any(), any())).thenReturn(DeleteControl.noFinalizerRemoval()); |
| 103 | + } |
| 104 | + |
| 105 | + var configurationService = mock(ConfigurationService.class); |
| 106 | + var mockWorkflowFactory = mock(ManagedWorkflowFactory.class); |
| 107 | + var mockManagedWorkflow = mock(ManagedWorkflow.class); |
| 108 | + |
| 109 | + when(configuration.getConfigurationService()).thenReturn(configurationService); |
| 110 | + var workflowSpec = mock(WorkflowSpec.class); |
| 111 | + when(workflowSpec.isExplicitInvocation()).thenReturn(isExplicitWorkflowInvocation); |
| 112 | + when(configuration.getWorkflowSpec()).thenReturn(Optional.of(workflowSpec)); |
| 113 | + when(configurationService.getMetrics()).thenReturn(NOOP); |
| 114 | + when(configurationService.getWorkflowFactory()).thenReturn(mockWorkflowFactory); |
| 115 | + when(mockWorkflowFactory.workflowFor(any())).thenReturn(mockManagedWorkflow); |
| 116 | + var managedWorkflowMock = workflow(workflowIsCleaner); |
| 117 | + when(mockManagedWorkflow.resolve(any(), any())).thenReturn(managedWorkflowMock); |
| 118 | + |
| 119 | + final var controller = new Controller<Secret>(reconciler, configuration, |
| 120 | + MockKubernetesClient.client(Secret.class)); |
| 121 | + |
| 122 | + controller.cleanup(new Secret(), new DefaultContext<>(null, controller, new Secret())); |
| 123 | + |
| 124 | + verify(managedWorkflowMock, times(workflowCleanerExecuted ? 1 : 0)).cleanup(any(), any()); |
| 125 | + } |
| 126 | + |
| 127 | + private Workflow workflow(boolean hasCleaner) { |
| 128 | + var workflow = mock(Workflow.class); |
| 129 | + when(workflow.cleanup(any(), any())).thenReturn(mock(WorkflowCleanupResult.class)); |
| 130 | + when(workflow.hasCleaner()).thenReturn(hasCleaner); |
| 131 | + return workflow; |
| 132 | + } |
64 | 133 | }
|
0 commit comments