You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by gr...@apache.org on 2016/08/28 21:20:45 UTC

[1/3] brooklyn-server git commit: Add ServiceStateLogic enricher for better child state propagation

Repository: brooklyn-server
Updated Branches:
  refs/heads/master 9238a1081 -> 50d5beeed


Add ServiceStateLogic enricher for better child state propagation


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

Branch: refs/heads/master
Commit: 724458a7e438f23e6fecb1da34b5f1598edf8faf
Parents: ec3010e
Author: Andrew Donald Kennedy <an...@cloudsoftcorp.com>
Authored: Thu Aug 11 23:56:51 2016 +0100
Committer: Andrew Donald Kennedy <an...@cloudsoftcorp.com>
Committed: Sat Aug 20 17:15:13 2016 +0100

----------------------------------------------------------------------
 .../apache/brooklyn/entity/stock/ConditionalEntityImpl.java   | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/724458a7/core/src/main/java/org/apache/brooklyn/entity/stock/ConditionalEntityImpl.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/entity/stock/ConditionalEntityImpl.java b/core/src/main/java/org/apache/brooklyn/entity/stock/ConditionalEntityImpl.java
index 054b5b0..ba061f4 100644
--- a/core/src/main/java/org/apache/brooklyn/entity/stock/ConditionalEntityImpl.java
+++ b/core/src/main/java/org/apache/brooklyn/entity/stock/ConditionalEntityImpl.java
@@ -33,10 +33,12 @@ import org.apache.brooklyn.core.entity.BrooklynConfigKeys;
 import org.apache.brooklyn.core.entity.Entities;
 import org.apache.brooklyn.core.entity.lifecycle.Lifecycle;
 import org.apache.brooklyn.core.entity.lifecycle.ServiceStateLogic;
+import org.apache.brooklyn.core.entity.lifecycle.ServiceStateLogic.ComputeServiceIndicatorsFromChildrenAndMembers;
 import org.apache.brooklyn.core.entity.trait.Startable;
 import org.apache.brooklyn.core.location.Locations;
 import org.apache.brooklyn.enricher.stock.Enrichers;
 import org.apache.brooklyn.util.collections.MutableSet;
+import org.apache.brooklyn.util.collections.QuorumCheck;
 import org.apache.brooklyn.util.exceptions.Exceptions;
 import org.apache.brooklyn.util.time.Duration;
 
@@ -72,8 +74,11 @@ public class ConditionalEntityImpl extends BasicStartableImpl implements Conditi
                 child = addChild(EntitySpec.create(spec));
                 sensors().set(CONDITIONAL_ENTITY, child);
 
-                // Add enrichers for sensor propagateion
+                // Add enrichers for sensor propagation
                 enrichers().add(Enrichers.builder().propagating(Startable.SERVICE_UP).from(child).build());
+                enrichers().add(ServiceStateLogic.newEnricherFromChildrenState()
+                        .suppressDuplicates(true)
+                        .configure(ComputeServiceIndicatorsFromChildrenAndMembers.RUNNING_QUORUM_CHECK, QuorumCheck.QuorumChecks.all()));
                 if (Boolean.TRUE.equals(propagate)) {
                     if (sensors.isEmpty()) {
                         enrichers().add(Enrichers.builder().propagatingAllButUsualAnd().from(child).build());


[2/3] brooklyn-server git commit: Change conditional entity to reflect service state of optional child

Posted by gr...@apache.org.
Change conditional entity to reflect service state of optional child

Propagate value for service.isUp and optional configurable set of sensors


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

Branch: refs/heads/master
Commit: ec3010e412440e3a20e2f5e973e0774335990546
Parents: b73cb73
Author: Andrew Donald Kennedy <an...@cloudsoftcorp.com>
Authored: Wed Aug 10 18:24:45 2016 +0100
Committer: Andrew Donald Kennedy <an...@cloudsoftcorp.com>
Committed: Sat Aug 20 17:15:13 2016 +0100

----------------------------------------------------------------------
 .../entity/stock/ConditionalEntity.java         | 23 +++++-
 .../entity/stock/ConditionalEntityImpl.java     | 82 +++++++++++++++++---
 .../entity/stock/ConditionalEntityTest.java     | 33 +++++++-
 3 files changed, 124 insertions(+), 14 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/ec3010e4/core/src/main/java/org/apache/brooklyn/entity/stock/ConditionalEntity.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/entity/stock/ConditionalEntity.java b/core/src/main/java/org/apache/brooklyn/entity/stock/ConditionalEntity.java
index 0e0a112..c5f8d81 100644
--- a/core/src/main/java/org/apache/brooklyn/entity/stock/ConditionalEntity.java
+++ b/core/src/main/java/org/apache/brooklyn/entity/stock/ConditionalEntity.java
@@ -18,6 +18,8 @@
  */
 package org.apache.brooklyn.entity.stock;
 
+import java.util.Collection;
+
 import com.google.common.annotations.Beta;
 import com.google.common.reflect.TypeToken;
 
@@ -44,6 +46,10 @@ import org.apache.brooklyn.util.core.flags.SetFromFlag;
  *         brooklyn.config:
  *           proxy.port: 8080
  *           loadbalancer.serverpool: $brooklyn:entity("servers")
+ *     conditional.entity.propagate: true
+ *     conditional.entity.sensors:
+ *       - $brooklyn:sensor("proxy.http.port")
+ *       - $brooklyn:sensor("main.uri")
  * </pre>
  */
 @Beta
@@ -51,11 +57,22 @@ import org.apache.brooklyn.util.core.flags.SetFromFlag;
 public interface ConditionalEntity extends BasicStartable {
 
     @SetFromFlag("entitySpec")
-    ConfigKey<EntitySpec<?>> CONDITIONAL_ENTITY_SPEC = ConfigKeys.newConfigKey(new TypeToken<EntitySpec<?>>() { }, "conditional.entity.spec", "The entity specification to be created");
+    ConfigKey<EntitySpec<?>> CONDITIONAL_ENTITY_SPEC = ConfigKeys.newConfigKey(new TypeToken<EntitySpec<?>>() { },
+            "conditional.entity.spec", "The entity specification to be created");
 
     @SetFromFlag("create")
-    AttributeSensorAndConfigKey<Boolean, Boolean> CREATE_CONDITIONAL_ENTITY = ConfigKeys.newSensorAndConfigKey(Boolean.class, "conditional.entity.create", "Whether the entity should be created");
+    AttributeSensorAndConfigKey<Boolean, Boolean> CREATE_CONDITIONAL_ENTITY = ConfigKeys.newSensorAndConfigKey(Boolean.class,
+            "conditional.entity.create", "Whether the entity should be created");
+
+    @SetFromFlag("propagateSensors")
+    ConfigKey<Boolean> PROPAGATE_CONDITIONAL_ENTITY_SENSORS = ConfigKeys.newBooleanConfigKey(
+            "conditional.entity.propagate", "Whether sensors are to be propagated from the child entity", Boolean.TRUE);
+
+    @SetFromFlag("sensorsToPropagate")
+    ConfigKey<Collection<AttributeSensor<?>>> CONDITIONAL_ENTITY_SENSOR_LIST = ConfigKeys.newConfigKey(new TypeToken<Collection<AttributeSensor<?>>>() { },
+            "conditional.entity.sensors", "Collection of sensors that are to be propagated from the child entity (all usual sensors if not set, or empty)");
 
-    AttributeSensor<Entity> CONDITIONAL_ENTITY = Sensors.newSensor(Entity.class, "conditional.entity", "The created entity");
+    AttributeSensor<Entity> CONDITIONAL_ENTITY = Sensors.newSensor(Entity.class,
+            "conditional.entity", "The created entity");
 
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/ec3010e4/core/src/main/java/org/apache/brooklyn/entity/stock/ConditionalEntityImpl.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/entity/stock/ConditionalEntityImpl.java b/core/src/main/java/org/apache/brooklyn/entity/stock/ConditionalEntityImpl.java
index 6c73a87..054b5b0 100644
--- a/core/src/main/java/org/apache/brooklyn/entity/stock/ConditionalEntityImpl.java
+++ b/core/src/main/java/org/apache/brooklyn/entity/stock/ConditionalEntityImpl.java
@@ -19,26 +19,88 @@
 package org.apache.brooklyn.entity.stock;
 
 import java.util.Collection;
+import java.util.Set;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import org.apache.brooklyn.api.entity.Entity;
 import org.apache.brooklyn.api.entity.EntitySpec;
 import org.apache.brooklyn.api.location.Location;
+import org.apache.brooklyn.api.sensor.AttributeSensor;
+import org.apache.brooklyn.core.entity.Attributes;
+import org.apache.brooklyn.core.entity.BrooklynConfigKeys;
+import org.apache.brooklyn.core.entity.Entities;
+import org.apache.brooklyn.core.entity.lifecycle.Lifecycle;
+import org.apache.brooklyn.core.entity.lifecycle.ServiceStateLogic;
+import org.apache.brooklyn.core.entity.trait.Startable;
+import org.apache.brooklyn.core.location.Locations;
+import org.apache.brooklyn.enricher.stock.Enrichers;
+import org.apache.brooklyn.util.collections.MutableSet;
+import org.apache.brooklyn.util.exceptions.Exceptions;
+import org.apache.brooklyn.util.time.Duration;
 
 public class ConditionalEntityImpl extends BasicStartableImpl implements ConditionalEntity {
 
+    private static final Logger LOG = LoggerFactory.getLogger(BasicStartableImpl.class);
+
     @Override
     public void start(Collection<? extends Location> locations) {
-        Entity child = sensors().get(CONDITIONAL_ENTITY);
-        EntitySpec<?> spec = config().get(CONDITIONAL_ENTITY_SPEC);
-        Boolean create = config().get(CREATE_CONDITIONAL_ENTITY);
-
-        // Child not yet created; Entity spec is present; Create flag is true
-        if (child == null && spec != null && Boolean.TRUE.equals(create)) {
-            Entity created = addChild(EntitySpec.create(spec));
-            sensors().set(CONDITIONAL_ENTITY, created);
+        try {
+            ServiceStateLogic.setExpectedState(this, Lifecycle.STARTING);
+            sensors().set(Attributes.SERVICE_UP, false);
+
+            // Block startup until other dependent components are available
+            Object val = config().get(START_LATCH);
+            if (val != null) {
+                LOG.debug("Finished waiting for start-latch in {}", this);
+            }
+
+            Entity child = sensors().get(CONDITIONAL_ENTITY);
+            EntitySpec<?> spec = config().get(CONDITIONAL_ENTITY_SPEC);
+            Boolean create = config().get(CREATE_CONDITIONAL_ENTITY);
+            Boolean propagate = config().get(PROPAGATE_CONDITIONAL_ENTITY_SENSORS);
+            Set<AttributeSensor<?>> sensors = MutableSet.copyOf(config().get(CONDITIONAL_ENTITY_SENSOR_LIST));
+            Duration timeout = config().get(BrooklynConfigKeys.START_TIMEOUT);
+
+            addLocations(locations);
+            locations = Locations.getLocationsCheckingAncestors(locations, this);
+            LOG.info("Starting entity {}: {}", this, locations);
+
+            // Child not yet created; Entity spec is present; Create flag is true
+            if (child == null && spec != null && Boolean.TRUE.equals(create)) {
+                child = addChild(EntitySpec.create(spec));
+                sensors().set(CONDITIONAL_ENTITY, child);
+
+                // Add enrichers for sensor propagateion
+                enrichers().add(Enrichers.builder().propagating(Startable.SERVICE_UP).from(child).build());
+                if (Boolean.TRUE.equals(propagate)) {
+                    if (sensors.isEmpty()) {
+                        enrichers().add(Enrichers.builder().propagatingAllButUsualAnd().from(child).build());
+                    } else {
+                        enrichers().add(Enrichers.builder().propagating(sensors).from(child).build());
+                    }
+                }
+            }
+
+            // Start child if create flag is set; otherwise just set service.isUp
+            if (Boolean.TRUE.equals(create)) {
+                LOG.info("Starting child {}: {}", child, locations);
+                if (Entities.invokeEffectorWithArgs(this, child, Startable.START, locations).blockUntilEnded(timeout)) {
+                    LOG.debug("Successfully started {} by {}", child, this);
+                } else {
+                    throw new IllegalStateException(String.format("Timed out while %s was starting %s", this, child));
+                }
+            } else {
+                LOG.debug("No child created, setting SERVICE_UP to true");
+                sensors().set(Attributes.SERVICE_UP, true);
+            }
+
+            ServiceStateLogic.setExpectedState(this, Lifecycle.RUNNING);
+        } catch (Throwable t) {
+            ServiceStateLogic.setExpectedState(this, Lifecycle.ON_FIRE);
+            throw Exceptions.propagate(t);
         }
-        super.start(locations);
     }
-
 }
 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/ec3010e4/core/src/test/java/org/apache/brooklyn/entity/stock/ConditionalEntityTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/entity/stock/ConditionalEntityTest.java b/core/src/test/java/org/apache/brooklyn/entity/stock/ConditionalEntityTest.java
index 0e1a56e..7ef837c 100644
--- a/core/src/test/java/org/apache/brooklyn/entity/stock/ConditionalEntityTest.java
+++ b/core/src/test/java/org/apache/brooklyn/entity/stock/ConditionalEntityTest.java
@@ -19,17 +19,21 @@
 package org.apache.brooklyn.entity.stock;
 
 import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertTrue;
+import static org.testng.Assert.*;
 
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
+import com.google.common.base.Predicates;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterables;
 
 import org.apache.brooklyn.api.entity.Entity;
 import org.apache.brooklyn.api.entity.EntitySpec;
 import org.apache.brooklyn.api.location.LocationSpec;
+import org.apache.brooklyn.api.sensor.AttributeSensor;
+import org.apache.brooklyn.core.entity.EntityAsserts;
+import org.apache.brooklyn.core.entity.trait.Startable;
 import org.apache.brooklyn.core.location.SimulatedLocation;
 import org.apache.brooklyn.core.test.BrooklynAppUnitTestSupport;
 import org.apache.brooklyn.core.test.entity.TestEntity;
@@ -57,6 +61,33 @@ public class ConditionalEntityTest extends BrooklynAppUnitTestSupport {
         Entity child = Iterables.getOnlyElement(optional.getChildren());
         assertTrue(child instanceof TestEntity);
         assertEquals(child, optional.sensors().get(ConditionalEntity.CONDITIONAL_ENTITY));
+
+        // The service.isUp sensor will have been propagated by default
+        EntityAsserts.assertAttributeEqualsEventually(child, Startable.SERVICE_UP, true);
+        EntityAsserts.assertAttributeEqualsEventually(optional, Startable.SERVICE_UP, true);
+    }
+
+    @Test
+    public void testAddsConditionalAndPropagatesSensors() throws Exception {
+        optional = app.addChild(EntitySpec.create(ConditionalEntity.class)
+                .configure(ConditionalEntity.CREATE_CONDITIONAL_ENTITY, true)
+                .configure(ConditionalEntity.PROPAGATE_CONDITIONAL_ENTITY_SENSORS, true)
+                .configure(ConditionalEntity.CONDITIONAL_ENTITY_SENSOR_LIST, ImmutableList.<AttributeSensor<?>>of(TestEntity.SEQUENCE))
+                .configure(ConditionalEntity.CONDITIONAL_ENTITY_SPEC, EntitySpec.create(TestEntity.class)));
+        app.start(ImmutableList.of(loc1));
+
+        assertEquals(optional.getChildren().size(), 1);
+        Entity child = Iterables.getOnlyElement(optional.getChildren());
+        assertTrue(child instanceof TestEntity);
+        assertEquals(child, optional.sensors().get(ConditionalEntity.CONDITIONAL_ENTITY));
+
+        // Check that the configured sensors are propagated
+        child.sensors().set(TestEntity.SEQUENCE, 123);
+        EntityAsserts.assertAttributeEqualsEventually(child, TestEntity.SEQUENCE, 123);
+        EntityAsserts.assertAttributeEqualsEventually(optional, TestEntity.SEQUENCE, 123);
+        child.sensors().set(TestEntity.NAME, "frog");
+        EntityAsserts.assertAttributeEqualsEventually(child, TestEntity.NAME, "frog");
+        EntityAsserts.assertAttribute(optional, TestEntity.NAME, Predicates.isNull());
     }
 
     @Test


[3/3] brooklyn-server git commit: This closes #295

Posted by gr...@apache.org.
This closes #295

* github/pr/295:
  Add ServiceStateLogic enricher for better child state propagation
  Change conditional entity to reflect service state of optional child


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

Branch: refs/heads/master
Commit: 50d5beeed9360b4798b83e29b806aee7fb1757e2
Parents: 9238a10 724458a
Author: Andrew Donald Kennedy <an...@cloudsoftcorp.com>
Authored: Sun Aug 28 22:20:38 2016 +0100
Committer: Andrew Donald Kennedy <an...@cloudsoftcorp.com>
Committed: Sun Aug 28 22:20:38 2016 +0100

----------------------------------------------------------------------
 .../entity/stock/ConditionalEntity.java         | 23 +++++-
 .../entity/stock/ConditionalEntityImpl.java     | 87 +++++++++++++++++---
 .../entity/stock/ConditionalEntityTest.java     | 33 +++++++-
 3 files changed, 129 insertions(+), 14 deletions(-)
----------------------------------------------------------------------