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 50f18e1f27a6112cd19cfcbd9f3737ccf8758ce7 Author: Alex Heneveld <[email protected]> AuthorDate: Wed Mar 29 16:28:41 2023 +0100 fix workflow policy resumption --- .../brooklyn/camp/brooklyn/WorkflowYamlTest.java | 28 +++++++++++++++++++++- .../brooklyn/core/workflow/WorkflowPolicy.java | 4 ++-- 2 files changed, 29 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 765fe6eb2f..888433ba0e 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 @@ -41,6 +41,7 @@ import org.apache.brooklyn.core.config.ConfigKeys; import org.apache.brooklyn.core.entity.*; import org.apache.brooklyn.core.entity.lifecycle.Lifecycle; import org.apache.brooklyn.core.entity.trait.Startable; +import org.apache.brooklyn.core.policy.AbstractPolicy; import org.apache.brooklyn.core.sensor.Sensors; import org.apache.brooklyn.core.test.BrooklynAppUnitTestSupport; import org.apache.brooklyn.core.test.entity.TestApplication; @@ -77,6 +78,7 @@ import java.util.Arrays; import java.util.Collection; import java.util.List; import java.util.Map; +import java.util.function.Consumer; import java.util.function.Predicate; import static org.apache.brooklyn.util.core.internal.ssh.ExecCmdAsserts.assertExecContains; @@ -210,6 +212,24 @@ public class WorkflowYamlTest extends AbstractYamlTest { doTestWorkflowPolicy("triggers: theTrigger", Duration.seconds(1)::isLongerThan); } + @Test(groups="Integration") + public void testWorkflowPolicyTriggerSuspendResume() throws Exception { + doTestWorkflowPolicy("triggers: theTrigger", Duration.seconds(1)::isLongerThan, policy -> { + Entity entity = ((EntityAdjuncts.EntityAdjunctProxyable) policy).getEntity(); + entity.sensors().set(MY_WORKFLOW_SENSOR, MutableMap.of("v", 10)); + entity.sensors().set(Sensors.newStringSensor("theTrigger"), "go2"); + EntityAsserts.assertAttributeEqualsEventually(MutableMap.of("timeout", "3s"), entity, MY_WORKFLOW_SENSOR, MutableMap.of("foo", "bar", "v", 11)); + policy.suspend(); + entity.sensors().set(Sensors.newStringSensor("theTrigger"), "go3"); + Time.sleep(Duration.millis(100)); + // not triggered + EntityAsserts.assertAttributeEquals(entity, MY_WORKFLOW_SENSOR, MutableMap.of("foo", "bar", "v", 11)); + policy.resume(); + entity.sensors().set(Sensors.newStringSensor("theTrigger"), "go4"); + EntityAsserts.assertAttributeEqualsEventually(MutableMap.of("timeout", "3s"), entity, MY_WORKFLOW_SENSOR, MutableMap.of("foo", "bar", "v", 12)); + }); + } + @Test(groups="Integration") // because delay public void testWorkflowPolicyPeriod() throws Exception { doTestWorkflowPolicy("period: 2s", Duration.seconds(2)::isShorterThan); @@ -280,6 +300,10 @@ public class WorkflowYamlTest extends AbstractYamlTest { } public void doTestWorkflowPolicy(String triggers, Predicate<Duration> timeCheckOrNullIfShouldFail) throws Exception { + doTestWorkflowPolicy(triggers, timeCheckOrNullIfShouldFail, null); + } + + public void doTestWorkflowPolicy(String triggers, Predicate<Duration> timeCheckOrNullIfShouldFail, Consumer<Policy> extraChecks) throws Exception { Entity app = createAndStartApplication( "services:", "- type: " + BasicEntity.class.getName(), @@ -321,7 +345,7 @@ public class WorkflowYamlTest extends AbstractYamlTest { // EntityAsserts.assertAttributeEqualsEventually(entity, s, MutableMap.of("foo", "bar", "v", 0)); entity.sensors().set(Sensors.newStringSensor("theTrigger"), "go"); - EntityAsserts.assertAttributeEqualsEventually(entity, MY_WORKFLOW_SENSOR, MutableMap.of("foo", "bar", "v", 0)); + EntityAsserts.assertAttributeEqualsEventually(MutableMap.of("timeout", "5s"), entity, MY_WORKFLOW_SENSOR, MutableMap.of("foo", "bar", "v", 0)); // EntityAsserts.assertAttributeEqualsEventually(entity, s, MutableMap.of("foo", "bar", "v", 1)); Duration d3 = Duration.of(sw).subtract(d2); // the next iteration should obey the time constraint specified above @@ -329,6 +353,8 @@ public class WorkflowYamlTest extends AbstractYamlTest { } else { EntityAsserts.assertAttributeEqualsContinually(entity, MY_WORKFLOW_SENSOR, null); } + + if (extraChecks!=null) extraChecks.accept(policy); } ClassLogWatcher lastLogWatcher; diff --git a/core/src/main/java/org/apache/brooklyn/core/workflow/WorkflowPolicy.java b/core/src/main/java/org/apache/brooklyn/core/workflow/WorkflowPolicy.java index 037bd1e555..9acd3f8a89 100644 --- a/core/src/main/java/org/apache/brooklyn/core/workflow/WorkflowPolicy.java +++ b/core/src/main/java/org/apache/brooklyn/core/workflow/WorkflowPolicy.java @@ -147,9 +147,9 @@ public class WorkflowPolicy<T> extends AbstractPolicy { @Override public void resume() { - boolean wasSuspended = isSuspended(); + boolean needsStarting = !poller.isRunning() || isSuspended(); super.resume(); - if (!wasSuspended) poller.start(); + if (needsStarting) poller.start(); } }
