Do rebind in a task - otherwise during loc.manage() can get errors, e.g. in JcloudsSshMachineLocation trying to obtain machine details by sshâing
Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/37a5e329 Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/37a5e329 Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/37a5e329 Branch: refs/heads/master Commit: 37a5e329e4cb60cbb859cf3c94eef15a26993135 Parents: 7bf9755 Author: Aled Sage <aled.s...@gmail.com> Authored: Tue Jun 3 01:39:11 2014 +0200 Committer: Aled Sage <aled.s...@gmail.com> Committed: Fri Jun 6 15:17:15 2014 +0200 ---------------------------------------------------------------------- .../entity/rebind/RebindManagerImpl.java | 23 +++++++++- .../entity/rebind/RebindManagerTest.java | 45 ++++++++++++++++++++ 2 files changed, 67 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/37a5e329/core/src/main/java/brooklyn/entity/rebind/RebindManagerImpl.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/brooklyn/entity/rebind/RebindManagerImpl.java b/core/src/main/java/brooklyn/entity/rebind/RebindManagerImpl.java index bf0f06e..2d76308 100644 --- a/core/src/main/java/brooklyn/entity/rebind/RebindManagerImpl.java +++ b/core/src/main/java/brooklyn/entity/rebind/RebindManagerImpl.java @@ -5,6 +5,7 @@ import static com.google.common.base.Preconditions.checkNotNull; import java.io.IOException; import java.util.List; import java.util.Map; +import java.util.concurrent.Callable; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; @@ -28,6 +29,7 @@ import brooklyn.internal.BrooklynFeatureEnablement; import brooklyn.location.Location; import brooklyn.location.basic.AbstractLocation; import brooklyn.location.basic.LocationInternal; +import brooklyn.management.Task; import brooklyn.management.internal.ManagementContextInternal; import brooklyn.mementos.BrooklynMemento; import brooklyn.mementos.BrooklynMementoManifest; @@ -45,6 +47,7 @@ import brooklyn.util.collections.MutableMap; import brooklyn.util.exceptions.Exceptions; import brooklyn.util.flags.FlagUtils; import brooklyn.util.javalang.Reflections; +import brooklyn.util.task.BasicExecutionContext; import brooklyn.util.time.Duration; import com.google.common.annotations.VisibleForTesting; @@ -177,9 +180,27 @@ public class RebindManagerImpl implements RebindManager { RebindExceptionHandler exceptionHandler = new RebindExceptionHandlerImpl(danglingRefFailureMode, rebindFailureMode); return rebind(classLoader, exceptionHandler); } - + @Override public List<Application> rebind(final ClassLoader classLoader, final RebindExceptionHandler exceptionHandler) throws IOException { + BasicExecutionContext ec = BasicExecutionContext.getCurrentExecutionContext(); + if (ec == null) { + ec = new BasicExecutionContext(managementContext.getExecutionManager()); + Task<List<Application>> task = ec.submit(new Callable<List<Application>>() { + @Override public List<Application> call() throws Exception { + return rebindImpl(classLoader, exceptionHandler); + }}); + try { + return task.get(); + } catch (Exception e) { + throw Exceptions.propagate(e); + } + } else { + return rebindImpl(classLoader, exceptionHandler); + } + } + + protected List<Application> rebindImpl(final ClassLoader classLoader, final RebindExceptionHandler exceptionHandler) throws IOException { checkNotNull(classLoader, "classLoader"); try { http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/37a5e329/core/src/test/java/brooklyn/entity/rebind/RebindManagerTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/brooklyn/entity/rebind/RebindManagerTest.java b/core/src/test/java/brooklyn/entity/rebind/RebindManagerTest.java new file mode 100644 index 0000000..7285c40 --- /dev/null +++ b/core/src/test/java/brooklyn/entity/rebind/RebindManagerTest.java @@ -0,0 +1,45 @@ +package brooklyn.entity.rebind; + +import static org.testng.Assert.assertEquals; + +import java.util.concurrent.Callable; + +import org.testng.annotations.Test; + +import brooklyn.entity.Entity; +import brooklyn.entity.proxying.EntitySpec; +import brooklyn.management.Task; +import brooklyn.test.entity.TestEntity; +import brooklyn.test.entity.TestEntityImpl; +import brooklyn.util.task.BasicTask; +import brooklyn.util.task.DynamicTasks; + +import com.google.common.base.Predicates; +import com.google.common.collect.Iterables; + +public class RebindManagerTest extends RebindTestFixtureWithApp { + + @Test + public void testRebindingEntityCanCallTask() throws Exception { + origApp.createAndManageChild(EntitySpec.create(TestEntity.class).impl(TestEntityWithTaskInRebind.class)); + + newApp = rebind(); + Entity newEntity = Iterables.find(newApp.getChildren(), Predicates.instanceOf(TestEntity.class)); + assertEquals(newEntity.getAttribute(TestEntity.NAME), "abc"); + } + public static class TestEntityWithTaskInRebind extends TestEntityImpl { + @Override + public void rebind() { + super.rebind(); + Task<String> task = new BasicTask<String>(new Callable<String>() { + @Override public String call() { + return "abc"; + }}); + String val = DynamicTasks.queueIfPossible(task) + .orSubmitAsync() + .asTask() + .getUnchecked(); + setAttribute(TestEntity.NAME, val); + } + } +}