Repository: incubator-brooklyn
Updated Branches:
refs/heads/master 4338a8f16 -> ff31a41d4
enhance yaml DSL for specifying a sensor
allows `sensor("sensor.name")`, looking up on entity, falling back to untyped
Object sensor
Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo
Commit:
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/8591999f
Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/8591999f
Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/8591999f
Branch: refs/heads/master
Commit: 8591999ff24555cf798c590b27b31f4da5368c87
Parents: 64b1992
Author: Alex Heneveld <[email protected]>
Authored: Fri Apr 10 12:24:54 2015 +0100
Committer: Alex Heneveld <[email protected]>
Committed: Sun Apr 12 20:00:52 2015 -0500
----------------------------------------------------------------------
.../src/main/java/brooklyn/util/task/Tasks.java | 1 -
docs/guide/yaml/yaml-reference.md | 3 +-
.../spi/dsl/methods/BrooklynDslCommon.java | 9 ++-
.../brooklyn/spi/dsl/methods/DslComponent.java | 35 ++++++++++++
.../camp/brooklyn/DslAndRebindYamlTest.java | 59 ++++++++++++++++++++
.../camp/brooklyn/EntitiesYamlTest.java | 4 +-
6 files changed, 104 insertions(+), 7 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/8591999f/core/src/main/java/brooklyn/util/task/Tasks.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/util/task/Tasks.java
b/core/src/main/java/brooklyn/util/task/Tasks.java
index f644441..573b342 100644
--- a/core/src/main/java/brooklyn/util/task/Tasks.java
+++ b/core/src/main/java/brooklyn/util/task/Tasks.java
@@ -18,7 +18,6 @@
*/
package brooklyn.util.task;
-import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.Callable;
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/8591999f/docs/guide/yaml/yaml-reference.md
----------------------------------------------------------------------
diff --git a/docs/guide/yaml/yaml-reference.md
b/docs/guide/yaml/yaml-reference.md
index 980b9e3..8427b06 100644
--- a/docs/guide/yaml/yaml-reference.md
+++ b/docs/guide/yaml/yaml-reference.md
@@ -147,6 +147,7 @@ concise DSL defined here:
until the given `sensor` from the component `ID` has a "truthy" (i.e.
non-trivial, non-empty, non-zero) value
* `.config("key")` will insert the value set against the given key at this
entity (or nearest ancestor);
can be used to supply config at the root which is used in multiple places
in the plan
+ * `$brooklyn:sensor("sensor.name")` returns the given sensor on the current
entity if found, or an untyped (Object) sensor;
* `$brooklyn:component("scope", "ID")` is also supported, to limit scope to
any of
* `global`: looks for the `ID` anywhere in the plan
* `child`: looks for the `ID` anywhere in the child only
@@ -157,7 +158,7 @@ concise DSL defined here:
* `$brooklyn:formatString("pattern e.g. %s %s", "field 1", "field 2")` returns
a future which creates the formatted string
with the given parameters, where parameters may be strings *or* other tasks
such as `attributeWhenReady`
* `$brooklyn:literal("string")` returns the given string as a literal
(suppressing any `$brooklyn:` expansion)
-* `$brooklyn:sensor("io.brooklyn.ContainingEntityClass", "sensor.name")`
returns the strongly typed sensor defined in the given class
+ `$brooklyn:sensor("io.brooklyn.ContainingEntityClass", "sensor.name")`
returns the strongly typed sensor defined in the given class
* `$brooklyn:entitySpec(Map)` returns a new `ServiceSpecification` as defined
by the given `Map`,
but as an `EntitySpec` suitable for setting as the value of
`ConfigKey<EntitySpec>` config items
(such as `memberSpec` in `DynamicCluster`)
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/8591999f/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/dsl/methods/BrooklynDslCommon.java
----------------------------------------------------------------------
diff --git
a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/dsl/methods/BrooklynDslCommon.java
b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/dsl/methods/BrooklynDslCommon.java
index b38afd8..da19f6e 100644
---
a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/dsl/methods/BrooklynDslCommon.java
+++
b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/dsl/methods/BrooklynDslCommon.java
@@ -95,9 +95,12 @@ public class BrooklynDslCommon {
return new DslComponent(Scope.THIS, "").attributeWhenReady(sensorName);
}
- // TODO Would be nice to have sensor(String sensorName), which would take
the sensor
- // from the entity in question, but that would require refactoring of
Brooklyn DSL
-
+ /** Returns a {@link Sensor}, looking up the sensor on the context if
available and using that,
+ * or else defining an untyped (Object) sensor */
+ public static BrooklynDslDeferredSupplier<Sensor<?>> sensor(String
sensorName) {
+ return new DslComponent(Scope.THIS, "").sensor(sensorName);
+ }
+
/** Returns a {@link Sensor} from the given entity type. */
@SuppressWarnings({ "unchecked", "rawtypes" })
public static Sensor<?> sensor(String clazzName, String sensorName) {
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/8591999f/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/dsl/methods/DslComponent.java
----------------------------------------------------------------------
diff --git
a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/dsl/methods/DslComponent.java
b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/dsl/methods/DslComponent.java
index 21e8afc..7b1ab4b 100644
---
a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/dsl/methods/DslComponent.java
+++
b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/dsl/methods/DslComponent.java
@@ -230,6 +230,41 @@ public class DslComponent extends
BrooklynDslDeferredSupplier<Entity> {
return component.toString()+"."+"config("+keyName+")";
}
}
+
+ public BrooklynDslDeferredSupplier<Sensor<?>> sensor(final String
sensorName) {
+ return new DslSensorSupplier(this, sensorName);
+ }
+ protected final static class DslSensorSupplier extends
BrooklynDslDeferredSupplier<Sensor<?>> {
+ private final DslComponent component;
+ private final String sensorName;
+ private static final long serialVersionUID = -4735177561947722511L;
+
+ public DslSensorSupplier(DslComponent component, String sensorName) {
+ this.component = Preconditions.checkNotNull(component);
+ this.sensorName = sensorName;
+ }
+
+ @Override
+ public Task<Sensor<?>> newTask() {
+ return Tasks.<Sensor<?>>builder().name("looking up sensor for
"+sensorName).dynamic(false).body(new Callable<Sensor<?>>() {
+ @Override
+ public Sensor<?> call() throws Exception {
+ Entity targetEntity = component.get();
+ Sensor<?> result = null;
+ if (targetEntity!=null) {
+ result =
targetEntity.getEntityType().getSensor(sensorName);
+ }
+ if (result!=null) return result;
+ return Sensors.newSensor(Object.class, sensorName);
+ }
+ }).build();
+ }
+
+ @Override
+ public String toString() {
+ return component.toString()+"."+"sensor("+sensorName+")";
+ }
+ }
public static enum Scope {
GLOBAL ("global"),
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/8591999f/usage/camp/src/test/java/io/brooklyn/camp/brooklyn/DslAndRebindYamlTest.java
----------------------------------------------------------------------
diff --git
a/usage/camp/src/test/java/io/brooklyn/camp/brooklyn/DslAndRebindYamlTest.java
b/usage/camp/src/test/java/io/brooklyn/camp/brooklyn/DslAndRebindYamlTest.java
index eb99cff..c90104f 100644
---
a/usage/camp/src/test/java/io/brooklyn/camp/brooklyn/DslAndRebindYamlTest.java
+++
b/usage/camp/src/test/java/io/brooklyn/camp/brooklyn/DslAndRebindYamlTest.java
@@ -31,9 +31,12 @@ import org.testng.annotations.Test;
import brooklyn.config.ConfigKey;
import brooklyn.entity.Application;
import brooklyn.entity.Entity;
+import brooklyn.entity.basic.Attributes;
+import brooklyn.entity.basic.ConfigKeys;
import brooklyn.entity.basic.Entities;
import brooklyn.entity.basic.EntityInternal;
import brooklyn.entity.rebind.RebindTestUtils;
+import brooklyn.event.Sensor;
import brooklyn.event.basic.Sensors;
import brooklyn.management.ManagementContext;
import brooklyn.management.internal.LocalManagementContext;
@@ -135,6 +138,62 @@ public class DslAndRebindYamlTest extends AbstractYamlTest
{
" test.confName:
$brooklyn:component(\"x\").attributeWhenReady(\"foo\")");
}
+ private void doTestOnEntityWithSensor(Entity testEntity, Sensor<?>
expectedSensor) throws Exception {
+ doTestOnEntityWithSensor(testEntity, expectedSensor, true);
+ }
+ private void doTestOnEntityWithSensor(Entity testEntity, Sensor<?>
expectedSensor, boolean inTask) throws Exception {
+ @SuppressWarnings("rawtypes")
+ ConfigKey<Sensor> configKey = ConfigKeys.newConfigKey(Sensor.class,
"test.sensor");
+ Sensor<?> s;
+ s = inTask ? getConfigInTask(testEntity, configKey) :
testEntity.getConfig(configKey);
+ Assert.assertEquals(s, expectedSensor);
+ Application app2 = rebind(testEntity.getApplication());
+ Entity te2 = Iterables.getOnlyElement( app2.getChildren() );
+ s = inTask ? getConfigInTask(te2, configKey) :
te2.getConfig(configKey);
+ Assert.assertEquals(s, expectedSensor);
+ }
+
+ @Test
+ public void testDslSensorFromClass() throws Exception {
+ doTestOnEntityWithSensor(entityWithSensorFromClass(),
Attributes.SERVICE_UP);
+ // without context it can still find it
+ doTestOnEntityWithSensor(entityWithSensorFromClass(),
Attributes.SERVICE_UP, false);
+ }
+ @Test
+ public void testDslSensorLocal() throws Exception {
+ doTestOnEntityWithSensor(entityWithSensorLocal(), TestEntity.SEQUENCE);
+ // here without context it makes one up, so type info (and description
etc) not present;
+ // but context is needed to submit the DslDeferredSupplier object, so
this would fail
+// doTestOnEntityWithSensor(entityWithSensorAdHoc(),
Sensors.newSensor(Object.class, TestEntity.SEQUENCE.getName()), false);
+ }
+ @Test
+ public void testDslSensorAdHoc() throws Exception {
+ doTestOnEntityWithSensor(entityWithSensorAdHoc(),
Sensors.newSensor(Object.class, "sensor.foo"));
+ // here context has no impact, but it is needed to submit the
DslDeferredSupplier object so this would fail
+// doTestOnEntityWithSensor(entityWithSensorAdHoc(),
Sensors.newSensor(Object.class, "sensor.foo"), false);
+ }
+
+ private Entity entityWithSensorFromClass() throws Exception {
+ return setupAndCheckTestEntityInBasicYamlWith(
+ " id: x",
+ " brooklyn.config:",
+ " test.sensor:
$brooklyn:sensor(\""+Attributes.class.getName()+"\",
\""+Attributes.SERVICE_UP.getName()+"\")");
+ }
+
+ private Entity entityWithSensorLocal() throws Exception {
+ return setupAndCheckTestEntityInBasicYamlWith(
+ " id: x",
+ " brooklyn.config:",
+ " test.sensor:
$brooklyn:sensor(\""+TestEntity.SEQUENCE.getName()+"\")");
+ }
+
+ private Entity entityWithSensorAdHoc() throws Exception {
+ return setupAndCheckTestEntityInBasicYamlWith(
+ " id: x",
+ " brooklyn.config:",
+ " test.sensor: $brooklyn:sensor(\"sensor.foo\")");
+ }
+
@Test
public void testDslConfigFromRoot() throws Exception {
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/8591999f/usage/camp/src/test/java/io/brooklyn/camp/brooklyn/EntitiesYamlTest.java
----------------------------------------------------------------------
diff --git
a/usage/camp/src/test/java/io/brooklyn/camp/brooklyn/EntitiesYamlTest.java
b/usage/camp/src/test/java/io/brooklyn/camp/brooklyn/EntitiesYamlTest.java
index 8defc5f..6deda0f 100644
--- a/usage/camp/src/test/java/io/brooklyn/camp/brooklyn/EntitiesYamlTest.java
+++ b/usage/camp/src/test/java/io/brooklyn/camp/brooklyn/EntitiesYamlTest.java
@@ -460,7 +460,7 @@ public class EntitiesYamlTest extends AbstractYamlTest {
Assert.assertEquals(getResolvedConfigInTask(entity,
key).get(), keyToEntity.get(key));
} catch (Throwable t) {
Exceptions.propagateIfFatal(t);
- Assert.fail("Wrong value for "+entity+":"+key+",
"+entity.getConfigRaw(key, false)+": "+t, t);
+ Assert.fail("Wrong value for "+entity+":"+key+",
"+((EntityInternal)entity).config().getLocalRaw(key)+": "+t, t);
}
}
}
@@ -699,7 +699,7 @@ public class EntitiesYamlTest extends AbstractYamlTest {
Application app = (Application) createStartWaitAndLogApplication(new
StringReader(yaml));
TestEntity entity = (TestEntity)
Iterables.getOnlyElement(app.getChildren());
- EntitySpec<?> entitySpec = (EntitySpec<?>)
entity.getAllConfigBag().getStringKey("key.does.not.match");
+ EntitySpec<?> entitySpec = (EntitySpec<?>)
entity.config().getBag().getStringKey("key.does.not.match");
assertEquals(entitySpec.getType(), TestEntity.class);
assertEquals(entitySpec.getConfig(),
ImmutableMap.of(TestEntity.CONF_NAME, "inchildspec"));
}