You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by he...@apache.org on 2022/10/22 00:38:24 UTC

[brooklyn-server] branch master updated (b35bab6dcd -> fdfc806cda)

This is an automated email from the ASF dual-hosted git repository.

heneveld pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/brooklyn-server.git


    from b35bab6dcd workflow basic expiry, and more workflow fixes
     new 7fce67194f add fail and goto steps, and accept step as keyword for shorthand
     new fdfc806cda fix error message with recent task builder change

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../core/workflow/WorkflowStepResolution.java      |  7 +-
 .../core/workflow/steps/FailWorkflowStep.java      | 77 ++++++++++++++++++++++
 ...turnWorkflowStep.java => GotoWorkflowStep.java} | 13 ++--
 .../brooklyn/util/core/task/TaskBuilder.java       |  6 +-
 .../brooklyn/core/workflow/WorkflowBasicTest.java  |  2 +
 .../workflow/WorkflowInputOutputExtensionTest.java |  7 +-
 .../workflow/WorkflowPersistReplayErrorsTest.java  | 12 ++++
 karaf/init/src/main/resources/catalog.bom          | 10 +++
 8 files changed, 119 insertions(+), 15 deletions(-)
 create mode 100644 core/src/main/java/org/apache/brooklyn/core/workflow/steps/FailWorkflowStep.java
 copy core/src/main/java/org/apache/brooklyn/core/workflow/steps/{ReturnWorkflowStep.java => GotoWorkflowStep.java} (76%)


[brooklyn-server] 01/02: add fail and goto steps, and accept step as keyword for shorthand

Posted by he...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

heneveld pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/brooklyn-server.git

commit 7fce67194f261d2b41cfd4b508170bad21216cc8
Author: Alex Heneveld <al...@cloudsoft.io>
AuthorDate: Sat Oct 22 01:29:23 2022 +0100

    add fail and goto steps, and accept step as keyword for shorthand
---
 .../core/workflow/WorkflowStepResolution.java      |  7 +-
 .../core/workflow/steps/FailWorkflowStep.java      | 77 ++++++++++++++++++++++
 .../core/workflow/steps/GotoWorkflowStep.java      | 51 ++++++++++++++
 .../brooklyn/core/workflow/WorkflowBasicTest.java  |  2 +
 .../workflow/WorkflowInputOutputExtensionTest.java |  7 +-
 .../workflow/WorkflowPersistReplayErrorsTest.java  | 12 ++++
 karaf/init/src/main/resources/catalog.bom          | 10 +++
 7 files changed, 159 insertions(+), 7 deletions(-)

diff --git a/core/src/main/java/org/apache/brooklyn/core/workflow/WorkflowStepResolution.java b/core/src/main/java/org/apache/brooklyn/core/workflow/WorkflowStepResolution.java
index 464f7f217f..b38667f315 100644
--- a/core/src/main/java/org/apache/brooklyn/core/workflow/WorkflowStepResolution.java
+++ b/core/src/main/java/org/apache/brooklyn/core/workflow/WorkflowStepResolution.java
@@ -57,13 +57,14 @@ public class WorkflowStepResolution {
             defM = MutableMap.copyOf((Map)def);
             if (!defM.containsKey("type")) {
                 // if there isn't a type, pull out shorthand
-                Object s = defM.remove("shorthand");
+                Object s = defM.remove("step");
+                if (s == null) s = defM.remove("shorthand");
                 if (s == null) s = defM.remove("s");
                 if (s == null) {
-                    throw new IllegalArgumentException("Step definition must indicate a `type` or a `shorthand` / `s`");
+                    throw new IllegalArgumentException("Step definition must indicate a `type` or a `step` / `shorthand` / `s`");
                 }
                 if (!(s instanceof String)) {
-                    throw new IllegalArgumentException("shorthand must be a string");
+                    throw new IllegalArgumentException("step shorthand must be a string");
                 }
                 shorthand = (String) s;
             }
diff --git a/core/src/main/java/org/apache/brooklyn/core/workflow/steps/FailWorkflowStep.java b/core/src/main/java/org/apache/brooklyn/core/workflow/steps/FailWorkflowStep.java
new file mode 100644
index 0000000000..95b4698c58
--- /dev/null
+++ b/core/src/main/java/org/apache/brooklyn/core/workflow/steps/FailWorkflowStep.java
@@ -0,0 +1,77 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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 org.apache.brooklyn.core.workflow.steps;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.sun.org.apache.bcel.internal.generic.RET;
+import org.apache.brooklyn.config.ConfigKey;
+import org.apache.brooklyn.core.config.ConfigKeys;
+import org.apache.brooklyn.core.workflow.WorkflowStepDefinition;
+import org.apache.brooklyn.core.workflow.WorkflowStepInstanceExecutionContext;
+import org.apache.brooklyn.util.text.Strings;
+
+public class FailWorkflowStep extends WorkflowStepDefinition {
+
+    public static final String SHORTHAND = "[ ?${rethrow} \"rethrow\" ] [ \"message\" ${message...} ]";
+
+    public static final ConfigKey<Boolean> RETHROW = ConfigKeys.newBooleanConfigKey("rethrow");
+    public static final ConfigKey<String> MESSAGE = ConfigKeys.newStringConfigKey("message");
+
+    @Override
+    public void populateFromShorthand(String expression) {
+        populateFromShorthandTemplate(SHORTHAND, expression);
+    }
+
+    @Override
+    protected Object doTaskBody(WorkflowStepInstanceExecutionContext context) {
+        Boolean rethrow = context.getInput(RETHROW);
+        String message = context.getInput(MESSAGE);
+        boolean hasError = context.getError() != null;
+        Throwable cause = context.getError();
+        if (cause==null && Boolean.TRUE.equals(rethrow)) cause = new IllegalArgumentException("Fail specified with rethrow but no contextual error available");
+        if (Boolean.FALSE.equals(rethrow)) cause = null;
+
+        if (Strings.isBlank(message) && cause instanceof RuntimeException) {
+            throw (RuntimeException) cause;
+        }
+        if (Strings.isBlank(message) && cause instanceof Error) {
+            throw (Error) cause;
+        }
+
+        throw new WorkflowFailException(message, cause);
+    }
+
+
+    public static class WorkflowFailException extends RuntimeException {
+        public WorkflowFailException() {
+        }
+
+        public WorkflowFailException(String message) {
+            super(message);
+        }
+
+        public WorkflowFailException(String message, Throwable cause) {
+            super(message, cause);
+        }
+
+        public WorkflowFailException(Throwable cause) {
+            super(cause);
+        }
+    }
+}
diff --git a/core/src/main/java/org/apache/brooklyn/core/workflow/steps/GotoWorkflowStep.java b/core/src/main/java/org/apache/brooklyn/core/workflow/steps/GotoWorkflowStep.java
new file mode 100644
index 0000000000..73b72f010b
--- /dev/null
+++ b/core/src/main/java/org/apache/brooklyn/core/workflow/steps/GotoWorkflowStep.java
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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 org.apache.brooklyn.core.workflow.steps;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import org.apache.brooklyn.config.ConfigKey;
+import org.apache.brooklyn.core.config.ConfigKeys;
+import org.apache.brooklyn.core.workflow.WorkflowStepDefinition;
+import org.apache.brooklyn.core.workflow.WorkflowStepInstanceExecutionContext;
+
+public class GotoWorkflowStep extends WorkflowStepDefinition {
+
+    public static final String SHORTHAND = "${next}";
+
+    @Override
+    public void populateFromShorthand(String expression) {
+        populateFromShorthandTemplate(SHORTHAND, expression);
+        Object next = input.remove("next");
+        if (next instanceof String) { this.next = (String)next; }
+        else throw new IllegalArgumentException("Shorthand should point to the next step");
+    }
+
+    @JsonIgnore
+    @Override
+    public String getNext() {
+        if (next==null) throw new IllegalStateException("next is required for goto step");
+        return next;
+    }
+
+    @Override
+    protected Object doTaskBody(WorkflowStepInstanceExecutionContext context) {
+        return context.getPreviousStepOutput();
+    }
+
+}
diff --git a/core/src/test/java/org/apache/brooklyn/core/workflow/WorkflowBasicTest.java b/core/src/test/java/org/apache/brooklyn/core/workflow/WorkflowBasicTest.java
index 073b477c2f..86cc36012d 100644
--- a/core/src/test/java/org/apache/brooklyn/core/workflow/WorkflowBasicTest.java
+++ b/core/src/test/java/org/apache/brooklyn/core/workflow/WorkflowBasicTest.java
@@ -89,6 +89,8 @@ public class WorkflowBasicTest extends BrooklynMgmtUnitTestSupport {
         addRegisteredTypeBean(mgmt, "clear-workflow-variable", ClearVariableWorkflowStep.class);
         addRegisteredTypeBean(mgmt, "wait", WaitWorkflowStep.class);
         addRegisteredTypeBean(mgmt, "return", ReturnWorkflowStep.class);
+        addRegisteredTypeBean(mgmt, "goto", GotoWorkflowStep.class);
+        addRegisteredTypeBean(mgmt, "fail", FailWorkflowStep.class);
         addRegisteredTypeBean(mgmt, "invoke-effector", InvokeEffectorWorkflowStep.class);
 
         addRegisteredTypeBean(mgmt, "retry", RetryWorkflowStep.class);
diff --git a/core/src/test/java/org/apache/brooklyn/core/workflow/WorkflowInputOutputExtensionTest.java b/core/src/test/java/org/apache/brooklyn/core/workflow/WorkflowInputOutputExtensionTest.java
index 43e9cf732a..13ed23191e 100644
--- a/core/src/test/java/org/apache/brooklyn/core/workflow/WorkflowInputOutputExtensionTest.java
+++ b/core/src/test/java/org/apache/brooklyn/core/workflow/WorkflowInputOutputExtensionTest.java
@@ -315,15 +315,14 @@ public class WorkflowInputOutputExtensionTest extends BrooklynMgmtUnitTestSuppor
     public void testAccessLocalOutput() throws Exception {
         Object output = invokeWorkflowStepsWithLogging(MutableList.of(
                 MutableMap.of("id" , "l1",
-                        "s", "let x = ${x} + ${workflow.step.l1.output.prev} ?? 1",
+                        "step", "let x = ${x} + ${workflow.step.l1.output.prev} ?? 1",
                         "output", MutableMap.of("prev", "${x}")),
                 "log ${x}",
                 MutableMap.of(
-                        "s", "let x = ${x} + 2 * ${prev}",
+                        "step", "let x = ${x} + 2 * ${prev}",
                         "output", MutableMap.of("prev", "${x}")),
                 "log ${x}",
-                MutableMap.of("type" , "no-op",
-                        "next", "l1",
+                MutableMap.of("step" , "goto l1",
                         "condition", MutableMap.of("target", "${x}", "less-than", 10)),
                 "return ${workflow.step.l1.output.prev}"
         ));
diff --git a/core/src/test/java/org/apache/brooklyn/core/workflow/WorkflowPersistReplayErrorsTest.java b/core/src/test/java/org/apache/brooklyn/core/workflow/WorkflowPersistReplayErrorsTest.java
index b68d8bbb83..3c86216a9e 100644
--- a/core/src/test/java/org/apache/brooklyn/core/workflow/WorkflowPersistReplayErrorsTest.java
+++ b/core/src/test/java/org/apache/brooklyn/core/workflow/WorkflowPersistReplayErrorsTest.java
@@ -659,4 +659,16 @@ public class WorkflowPersistReplayErrorsTest extends RebindTestFixture<BasicAppl
         );
     }
 
+    @Test
+    public void testFail() {
+        Task<?> out = runSteps(
+                MutableList.of("fail message wtf"),
+                null,
+                ConfigBag.newInstance().configure(WorkflowCommonConfig.ON_ERROR,
+                        MutableList.of(MutableMap.of("step", "return Yay WTF",
+                                "condition", MutableMap.of("error-cause", MutableMap.of("regex", ".*Fail.*wtf.*")))))
+        );
+        Asserts.assertEquals(out.getUnchecked(), "Yay WTF");
+    }
+
 }
diff --git a/karaf/init/src/main/resources/catalog.bom b/karaf/init/src/main/resources/catalog.bom
index 5242ed6e58..bd9472ea1d 100644
--- a/karaf/init/src/main/resources/catalog.bom
+++ b/karaf/init/src/main/resources/catalog.bom
@@ -134,6 +134,16 @@ brooklyn.catalog:
     itemType: bean
     item:
       type: org.apache.brooklyn.core.workflow.steps.ReturnWorkflowStep
+  - id: goto
+    format: java-type-name
+    itemType: bean
+    item:
+      type: org.apache.brooklyn.core.workflow.steps.GotoWorkflowStep
+  - id: fail
+    format: java-type-name
+    itemType: bean
+    item:
+      type: org.apache.brooklyn.core.workflow.steps.FailWorkflowStep
 
   - id: workflow
     format: java-type-name


[brooklyn-server] 02/02: fix error message with recent task builder change

Posted by he...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

heneveld pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/brooklyn-server.git

commit fdfc806cda0242b03ec5de1be1b0f4e0cff2a6f6
Author: Alex Heneveld <al...@cloudsoft.io>
AuthorDate: Sat Oct 22 01:37:58 2022 +0100

    fix error message with recent task builder change
---
 .../main/java/org/apache/brooklyn/util/core/task/TaskBuilder.java   | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/core/src/main/java/org/apache/brooklyn/util/core/task/TaskBuilder.java b/core/src/main/java/org/apache/brooklyn/util/core/task/TaskBuilder.java
index 069903f728..97ea74cf7e 100644
--- a/core/src/main/java/org/apache/brooklyn/util/core/task/TaskBuilder.java
+++ b/core/src/main/java/org/apache/brooklyn/util/core/task/TaskBuilder.java
@@ -158,8 +158,10 @@ public class TaskBuilder<T> {
         if (description!=null) taskFlags.put("description", description);
         if (!tags.isEmpty()) {
             Object otherTags = taskFlags.put("tags", tags);
-            if (otherTags instanceof Collection) tags.addAll((Collection)otherTags);
-            else log.warn("Ignoring unexpected 'tags' flag in task: "+otherTags);
+            if (otherTags!=null) {
+                if (otherTags instanceof Collection) tags.addAll((Collection) otherTags);
+                else log.warn("Ignoring unexpected 'tags' flag in task: " + otherTags);
+            }
         }
         
         if (Boolean.FALSE.equals(dynamic) && children.isEmpty()) {