This is an automated email from the ASF dual-hosted git repository.
heneveld pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/brooklyn-server.git
The following commit(s) were added to refs/heads/master by this push:
new 62287917d4 test and fix for dsl predicate resolving config on an
unpacked list target
62287917d4 is described below
commit 62287917d47479acd7488e6b69ec32b09794b28d
Author: Alex Heneveld <[email protected]>
AuthorDate: Mon Aug 22 10:49:07 2022 +0100
test and fix for dsl predicate resolving config on an unpacked list target
---
.../brooklyn/spi/dsl/DslPredicateYamlTest.java | 26 ++++++++++++++++++++++
.../util/core/predicates/DslPredicates.java | 15 +++++++++++--
2 files changed, 39 insertions(+), 2 deletions(-)
diff --git
a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/DslPredicateYamlTest.java
b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/DslPredicateYamlTest.java
index db25f2433e..864d2d3726 100644
---
a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/DslPredicateYamlTest.java
+++
b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/DslPredicateYamlTest.java
@@ -26,6 +26,8 @@ import org.apache.brooklyn.test.Asserts;
import org.apache.brooklyn.util.collections.MutableMap;
import org.apache.brooklyn.util.core.flags.TypeCoercions;
import org.apache.brooklyn.util.core.predicates.DslPredicates;
+import org.apache.brooklyn.util.core.task.DynamicTasks;
+import org.apache.brooklyn.util.core.task.Tasks;
import org.testng.annotations.Test;
public class DslPredicateYamlTest extends AbstractYamlTest {
@@ -155,6 +157,30 @@ public class DslPredicateYamlTest extends AbstractYamlTest
{
Asserts.assertTrue( predicate.apply(app) );
}
+ @Test
+ public void testDslTargetLocationRetargetsWithoutGettingConfusedByConfig()
throws Exception {
+ Entity app = createAndStartApplication(
+ "services:",
+ "- type: " + BasicApplication.class.getName(),
+ " location: localhost",
+ " brooklyn.config:",
+ " test.confPredicate:",
+ " target: location",
+ " config: locHasConf");
+ // if 'location' is expanded as list, config is taken on the location
+ Runnable resolveCheck = () -> {
+ DslPredicates.DslPredicate predicate =
app.config().get(TestEntity.CONF_PREDICATE);
+ Asserts.assertFalse(predicate.apply(app));
+
app.getLocations().iterator().next().config().set(ConfigKeys.newStringConfigKey("locHasConf"),
"yes!");
+ Asserts.assertTrue(predicate.apply(app));
+ };
+ // works in a task
+ DynamicTasks.submit(Tasks.create("check config", resolveCheck),
app).get();
+
+ // outside of a task we get a nice error
+ Asserts.assertFailsWith(resolveCheck, e ->
Asserts.expectedFailureContainsIgnoreCase(e, "locHasConf", "Localhost",
"resolve", "entity task"));
+ }
+
@Test
public void testDslTargetTagRetargets() throws Exception {
Entity app = createAndStartApplication(
diff --git
a/core/src/main/java/org/apache/brooklyn/util/core/predicates/DslPredicates.java
b/core/src/main/java/org/apache/brooklyn/util/core/predicates/DslPredicates.java
index a2f2b72d2e..64bcf08117 100644
---
a/core/src/main/java/org/apache/brooklyn/util/core/predicates/DslPredicates.java
+++
b/core/src/main/java/org/apache/brooklyn/util/core/predicates/DslPredicates.java
@@ -485,7 +485,13 @@ public class DslPredicates {
ValueResolver<Object> resolver =
Tasks.resolving((DeferredSupplier) () ->
((Configurable)value).config().get(ConfigKeys.newConfigKey(Object.class,
config)))
.as(Object.class).allowDeepResolution(true).immediately(true);
if (value instanceof Entity) resolver.context(
(Entity)value );
- return resolver.getMaybe();
+ Maybe<Object> result = resolver.getMaybe();
+ if (result.isAbsent()) {
+ if (!(value instanceof Entity) &&
BrooklynTaskTags.getContextEntity(Tasks.current())==null) {
+ throw new IllegalStateException("Not permitted to
resolve config '"+config+"' on "+value+" outside of an entity task");
+ }
+ }
+ return result;
} else {
return Maybe.absent("Config not supported on " + value + "
(testing config '" + config + "')");
}
@@ -494,7 +500,7 @@ public class DslPredicates {
if (sensor!=null) resolvers.put("sensor", (value) -> {
if (value instanceof Entity) {
ValueResolver<Object> resolver =
Tasks.resolving((DeferredSupplier) () ->
((Entity)value).sensors().get(Sensors.newSensor(Object.class, sensor)))
-
.as(Object.class).allowDeepResolution(true).immediately(true);
+
.as(Object.class).allowDeepResolution(true).immediately(true).context((Entity)value);
return resolver.getMaybe();
} else {
return Maybe.absent("Sensors not supported on " + value +
" (testing sensor '" + config + "')");
@@ -507,6 +513,11 @@ public class DslPredicates {
Maybe<Object> result;
if (target instanceof String) {
result = Maybe.of( resolveTargetStringAgainstInput((String)
target, input).get() );
+
+ if (result.isPresent() && result.get() instanceof
RetargettedPredicateEvaluation) {
+ // do retargetting before doing further resolution (of
other keys, e.g. config)
+ return result;
+ }
} else {
if (target == null) {
target = input;