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);
+        }
+    }
+}

Reply via email to