diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/NodeExecutor.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/NodeExecutor.java index e7a017a291..98756f7eb6 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/NodeExecutor.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/NodeExecutor.java @@ -15,10 +15,15 @@ */ package io.javaoperatorsdk.operator.processing.dependent.workflow; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import io.fabric8.kubernetes.api.model.HasMetadata; abstract class NodeExecutor implements Runnable { + private static final Logger log = LoggerFactory.getLogger(NodeExecutor.class); + private final DependentResourceNode dependentResourceNode; private final AbstractWorkflowExecutor

workflowExecutor; @@ -37,6 +42,10 @@ public void run() { } catch (Exception e) { // Exception is required because of Kotlin workflowExecutor.handleExceptionInExecutor(dependentResourceNode, e); + } catch (Error e) { + // without this user would see no sign about the error + log.error("java.lang.Error during execution", e); + throw e; } finally { workflowExecutor.handleNodeExecutionFinish(dependentResourceNode); } diff --git a/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/dependent/workflow/NodeExecutorTest.java b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/dependent/workflow/NodeExecutorTest.java new file mode 100644 index 0000000000..870bae9c58 --- /dev/null +++ b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/dependent/workflow/NodeExecutorTest.java @@ -0,0 +1,44 @@ +/* + * Copyright Java Operator SDK Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.javaoperatorsdk.operator.processing.dependent.workflow; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class NodeExecutorTest { + + private NodeExecutor errorThrowingNodeExecutor = + new NodeExecutor(null, null) { + @Override + protected void doRun(DependentResourceNode dependentResourceNode) { + throw new NoSuchFieldError(); + } + }; + + // for manual testing only to verify you can see the log message + @Disabled + @Test + void nodeExecutorLogsError() throws InterruptedException { + ExecutorService executorService = Executors.newSingleThreadExecutor(); + executorService.submit(errorThrowingNodeExecutor); + Thread.sleep(500); + } +}