You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by he...@apache.org on 2015/04/17 16:34:58 UTC
[2/8] incubator-brooklyn git commit: add an optional config
`firstMemberSpec` to DynamicCluster, with test
add an optional config `firstMemberSpec` to DynamicCluster, with test
Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/64b19928
Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/64b19928
Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/64b19928
Branch: refs/heads/master
Commit: 64b19928d80bef311f3f1dfebfa075466aad82c7
Parents: 04fc801
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Thu Apr 2 07:23:47 2015 -0400
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Sun Apr 12 20:00:52 2015 -0500
----------------------------------------------------------------------
.../brooklyn/entity/group/DynamicCluster.java | 5 ++
.../entity/group/DynamicClusterImpl.java | 5 +-
.../entity/group/DynamicClusterTest.java | 52 ++++++++++++++++++++
3 files changed, 61 insertions(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/64b19928/core/src/main/java/brooklyn/entity/group/DynamicCluster.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/group/DynamicCluster.java b/core/src/main/java/brooklyn/entity/group/DynamicCluster.java
index 764704e..8309528 100644
--- a/core/src/main/java/brooklyn/entity/group/DynamicCluster.java
+++ b/core/src/main/java/brooklyn/entity/group/DynamicCluster.java
@@ -120,6 +120,11 @@ public interface DynamicCluster extends AbstractGroup, Cluster, MemberReplaceabl
new TypeToken<EntitySpec<?>>() { },
"dynamiccluster.memberspec", "entity spec for creating new cluster members", null);
+ @SetFromFlag("firstMemberSpec")
+ ConfigKey<EntitySpec<?>> FIRST_MEMBER_SPEC = ConfigKeys.newConfigKey(
+ new TypeToken<EntitySpec<?>>() { },
+ "dynamiccluster.firstmemberspec", "entity spec for creating new cluster members, used for the very first member if different", null);
+
/** @deprecated since 0.7.0; use {@link #MEMBER_SPEC} instead. */
@SuppressWarnings("rawtypes")
@Deprecated
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/64b19928/core/src/main/java/brooklyn/entity/group/DynamicClusterImpl.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/group/DynamicClusterImpl.java b/core/src/main/java/brooklyn/entity/group/DynamicClusterImpl.java
index 0b77910..43b671c 100644
--- a/core/src/main/java/brooklyn/entity/group/DynamicClusterImpl.java
+++ b/core/src/main/java/brooklyn/entity/group/DynamicClusterImpl.java
@@ -767,7 +767,10 @@ public class DynamicClusterImpl extends AbstractGroupImpl implements DynamicClus
}
protected Entity createNode(@Nullable Location loc, Map<?,?> flags) {
- EntitySpec<?> memberSpec = getMemberSpec();
+ EntitySpec<?> memberSpec = null;
+ if (getMembers().isEmpty()) memberSpec = getConfig(FIRST_MEMBER_SPEC);
+ if (memberSpec == null) memberSpec = getMemberSpec();
+
if (memberSpec != null) {
return addChild(EntitySpec.create(memberSpec).configure(flags).location(loc));
}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/64b19928/core/src/test/java/brooklyn/entity/group/DynamicClusterTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/brooklyn/entity/group/DynamicClusterTest.java b/core/src/test/java/brooklyn/entity/group/DynamicClusterTest.java
index 8f953a4..58949d7 100644
--- a/core/src/test/java/brooklyn/entity/group/DynamicClusterTest.java
+++ b/core/src/test/java/brooklyn/entity/group/DynamicClusterTest.java
@@ -65,6 +65,7 @@ import brooklyn.test.EntityTestUtils;
import brooklyn.test.entity.TestEntity;
import brooklyn.test.entity.TestEntityImpl;
import brooklyn.util.collections.MutableMap;
+import brooklyn.util.collections.MutableSet;
import brooklyn.util.collections.QuorumCheck.QuorumChecks;
import brooklyn.util.exceptions.Exceptions;
import brooklyn.util.time.Time;
@@ -898,4 +899,55 @@ public class DynamicClusterTest extends BrooklynAppUnitTestSupport {
return e;
}
}
+
+ @Test
+ public void testDifferentFirstMemberSpec() throws Exception {
+ DynamicCluster cluster = app.createAndManageChild(EntitySpec.create(DynamicCluster.class)
+ .configure(DynamicCluster.FIRST_MEMBER_SPEC,
+ EntitySpec.create(BasicEntity.class).configure(TestEntity.CONF_NAME, "first"))
+ .configure(DynamicCluster.MEMBER_SPEC,
+ EntitySpec.create(BasicEntity.class).configure(TestEntity.CONF_NAME, "non-first"))
+ .configure(DynamicCluster.UP_QUORUM_CHECK, QuorumChecks.alwaysTrue())
+ .configure(DynamicCluster.INITIAL_SIZE, 3));
+ cluster.start(ImmutableList.of(loc));
+
+ EntityTestUtils.assertAttributeEqualsEventually(cluster, Attributes.SERVICE_STATE_ACTUAL, Lifecycle.RUNNING);
+ assertTrue(cluster.getAttribute(Attributes.SERVICE_UP));
+
+ assertEquals(cluster.getMembers().size(), 3);
+
+ assertFirstAndNonFirstCounts(cluster.getMembers(), 1, 2);
+
+ // and after re-size
+ cluster.resize(4);
+// Entities.dumpInfo(cluster);
+ assertFirstAndNonFirstCounts(cluster.getMembers(), 1, 3);
+
+ // and re-size to 1
+ cluster.resize(1);
+ assertFirstAndNonFirstCounts(cluster.getMembers(), 1, 0);
+
+ // and re-size to 0
+ cluster.resize(0);
+ assertFirstAndNonFirstCounts(cluster.getMembers(), 0, 0);
+
+ // and back to 3
+ cluster.resize(3);
+ assertFirstAndNonFirstCounts(cluster.getMembers(), 1, 2);
+ }
+
+ private void assertFirstAndNonFirstCounts(Collection<Entity> members, int expectedFirstCount, int expectedNonFirstCount) {
+ Set<Entity> found = MutableSet.of();
+ for (Entity e: members) {
+ if ("first".equals(e.getConfig(TestEntity.CONF_NAME))) found.add(e);
+ }
+ assertEquals(found.size(), expectedFirstCount);
+
+ found.clear();
+ for (Entity e: members) {
+ if ("non-first".equals(e.getConfig(TestEntity.CONF_NAME))) found.add(e);
+ }
+ assertEquals(found.size(), expectedNonFirstCount);
+ }
+
}