diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9af21ff715..4bb57c0f81 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -29,7 +29,7 @@ jobs: - name: Set up Minikube uses: manusa/actions-setup-minikube@v2.0.1 with: - minikube version: 'v1.15.0' + minikube version: 'v1.15.1' kubernetes version: ${{ matrix.kubernetes }} driver: 'docker' - name: Run integration tests diff --git a/operator-framework/src/main/java/io/javaoperatorsdk/operator/ControllerUtils.java b/operator-framework/src/main/java/io/javaoperatorsdk/operator/ControllerUtils.java index baaa7d798b..ee55c152f3 100644 --- a/operator-framework/src/main/java/io/javaoperatorsdk/operator/ControllerUtils.java +++ b/operator-framework/src/main/java/io/javaoperatorsdk/operator/ControllerUtils.java @@ -16,23 +16,27 @@ public class ControllerUtils { private final static double JAVA_VERSION = Double.parseDouble(System.getProperty("java.specification.version")); - - private final static Logger log = LoggerFactory.getLogger(ControllerUtils.class); + private static final String FINALIZER_NAME_SUFFIX = "/finalizer"; // this is just to support testing, this way we don't try to create class multiple times in memory with same name. // note that other solution is to add a random string to doneable class name private static Map, Class>> doneableClassCache = new HashMap<>(); - static String getDefaultFinalizer(ResourceController controller) { - return getAnnotation(controller).finalizerName(); + static String getFinalizer(ResourceController controller) { + final String annotationFinalizerName = getAnnotation(controller).finalizerName(); + if (!Controller.NULL.equals(annotationFinalizerName)) { + return annotationFinalizerName; + } + final String crdName = getAnnotation(controller).crdName() + FINALIZER_NAME_SUFFIX; + return crdName; } static boolean getGenerationEventProcessing(ResourceController controller) { return getAnnotation(controller).generationAwareEventProcessing(); } - static Class getCustomResourceClass(ResourceController controller) { + static Class getCustomResourceClass(ResourceController controller) { return (Class) getAnnotation(controller).customResourceClass(); } @@ -79,10 +83,7 @@ private static Controller getAnnotation(ResourceController controller) { return controller.getClass().getAnnotation(Controller.class); } - public static boolean hasDefaultFinalizer(CustomResource resource, String finalizer) { - if (resource.getMetadata().getFinalizers() != null) { - return resource.getMetadata().getFinalizers().contains(finalizer); - } - return false; + public static boolean hasGivenFinalizer(CustomResource resource, String finalizer) { + return resource.getMetadata().getFinalizers() != null && resource.getMetadata().getFinalizers().contains(finalizer); } } diff --git a/operator-framework/src/main/java/io/javaoperatorsdk/operator/Operator.java b/operator-framework/src/main/java/io/javaoperatorsdk/operator/Operator.java index 655849a644..73e03a44c2 100644 --- a/operator-framework/src/main/java/io/javaoperatorsdk/operator/Operator.java +++ b/operator-framework/src/main/java/io/javaoperatorsdk/operator/Operator.java @@ -55,7 +55,7 @@ private void registerController(ResourceController Class resClass = ControllerUtils.getCustomResourceClass(controller); CustomResourceDefinitionContext crd = getCustomResourceDefinitionForController(controller); KubernetesDeserializer.registerCustomKind(crd.getVersion(), crd.getKind(), resClass); - String finalizer = ControllerUtils.getDefaultFinalizer(controller); + String finalizer = ControllerUtils.getFinalizer(controller); MixedOperation client = k8sClient.customResources(crd, resClass, CustomResourceList.class, ControllerUtils.getCustomResourceDoneableClass(controller)); EventDispatcher eventDispatcher = new EventDispatcher(controller, finalizer, new EventDispatcher.CustomResourceFacade(client), ControllerUtils.getGenerationEventProcessing(controller)); diff --git a/operator-framework/src/main/java/io/javaoperatorsdk/operator/api/Controller.java b/operator-framework/src/main/java/io/javaoperatorsdk/operator/api/Controller.java index a2aba33cb7..9edec45c75 100644 --- a/operator-framework/src/main/java/io/javaoperatorsdk/operator/api/Controller.java +++ b/operator-framework/src/main/java/io/javaoperatorsdk/operator/api/Controller.java @@ -10,14 +10,17 @@ @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE}) public @interface Controller { - - String DEFAULT_FINALIZER = "operator.default.finalizer"; + String NULL = ""; String crdName(); Class customResourceClass(); - String finalizerName() default DEFAULT_FINALIZER; + /** + * Optional finalizer name, if it is not, + * the crdName will be used as the name of the finalizer too. + */ + String finalizerName() default NULL; /** * If true, will dispatch new event to the controller if generation increased since the last processing, otherwise will diff --git a/operator-framework/src/main/java/io/javaoperatorsdk/operator/api/ResourceController.java b/operator-framework/src/main/java/io/javaoperatorsdk/operator/api/ResourceController.java index 15c464a3cd..822a5f508d 100644 --- a/operator-framework/src/main/java/io/javaoperatorsdk/operator/api/ResourceController.java +++ b/operator-framework/src/main/java/io/javaoperatorsdk/operator/api/ResourceController.java @@ -6,7 +6,7 @@ public interface ResourceController { /** * The implementation should delete the associated component(s). Note that this is method is called when an object - * is marked for deletion. After its executed the default finalizer is automatically removed by the framework; + * is marked for deletion. After its executed the custom resource finalizer is automatically removed by the framework; * unless the return value is false - note that this is almost never the case. * Its important to have the implementation also idempotent, in the current implementation to cover all edge cases * actually will be executed mostly twice. @@ -27,5 +27,4 @@ public interface ResourceController { * However we will always call an update if there is no finalizer on object and its not marked for deletion. */ UpdateControl createOrUpdateResource(R resource, Context context); - } diff --git a/operator-framework/src/main/java/io/javaoperatorsdk/operator/processing/EventDispatcher.java b/operator-framework/src/main/java/io/javaoperatorsdk/operator/processing/EventDispatcher.java index 11cc350ad1..2b102e8471 100644 --- a/operator-framework/src/main/java/io/javaoperatorsdk/operator/processing/EventDispatcher.java +++ b/operator-framework/src/main/java/io/javaoperatorsdk/operator/processing/EventDispatcher.java @@ -21,17 +21,17 @@ public class EventDispatcher { private final static Logger log = LoggerFactory.getLogger(EventDispatcher.class); private final ResourceController controller; - private final String resourceDefaultFinalizer; + private final String resourceFinalizer; private final CustomResourceFacade customResourceFacade; private final boolean generationAware; private final Map lastGenerationProcessedSuccessfully = new ConcurrentHashMap<>(); public EventDispatcher(ResourceController controller, - String defaultFinalizer, + String finalizer, CustomResourceFacade customResourceFacade, boolean generationAware) { this.controller = controller; this.customResourceFacade = customResourceFacade; - this.resourceDefaultFinalizer = defaultFinalizer; + this.resourceFinalizer = finalizer; this.generationAware = generationAware; } @@ -43,24 +43,24 @@ public void handleEvent(CustomResourceEvent event) { log.error("Received error for resource: {}", resource.getMetadata().getName()); return; } - if (markedForDeletion(resource) && !ControllerUtils.hasDefaultFinalizer(resource, resourceDefaultFinalizer)) { - log.debug("Skipping event dispatching since its marked for deletion but has no default finalizer: {}", event); + if (markedForDeletion(resource) && !ControllerUtils.hasGivenFinalizer(resource, resourceFinalizer)) { + log.debug("Skipping event dispatching since its marked for deletion but does not have finalizer: {}", event); return; } Context context = new DefaultContext(new RetryInfo(event.getRetryCount(), event.getRetryExecution().isLastExecution())); if (markedForDeletion(resource)) { boolean removeFinalizer = controller.deleteResource(resource, context); - boolean hasDefaultFinalizer = ControllerUtils.hasDefaultFinalizer(resource, resourceDefaultFinalizer); - if (removeFinalizer && hasDefaultFinalizer) { - removeDefaultFinalizer(resource); + boolean hasFinalizer = ControllerUtils.hasGivenFinalizer(resource, resourceFinalizer); + if (removeFinalizer && hasFinalizer) { + removeFinalizer(resource); } else { - log.debug("Skipping finalizer remove. removeFinalizer: {}, hasDefaultFinalizer: {} ", - removeFinalizer, hasDefaultFinalizer); + log.debug("Skipping finalizer remove. removeFinalizer: {}, hasFinalizer: {} ", + removeFinalizer, hasFinalizer); } cleanup(resource); } else { - if (!ControllerUtils.hasDefaultFinalizer(resource, resourceDefaultFinalizer) && !markedForDeletion(resource)) { - /* We always add the default finalizer if missing and not marked for deletion. + if (!ControllerUtils.hasGivenFinalizer(resource, resourceFinalizer) && !markedForDeletion(resource)) { + /* We always add a finalizer if missing and not marked for deletion. We execute the controller processing only for processing the event sent as a results of the finalizer add. This will make sure that the resources are not created before there is a finalizer. @@ -118,9 +118,9 @@ private void updateCustomResource(CustomResource updatedResource) { } - private void removeDefaultFinalizer(CustomResource resource) { + private void removeFinalizer(CustomResource resource) { log.debug("Removing finalizer on resource {}:", resource); - resource.getMetadata().getFinalizers().remove(resourceDefaultFinalizer); + resource.getMetadata().getFinalizers().remove(resourceFinalizer); customResourceFacade.replaceWithLock(resource); } @@ -130,12 +130,12 @@ private void replace(CustomResource resource) { } private void addFinalizerIfNotPresent(CustomResource resource) { - if (!ControllerUtils.hasDefaultFinalizer(resource, resourceDefaultFinalizer) && !markedForDeletion(resource)) { - log.info("Adding default finalizer to {}", resource.getMetadata()); + if (!ControllerUtils.hasGivenFinalizer(resource, resourceFinalizer) && !markedForDeletion(resource)) { + log.info("Adding finalizer {} to {}", resourceFinalizer, resource.getMetadata()); if (resource.getMetadata().getFinalizers() == null) { resource.getMetadata().setFinalizers(new ArrayList<>(1)); } - resource.getMetadata().getFinalizers().add(resourceDefaultFinalizer); + resource.getMetadata().getFinalizers().add(resourceFinalizer); } } diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/ControllerExecutionIT.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/ControllerExecutionIT.java index 0cf0478342..e20492103a 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/ControllerExecutionIT.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/ControllerExecutionIT.java @@ -21,7 +21,6 @@ @TestInstance(TestInstance.Lifecycle.PER_METHOD) public class ControllerExecutionIT { - private final static Logger log = LoggerFactory.getLogger(ControllerExecutionIT.class); public static final String TEST_CUSTOM_RESOURCE_NAME = "test-custom-resource"; private IntegrationTestSupport integrationTestSupport = new IntegrationTestSupport(); diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/ControllerUtilsTest.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/ControllerUtilsTest.java index d0a143e427..4c8b48a009 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/ControllerUtilsTest.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/ControllerUtilsTest.java @@ -1,23 +1,46 @@ package io.javaoperatorsdk.operator; -import io.javaoperatorsdk.operator.sample.TestCustomResource; -import io.javaoperatorsdk.operator.sample.TestCustomResourceController; import io.fabric8.kubernetes.client.CustomResourceDoneable; +import io.javaoperatorsdk.operator.api.Context; import io.javaoperatorsdk.operator.api.Controller; +import io.javaoperatorsdk.operator.api.ResourceController; +import io.javaoperatorsdk.operator.api.UpdateControl; +import io.javaoperatorsdk.operator.sample.TestCustomResource; +import io.javaoperatorsdk.operator.sample.TestCustomResourceController; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.*; class ControllerUtilsTest { + public static final String CUSTOM_FINALIZER_NAME = "a.custom/finalizer"; + @Test public void returnsValuesFromControllerAnnotationFinalizer() { - Assertions.assertEquals(Controller.DEFAULT_FINALIZER, ControllerUtils.getDefaultFinalizer(new TestCustomResourceController(null))); + Assertions.assertEquals(TestCustomResourceController.CRD_NAME + "/finalizer", ControllerUtils.getFinalizer(new TestCustomResourceController(null))); assertEquals(TestCustomResource.class, ControllerUtils.getCustomResourceClass(new TestCustomResourceController(null))); Assertions.assertEquals(TestCustomResourceController.CRD_NAME, ControllerUtils.getCrdName(new TestCustomResourceController(null))); - assertEquals(false, ControllerUtils.getGenerationEventProcessing(new TestCustomResourceController(null))); + assertFalse(ControllerUtils.getGenerationEventProcessing(new TestCustomResourceController(null))); assertTrue(CustomResourceDoneable.class.isAssignableFrom(ControllerUtils.getCustomResourceDoneableClass(new TestCustomResourceController(null)))); } + + @Controller(crdName = "test.crd", customResourceClass = TestCustomResource.class, finalizerName = CUSTOM_FINALIZER_NAME) + static class TestCustomFinalizerController implements ResourceController { + + @Override + public boolean deleteResource(TestCustomResource resource, Context context) { + return false; + } + + @Override + public UpdateControl createOrUpdateResource(TestCustomResource resource, Context context) { + return null; + } + } + + @Test + public void returnCustomerFinalizerNameIfSet() { + assertEquals(CUSTOM_FINALIZER_NAME, ControllerUtils.getFinalizer(new TestCustomFinalizerController())); + } } diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/EventDispatcherTest.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/EventDispatcherTest.java index 9509880bf3..eb120fbdb7 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/EventDispatcherTest.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/EventDispatcherTest.java @@ -20,15 +20,16 @@ class EventDispatcherTest { + public static final String FINALIZER_NAME = "finalizer"; private CustomResource testCustomResource; private EventDispatcher eventDispatcher; - private ResourceController controller = mock(ResourceController.class); - private EventDispatcher.CustomResourceFacade customResourceFacade = mock(EventDispatcher.CustomResourceFacade.class); + private final ResourceController controller = mock(ResourceController.class); + private final EventDispatcher.CustomResourceFacade customResourceFacade = mock(EventDispatcher.CustomResourceFacade.class); @BeforeEach void setup() { eventDispatcher = new EventDispatcher(controller, - Controller.DEFAULT_FINALIZER, customResourceFacade, false); + FINALIZER_NAME, customResourceFacade, false); testCustomResource = getResource(); @@ -45,7 +46,7 @@ void callCreateOrUpdateOnNewResource() { @Test void updatesOnlyStatusSubResource() { - testCustomResource.getMetadata().getFinalizers().add(Controller.DEFAULT_FINALIZER); + testCustomResource.getMetadata().getFinalizers().add(FINALIZER_NAME); when(controller.createOrUpdateResource(eq(testCustomResource), any())) .thenReturn(UpdateControl.updateStatusSubResource(testCustomResource)); @@ -63,17 +64,17 @@ void callCreateOrUpdateOnModifiedResource() { } @Test - void adsDefaultFinalizerOnCreateIfNotThere() { + void addsFinalizerOnCreateIfNotThere() { eventDispatcher.handleEvent(customResourceEvent(Watcher.Action.MODIFIED, testCustomResource)); verify(controller, times(1)) .createOrUpdateResource(argThat(testCustomResource -> - testCustomResource.getMetadata().getFinalizers().contains(Controller.DEFAULT_FINALIZER)), any()); + testCustomResource.getMetadata().getFinalizers().contains(FINALIZER_NAME)), any()); } @Test void callsDeleteIfObjectHasFinalizerAndMarkedForDelete() { testCustomResource.getMetadata().setDeletionTimestamp("2019-8-10"); - testCustomResource.getMetadata().getFinalizers().add(Controller.DEFAULT_FINALIZER); + testCustomResource.getMetadata().getFinalizers().add(FINALIZER_NAME); eventDispatcher.handleEvent(customResourceEvent(Watcher.Action.MODIFIED, testCustomResource)); @@ -84,7 +85,7 @@ void callsDeleteIfObjectHasFinalizerAndMarkedForDelete() { * Note that there could be more finalizers. Out of our control. */ @Test - void callDeleteOnControllerIfMarkedForDeletionButThereIsNoDefaultFinalizer() { + void callDeleteOnControllerIfMarkedForDeletionButThereIsNoFinalizer() { markForDeletion(testCustomResource); eventDispatcher.handleEvent(customResourceEvent(Watcher.Action.MODIFIED, testCustomResource)); @@ -93,7 +94,7 @@ void callDeleteOnControllerIfMarkedForDeletionButThereIsNoDefaultFinalizer() { } @Test - void removesDefaultFinalizerOnDelete() { + void removesFinalizerOnDelete() { markForDeletion(testCustomResource); eventDispatcher.handleEvent(customResourceEvent(Watcher.Action.MODIFIED, testCustomResource)); @@ -172,9 +173,8 @@ void doesNotMarkNewGenerationInCaseOfException() { .thenThrow(new IllegalStateException("Exception for testing purposes")) .thenReturn(UpdateControl.noUpdate()); - Assertions.assertThrows(IllegalStateException.class, () -> { - eventDispatcher.handleEvent(customResourceEvent(Watcher.Action.MODIFIED, testCustomResource)); - }); + Assertions.assertThrows(IllegalStateException.class, () -> + eventDispatcher.handleEvent(customResourceEvent(Watcher.Action.MODIFIED, testCustomResource))); eventDispatcher.handleEvent(customResourceEvent(Watcher.Action.MODIFIED, testCustomResource)); verify(controller, times(2)).createOrUpdateResource(eq(testCustomResource), any()); @@ -183,7 +183,7 @@ void doesNotMarkNewGenerationInCaseOfException() { void generationAwareMode() { eventDispatcher = new EventDispatcher(controller, - Controller.DEFAULT_FINALIZER, customResourceFacade, true); + FINALIZER_NAME, customResourceFacade, true); } private void markForDeletion(CustomResource customResource) { @@ -202,7 +202,7 @@ CustomResource getResource() { .withDeletionGracePeriodSeconds(10L) .withGeneration(10L) .withName("name") - .withFinalizers(Controller.DEFAULT_FINALIZER) + .withFinalizers(FINALIZER_NAME) .withNamespace("namespace") .withResourceVersion("resourceVersion") .withSelfLink("selfLink") diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/EventSchedulerTest.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/EventSchedulerTest.java index 106b81df11..2cbd5343c8 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/EventSchedulerTest.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/EventSchedulerTest.java @@ -1,16 +1,15 @@ package io.javaoperatorsdk.operator; +import io.fabric8.kubernetes.api.model.ObjectMetaBuilder; +import io.fabric8.kubernetes.client.CustomResource; +import io.fabric8.kubernetes.client.Watcher; import io.javaoperatorsdk.operator.processing.CustomResourceEvent; import io.javaoperatorsdk.operator.processing.EventDispatcher; import io.javaoperatorsdk.operator.processing.EventScheduler; import io.javaoperatorsdk.operator.processing.retry.GenericRetry; import io.javaoperatorsdk.operator.sample.TestCustomResource; -import io.fabric8.kubernetes.api.model.ObjectMetaBuilder; -import io.fabric8.kubernetes.client.CustomResource; -import io.fabric8.kubernetes.client.Watcher; import org.assertj.core.api.Condition; import org.junit.jupiter.api.Test; -import org.mockito.ArgumentMatcher; import org.mockito.ArgumentMatchers; import org.mockito.invocation.InvocationOnMock; import org.slf4j.Logger; @@ -31,12 +30,10 @@ class EventSchedulerTest { public static final int INVOCATION_DURATION = 80; public static final int MAX_RETRY_ATTEMPTS = 3; - @SuppressWarnings("unchecked") - private EventDispatcher eventDispatcher = mock(EventDispatcher.class); - - private EventScheduler eventScheduler = initScheduler(); - private List eventProcessingList = Collections.synchronizedList(new ArrayList<>()); + private final EventDispatcher eventDispatcher = mock(EventDispatcher.class); + private final EventScheduler eventScheduler = initScheduler(); + private final List eventProcessingList = Collections.synchronizedList(new ArrayList<>()); @Test @@ -54,7 +51,7 @@ public void schedulesEvent() { } @Test - public void eventsAreNotExecutedConcurrentlyForSameResource() throws InterruptedException { + public void eventsAreNotExecutedConcurrentlyForSameResource() { normalDispatcherExecution(); CustomResource resource1 = sampleResource(); CustomResource resource2 = sampleResource(); @@ -141,18 +138,8 @@ public void processesNewEventIfItIsReceivedAfterExecutionInError() { CustomResource resource2 = sampleResource(); resource2.getMetadata().setResourceVersion("2"); - doAnswer(this::exceptionInExecution).when(eventDispatcher).handleEvent(ArgumentMatchers.argThat(new ArgumentMatcher() { - @Override - public boolean matches(CustomResourceEvent event) { - return event.getResource().equals(resource1); - } - })); - doAnswer(this::normalExecution).when(eventDispatcher).handleEvent(ArgumentMatchers.argThat(new ArgumentMatcher() { - @Override - public boolean matches(CustomResourceEvent event) { - return event.getResource().equals(resource2); - } - })); + doAnswer(this::exceptionInExecution).when(eventDispatcher).handleEvent(ArgumentMatchers.argThat(event -> event.getResource().equals(resource1))); + doAnswer(this::normalExecution).when(eventDispatcher).handleEvent(ArgumentMatchers.argThat(event -> event.getResource().equals(resource2))); eventScheduler.eventReceived(Watcher.Action.MODIFIED, resource1); eventScheduler.eventReceived(Watcher.Action.MODIFIED, resource2); @@ -203,9 +190,6 @@ private Object normalExecution(InvocationOnMock invocation) { } - - - private EventScheduler initScheduler() { return new EventScheduler(eventDispatcher, new GenericRetry().setMaxAttempts(MAX_RETRY_ATTEMPTS).withLinearRetry()); } @@ -262,11 +246,11 @@ CustomResource sampleResource() { } private static class EventProcessingDetail { - private Watcher.Action action; - private LocalDateTime startTime; - private LocalDateTime endTime; - private CustomResource customResource; - private Exception exception; + private final Watcher.Action action; + private final LocalDateTime startTime; + private final LocalDateTime endTime; + private final CustomResource customResource; + private final Exception exception; public EventProcessingDetail(Watcher.Action action, LocalDateTime startTime, LocalDateTime endTime, CustomResource customResource, Exception exception) { this.action = action; @@ -281,42 +265,14 @@ public EventProcessingDetail(Watcher.Action action, LocalDateTime startTime, Loc this(action, startTime, endTime, customResource, null); } - public LocalDateTime getStartTime() { - return startTime; - } - - public EventProcessingDetail setStartTime(LocalDateTime startTime) { - this.startTime = startTime; - return this; - } - public LocalDateTime getEndTime() { return endTime; } - public EventProcessingDetail setEndTime(LocalDateTime endTime) { - this.endTime = endTime; - return this; - } - public CustomResource getCustomResource() { return customResource; } - public EventProcessingDetail setCustomResource(CustomResource customResource) { - this.customResource = customResource; - return this; - } - - public Watcher.Action getAction() { - return action; - } - - public EventProcessingDetail setAction(Watcher.Action action) { - this.action = action; - return this; - } - public Exception getException() { return exception; } diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/IntegrationTestSupport.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/IntegrationTestSupport.java index b9bd2f6f69..2c6e0274ce 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/IntegrationTestSupport.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/IntegrationTestSupport.java @@ -53,7 +53,7 @@ public void initialize(KubernetesClient k8sClient, ResourceController controller } operator = new Operator(k8sClient); operator.registerController(controller, TEST_NAMESPACE); - log.info("Operator is running with TestCustomeResourceController"); + log.info("Operator is running with {}", controller.getClass().getCanonicalName()); } public CustomResourceDefinition loadCRDAndApplyToCluster(String classPathYaml) { @@ -107,7 +107,7 @@ public void teardownIfSuccess(TestRun test) { if (namespace.getStatus().getPhase().equals("Active")) { k8sClient.namespaces().withName(TEST_NAMESPACE).delete(); } - await("namespace deleted").atMost(30, TimeUnit.SECONDS) + await("namespace deleted").atMost(45, TimeUnit.SECONDS) .until(() -> k8sClient.namespaces().withName(TEST_NAMESPACE).get() == null); } catch (Exception e) { throw new IllegalStateException(e); diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/SubResourceUpdateIT.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/SubResourceUpdateIT.java index c070fab162..540001c5e1 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/SubResourceUpdateIT.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/SubResourceUpdateIT.java @@ -68,7 +68,7 @@ public void ifNoFinalizerPresentFirstAddsTheFinalizerThenExecutesControllerAgain * If this would not happen (no optimistic locking on status sub-resource) we could receive and store an event * while processing the controller method. But this event would always fail since its resource version is outdated * already. - * */ + */ @Test public void updateCustomResourceAfterSubResourceChange() { integrationTestSupport.teardownIfSuccess(() -> { @@ -104,7 +104,7 @@ public SubResourceTestCustomResource createTestCustomResource(String id) { resource.setMetadata(new ObjectMetaBuilder() .withName("subresource-" + id) .withNamespace(TEST_NAMESPACE) - .withFinalizers(Controller.DEFAULT_FINALIZER) + .withFinalizers(SubResourceTestCustomResourceController.FINALIZER_NAME) .build()); resource.setKind("SubresourceSample"); resource.setSpec(new SubResourceTestCustomResourceSpec()); diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/TestCustomResourceController.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/TestCustomResourceController.java index d272563537..9f27896914 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/TestCustomResourceController.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/TestCustomResourceController.java @@ -25,6 +25,7 @@ public class TestCustomResourceController implements ResourceController createOrUpdateResource(TestCustomResource resource, Context context) { numberOfExecutions.addAndGet(1); - if (!resource.getMetadata().getFinalizers().contains(Controller.DEFAULT_FINALIZER)) { + if (!resource.getMetadata().getFinalizers().contains(FINALIZER_NAME)) { throw new IllegalStateException("Finalizer is not present."); } diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/subresource/SubResourceTestCustomResourceController.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/subresource/SubResourceTestCustomResourceController.java index a08076e472..9b47305490 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/subresource/SubResourceTestCustomResourceController.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/subresource/SubResourceTestCustomResourceController.java @@ -18,8 +18,9 @@ public class SubResourceTestCustomResourceController implements ResourceControll TestExecutionInfoProvider { public static final String CRD_NAME = "subresourcesample.sample.javaoperatorsdk"; + public static final String FINALIZER_NAME = CRD_NAME + "/finalizer"; private static final Logger log = LoggerFactory.getLogger(SubResourceTestCustomResourceController.class); - private AtomicInteger numberOfExecutions = new AtomicInteger(0); + private final AtomicInteger numberOfExecutions = new AtomicInteger(0); @Override public boolean deleteResource(SubResourceTestCustomResource resource, Context context) { @@ -30,7 +31,7 @@ public boolean deleteResource(SubResourceTestCustomResource resource, Context createOrUpdateResource(SubResourceTestCustomResource resource, Context context) { numberOfExecutions.addAndGet(1); - if (!resource.getMetadata().getFinalizers().contains(Controller.DEFAULT_FINALIZER)) { + if (!resource.getMetadata().getFinalizers().contains(FINALIZER_NAME)) { throw new IllegalStateException("Finalizer is not present."); } log.info("Value: " + resource.getSpec().getValue());