You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by tb...@apache.org on 2018/06/01 10:00:47 UTC

[1/5] brooklyn-server git commit: Persisting entity: don’t persist its adjuncts every time

Repository: brooklyn-server
Updated Branches:
  refs/heads/master 36cb70d2d -> 6f093c71f


Persisting entity: don’t persist its adjuncts every time

Project: http://git-wip-us.apache.org/repos/asf/brooklyn-server/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-server/commit/492ebd58
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-server/tree/492ebd58
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-server/diff/492ebd58

Branch: refs/heads/master
Commit: 492ebd58552b8f691ee22e0dd76e535fea56ef2c
Parents: ff38a5c
Author: Aled Sage <al...@gmail.com>
Authored: Wed May 23 10:47:24 2018 +0100
Committer: Aled Sage <al...@gmail.com>
Committed: Thu May 24 12:24:13 2018 +0100

----------------------------------------------------------------------
 .../core/BrooklynFeatureEnablement.java         | 12 ++++++
 .../mgmt/internal/EntityChangeListener.java     |  1 +
 .../rebind/PeriodicDeltaChangeListener.java     | 39 +++++++++++++++++++-
 3 files changed, 51 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/492ebd58/core/src/main/java/org/apache/brooklyn/core/BrooklynFeatureEnablement.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/BrooklynFeatureEnablement.java b/core/src/main/java/org/apache/brooklyn/core/BrooklynFeatureEnablement.java
index 939a15d..8c142d8 100644
--- a/core/src/main/java/org/apache/brooklyn/core/BrooklynFeatureEnablement.java
+++ b/core/src/main/java/org/apache/brooklyn/core/BrooklynFeatureEnablement.java
@@ -59,6 +59,17 @@ public class BrooklynFeatureEnablement {
 
     public static final String FEATURE_FEED_PERSISTENCE_PROPERTY = FEATURE_PROPERTY_PREFIX+".feedPersistence";
     
+    /**
+     * When persisting an entity that changes, whether to persist its adjuncts and locations 
+     * (i.e. its enrichers, policies, feeds and locations).
+     * 
+     * This was previously the default behaviour, which meant that (legacy) java-based Brooklyn objects
+     * (e.g. entities, locations, policies, enrichers or feeds) could get away with bad practices and 
+     * still be persisted. For example, they could change 'state' without telling the listener, and hope
+     * that the entity they were attached to would soon persist (thus piggy-backing off it).
+     */
+    public static final String FEATURE_REFERENCED_OBJECTS_PERSISTENCE_PROPERTY = FEATURE_PROPERTY_PREFIX+".referencedObjectsPersistence";
+    
     /** whether feeds are automatically registered when set on entities, so that they are persisted */
     public static final String FEATURE_FEED_REGISTRATION_PROPERTY = FEATURE_PROPERTY_PREFIX+".feedRegistration";
 
@@ -150,6 +161,7 @@ public class BrooklynFeatureEnablement {
         setDefault(FEATURE_FEED_REGISTRATION_PROPERTY, false);
         setDefault(FEATURE_BUNDLE_PERSISTENCE_PROPERTY, true);
         setDefault(FEATURE_CATALOG_PERSISTENCE_PROPERTY, true);
+        setDefault(FEATURE_REFERENCED_OBJECTS_PERSISTENCE_PROPERTY, false);
         setDefault(FEATURE_DEFAULT_STANDBY_IS_HOT_PROPERTY, false);
         setDefault(FEATURE_PERSIST_ENTITY_SPEC_AS_SUPPLIER, true);
         setDefault(FEATURE_RENAME_THREADS, false);

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/492ebd58/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/EntityChangeListener.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/EntityChangeListener.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/EntityChangeListener.java
index b7f53a4..a0f5d73 100644
--- a/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/EntityChangeListener.java
+++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/EntityChangeListener.java
@@ -29,6 +29,7 @@ public interface EntityChangeListener {
 
     // TODO for testing only!
     public static final EntityChangeListener NOOP = new EntityChangeListener() {
+        @Override public String toString() { return "EntityChangeListener.NOOP"; }
         @Override public void onChanged() {}
         @Override public void onAttributeChanged(AttributeSensor<?> attribute) {}
         @Override public void onConfigChanged(ConfigKey<?> key) {}

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/492ebd58/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/PeriodicDeltaChangeListener.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/PeriodicDeltaChangeListener.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/PeriodicDeltaChangeListener.java
index e4b2d7d..349f47f 100644
--- a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/PeriodicDeltaChangeListener.java
+++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/PeriodicDeltaChangeListener.java
@@ -195,6 +195,7 @@ public class PeriodicDeltaChangeListener implements ChangeListener {
     private final boolean persistPoliciesEnabled;
     private final boolean persistEnrichersEnabled;
     private final boolean persistFeedsEnabled;
+    private final boolean persistReferencedObjectsEnabled;
     
     private final Semaphore persistingMutex = new Semaphore(1);
     private final Object startStopMutex = new Object();
@@ -222,6 +223,7 @@ public class PeriodicDeltaChangeListener implements ChangeListener {
         this.persistPoliciesEnabled = BrooklynFeatureEnablement.isEnabled(BrooklynFeatureEnablement.FEATURE_POLICY_PERSISTENCE_PROPERTY);
         this.persistEnrichersEnabled = BrooklynFeatureEnablement.isEnabled(BrooklynFeatureEnablement.FEATURE_ENRICHER_PERSISTENCE_PROPERTY);
         this.persistFeedsEnabled = BrooklynFeatureEnablement.isEnabled(BrooklynFeatureEnablement.FEATURE_FEED_PERSISTENCE_PROPERTY);
+        this.persistReferencedObjectsEnabled = BrooklynFeatureEnablement.isEnabled(BrooklynFeatureEnablement.FEATURE_REFERENCED_OBJECTS_PERSISTENCE_PROPERTY);
     }
     
     public void start() {
@@ -355,6 +357,11 @@ public class PeriodicDeltaChangeListener implements ChangeListener {
         return state == ListenerState.STOPPING || state == ListenerState.STOPPED || executionContext.isShutdown();
     }
     
+    /**
+     * @deprecated since 1.0.0; its use is enabled via BrooklynFeatureEnablement.FEATURE_REFERENCED_OBJECTS_PERSISTENCE_PROPERTY,
+     *             to preserve backwards compatibility for legacy implementations of entities, policies, etc.
+     */
+    @Deprecated
     private void addReferencedObjects(DeltaCollector deltaCollector) {
         MutableSet<BrooklynObject> referencedObjects = MutableSet.of();
         
@@ -443,7 +450,9 @@ public class PeriodicDeltaChangeListener implements ChangeListener {
                         limitedCountString(prevDeltaCollector.entities), limitedCountString(prevDeltaCollector.locations), limitedCountString(prevDeltaCollector.policies), limitedCountString(prevDeltaCollector.enrichers), limitedCountString(prevDeltaCollector.catalogItems), limitedCountString(prevDeltaCollector.bundles), 
                         limitedCountString(prevDeltaCollector.removedEntityIds), limitedCountString(prevDeltaCollector.removedLocationIds), limitedCountString(prevDeltaCollector.removedPolicyIds), limitedCountString(prevDeltaCollector.removedEnricherIds), limitedCountString(prevDeltaCollector.removedCatalogItemIds), limitedCountString(prevDeltaCollector.removedBundleIds)});
 
-            addReferencedObjects(prevDeltaCollector);
+            if (persistReferencedObjectsEnabled) {
+                addReferencedObjects(prevDeltaCollector);
+            }
 
             if (LOG.isTraceEnabled()) LOG.trace("Checkpointing delta of memento with references: "
                     + "updating {} entities, {} locations, {} policies, {} enrichers, {} catalog items, {} bundles; "
@@ -527,7 +536,35 @@ public class PeriodicDeltaChangeListener implements ChangeListener {
     public synchronized void onManaged(BrooklynObject instance) {
         if (LOG.isTraceEnabled()) LOG.trace("onManaged: {}", instance);
         onChanged(instance);
+        addReferencedObjects(instance);
+    }
+
+    private void addReferencedObjects(BrooklynObject instance) {
+        if (!(instance instanceof Entity)) return;
+        Entity entity = (Entity) instance;
+        
+        MutableSet<BrooklynObject> referencedObjects = MutableSet.of();
+        
+        // collect references
+        for (Location location : entity.getLocations()) {
+            Collection<Location> findLocationsInHierarchy = TreeUtils.findLocationsInHierarchy(location);
+            referencedObjects.addAll(findLocationsInHierarchy);
+        }
+        if (persistPoliciesEnabled) {
+            referencedObjects.addAll(entity.policies());
+        }
+        if (persistEnrichersEnabled) {
+            referencedObjects.addAll(entity.enrichers());
+        }
+        if (persistFeedsEnabled) {
+            referencedObjects.addAll(((EntityInternal)entity).feeds().getFeeds());
+        }
+        
+        for (BrooklynObject ref : referencedObjects) {
+            deltaCollector.addIfNotRemoved(ref);
+        }
     }
+    
 
     @Override
     public synchronized void onUnmanaged(BrooklynObject instance) {


[5/5] brooklyn-server git commit: This closes #964

Posted by tb...@apache.org.
This closes #964


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-server/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-server/commit/6f093c71
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-server/tree/6f093c71
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-server/diff/6f093c71

Branch: refs/heads/master
Commit: 6f093c71f9d43c9832e5ecabd4ee0639a348422f
Parents: 36cb70d 49ee11d
Author: Thomas Bouron <th...@cloudsoftcorp.com>
Authored: Fri Jun 1 10:59:33 2018 +0100
Committer: Thomas Bouron <th...@cloudsoftcorp.com>
Committed: Fri Jun 1 10:59:33 2018 +0100

----------------------------------------------------------------------
 .../CatalogOsgiVersionMoreEntityRebindTest.java |  5 +-
 .../brooklyn/catalog/CatalogYamlRebindTest.java | 43 ++++++++++++++++-
 .../core/BrooklynFeatureEnablement.java         | 12 +++++
 .../mgmt/internal/EntityChangeListener.java     |  1 +
 .../rebind/PeriodicDeltaChangeListener.java     | 51 +++++++++++++++++---
 .../core/mgmt/rebind/RebindFailuresTest.java    |  6 +--
 .../rebind/RebindLocalhostLocationTest.java     | 10 ++--
 .../RebindManagerExceptionHandlerTest.java      |  7 ++-
 .../core/mgmt/rebind/RebindOptions.java         |  6 ++-
 9 files changed, 119 insertions(+), 22 deletions(-)
----------------------------------------------------------------------



[4/5] brooklyn-server git commit: PR #964: Incorporate review comments

Posted by tb...@apache.org.
PR #964: Incorporate review comments

Project: http://git-wip-us.apache.org/repos/asf/brooklyn-server/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-server/commit/49ee11d6
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-server/tree/49ee11d6
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-server/diff/49ee11d6

Branch: refs/heads/master
Commit: 49ee11d6c90620cf935330249b1c6d5ea9351d27
Parents: 492ebd5
Author: Aled Sage <al...@gmail.com>
Authored: Tue May 29 20:30:09 2018 +0100
Committer: Aled Sage <al...@gmail.com>
Committed: Tue May 29 20:30:09 2018 +0100

----------------------------------------------------------------------
 .../core/BrooklynFeatureEnablement.java         |  4 ++--
 .../rebind/PeriodicDeltaChangeListener.java     | 24 ++++++++++----------
 2 files changed, 14 insertions(+), 14 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/49ee11d6/core/src/main/java/org/apache/brooklyn/core/BrooklynFeatureEnablement.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/BrooklynFeatureEnablement.java b/core/src/main/java/org/apache/brooklyn/core/BrooklynFeatureEnablement.java
index 8c142d8..2ff62d3 100644
--- a/core/src/main/java/org/apache/brooklyn/core/BrooklynFeatureEnablement.java
+++ b/core/src/main/java/org/apache/brooklyn/core/BrooklynFeatureEnablement.java
@@ -68,7 +68,7 @@ public class BrooklynFeatureEnablement {
      * still be persisted. For example, they could change 'state' without telling the listener, and hope
      * that the entity they were attached to would soon persist (thus piggy-backing off it).
      */
-    public static final String FEATURE_REFERENCED_OBJECTS_PERSISTENCE_PROPERTY = FEATURE_PROPERTY_PREFIX+".referencedObjectsPersistence";
+    public static final String FEATURE_REFERENCED_OBJECTS_REPERSISTENCE_PROPERTY = FEATURE_PROPERTY_PREFIX+".referencedObjectsRepersistence";
     
     /** whether feeds are automatically registered when set on entities, so that they are persisted */
     public static final String FEATURE_FEED_REGISTRATION_PROPERTY = FEATURE_PROPERTY_PREFIX+".feedRegistration";
@@ -161,7 +161,7 @@ public class BrooklynFeatureEnablement {
         setDefault(FEATURE_FEED_REGISTRATION_PROPERTY, false);
         setDefault(FEATURE_BUNDLE_PERSISTENCE_PROPERTY, true);
         setDefault(FEATURE_CATALOG_PERSISTENCE_PROPERTY, true);
-        setDefault(FEATURE_REFERENCED_OBJECTS_PERSISTENCE_PROPERTY, false);
+        setDefault(FEATURE_REFERENCED_OBJECTS_REPERSISTENCE_PROPERTY, false);
         setDefault(FEATURE_DEFAULT_STANDBY_IS_HOT_PROPERTY, false);
         setDefault(FEATURE_PERSIST_ENTITY_SPEC_AS_SUPPLIER, true);
         setDefault(FEATURE_RENAME_THREADS, false);

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/49ee11d6/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/PeriodicDeltaChangeListener.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/PeriodicDeltaChangeListener.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/PeriodicDeltaChangeListener.java
index 349f47f..56da64d 100644
--- a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/PeriodicDeltaChangeListener.java
+++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/PeriodicDeltaChangeListener.java
@@ -195,7 +195,7 @@ public class PeriodicDeltaChangeListener implements ChangeListener {
     private final boolean persistPoliciesEnabled;
     private final boolean persistEnrichersEnabled;
     private final boolean persistFeedsEnabled;
-    private final boolean persistReferencedObjectsEnabled;
+    private final boolean rePersistReferencedObjectsEnabled;
     
     private final Semaphore persistingMutex = new Semaphore(1);
     private final Object startStopMutex = new Object();
@@ -223,7 +223,7 @@ public class PeriodicDeltaChangeListener implements ChangeListener {
         this.persistPoliciesEnabled = BrooklynFeatureEnablement.isEnabled(BrooklynFeatureEnablement.FEATURE_POLICY_PERSISTENCE_PROPERTY);
         this.persistEnrichersEnabled = BrooklynFeatureEnablement.isEnabled(BrooklynFeatureEnablement.FEATURE_ENRICHER_PERSISTENCE_PROPERTY);
         this.persistFeedsEnabled = BrooklynFeatureEnablement.isEnabled(BrooklynFeatureEnablement.FEATURE_FEED_PERSISTENCE_PROPERTY);
-        this.persistReferencedObjectsEnabled = BrooklynFeatureEnablement.isEnabled(BrooklynFeatureEnablement.FEATURE_REFERENCED_OBJECTS_PERSISTENCE_PROPERTY);
+        this.rePersistReferencedObjectsEnabled = BrooklynFeatureEnablement.isEnabled(BrooklynFeatureEnablement.FEATURE_REFERENCED_OBJECTS_REPERSISTENCE_PROPERTY);
     }
     
     public void start() {
@@ -450,16 +450,16 @@ public class PeriodicDeltaChangeListener implements ChangeListener {
                         limitedCountString(prevDeltaCollector.entities), limitedCountString(prevDeltaCollector.locations), limitedCountString(prevDeltaCollector.policies), limitedCountString(prevDeltaCollector.enrichers), limitedCountString(prevDeltaCollector.catalogItems), limitedCountString(prevDeltaCollector.bundles), 
                         limitedCountString(prevDeltaCollector.removedEntityIds), limitedCountString(prevDeltaCollector.removedLocationIds), limitedCountString(prevDeltaCollector.removedPolicyIds), limitedCountString(prevDeltaCollector.removedEnricherIds), limitedCountString(prevDeltaCollector.removedCatalogItemIds), limitedCountString(prevDeltaCollector.removedBundleIds)});
 
-            if (persistReferencedObjectsEnabled) {
+            if (rePersistReferencedObjectsEnabled) {
                 addReferencedObjects(prevDeltaCollector);
-            }
 
-            if (LOG.isTraceEnabled()) LOG.trace("Checkpointing delta of memento with references: "
-                    + "updating {} entities, {} locations, {} policies, {} enrichers, {} catalog items, {} bundles; "
-                    + "removing {} entities, {} locations, {} policies, {} enrichers, {} catalog items, {} bundles",
-                    new Object[] {
-                        prevDeltaCollector.entities.size(), prevDeltaCollector.locations.size(), prevDeltaCollector.policies.size(), prevDeltaCollector.enrichers.size(), prevDeltaCollector.catalogItems.size(), prevDeltaCollector.bundles.size(),
-                        prevDeltaCollector.removedEntityIds.size(), prevDeltaCollector.removedLocationIds.size(), prevDeltaCollector.removedPolicyIds.size(), prevDeltaCollector.removedEnricherIds.size(), prevDeltaCollector.removedCatalogItemIds.size(), prevDeltaCollector.removedBundleIds.size()});
+                if (LOG.isTraceEnabled()) LOG.trace("Checkpointing delta of memento with references: "
+                        + "updating {} entities, {} locations, {} policies, {} enrichers, {} catalog items, {} bundles; "
+                        + "removing {} entities, {} locations, {} policies, {} enrichers, {} catalog items, {} bundles",
+                        new Object[] {
+                            prevDeltaCollector.entities.size(), prevDeltaCollector.locations.size(), prevDeltaCollector.policies.size(), prevDeltaCollector.enrichers.size(), prevDeltaCollector.catalogItems.size(), prevDeltaCollector.bundles.size(),
+                            prevDeltaCollector.removedEntityIds.size(), prevDeltaCollector.removedLocationIds.size(), prevDeltaCollector.removedPolicyIds.size(), prevDeltaCollector.removedEnricherIds.size(), prevDeltaCollector.removedCatalogItemIds.size(), prevDeltaCollector.removedBundleIds.size()});
+            }
 
             // Generate mementos for everything that has changed in this time period
             if (prevDeltaCollector.isEmpty()) {
@@ -536,10 +536,10 @@ public class PeriodicDeltaChangeListener implements ChangeListener {
     public synchronized void onManaged(BrooklynObject instance) {
         if (LOG.isTraceEnabled()) LOG.trace("onManaged: {}", instance);
         onChanged(instance);
-        addReferencedObjects(instance);
+        addReferencedObjectsForInitialPersist(instance);
     }
 
-    private void addReferencedObjects(BrooklynObject instance) {
+    private void addReferencedObjectsForInitialPersist(BrooklynObject instance) {
         if (!(instance instanceof Entity)) return;
         Entity entity = (Entity) instance;
         


[2/5] brooklyn-server git commit: Fix integration test in RebindLocalhostLocationTest

Posted by tb...@apache.org.
Fix integration test in RebindLocalhostLocationTest

(See the existing TODO in the code)

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

Branch: refs/heads/master
Commit: ff38a5c80c0d77b81316623d749b76bf3dd1a78e
Parents: 9539ccf
Author: Aled Sage <al...@gmail.com>
Authored: Wed May 23 10:46:21 2018 +0100
Committer: Aled Sage <al...@gmail.com>
Committed: Thu May 24 12:24:13 2018 +0100

----------------------------------------------------------------------
 .../core/mgmt/rebind/RebindLocalhostLocationTest.java     | 10 ++++------
 1 file changed, 4 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/ff38a5c8/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindLocalhostLocationTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindLocalhostLocationTest.java b/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindLocalhostLocationTest.java
index 381ec48..5bc6cc2 100644
--- a/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindLocalhostLocationTest.java
+++ b/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindLocalhostLocationTest.java
@@ -29,7 +29,6 @@ import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 import org.apache.brooklyn.api.location.LocationSpec;
 import org.apache.brooklyn.api.mgmt.rebind.mementos.BrooklynMementoManifest;
-import org.apache.brooklyn.core.test.entity.TestApplication;
 import org.apache.brooklyn.location.localhost.LocalhostMachineProvisioningLocation;
 import org.apache.brooklyn.location.ssh.SshMachineLocation;
 
@@ -87,19 +86,18 @@ public class RebindLocalhostLocationTest extends RebindTestFixtureWithApp {
         testMachineUsableAfterRebind();
         newApp.stop();
 
-        switchOriginalToNewManagementContext();
-        
         // TODO how should we automatically unmanage these?
         // (in this test, locations are created manually, so probably should be destroyed manually, 
         // but in most cases we should probably unmanage the location as part of the entity;
         // could keep the entity ID only in the location, then safely reverse-check usages?)
         // see related non-integration test in RebindEntityTest
-        origManagementContext.getLocationManager().unmanage(origLoc);
+        newManagementContext.getLocationManager().unmanage(origLoc);
         
-        RebindTestUtils.waitForPersisted(origManagementContext);
+        RebindTestUtils.waitForPersisted(newManagementContext);
+        
+        switchOriginalToNewManagementContext();
         
         BrooklynMementoManifest mf = loadMementoManifest();
         Assert.assertTrue(mf.getLocationIdToType().isEmpty(), "Expected no locations; had "+mf.getLocationIdToType());
     }
-    
 }


[3/5] brooklyn-server git commit: Rebind tests: stricter (e.g. no dangling-references)

Posted by tb...@apache.org.
Rebind tests: stricter (e.g. no dangling-references)


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-server/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-server/commit/9539ccf6
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-server/tree/9539ccf6
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-server/diff/9539ccf6

Branch: refs/heads/master
Commit: 9539ccf65fecf5abd944b371ee36fb5a265484e7
Parents: dedaffd
Author: Aled Sage <al...@gmail.com>
Authored: Wed May 23 10:45:33 2018 +0100
Committer: Aled Sage <al...@gmail.com>
Committed: Thu May 24 12:24:13 2018 +0100

----------------------------------------------------------------------
 .../CatalogOsgiVersionMoreEntityRebindTest.java |  5 ++-
 .../brooklyn/catalog/CatalogYamlRebindTest.java | 43 +++++++++++++++++++-
 .../core/mgmt/rebind/RebindFailuresTest.java    |  6 +--
 .../RebindManagerExceptionHandlerTest.java      |  7 +++-
 .../core/mgmt/rebind/RebindOptions.java         |  6 ++-
 5 files changed, 58 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/9539ccf6/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogOsgiVersionMoreEntityRebindTest.java
----------------------------------------------------------------------
diff --git a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogOsgiVersionMoreEntityRebindTest.java b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogOsgiVersionMoreEntityRebindTest.java
index 835609d..61245df 100644
--- a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogOsgiVersionMoreEntityRebindTest.java
+++ b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogOsgiVersionMoreEntityRebindTest.java
@@ -40,6 +40,7 @@ import org.apache.brooklyn.core.entity.trait.Startable;
 import org.apache.brooklyn.core.mgmt.ha.OsgiBundleInstallationResult;
 import org.apache.brooklyn.core.mgmt.internal.ManagementContextInternal;
 import org.apache.brooklyn.core.mgmt.osgi.OsgiVersionMoreEntityTest;
+import org.apache.brooklyn.core.mgmt.rebind.RebindOptions;
 import org.apache.brooklyn.core.test.entity.TestEntity;
 import org.apache.brooklyn.entity.group.DynamicCluster;
 import org.apache.brooklyn.entity.stock.BasicApplication;
@@ -270,7 +271,9 @@ public class CatalogOsgiVersionMoreEntityRebindTest extends AbstractYamlRebindTe
         }
         
         try {
-            StartableApplication app2 = rebind();
+            // Expect dangling reference(s) to catalog item from uninstalled bundle
+            RebindOptions rebindOptionsWithDefaultExceptionHandler = RebindOptions.create().exceptionHandler(null);
+            StartableApplication app2 = rebind(rebindOptionsWithDefaultExceptionHandler);
             Asserts.shouldHaveFailedPreviously("Expected deployment to fail rebind; instead got "+app2);
         } catch (Exception e) {
             // should fail to rebind this entity

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/9539ccf6/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlRebindTest.java
----------------------------------------------------------------------
diff --git a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlRebindTest.java b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlRebindTest.java
index 66e5663..7fec600 100644
--- a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlRebindTest.java
+++ b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlRebindTest.java
@@ -31,6 +31,7 @@ import java.util.List;
 
 import org.apache.brooklyn.api.catalog.CatalogItem;
 import org.apache.brooklyn.api.entity.Entity;
+import org.apache.brooklyn.api.mgmt.rebind.RebindManager.RebindFailureMode;
 import org.apache.brooklyn.api.mgmt.rebind.mementos.BrooklynMementoPersister;
 import org.apache.brooklyn.api.mgmt.rebind.mementos.BrooklynMementoRawData;
 import org.apache.brooklyn.api.objs.BrooklynObjectType;
@@ -46,6 +47,7 @@ import org.apache.brooklyn.core.mgmt.persist.BrooklynMementoPersisterToObjectSto
 import org.apache.brooklyn.core.mgmt.persist.PersistenceObjectStore;
 import org.apache.brooklyn.core.mgmt.persist.PersistenceObjectStore.StoreObjectAccessor;
 import org.apache.brooklyn.core.mgmt.rebind.RebindExceptionHandlerImpl;
+import org.apache.brooklyn.core.mgmt.rebind.RebindManagerImpl;
 import org.apache.brooklyn.core.mgmt.rebind.RebindOptions;
 import org.apache.brooklyn.core.mgmt.rebind.transformer.CompoundTransformer;
 import org.apache.brooklyn.core.test.policy.TestEnricher;
@@ -53,6 +55,7 @@ import org.apache.brooklyn.core.test.policy.TestPolicy;
 import org.apache.brooklyn.entity.stock.BasicEntity;
 import org.apache.brooklyn.test.Asserts;
 import org.apache.brooklyn.test.support.TestResourceUnavailableException;
+import org.apache.brooklyn.util.collections.QuorumCheck;
 import org.apache.brooklyn.util.exceptions.Exceptions;
 import org.apache.brooklyn.util.text.Strings;
 import org.testng.annotations.AfterMethod;
@@ -140,14 +143,50 @@ public class CatalogYamlRebindTest extends AbstractYamlRebindTest {
 
     @Test(dataProvider = "dataProvider")
     public void testRebindWithCatalogAndApp(RebindWithCatalogTestMode mode, OsgiMode osgiMode) throws Exception {
-        testRebindWithCatalogAndAppUsingOptions(mode, osgiMode, RebindOptions.create());
+        RebindOptions rebindOptions;
+        if (mode == RebindWithCatalogTestMode.DELETE_CATALOG || mode == RebindWithCatalogTestMode.REPLACE_CATALOG_WITH_NEWER_VERSION) {
+            // Don't be strict:
+            //  - After deleting catalog item, expect dangling reference that pointed at it.
+            //  - TODO For 'replace catalog', the dangling-ref check is done very early so those appear as 'dangling'.
+            //         We subsequently switch the catalog id. Ideally we wouldn't count those as 'dangling' in the rebind check,
+            //         if there is a newer version available.
+            rebindOptions = RebindOptions.create()
+                    .exceptionHandler(RebindExceptionHandlerImpl.builder()
+                            .strict()
+                            .danglingRefFailureMode(RebindFailureMode.CONTINUE)
+                            .danglingRefQuorumRequiredHealthy(RebindManagerImpl.DANGLING_REFERENCES_MIN_REQUIRED_HEALTHY.getDefaultValue())
+                            .build());
+        } else {
+            rebindOptions = RebindOptions.create();
+        }
+        testRebindWithCatalogAndAppUsingOptions(mode, osgiMode, rebindOptions);
+    }
+
+    @Test
+    public void testRebindWithCatalogAndAppRebindCatalogItemIdsTemp() throws Exception {
+        testRebindWithCatalogAndAppRebindCatalogItemIds(RebindWithCatalogTestMode.REPLACE_CATALOG_WITH_NEWER_VERSION, OsgiMode.NONE);
     }
 
     // Re-run all the same tests as testRebindWithCatalogAndApp, but with the XML updated to mimic state
     // persisted before <catalogItemIdSearchPath> was introduced.
     @Test(dataProvider = "dataProvider")
     public void testRebindWithCatalogAndAppRebindCatalogItemIds(RebindWithCatalogTestMode mode, OsgiMode osgiMode) throws Exception {
-        final RebindOptions rebindOptions = RebindOptions.create();
+        RebindOptions rebindOptions;
+        if (mode == RebindWithCatalogTestMode.DELETE_CATALOG || mode == RebindWithCatalogTestMode.REPLACE_CATALOG_WITH_NEWER_VERSION) {
+            // Don't be strict:
+            //  - After deleting catalog item, expect dangling reference that pointed at it.
+            //  - TODO For 'replace catalog', the dangling-ref check is done very early so those appear as 'dangling'.
+            //         We subsequently switch the catalog id. Ideally we wouldn't count those as 'dangling' in the rebind check,
+            //         if there is a newer version available.
+            rebindOptions = RebindOptions.create()
+                    .exceptionHandler(RebindExceptionHandlerImpl.builder()
+                            .strict()
+                            .danglingRefFailureMode(RebindFailureMode.CONTINUE)
+                            .danglingRefQuorumRequiredHealthy(RebindManagerImpl.DANGLING_REFERENCES_MIN_REQUIRED_HEALTHY.getDefaultValue())
+                            .build());
+        } else {
+            rebindOptions = RebindOptions.create();
+        }
         applyCompoundStateTransformer(rebindOptions, CompoundTransformer.builder()
             .xmlDeleteItem("//searchPath") // delete searchPath element
             .xmlDeleteItem("//@*[contains(., 'searchPath')]") // delete any attributes that reference searchPath

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/9539ccf6/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindFailuresTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindFailuresTest.java b/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindFailuresTest.java
index f056a22..ce4de2c 100644
--- a/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindFailuresTest.java
+++ b/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindFailuresTest.java
@@ -71,7 +71,7 @@ public class RebindFailuresTest extends RebindTestFixtureWithApp {
                 .impl(MyEntityFailingImpl.class)
                 .configure(MyEntityFailingImpl.FAIL_ON_GENERATE_MEMENTO, true));
         
-        newApp = rebind();
+        newApp = rebind(RebindOptions.create().defaultExceptionHandler());
         MyEntity newE = (MyEntity) Iterables.find(newApp.getChildren(), EntityPredicates.idEqualTo(origE.getId()));
         Optional<Entity> newFailingE = Iterables.tryFind(newApp.getChildren(), EntityPredicates.idEqualTo(origFailingE.getId()));
         
@@ -196,7 +196,7 @@ public class RebindFailuresTest extends RebindTestFixtureWithApp {
         origApp.policies().add(PolicySpec.create(MyPolicyFailingImpl.class)
                 .configure(MyPolicyFailingImpl.FAIL_ON_REBIND, true));
         
-        newApp = rebind();
+        newApp = rebind(RebindOptions.create().defaultExceptionHandler());
         
         Optional<Policy> newPolicy = Iterables.tryFind(newApp.policies(), Predicates.instanceOf(MyPolicyFailingImpl.class));
         assertFalse(newPolicy.isPresent(), "policy="+newPolicy);
@@ -207,7 +207,7 @@ public class RebindFailuresTest extends RebindTestFixtureWithApp {
         origApp.enrichers().add(EnricherSpec.create(MyEnricherFailingImpl.class)
                 .configure(MyEnricherFailingImpl.FAIL_ON_REBIND, true));
         
-        newApp = rebind();
+        newApp = rebind(RebindOptions.create().defaultExceptionHandler());
         
         Optional<Enricher> newEnricher = Iterables.tryFind(newApp.enrichers(), Predicates.instanceOf(MyEnricherFailingImpl.class));
         assertFalse(newEnricher.isPresent(), "enricher="+newEnricher);

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/9539ccf6/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindManagerExceptionHandlerTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindManagerExceptionHandlerTest.java b/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindManagerExceptionHandlerTest.java
index 33583fa..9a338f7 100644
--- a/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindManagerExceptionHandlerTest.java
+++ b/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindManagerExceptionHandlerTest.java
@@ -42,7 +42,8 @@ public class RebindManagerExceptionHandlerTest extends RebindTestFixtureWithApp
     @Test
     public void testAddConfigFailure() throws Throwable {
         try {
-            rebind();
+            RebindOptions rebindOptions = RebindOptions.create().defaultExceptionHandler();
+            rebind(rebindOptions);
             Asserts.shouldHaveFailedPreviously();
         } catch (Throwable e) {
             Asserts.expectedFailureContainsIgnoreCase(e, "minRam=4", "keyWithMapValue");
@@ -51,7 +52,9 @@ public class RebindManagerExceptionHandlerTest extends RebindTestFixtureWithApp
 
     @Test
     public void testAddConfigContinue() throws Throwable {
-        RebindOptions rebindOptions = RebindOptions.create().additionalProperties(ImmutableMap.of("rebind.failureMode.addConfig", "continue"));
+        RebindOptions rebindOptions = RebindOptions.create()
+                .defaultExceptionHandler()
+                .additionalProperties(ImmutableMap.of("rebind.failureMode.addConfig", "continue"));
         TestApplication rebindedApp = rebind(rebindOptions);
         EntityAsserts.assertConfigEquals(rebindedApp, TestEntity.CONF_MAP_THING, null);
     }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/9539ccf6/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindOptions.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindOptions.java b/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindOptions.java
index d4a4986..72e956f 100644
--- a/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindOptions.java
+++ b/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindOptions.java
@@ -40,7 +40,7 @@ public class RebindOptions {
 
     public boolean checkSerializable;
     public boolean terminateOrigManagementContext;
-    public RebindExceptionHandler exceptionHandler;
+    public RebindExceptionHandler exceptionHandler = RebindExceptionHandlerImpl.builder().strict().build();
     public ManagementContext origManagementContext;
     public ManagementContext newManagementContext;
     public File mementoDir;
@@ -80,6 +80,10 @@ public class RebindOptions {
         this.terminateOrigManagementContext = val;
         return this;
     }
+    public RebindOptions defaultExceptionHandler() {
+        this.exceptionHandler = null;
+        return this;
+    }
     public RebindOptions exceptionHandler(RebindExceptionHandler val) {
         this.exceptionHandler = val;
         return this;