test that changing version applies to specs
Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/71c82da5 Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/71c82da5 Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/71c82da5 Branch: refs/heads/master Commit: 71c82da572ae28d73c31f1c102f4ac4c5a7f2280 Parents: 0dc533d Author: Alex Heneveld <[email protected]> Authored: Fri Feb 6 17:59:49 2015 +0000 Committer: Alex Heneveld <[email protected]> Committed: Fri Feb 6 22:12:14 2015 +0000 ---------------------------------------------------------------------- .../rebind/ActivePartialRebindIteration.java | 2 +- .../management/internal/LocalEntityManager.java | 21 +++++++--- .../rebind/ActivePartialRebindVersionTest.java | 44 ++++++++++++++++++-- 3 files changed, 57 insertions(+), 10 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/71c82da5/core/src/main/java/brooklyn/entity/rebind/ActivePartialRebindIteration.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/brooklyn/entity/rebind/ActivePartialRebindIteration.java b/core/src/main/java/brooklyn/entity/rebind/ActivePartialRebindIteration.java index 56c467f..d3c4f5f 100644 --- a/core/src/main/java/brooklyn/entity/rebind/ActivePartialRebindIteration.java +++ b/core/src/main/java/brooklyn/entity/rebind/ActivePartialRebindIteration.java @@ -142,7 +142,7 @@ public class ActivePartialRebindIteration extends RebindIteration { @Override protected Collection<String> getMementoRootEntities() { - // TODO must parents + // all entities are roots here, because we are not recursing return memento.getEntityIds(); } http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/71c82da5/core/src/main/java/brooklyn/management/internal/LocalEntityManager.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/brooklyn/management/internal/LocalEntityManager.java b/core/src/main/java/brooklyn/management/internal/LocalEntityManager.java index 3e9e4c0..cd66e5b 100644 --- a/core/src/main/java/brooklyn/management/internal/LocalEntityManager.java +++ b/core/src/main/java/brooklyn/management/internal/LocalEntityManager.java @@ -65,9 +65,9 @@ import brooklyn.util.task.Tasks; import brooklyn.util.time.CountdownTimer; import brooklyn.util.time.Duration; -import com.google.common.base.Preconditions; import com.google.common.annotations.Beta; import com.google.common.base.Function; +import com.google.common.base.Preconditions; import com.google.common.base.Predicate; import com.google.common.base.Predicates; import com.google.common.collect.ImmutableList; @@ -285,7 +285,7 @@ public class LocalEntityManager implements EntityManagerInternal { } final List<EntityInternal> allEntities = Lists.newArrayList(); - recursively(e, new Predicate<EntityInternal>() { public boolean apply(EntityInternal it) { + Predicate<EntityInternal> manageEntity = new Predicate<EntityInternal>() { public boolean apply(EntityInternal it) { ManagementTransitionMode mode = getLastManagementTransitionMode(it.getId()); if (mode==null) { setManagementTransitionMode(it, mode = initialMode); @@ -309,9 +309,13 @@ public class LocalEntityManager implements EntityManagerInternal { // silently bail out return false; } else { - // on rebind, should not have any deployed instances - log.warn("Already deployed "+it+" when managing "+mode+"/"+initialMode+"; ignoring this and all descendants"); - return false; + if (mode.wasPrimary() && mode.isPrimary()) { + // active partial rebind; continue + } else { + // on rebind, should not have any deployed instances + log.warn("Already deployed "+it+" when managing "+mode+"/"+initialMode+"; ignoring this and all descendants"); + return false; + } } } @@ -325,7 +329,12 @@ public class LocalEntityManager implements EntityManagerInternal { preManageNonRecursive(it, mode); it.getManagementSupport().onManagementStarting( new ManagementTransitionInfo(managementContext, mode) ); return manageNonRecursive(it, mode); - } }); + } }; + if (initialMode.wasPrimary() && initialMode.isPrimary()) { + manageEntity.apply( (EntityInternal)e ); + } else { + recursively(e, manageEntity); + } for (EntityInternal it : allEntities) { if (!it.getManagementSupport().isFullyManaged()) { http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/71c82da5/core/src/test/java/brooklyn/entity/rebind/ActivePartialRebindVersionTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/brooklyn/entity/rebind/ActivePartialRebindVersionTest.java b/core/src/test/java/brooklyn/entity/rebind/ActivePartialRebindVersionTest.java index b239f1a..9eec02b 100644 --- a/core/src/test/java/brooklyn/entity/rebind/ActivePartialRebindVersionTest.java +++ b/core/src/test/java/brooklyn/entity/rebind/ActivePartialRebindVersionTest.java @@ -24,11 +24,14 @@ import org.testng.Assert; import org.testng.annotations.Test; import brooklyn.catalog.CatalogItem; +import brooklyn.catalog.internal.CatalogUtils; import brooklyn.entity.Entity; +import brooklyn.entity.group.DynamicCluster; +import brooklyn.entity.proxying.EntitySpec; import brooklyn.entity.rebind.transformer.CompoundTransformer; import brooklyn.management.internal.LocalManagementContext; -import brooklyn.management.osgi.OsgiTestResources; import brooklyn.management.osgi.OsgiVersionMoreEntityTest; +import brooklyn.util.collections.MutableList; public class ActivePartialRebindVersionTest extends RebindTestFixtureWithApp { @@ -64,8 +67,8 @@ public class ActivePartialRebindVersionTest extends RebindTestFixtureWithApp { // now transform, with a version change CompoundTransformer transformer = CompoundTransformer.builder().changeCatalogItemId( - OsgiTestResources.BROOKLYN_TEST_MORE_ENTITIES_MORE_ENTITY, "1.0", - OsgiTestResources.BROOKLYN_TEST_MORE_ENTITIES_MORE_ENTITY, "1.1").build(); + catV1.getSymbolicName(), catV1.getVersion(), + catV2.getSymbolicName(), catV2.getVersion()).build(); doPartialRebindByObjectById(transformer, childV1.getId()); Entity childV2 = origManagementContext.lookup(childV1.getId(), Entity.class); @@ -78,4 +81,39 @@ public class ActivePartialRebindVersionTest extends RebindTestFixtureWithApp { Assert.assertTrue(childV1==childV2, "Expected same instance: "+childV1+" / "+childV2); } + @Test + public void testSwitchingVersionsInCluster() throws Exception { + CatalogItem<?, ?> catV1 = OsgiVersionMoreEntityTest.addMoreEntityV1(origManagementContext, "1.0"); + CatalogItem<?, ?> catV2 = OsgiVersionMoreEntityTest.addMoreEntityV2(origManagementContext, "1.1"); + + // could do a yaml test in a downstream project (no camp available here) +// CreationResult<List<Entity>, List<String>> clusterR = EntityManagementUtils.addChildren(origApp, +// "services:\n" +// + "- type: "+DynamicCluster.class.getName()+"\n" +// + " initialSize: 1\n" +// + " entitySpec: { type: "+catV1.getId()+" }\n", true); + DynamicCluster cluster = origApp.createAndManageChild(EntitySpec.create(DynamicCluster.class) + .configure(DynamicCluster.INITIAL_SIZE, 1) + .configure(DynamicCluster.MEMBER_SPEC, CatalogUtils.createEntitySpec(origManagementContext, catV1)) + ); + cluster.start(MutableList.of(origApp.newSimulatedLocation())); + Entity childV1 = MutableList.copyOf(cluster.getChildren()).get(1); + + OsgiVersionMoreEntityTest.assertV1EffectorCall(childV1); + + // now transform, with a version change + CompoundTransformer transformer = CompoundTransformer.builder().changeCatalogItemId( + catV1.getSymbolicName(), catV1.getVersion(), + catV2.getSymbolicName(), catV2.getVersion()).build(); + doPartialRebindByObjectById(transformer, cluster.getId(), childV1.getId()); + + // existing child now points to new implementation -- saying HI + OsgiVersionMoreEntityTest.assertV2EffectorCall(childV1); + + // and scale out new child also gets new impl + cluster.resize(2); + Entity child2 = MutableList.copyOf(cluster.getChildren()).get(2); + OsgiVersionMoreEntityTest.assertV2EffectorCall(child2); + } + }
