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);
         }
 

Reply via email to