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;