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;

Reply via email to