MembershipTrackingPolicy: support configuring sensors to track
Project: http://git-wip-us.apache.org/repos/asf/brooklyn-server/repo Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-server/commit/24c3a4ce Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-server/tree/24c3a4ce Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-server/diff/24c3a4ce Branch: refs/heads/0.5.0 Commit: 24c3a4cea85e9e08bca772d7841bff10d9b433bd Parents: 1bdb182 Author: Aled Sage <[email protected]> Authored: Wed Apr 17 14:39:28 2013 +0100 Committer: Aled Sage <[email protected]> Committed: Fri Apr 26 14:40:05 2013 +0100 ---------------------------------------------------------------------- .../group/AbstractMembershipTrackingPolicy.java | 19 +++++++++++++++++++ .../group/MembershipTrackingPolicyTest.java | 20 +++++++++++++++++++- 2 files changed, 38 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/24c3a4ce/core/src/main/java/brooklyn/entity/group/AbstractMembershipTrackingPolicy.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/brooklyn/entity/group/AbstractMembershipTrackingPolicy.java b/core/src/main/java/brooklyn/entity/group/AbstractMembershipTrackingPolicy.java index c42ec71..d345bc5 100644 --- a/core/src/main/java/brooklyn/entity/group/AbstractMembershipTrackingPolicy.java +++ b/core/src/main/java/brooklyn/entity/group/AbstractMembershipTrackingPolicy.java @@ -2,6 +2,7 @@ package brooklyn.entity.group; import java.util.Collections; import java.util.Map; +import java.util.Set; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -10,11 +11,14 @@ import brooklyn.entity.Entity; import brooklyn.entity.Group; import brooklyn.entity.basic.DynamicGroup; import brooklyn.entity.trait.Startable; +import brooklyn.event.Sensor; import brooklyn.event.SensorEvent; import brooklyn.event.SensorEventListener; import brooklyn.policy.basic.AbstractPolicy; +import brooklyn.util.flags.SetFromFlag; import com.google.common.base.Preconditions; +import com.google.common.collect.Sets; /** abstract class which helps track membership of a group, invoking (empty) methods in this class on MEMBER{ADDED,REMOVED} events, as well as SERVICE_UP {true,false} for those members. */ public abstract class AbstractMembershipTrackingPolicy extends AbstractPolicy { @@ -22,9 +26,14 @@ public abstract class AbstractMembershipTrackingPolicy extends AbstractPolicy { private Group group; + @SetFromFlag + private Set<Sensor<?>> sensorsToTrack; + public AbstractMembershipTrackingPolicy(Map flags) { super(flags); + if (sensorsToTrack == null) sensorsToTrack = Sets.newLinkedHashSet(); } + public AbstractMembershipTrackingPolicy() { this(Collections.emptyMap()); } @@ -67,6 +76,8 @@ public abstract class AbstractMembershipTrackingPolicy extends AbstractPolicy { protected void subscribeToGroup() { Preconditions.checkNotNull(group, "The group cannot be null"); + LOG.debug("Subscribing to group "+group+", for memberAdded, memberRemoved, serviceUp, and {}", sensorsToTrack); + subscribe(group, DynamicGroup.MEMBER_ADDED, new SensorEventListener<Entity>() { @Override public void onEvent(SensorEvent<Entity> event) { onEntityAdded(event.getValue()); @@ -83,6 +94,14 @@ public abstract class AbstractMembershipTrackingPolicy extends AbstractPolicy { onEntityChange(event.getSource()); } }); + for (Sensor<?> sensor : sensorsToTrack) { + subscribeToMembers(group, sensor, new SensorEventListener<Object>() { + @Override public void onEvent(SensorEvent<Object> event) { + onEntityChange(event.getSource()); + } + }); + } + for (Entity it : group.getMembers()) { onEntityAdded(it); } // FIXME cluster may be remote, we need to make this retrieve the remote values, or store members in local mgmt node, or use children http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/24c3a4ce/core/src/test/java/brooklyn/entity/group/MembershipTrackingPolicyTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/brooklyn/entity/group/MembershipTrackingPolicyTest.java b/core/src/test/java/brooklyn/entity/group/MembershipTrackingPolicyTest.java index a2d2257..a8f20e6 100644 --- a/core/src/test/java/brooklyn/entity/group/MembershipTrackingPolicyTest.java +++ b/core/src/test/java/brooklyn/entity/group/MembershipTrackingPolicyTest.java @@ -25,6 +25,7 @@ import brooklyn.util.MutableMap; import com.google.common.base.Objects; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; public class MembershipTrackingPolicyTest { @@ -115,7 +116,24 @@ public class MembershipTrackingPolicyTest { assertRecordsEventually(Record.newAdded(e1)); } + @Test + public void testNotifiedOfExtraTrackedSensors() throws Exception { + TestEntity e1 = createAndManageChildOf(group); + + RecordingMembershipTrackingPolicy policy2 = new RecordingMembershipTrackingPolicy(MutableMap.of("group", group, "sensorsToTrack", ImmutableSet.of(TestEntity.NAME))); + group.addPolicy(policy2); + policy2.setGroup(group); + + e1.setAttribute(TestEntity.NAME, "myname"); + + assertRecordsEventually(policy2, Record.newAdded(e1), Record.newChanged(e1)); + } + private void assertRecordsEventually(final Record... expected) { + assertRecordsEventually(policy, expected); + } + + private void assertRecordsEventually(final RecordingMembershipTrackingPolicy policy, final Record... expected) { TestUtils.assertEventually(MutableMap.of("timeout", TIMEOUT_MS), new Runnable() { public void run() { assertEquals(policy.records, ImmutableList.copyOf(expected), "actual="+policy.records); @@ -132,7 +150,7 @@ public class MembershipTrackingPolicyTest { static class RecordingMembershipTrackingPolicy extends AbstractMembershipTrackingPolicy { final List<Record> records = new CopyOnWriteArrayList<Record>(); - public RecordingMembershipTrackingPolicy(MutableMap<String, BasicGroup> flags) { + public RecordingMembershipTrackingPolicy(MutableMap<String, ?> flags) { super(flags); }
