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 2022/08/22 09:49:25 UTC
[brooklyn-server] branch master updated: test and fix for dsl predicate resolving config on an unpacked list target
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 <al...@cloudsoft.io>
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;