Repository: incubator-brooklyn
Updated Branches:
  refs/heads/master 4b02716b0 -> 320c1c752


copy-state CLI: use BrooklynMementoRawData


Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo
Commit: 
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/82ddabb0
Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/82ddabb0
Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/82ddabb0

Branch: refs/heads/master
Commit: 82ddabb013e3114195b53c8a9afc05e5459d2155
Parents: bba5f3e
Author: Aled Sage <[email protected]>
Authored: Thu Sep 11 13:00:26 2014 +0100
Committer: Aled Sage <[email protected]>
Committed: Thu Sep 18 10:13:04 2014 +0100

----------------------------------------------------------------------
 .../brooklyn/entity/rebind/RebindManager.java   |   3 +-
 .../entity/rebind/RebindManagerImpl.java        | 103 +++++++++----------
 .../entity/rebind/dto/BrooklynMementoImpl.java  |   4 +-
 .../NonDeploymentManagementContext.java         |   4 +-
 usage/cli/src/main/java/brooklyn/cli/Main.java  |   8 +-
 .../brooklyn/launcher/BrooklynLauncher.java     |   8 +-
 .../BrooklynLauncherRebindTestToFiles.java      |   7 +-
 7 files changed, 65 insertions(+), 72 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/82ddabb0/api/src/main/java/brooklyn/entity/rebind/RebindManager.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/brooklyn/entity/rebind/RebindManager.java 
b/api/src/main/java/brooklyn/entity/rebind/RebindManager.java
index 7df2edd..5c5d972 100644
--- a/api/src/main/java/brooklyn/entity/rebind/RebindManager.java
+++ b/api/src/main/java/brooklyn/entity/rebind/RebindManager.java
@@ -26,6 +26,7 @@ import java.util.concurrent.TimeoutException;
 import brooklyn.entity.Application;
 import brooklyn.mementos.BrooklynMemento;
 import brooklyn.mementos.BrooklynMementoPersister;
+import brooklyn.mementos.BrooklynMementoRawData;
 import brooklyn.util.time.Duration;
 
 import com.google.common.annotations.VisibleForTesting;
@@ -66,7 +67,7 @@ public interface RebindManager {
 
     public List<Application> rebind(ClassLoader classLoader, 
RebindExceptionHandler exceptionHandler) throws IOException;
 
-    public BrooklynMemento retrieveMemento(ClassLoader classLoader) throws 
IOException;
+    public BrooklynMementoRawData retrieveMementoRawData() throws IOException;
 
     public ChangeListener getChangeListener();
 

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/82ddabb0/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 2b4d4f8..70c2452 100644
--- a/core/src/main/java/brooklyn/entity/rebind/RebindManagerImpl.java
+++ b/core/src/main/java/brooklyn/entity/rebind/RebindManagerImpl.java
@@ -44,6 +44,7 @@ import brooklyn.entity.proxying.InternalEntityFactory;
 import brooklyn.entity.proxying.InternalFactory;
 import brooklyn.entity.proxying.InternalLocationFactory;
 import brooklyn.entity.proxying.InternalPolicyFactory;
+import brooklyn.entity.rebind.persister.BrooklynMementoPersisterToObjectStore;
 import brooklyn.internal.BrooklynFeatureEnablement;
 import brooklyn.location.Location;
 import brooklyn.location.basic.AbstractLocation;
@@ -54,6 +55,7 @@ import brooklyn.mementos.BrooklynMemento;
 import brooklyn.mementos.BrooklynMementoManifest;
 import brooklyn.mementos.BrooklynMementoPersister;
 import brooklyn.mementos.BrooklynMementoPersister.LookupContext;
+import brooklyn.mementos.BrooklynMementoRawData;
 import brooklyn.mementos.EnricherMemento;
 import brooklyn.mementos.EntityMemento;
 import brooklyn.mementos.LocationMemento;
@@ -273,22 +275,15 @@ public class RebindManagerImpl implements RebindManager {
     }
     
     @Override
-    public BrooklynMemento retrieveMemento(ClassLoader classLoader) throws 
IOException {
+    public BrooklynMementoRawData retrieveMementoRawData() throws IOException {
         RebindExceptionHandler exceptionHandler = 
RebindExceptionHandlerImpl.builder()
                 .danglingRefFailureMode(danglingRefFailureMode)
                 .rebindFailureMode(rebindFailureMode)
                 .addPolicyFailureMode(addPolicyFailureMode)
                 .loadPolicyFailureMode(loadPolicyFailureMode)
                 .build();
-        RebindContextImpl rebindContext = new 
RebindContextImpl(exceptionHandler, classLoader);
-        BrooklynMementoManifest mementoManifest = 
persister.loadMementoManifest(exceptionHandler);
         
-        RebindTracker.setRebinding();
-        try {
-            return retrieveMemento(classLoader, exceptionHandler, 
rebindContext, mementoManifest);
-        } finally {
-            RebindTracker.reset();
-        }
+        return loadMementoRawData(exceptionHandler);
     }
 
     /**
@@ -296,28 +291,61 @@ public class RebindManagerImpl implements RebindManager {
      * 
      * In so doing, it instantiates the entities + locations, registering them 
with the rebindContext.
      */
-    protected BrooklynMemento retrieveMemento(final ClassLoader classLoader, 
final RebindExceptionHandler exceptionHandler, RebindContextImpl rebindContext, 
BrooklynMementoManifest mementoManifest) throws IOException {
+    protected BrooklynMementoRawData loadMementoRawData(final 
RebindExceptionHandler exceptionHandler) throws IOException {
+        try {
+            if (!(persister instanceof BrooklynMementoPersisterToObjectStore)) 
{
+                throw new IllegalStateException("Cannot load raw memento with 
persister "+persister);
+            }
+            
+            return 
((BrooklynMementoPersisterToObjectStore)persister).loadMementoRawData(exceptionHandler);
+            
+        } catch (RuntimeException e) {
+            throw exceptionHandler.onFailed(e);
+        }
+    }
+
+    protected List<Application> rebindImpl(final ClassLoader classLoader, 
final RebindExceptionHandler exceptionHandler) throws IOException {
         checkNotNull(classLoader, "classLoader");
 
+        RebindTracker.setRebinding();
         try {
             Reflections reflections = new Reflections(classLoader);
-            
+            RebindContextImpl rebindContext = new 
RebindContextImpl(exceptionHandler, classLoader);
             LookupContext realLookupContext = new 
RebindContextLookupContext(managementContext, rebindContext, exceptionHandler);
             
-            // Two-phase deserialization.
+            // Mutli-phase deserialization.
             //  1. deserialize just the "manifest" to find all instances (and 
their types).
-            //     (this is now passed in; we are just left with instantiating 
the instances that may be cross-referenced.
-            //  2. deserialize so that inter-entity references can be set (and 
entity config/state is set).
+            //  2. instantiate entities+locations so that inter-entity 
references can subsequently be set during deserialize (and entity config/state 
is set).
+            //  3. deserialize the memento
+            //  4. instantiate policies+enrichers (could perhaps merge this 
with (2), depending how they are implemented)
+            //  5. reconstruct the entities etc (i.e. calling init on the 
already-instantiated instances).
+            //  6. add policies+enrichers to all the entities.
+            //  7. manage the entities
             
             // TODO if underlying data-store is changed between first and 
second phase (e.g. to add an
             // entity), then second phase might try to reconstitute an entity 
that has not been put in
             // the rebindContext. This should not affect normal production 
usage, because rebind is run
             // against a data-store that is not being written to by other 
brooklyn instance(s).
+
             
             //
             // PHASE ONE
             //
             
+            BrooklynMementoManifest mementoManifest = 
persister.loadMementoManifest(exceptionHandler);
+            
+            boolean isEmpty = mementoManifest.isEmpty();
+            if (!isEmpty) {
+                LOG.info("Rebinding from 
"+getPersister().getBackingStoreDescription()+"...");
+            } else {
+                LOG.info("Rebind check: no existing state; will persist new 
items to "+getPersister().getBackingStoreDescription());
+            }
+
+            
+            //
+            // PHASE TWO
+            //
+            
             // Instantiate locations
             LOG.debug("RebindManager instantiating locations: {}", 
mementoManifest.getLocationIdToType().keySet());
             for (Map.Entry<String, String> entry : 
mementoManifest.getLocationIdToType().entrySet()) {
@@ -348,53 +376,18 @@ public class RebindManagerImpl implements RebindManager {
                 }
             }
             
-            //
-            // PHASE TWO
-            //
-            
-            return persister.loadMemento(realLookupContext, exceptionHandler);
-            
-        } catch (RuntimeException e) {
-            throw exceptionHandler.onFailed(e);
-        }
-    }
-    
-    protected List<Application> rebindImpl(final ClassLoader classLoader, 
final RebindExceptionHandler exceptionHandler) throws IOException {
-        checkNotNull(classLoader, "classLoader");
-
-        RebindTracker.setRebinding();
-        try {
-            Reflections reflections = new Reflections(classLoader);
-            RebindContextImpl rebindContext = new 
RebindContextImpl(exceptionHandler, classLoader);
-            
-            // Five-phase deserialization.
-            //  1. deserialize just the "manifest" to find all instances (and 
their types).
-            //  2. deserialize so that inter-entity references can be set (and 
entity config/state is set).
-            //  3. reconstruct the entities etc (i.e. calling init on the 
already-instantiated instances).
-            //  4. add policies+enrichers to all the entities.
-            //  5. manage the entities
-            
             
             //
-            // PHASE ONE
+            // PHASE THREE
             //
             
-            BrooklynMementoManifest mementoManifest = 
persister.loadMementoManifest(exceptionHandler);
-            
-            boolean isEmpty = mementoManifest.isEmpty();
-            if (!isEmpty) {
-                LOG.info("Rebinding from 
"+getPersister().getBackingStoreDescription()+"...");
-            } else {
-                LOG.info("Rebind check: no existing state; will persist new 
items to "+getPersister().getBackingStoreDescription());
-            }
+            BrooklynMemento memento = persister.loadMemento(realLookupContext, 
exceptionHandler);
 
             
             //
-            // PHASE TWO CONTINUED...
+            // PHASE FOUR
             //
             
-            BrooklynMemento memento = retrieveMemento(classLoader, 
exceptionHandler, rebindContext, mementoManifest);
-            
             // Instantiate policies
             if (persistPoliciesEnabled) {
                 LOG.debug("RebindManager instantiating policies: {}", 
memento.getPolicyIds());
@@ -431,7 +424,7 @@ public class RebindManagerImpl implements RebindManager {
             
             
             //
-            // PHASE THREE
+            // PHASE FIVE
             //
             
             // Reconstruct locations
@@ -515,7 +508,7 @@ public class RebindManagerImpl implements RebindManager {
 
             
             //
-            // PHASE FOUR
+            // PHASE SIX
             //
             
             // Associate policies+enrichers with entities
@@ -540,7 +533,7 @@ public class RebindManagerImpl implements RebindManager {
             
             
             //
-            // PHASE FIVE
+            // PHASE SEVEN
             //
 
             LOG.debug("RebindManager managing locations");

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/82ddabb0/core/src/main/java/brooklyn/entity/rebind/dto/BrooklynMementoImpl.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/brooklyn/entity/rebind/dto/BrooklynMementoImpl.java 
b/core/src/main/java/brooklyn/entity/rebind/dto/BrooklynMementoImpl.java
index 732b7ce..f9e8ab4 100644
--- a/core/src/main/java/brooklyn/entity/rebind/dto/BrooklynMementoImpl.java
+++ b/core/src/main/java/brooklyn/entity/rebind/dto/BrooklynMementoImpl.java
@@ -59,10 +59,10 @@ public class BrooklynMementoImpl implements 
BrooklynMemento, Serializable {
         public Builder applicationId(String val) {
             applicationIds.add(val); return this;
         }
-        public Builder applicationIds(List<String> vals) {
+        public Builder applicationIds(Collection<String> vals) {
             applicationIds.addAll(vals); return this;
         }
-        public Builder topLevelLocationIds(List<String> vals) {
+        public Builder topLevelLocationIds(Collection<String> vals) {
             topLevelLocationIds.addAll(vals); return this;
         }
         public void memento(Memento memento) {

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/82ddabb0/core/src/main/java/brooklyn/management/internal/NonDeploymentManagementContext.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/brooklyn/management/internal/NonDeploymentManagementContext.java
 
b/core/src/main/java/brooklyn/management/internal/NonDeploymentManagementContext.java
index e60a9bd..cc2c916 100644
--- 
a/core/src/main/java/brooklyn/management/internal/NonDeploymentManagementContext.java
+++ 
b/core/src/main/java/brooklyn/management/internal/NonDeploymentManagementContext.java
@@ -64,8 +64,8 @@ import brooklyn.management.ha.ManagementNodeState;
 import brooklyn.management.ha.ManagementPlaneSyncRecord;
 import brooklyn.management.ha.ManagementPlaneSyncRecordPersister;
 import brooklyn.management.ha.OsgiManager;
-import brooklyn.mementos.BrooklynMemento;
 import brooklyn.mementos.BrooklynMementoPersister;
+import brooklyn.mementos.BrooklynMementoRawData;
 import brooklyn.util.guava.Maybe;
 import brooklyn.util.time.Duration;
 
@@ -469,7 +469,7 @@ public class NonDeploymentManagementContext implements 
ManagementContextInternal
             throw new IllegalStateException("Non-deployment context 
"+NonDeploymentManagementContext.this+" is not valid for this operation.");
         }
         @Override
-        public BrooklynMemento retrieveMemento(ClassLoader classLoader) {
+        public BrooklynMementoRawData retrieveMementoRawData() {
             throw new IllegalStateException("Non-deployment context 
"+NonDeploymentManagementContext.this+" is not valid for this operation.");
         }
     }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/82ddabb0/usage/cli/src/main/java/brooklyn/cli/Main.java
----------------------------------------------------------------------
diff --git a/usage/cli/src/main/java/brooklyn/cli/Main.java 
b/usage/cli/src/main/java/brooklyn/cli/Main.java
index 5a8c7d4..9f1df6e 100644
--- a/usage/cli/src/main/java/brooklyn/cli/Main.java
+++ b/usage/cli/src/main/java/brooklyn/cli/Main.java
@@ -53,7 +53,7 @@ import brooklyn.launcher.BrooklynServerDetails;
 import brooklyn.launcher.config.StopWhichAppsOnShutdown;
 import brooklyn.management.ManagementContext;
 import brooklyn.management.ha.HighAvailabilityMode;
-import brooklyn.mementos.BrooklynMemento;
+import brooklyn.mementos.BrooklynMementoRawData;
 import brooklyn.rest.security.PasswordHasher;
 import brooklyn.util.ResourceUtils;
 import brooklyn.util.exceptions.Exceptions;
@@ -682,11 +682,11 @@ public class Main extends AbstractMain {
         public String localBrooklynProperties;
 
         @Option(name = { "--persistenceDir" }, title = "persistence dir",
-                description = "The directory to read/write persisted state (or 
container name if using an object store)")
+                description = "The directory to read persisted state (or 
container name if using an object store)")
         public String persistenceDir;
 
         @Option(name = { "--persistenceLocation" }, title = "persistence 
location",
-            description = "The location spec for an object store to read/write 
persisted state")
+            description = "The location spec for an object store to read 
persisted state")
         public String persistenceLocation;
     
         @Option(name = { "--destinationDir" }, required = true, title = 
"destination dir",
@@ -724,7 +724,7 @@ public class Main extends AbstractMain {
             }
             
             try {
-                BrooklynMemento memento = launcher.retrieveState();
+                BrooklynMementoRawData memento = launcher.retrieveState();
                 launcher.persistState(memento, destinationDirF);
                 
             } catch (FatalRuntimeException e) {

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/82ddabb0/usage/launcher/src/main/java/brooklyn/launcher/BrooklynLauncher.java
----------------------------------------------------------------------
diff --git 
a/usage/launcher/src/main/java/brooklyn/launcher/BrooklynLauncher.java 
b/usage/launcher/src/main/java/brooklyn/launcher/BrooklynLauncher.java
index 3e7bbb2..7910b71 100644
--- a/usage/launcher/src/main/java/brooklyn/launcher/BrooklynLauncher.java
+++ b/usage/launcher/src/main/java/brooklyn/launcher/BrooklynLauncher.java
@@ -74,6 +74,7 @@ import 
brooklyn.management.ha.ManagementPlaneSyncRecordPersisterToObjectStore;
 import brooklyn.management.internal.LocalManagementContext;
 import brooklyn.management.internal.ManagementContextInternal;
 import brooklyn.mementos.BrooklynMemento;
+import brooklyn.mementos.BrooklynMementoRawData;
 import brooklyn.rest.BrooklynWebConfig;
 import brooklyn.rest.security.BrooklynPropertiesSecurityFilter;
 import brooklyn.util.exceptions.Exceptions;
@@ -431,7 +432,7 @@ public class BrooklynLauncher {
         return this;
     }
     
-    public BrooklynMemento retrieveState() {
+    public BrooklynMementoRawData retrieveState() {
         initManagementContext();
 
         try {
@@ -440,9 +441,8 @@ public class BrooklynLauncher {
             handleSubsystemStartupError(ignorePersistenceErrors, 
"persistence", e);
         }
 
-        ClassLoader classLoader = 
managementContext.getCatalog().getRootClassLoader();
         try {
-            return 
managementContext.getRebindManager().retrieveMemento(classLoader);
+            return 
managementContext.getRebindManager().retrieveMementoRawData();
             
         } catch (Exception e) {
             Exceptions.propagateIfFatal(e);
@@ -452,7 +452,7 @@ public class BrooklynLauncher {
         }
     }
 
-    public void persistState(BrooklynMemento memento, File destinationDir) {
+    public void persistState(BrooklynMementoRawData memento, File 
destinationDir) {
         initManagementContext();
         
         try {

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/82ddabb0/usage/launcher/src/test/java/brooklyn/launcher/BrooklynLauncherRebindTestToFiles.java
----------------------------------------------------------------------
diff --git 
a/usage/launcher/src/test/java/brooklyn/launcher/BrooklynLauncherRebindTestToFiles.java
 
b/usage/launcher/src/test/java/brooklyn/launcher/BrooklynLauncherRebindTestToFiles.java
index 20809fc..c40e61a 100644
--- 
a/usage/launcher/src/test/java/brooklyn/launcher/BrooklynLauncherRebindTestToFiles.java
+++ 
b/usage/launcher/src/test/java/brooklyn/launcher/BrooklynLauncherRebindTestToFiles.java
@@ -26,13 +26,12 @@ import org.testng.annotations.Test;
 
 import brooklyn.config.BrooklynProperties;
 import brooklyn.config.BrooklynServerConfig;
-import brooklyn.config.StringConfigMap;
 import brooklyn.entity.proxying.EntitySpec;
 import brooklyn.entity.rebind.persister.BrooklynMementoPersisterToObjectStore;
 import brooklyn.entity.rebind.persister.FileBasedObjectStore;
 import brooklyn.entity.rebind.persister.PersistMode;
 import brooklyn.management.ManagementContext;
-import brooklyn.mementos.BrooklynMemento;
+import brooklyn.mementos.BrooklynMementoRawData;
 import brooklyn.test.entity.TestApplication;
 import brooklyn.util.javalang.JavaClassNames;
 import brooklyn.util.os.Os;
@@ -120,11 +119,11 @@ public class BrooklynLauncherRebindTestToFiles extends 
BrooklynLauncherRebindTes
         try {
             // Auto will rebind if the dir exists
             BrooklynLauncher launcher = newLauncherDefault(PersistMode.AUTO);
-            BrooklynMemento memento = launcher.retrieveState();
+            BrooklynMementoRawData memento = launcher.retrieveState();
             launcher.persistState(memento, destinationDir);
             launcher.terminate();
             
-            assertEquals(memento.getApplicationIds().size(), 1, 
"apps="+memento.getApplicationIds());
+            assertEquals(memento.getEntities().size(), 1, 
"entityMementos="+memento.getEntities().keySet());
             
             // Should now have a usable copy in the destionationDir
             // Auto will rebind if the dir exists

Reply via email to