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 2014/08/30 01:01:16 UTC

[16/26] git commit: default children/members enrichers for service_up and service_problems ignores entities that report null as well as those that don't report; this can be overridden with IGNORE_{NULL,TRANSITIONING} config keys. and the load balancing p

default children/members enrichers for service_up and service_problems ignores entities that report null as well as those that don't report; this can be overridden with IGNORE_{NULL,TRANSITIONING} config keys.
and the load balancing policy defaults not to blocking service up simply because children/members are not present. misc other tidies around policies.


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

Branch: refs/heads/master
Commit: d3886a055353f2efa435c84d45668c1a3ab0aa23
Parents: cbc103a
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Mon Aug 25 10:48:19 2014 +0100
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Wed Aug 27 02:17:18 2014 -0400

----------------------------------------------------------------------
 .../java/brooklyn/entity/basic/Entities.java    |  5 +--
 .../brooklyn/entity/basic/EntityConfigMap.java  |  8 ++---
 .../java/brooklyn/entity/basic/QuorumCheck.java |  3 ++
 .../entity/basic/ServiceStateLogic.java         | 36 +++++++++++++++-----
 .../loadbalancing/BalanceableContainer.java     | 13 +++++--
 .../loadbalancing/BalanceableWorkerPool.java    |  3 ++
 .../BalanceableWorkerPoolImpl.java              |  6 ++--
 .../loadbalancing/LoadBalancingPolicy.java      | 17 +++++----
 .../AbstractLoadBalancingPolicyTest.java        |  2 +-
 .../loadbalancing/LoadBalancingPolicyTest.java  |  4 ++-
 .../loadbalancing/MockContainerEntity.java      |  2 +-
 .../loadbalancing/MockContainerEntityImpl.java  |  3 +-
 12 files changed, 71 insertions(+), 31 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/d3886a05/core/src/main/java/brooklyn/entity/basic/Entities.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/basic/Entities.java b/core/src/main/java/brooklyn/entity/basic/Entities.java
index ea35432..4191110 100644
--- a/core/src/main/java/brooklyn/entity/basic/Entities.java
+++ b/core/src/main/java/brooklyn/entity/basic/Entities.java
@@ -281,7 +281,7 @@ public class Entities {
         dumpInfo(e, new PrintWriter(System.out), currentIndentation, tab);
     }
     public static void dumpInfo(Entity e, Writer out, String currentIndentation, String tab) throws IOException {
-        out.append(currentIndentation+e.toString()+"\n");
+        out.append(currentIndentation+e.toString()+" "+e.getId()+"\n");
 
         out.append(currentIndentation+tab+tab+"locations = "+e.getLocations()+"\n");
 
@@ -332,7 +332,8 @@ public class Entities {
         if (e instanceof Group) {
             StringBuilder members = new StringBuilder();
             for (Entity it : ((Group)e).getMembers()) {
-                members.append(it.getId()+", ");
+                if (members.length()>0) members.append(", ");
+                members.append(it.getId());
             }
             out.append(currentIndentation+tab+tab+"Members: "+members.toString()+"\n");
         }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/d3886a05/core/src/main/java/brooklyn/entity/basic/EntityConfigMap.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/basic/EntityConfigMap.java b/core/src/main/java/brooklyn/entity/basic/EntityConfigMap.java
index c946fe0..3f5884b 100644
--- a/core/src/main/java/brooklyn/entity/basic/EntityConfigMap.java
+++ b/core/src/main/java/brooklyn/entity/basic/EntityConfigMap.java
@@ -102,8 +102,6 @@ public class EntityConfigMap implements ConfigMap {
         //           but that example doesn't have a default...
         ConfigKey<T> ownKey = entity!=null ? (ConfigKey<T>)elvis(entity.getEntityType().getConfigKey(key.getName()), key) : key;
         
-        ExecutionContext exec = entity.getExecutionContext();
-
         // TODO We're notifying of config-changed because currently persistence needs to know when the
         // attributeWhenReady is complete (so it can persist the result).
         // Long term, we'll just persist tasks properly so the call to onConfigChanged will go!
@@ -114,11 +112,13 @@ public class EntityConfigMap implements ConfigMap {
             T result = null;
             boolean complete = false;
             if (((ConfigKeySelfExtracting<T>)ownKey).isSet(ownConfig)) {
+                ExecutionContext exec = entity.getExecutionContext();
                 result = ((ConfigKeySelfExtracting<T>)ownKey).extractValue(ownConfig, exec);
                 complete = true;
             } else if (((ConfigKeySelfExtracting<T>)ownKey).isSet(inheritedConfig)) {
-               result = ((ConfigKeySelfExtracting<T>)ownKey).extractValue(inheritedConfig, exec);
-               complete = true;
+                ExecutionContext exec = entity.getExecutionContext();
+                result = ((ConfigKeySelfExtracting<T>)ownKey).extractValue(inheritedConfig, exec);
+                complete = true;
             } else if (localConfigBag.containsKey(ownKey)) {
                 // TODO configBag.get doesn't handle tasks/attributeWhenReady - it only uses TypeCoercions
                 result = localConfigBag.get(ownKey);

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/d3886a05/core/src/main/java/brooklyn/entity/basic/QuorumCheck.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/basic/QuorumCheck.java b/core/src/main/java/brooklyn/entity/basic/QuorumCheck.java
index bac4515..17195e8 100644
--- a/core/src/main/java/brooklyn/entity/basic/QuorumCheck.java
+++ b/core/src/main/java/brooklyn/entity/basic/QuorumCheck.java
@@ -39,6 +39,9 @@ public interface QuorumCheck {
         public static QuorumCheck atLeastOneUnlessEmpty() {
             return new NumericQuorumCheck(1, 0.0, true);
         }
+        public static QuorumCheck alwaysTrue() {
+            return new NumericQuorumCheck(0, 0.0, true);
+        }
         public static QuorumCheck newInstance(int minRequiredSize, double minRequiredRatio, boolean allowEmpty) {
             return new NumericQuorumCheck(minRequiredSize, minRequiredRatio, allowEmpty);
         }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/d3886a05/core/src/main/java/brooklyn/entity/basic/ServiceStateLogic.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/basic/ServiceStateLogic.java b/core/src/main/java/brooklyn/entity/basic/ServiceStateLogic.java
index de4f1ad..9e66381 100644
--- a/core/src/main/java/brooklyn/entity/basic/ServiceStateLogic.java
+++ b/core/src/main/java/brooklyn/entity/basic/ServiceStateLogic.java
@@ -25,6 +25,9 @@ import java.util.Map;
 
 import javax.annotation.Nullable;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import brooklyn.config.ConfigKey;
 import brooklyn.enricher.Enrichers;
 import brooklyn.enricher.basic.AbstractEnricher;
@@ -55,6 +58,8 @@ import com.google.common.collect.ImmutableList;
 /** Logic, sensors and enrichers, and conveniences, for computing service status */ 
 public class ServiceStateLogic {
 
+    private static final Logger log = LoggerFactory.getLogger(ServiceStateLogic.class);
+    
     public static final AttributeSensor<Boolean> SERVICE_UP = Attributes.SERVICE_UP;
     public static final AttributeSensor<Map<String,Object>> SERVICE_NOT_UP_INDICATORS = Attributes.SERVICE_NOT_UP_INDICATORS;
     
@@ -206,6 +211,7 @@ public class ServiceStateLogic {
         }
 
         protected void setActualState(@Nullable Lifecycle state) {
+            if (log.isTraceEnabled()) log.trace("{} setting actual state {}", this, state);
             emit(SERVICE_STATE_ACTUAL, (state==null ? Entities.REMOVE : state));
         }
     }
@@ -253,6 +259,8 @@ public class ServiceStateLogic {
             "Logic for checking whether this service is healthy, based on children and/or members running, defaulting to requiring none to be ON-FIRE", QuorumCheck.QuorumChecks.all());
         public static final ConfigKey<Boolean> DERIVE_SERVICE_NOT_UP = ConfigKeys.newBooleanConfigKey("enricher.service_state.children_and_members.service_up.publish", "Whether to derive a service-not-up indicator from children", true);
         public static final ConfigKey<Boolean> DERIVE_SERVICE_PROBLEMS = ConfigKeys.newBooleanConfigKey("enricher.service_state.children_and_members.service_problems.publish", "Whether to derive a service-problem indicator from children", true);
+        public static final ConfigKey<Boolean> IGNORE_NULL_VALUES = ConfigKeys.newBooleanConfigKey("enricher.service_state.children_and_members.ignore_nulls", "Whether to ignore children reporting null values for the sensor", true);
+        public static final ConfigKey<Boolean> IGNORE_TRANSITIONING = ConfigKeys.newBooleanConfigKey("enricher.service_state.children_and_members.ignore_transitioning", "Whether to ignore children reporting transitional states (starting, stopping, etc) for service state", true);
 
         protected String getKeyForMapSensor() {
             return Preconditions.checkNotNull(super.getUniqueTag());
@@ -304,7 +312,12 @@ public class ServiceStateLogic {
         protected Object computeServiceNotUp() {
             Map<Entity, Boolean> values = getValues(SERVICE_UP);
             List<Entity> violators = MutableList.of();
+            boolean ignoreNull = getConfig(IGNORE_NULL_VALUES);
+            int entries=0;
             for (Map.Entry<Entity, Boolean> state: values.entrySet()) {
+                if (ignoreNull && state.getValue()==null)
+                    continue;
+                entries++;
                 if (!Boolean.TRUE.equals(state.getValue())) {
                     violators.add(state.getKey());
                 }
@@ -312,11 +325,12 @@ public class ServiceStateLogic {
 
             QuorumCheck qc = getConfig(UP_QUORUM_CHECK);
             if (qc!=null) {
-                if (qc.isQuorate(values.size()-violators.size(), values.size()))
+                if (qc.isQuorate(entries-violators.size(), entries))
                     // quorate
                     return null;
 
                 if (values.isEmpty()) return "No entities present";
+                if (entries==0) return "No entities publishing service up";
                 if (violators.isEmpty()) return "Not enough entities";
             } else {
                 if (violators.isEmpty())
@@ -324,35 +338,41 @@ public class ServiceStateLogic {
             }
 
             if (violators.size()==1) return violators.get(0)+" is not up";
-            if (violators.size()==values.size()) return "None of the entities are up";
+            if (violators.size()==entries) return "None of the entities are up";
             return violators.size()+" entities are not up, including "+violators.get(0);
         }
 
         protected Object computeServiceProblems() {
             Map<Entity, Lifecycle> values = getValues(SERVICE_STATE_ACTUAL);
-            int numRunning=0, numOnFire=0;
+            int numRunning=0, numNotHealthy=0;
+            boolean ignoreNull = getConfig(IGNORE_NULL_VALUES);
+            boolean ignoreTransition = getConfig(IGNORE_TRANSITIONING);
             for (Lifecycle state: values.values()) {
                 if (state==Lifecycle.RUNNING) numRunning++;
-                else if (state==Lifecycle.ON_FIRE) numOnFire++;
+                else if (state==Lifecycle.ON_FIRE) numNotHealthy++;
+                else if (state==null) { if (!ignoreNull) numNotHealthy++; }
+                else { if (!ignoreTransition) numNotHealthy++; }
             }
 
             QuorumCheck qc = getConfig(RUNNING_QUORUM_CHECK);
             if (qc!=null) {
-                if (qc.isQuorate(numRunning, numOnFire+numRunning))
+                if (qc.isQuorate(numRunning, numNotHealthy+numRunning))
                     // quorate
                     return null;
 
-                if (numOnFire==0)
+                if (numNotHealthy==0)
                     return "Not enough entities running to be quorate";
             } else {
-                if (numOnFire==0)
+                if (numNotHealthy==0)
                     return null;
             }
 
-            return numOnFire+" entit"+Strings.ies(numOnFire)+" are on fire";
+            return numNotHealthy+" entit"+Strings.ies(numNotHealthy)+" not healthy";
         }
 
         protected void updateMapSensor(AttributeSensor<Map<String, Object>> sensor, Object value) {
+            if (log.isTraceEnabled()) log.trace("{} updating map sensor {} with {}", new Object[] { this, sensor, value });
+
             if (value!=null)
                 updateMapSensorEntry(entity, sensor, getKeyForMapSensor(), value);
             else

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/d3886a05/policy/src/main/java/brooklyn/policy/loadbalancing/BalanceableContainer.java
----------------------------------------------------------------------
diff --git a/policy/src/main/java/brooklyn/policy/loadbalancing/BalanceableContainer.java b/policy/src/main/java/brooklyn/policy/loadbalancing/BalanceableContainer.java
index 56969d0..9a7ecb1 100644
--- a/policy/src/main/java/brooklyn/policy/loadbalancing/BalanceableContainer.java
+++ b/policy/src/main/java/brooklyn/policy/loadbalancing/BalanceableContainer.java
@@ -20,7 +20,12 @@ package brooklyn.policy.loadbalancing;
 
 import java.util.Set;
 
+import brooklyn.config.ConfigKey;
 import brooklyn.entity.Entity;
+import brooklyn.entity.basic.AbstractGroup;
+import brooklyn.entity.basic.ConfigKeys;
+import brooklyn.entity.basic.QuorumCheck;
+import brooklyn.entity.basic.QuorumCheck.QuorumChecks;
 import brooklyn.event.basic.BasicNotificationSensor;
 
 /**
@@ -28,14 +33,18 @@ import brooklyn.event.basic.BasicNotificationSensor;
  * Membership of a balanceable container does not imply a parent-child relationship in the Brooklyn
  * management sense.
  */
-public interface BalanceableContainer<ItemType extends Movable> extends Entity {
+public interface BalanceableContainer<ItemType extends Movable> extends Entity, AbstractGroup {
     
     public static BasicNotificationSensor<Entity> ITEM_ADDED = new BasicNotificationSensor<Entity>(
             Entity.class, "balanceablecontainer.item.added", "Movable item added to balanceable container");
     public static BasicNotificationSensor<Entity> ITEM_REMOVED = new BasicNotificationSensor<Entity>(
             Entity.class, "balanceablecontainer.item.removed", "Movable item removed from balanceable container");
     
-    
+    public static final ConfigKey<QuorumCheck> UP_QUORUM_CHECK = ConfigKeys.newConfigKeyWithDefault(AbstractGroup.UP_QUORUM_CHECK, 
+        "Up check from members; default one for container overrides usual check to always return true, "
+        + "i.e. not block service up simply because the container is empty or something in the container has failed",
+        QuorumChecks.alwaysTrue());
+
     public Set<ItemType> getBalanceableItems();
     
 }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/d3886a05/policy/src/main/java/brooklyn/policy/loadbalancing/BalanceableWorkerPool.java
----------------------------------------------------------------------
diff --git a/policy/src/main/java/brooklyn/policy/loadbalancing/BalanceableWorkerPool.java b/policy/src/main/java/brooklyn/policy/loadbalancing/BalanceableWorkerPool.java
index 023edbe..ab18ce6 100644
--- a/policy/src/main/java/brooklyn/policy/loadbalancing/BalanceableWorkerPool.java
+++ b/policy/src/main/java/brooklyn/policy/loadbalancing/BalanceableWorkerPool.java
@@ -32,6 +32,9 @@ import brooklyn.event.basic.BasicNotificationSensor;
  * Represents an elastic group of "container" entities, each of which is capable of hosting "item" entities that perform
  * work and consume the container's available resources (e.g. CPU or bandwidth). Auto-scaling and load-balancing policies can
  * be attached to this pool to provide dynamic elasticity based on workrates reported by the individual item entities.
+ * <p>
+ * The containers must be "up" in order to receive work, thus they must NOT follow the default enricher pattern
+ * for groups which says that the group must be up to receive work.
  */
 @ImplementedBy(BalanceableWorkerPoolImpl.class)
 public interface BalanceableWorkerPool extends Entity, Resizable {

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/d3886a05/policy/src/main/java/brooklyn/policy/loadbalancing/BalanceableWorkerPoolImpl.java
----------------------------------------------------------------------
diff --git a/policy/src/main/java/brooklyn/policy/loadbalancing/BalanceableWorkerPoolImpl.java b/policy/src/main/java/brooklyn/policy/loadbalancing/BalanceableWorkerPoolImpl.java
index 905411e..bb7b64b 100644
--- a/policy/src/main/java/brooklyn/policy/loadbalancing/BalanceableWorkerPoolImpl.java
+++ b/policy/src/main/java/brooklyn/policy/loadbalancing/BalanceableWorkerPoolImpl.java
@@ -36,9 +36,7 @@ import brooklyn.event.SensorEvent;
 import brooklyn.event.SensorEventListener;
 
 /**
- * Represents an elastic group of "container" entities, each of which is capable of hosting "item" entities that perform
- * work and consume the container's available resources (e.g. CPU or bandwidth). Auto-scaling and load-balancing policies can
- * be attached to this pool to provide dynamic elasticity based on workrates reported by the individual item entities.
+ * @see BalanceableWorkerPool
  */
 public class BalanceableWorkerPoolImpl extends AbstractEntity implements BalanceableWorkerPool {
 
@@ -60,7 +58,7 @@ public class BalanceableWorkerPoolImpl extends AbstractEntity implements Balance
             if (LOG.isTraceEnabled()) LOG.trace("{} received event {}", BalanceableWorkerPoolImpl.this, event);
             Entity source = event.getSource();
             Object value = event.getValue();
-            Sensor sensor = event.getSensor();
+            Sensor<?> sensor = event.getSensor();
             
             if (sensor.equals(AbstractGroup.MEMBER_ADDED)) {
                 if (source.equals(containerGroup)) {

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/d3886a05/policy/src/main/java/brooklyn/policy/loadbalancing/LoadBalancingPolicy.java
----------------------------------------------------------------------
diff --git a/policy/src/main/java/brooklyn/policy/loadbalancing/LoadBalancingPolicy.java b/policy/src/main/java/brooklyn/policy/loadbalancing/LoadBalancingPolicy.java
index 6738d6c..7cef21d 100644
--- a/policy/src/main/java/brooklyn/policy/loadbalancing/LoadBalancingPolicy.java
+++ b/policy/src/main/java/brooklyn/policy/loadbalancing/LoadBalancingPolicy.java
@@ -87,9 +87,11 @@ public class LoadBalancingPolicy<NodeType extends Entity, ItemType extends Movab
     private volatile long executorTime = 0;
 
     private int lastEmittedDesiredPoolSize = 0;
-    private String lastEmittedPoolTemperature = null; // "cold" or "hot"
+    private static enum TemperatureStates { COLD, HOT }
+    private TemperatureStates lastEmittedPoolTemperature = null; // "cold" or "hot"
     
     private final SensorEventListener<Object> eventHandler = new SensorEventListener<Object>() {
+        @SuppressWarnings({ "rawtypes", "unchecked" })
         public void onEvent(SensorEvent<Object> event) {
             if (LOG.isTraceEnabled()) LOG.trace("{} received event {}", LoadBalancingPolicy.this, event);
             Entity source = event.getSource();
@@ -119,6 +121,7 @@ public class LoadBalancingPolicy<NodeType extends Entity, ItemType extends Movab
             BalanceablePoolModel<NodeType, ItemType> model) {
         this(MutableMap.of(), metric, model);
     }
+    @SuppressWarnings({ "unchecked", "rawtypes" })
     public LoadBalancingPolicy(Map props, AttributeSensor<? extends Number> metric,
             BalanceablePoolModel<NodeType, ItemType> model) {
         
@@ -133,6 +136,7 @@ public class LoadBalancingPolicy<NodeType extends Entity, ItemType extends Movab
         executor = Executors.newSingleThreadScheduledExecutor(newThreadFactory());
     }
     
+    @SuppressWarnings("unchecked")
     @Override
     public void setEntity(EntityLocal entity) {
         Preconditions.checkArgument(entity instanceof BalanceableWorkerPool, "Provided entity must be a BalanceableWorkerPool");
@@ -185,12 +189,13 @@ public class LoadBalancingPolicy<NodeType extends Entity, ItemType extends Movab
             long delay = Math.max(0, (executorTime + minPeriodBetweenExecs) - now);
             
             executor.schedule(new Runnable() {
+                @SuppressWarnings("rawtypes")
                 public void run() {
                     try {
                         executorTime = System.currentTimeMillis();
                         executorQueued.set(false);
                         strategy.rebalance();
-                        
+
                         if (LOG.isDebugEnabled()) LOG.debug("{} post-rebalance: poolSize={}; workrate={}; lowThreshold={}; " + 
                                 "highThreshold={}", new Object[] {this, model.getPoolSize(), model.getCurrentPoolWorkrate(), 
                                 model.getPoolLowThreshold(), model.getPoolHighThreshold()});
@@ -206,10 +211,10 @@ public class LoadBalancingPolicy<NodeType extends Entity, ItemType extends Movab
                             
                             if (LOG.isInfoEnabled()) {
                                 int desiredPoolSize = (int) Math.ceil(model.getCurrentPoolWorkrate() / (model.getPoolLowThreshold()/model.getPoolSize()));
-                                if (desiredPoolSize != lastEmittedDesiredPoolSize || lastEmittedPoolTemperature != "cold") {
+                                if (desiredPoolSize != lastEmittedDesiredPoolSize || lastEmittedPoolTemperature != TemperatureStates.COLD) {
                                     LOG.info("{} emitted COLD (suggesting {}): {}", new Object[] {this, desiredPoolSize, eventVal});
                                     lastEmittedDesiredPoolSize = desiredPoolSize;
-                                    lastEmittedPoolTemperature = "cold";
+                                    lastEmittedPoolTemperature = TemperatureStates.COLD;
                                 }
                             }
                         
@@ -224,10 +229,10 @@ public class LoadBalancingPolicy<NodeType extends Entity, ItemType extends Movab
                             
                             if (LOG.isInfoEnabled()) {
                                 int desiredPoolSize = (int) Math.ceil(model.getCurrentPoolWorkrate() / (model.getPoolHighThreshold()/model.getPoolSize()));
-                                if (desiredPoolSize != lastEmittedDesiredPoolSize || lastEmittedPoolTemperature != "hot") {
+                                if (desiredPoolSize != lastEmittedDesiredPoolSize || lastEmittedPoolTemperature != TemperatureStates.HOT) {
                                     LOG.info("{} emitted HOT (suggesting {}): {}", new Object[] {this, desiredPoolSize, eventVal});
                                     lastEmittedDesiredPoolSize = desiredPoolSize;
-                                    lastEmittedPoolTemperature = "hot";
+                                    lastEmittedPoolTemperature = TemperatureStates.HOT;
                                 }
                             }
                         }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/d3886a05/policy/src/test/java/brooklyn/policy/loadbalancing/AbstractLoadBalancingPolicyTest.java
----------------------------------------------------------------------
diff --git a/policy/src/test/java/brooklyn/policy/loadbalancing/AbstractLoadBalancingPolicyTest.java b/policy/src/test/java/brooklyn/policy/loadbalancing/AbstractLoadBalancingPolicyTest.java
index 0cd05a0..244d8fa 100644
--- a/policy/src/test/java/brooklyn/policy/loadbalancing/AbstractLoadBalancingPolicyTest.java
+++ b/policy/src/test/java/brooklyn/policy/loadbalancing/AbstractLoadBalancingPolicyTest.java
@@ -91,7 +91,7 @@ public class AbstractLoadBalancingPolicyTest {
         
         model = new DefaultBalanceablePoolModel<Entity, Entity>("pool-model");
         
-        app = ApplicationBuilder.newManagedApp(TestApplication.class);
+        app = TestApplication.Factory.newManagedInstanceForTests();
         containerGroup = app.createAndManageChild(EntitySpec.create(DynamicGroup.class)
                 .displayName("containerGroup")
                 .configure(DynamicGroup.ENTITY_FILTER, Predicates.instanceOf(MockContainerEntity.class)));

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/d3886a05/policy/src/test/java/brooklyn/policy/loadbalancing/LoadBalancingPolicyTest.java
----------------------------------------------------------------------
diff --git a/policy/src/test/java/brooklyn/policy/loadbalancing/LoadBalancingPolicyTest.java b/policy/src/test/java/brooklyn/policy/loadbalancing/LoadBalancingPolicyTest.java
index df7d300..c0ff7b7 100644
--- a/policy/src/test/java/brooklyn/policy/loadbalancing/LoadBalancingPolicyTest.java
+++ b/policy/src/test/java/brooklyn/policy/loadbalancing/LoadBalancingPolicyTest.java
@@ -27,6 +27,8 @@ import brooklyn.entity.basic.Entities;
 import brooklyn.entity.basic.EntityLocal;
 import brooklyn.test.Asserts;
 import brooklyn.util.collections.MutableMap;
+import brooklyn.util.time.Duration;
+import brooklyn.util.time.Time;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
@@ -179,7 +181,7 @@ public class LoadBalancingPolicyTest extends AbstractLoadBalancingPolicyTest {
         
         MockContainerEntity containerC = newAsyncContainer(app, "C", 10, 30, CONTAINER_STARTUP_DELAY_MS);
         // New container allows hot ones to offload work.
-        
+
         assertWorkratesEventually(
                 ImmutableList.of(containerA, containerB, containerC), 
                 ImmutableList.of(item1, item2, item3, item4, item5, item6, item7, item8), 

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/d3886a05/policy/src/test/java/brooklyn/policy/loadbalancing/MockContainerEntity.java
----------------------------------------------------------------------
diff --git a/policy/src/test/java/brooklyn/policy/loadbalancing/MockContainerEntity.java b/policy/src/test/java/brooklyn/policy/loadbalancing/MockContainerEntity.java
index 1de0d47..2fba8f0 100644
--- a/policy/src/test/java/brooklyn/policy/loadbalancing/MockContainerEntity.java
+++ b/policy/src/test/java/brooklyn/policy/loadbalancing/MockContainerEntity.java
@@ -41,7 +41,7 @@ public interface MockContainerEntity extends AbstractGroup, BalanceableContainer
     public static final ConfigKey<Long> DELAY = new BasicConfigKey<Long>(
             Long.class, "mock.container.delay", "", 0L);
 
-    public static final Effector OFFLOAD_AND_STOP = new MethodEffector(MockContainerEntity.class, "offloadAndStop");
+    public static final Effector<Void> OFFLOAD_AND_STOP = new MethodEffector<Void>(MockContainerEntity.class, "offloadAndStop");
 
     public void lock();
 

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/d3886a05/policy/src/test/java/brooklyn/policy/loadbalancing/MockContainerEntityImpl.java
----------------------------------------------------------------------
diff --git a/policy/src/test/java/brooklyn/policy/loadbalancing/MockContainerEntityImpl.java b/policy/src/test/java/brooklyn/policy/loadbalancing/MockContainerEntityImpl.java
index 13baec5..09906d0 100644
--- a/policy/src/test/java/brooklyn/policy/loadbalancing/MockContainerEntityImpl.java
+++ b/policy/src/test/java/brooklyn/policy/loadbalancing/MockContainerEntityImpl.java
@@ -116,6 +116,7 @@ public class MockContainerEntityImpl extends AbstractGroupImpl implements MockCo
         emit(BalanceableContainer.ITEM_REMOVED, item);
     }
 
+    @SuppressWarnings("unchecked")
     @Override
     public Set<Movable> getBalanceableItems() {
         return (Set) Sets.newLinkedHashSet(getMembers());
@@ -137,8 +138,6 @@ public class MockContainerEntityImpl extends AbstractGroupImpl implements MockCo
             if (getDelay() > 0) Time.sleep(getDelay());
             running = true;
             addLocations(locs);
-            Location loc = Iterables.get(locs, 0);
-            String locName = (loc.getDisplayName() != null) ? loc.getDisplayName() : loc.toString();
             emit(Attributes.LOCATION_CHANGED, null);
             setAttribute(SERVICE_UP, true);
         } finally {