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 bf4d4f6784e4a4466ac17a9aa0f1ecee0e040bd2 Author: Alex Heneveld <[email protected]> AuthorDate: Thu Apr 13 17:48:55 2023 +0100 fix and test for sub-workflows not running in entity context and fixes other places where entities get converted to maps --- .../brooklyn/camp/brooklyn/WorkflowYamlTest.java | 54 ++++++++++++++++++++++ .../workflow/WorkflowExpressionResolution.java | 2 +- .../apache/brooklyn/util/collections/Jsonya.java | 4 +- 3 files changed, 57 insertions(+), 3 deletions(-) diff --git a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/WorkflowYamlTest.java b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/WorkflowYamlTest.java index 2624818432..51e4a1fe31 100644 --- a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/WorkflowYamlTest.java +++ b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/WorkflowYamlTest.java @@ -980,4 +980,58 @@ public class WorkflowYamlTest extends AbstractYamlTest { Asserts.assertEquals(Iterables.getOnlyElement(entity.getChildren()).getDisplayName(), "Test"); } + @Test + public void testSubWorkflowOnEntities() throws Exception { + Application app = createAndStartApplication( + "services:", + "- type: " + BasicEntity.class.getName(), + " id: child"); + + doTestSubWorkflowOnEntities(app, false, + "steps:", + " - type: workflow", + " target: $brooklyn:child(\"child\")", + " steps:", + " - set-sensor boolean ran = true", + " - return ${entity.id}"); + + doTestSubWorkflowOnEntities(app, true, + "steps:", + " - type: workflow", + " target:", + " - $brooklyn:child(\"child\")", + " steps:", + " - set-sensor boolean ran = true", + " - return ${entity.id}"); + + doTestSubWorkflowOnEntities(app, false, + "steps:", + " - step: let child = $brooklyn:child(\"child\")", + " - type: workflow", + " target: ${child}", + " steps:", + " - set-sensor boolean ran = true", + " - return ${entity.id}"); + + doTestSubWorkflowOnEntities(app, true, + "steps:", + " - step: let children", + " value:", + " - $brooklyn:child(\"child\")", + " - type: workflow", + " target: ${children}", + " steps:", + " - set-sensor boolean ran = true", + " - return ${entity.id}"); + } + + void doTestSubWorkflowOnEntities(Application app, boolean expectList, String ...steps) throws Exception { + Entity entity = Iterables.getOnlyElement(app.getChildren()); + entity.sensors().set(Sensors.newBooleanSensor("ran"), false); + WorkflowExecutionContext x = WorkflowBasicTest.runWorkflow(app, Strings.lines(steps), "test"); + Asserts.assertEquals(x.getTask(false).get().getUnchecked(), + expectList ? MutableList.of(entity.getId()) : entity.getId()); + EntityAsserts.assertAttributeEquals(entity, Sensors.newBooleanSensor("ran"), true); + } + } diff --git a/core/src/main/java/org/apache/brooklyn/core/workflow/WorkflowExpressionResolution.java b/core/src/main/java/org/apache/brooklyn/core/workflow/WorkflowExpressionResolution.java index b6b73dc4db..d9fad13f78 100644 --- a/core/src/main/java/org/apache/brooklyn/core/workflow/WorkflowExpressionResolution.java +++ b/core/src/main/java/org/apache/brooklyn/core/workflow/WorkflowExpressionResolution.java @@ -344,7 +344,7 @@ public class WorkflowExpressionResolution { /** does not use templates */ public <T> T resolveCoercingOnly(Object expression, TypeToken<T> type) { try { - if (expression==null || (Jsonya.isTypeJsonPrimitiveCompatible(expression) && !(expression instanceof Set))) { + if (expression==null || (Jsonya.isJsonPrimitiveDeep(expression) && !(expression instanceof Set))) { // only try yaml coercion, as values are normally set from yaml and will be raw at this stage (but not if they are from a DSL) // (might be better to always to TC.coerce) return BeanWithTypeUtils.convert(context.getManagementContext(), expression, type, true, diff --git a/utils/common/src/main/java/org/apache/brooklyn/util/collections/Jsonya.java b/utils/common/src/main/java/org/apache/brooklyn/util/collections/Jsonya.java index e74db77e66..b79d5ca0ae 100644 --- a/utils/common/src/main/java/org/apache/brooklyn/util/collections/Jsonya.java +++ b/utils/common/src/main/java/org/apache/brooklyn/util/collections/Jsonya.java @@ -117,8 +117,8 @@ public class Jsonya { public static boolean isJsonPrimitiveDeep(Object x) { if (x==null) return true; if (x instanceof String || Boxing.isPrimitiveOrBoxedObject(x)) return true; - if (x instanceof Map) return ((Map<?,?>)x).entrySet().stream().anyMatch(ent -> !isJsonPrimitiveDeep(ent.getKey()) || !isJsonPrimitiveDeep(ent.getValue())); - if (x instanceof Collection) return ((Collection)x).stream().anyMatch(ent -> !isJsonPrimitiveDeep(ent)); + if (x instanceof Map) return !((Map<?,?>)x).entrySet().stream().anyMatch(ent -> !isJsonPrimitiveDeep(ent.getKey()) || !isJsonPrimitiveDeep(ent.getValue())); + if (x instanceof Collection) return !((Collection)x).stream().anyMatch(ent -> !isJsonPrimitiveDeep(ent)); return false; }
