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/07/14 13:24:59 UTC

[brooklyn-server] branch master updated (98e04b606c -> ee64a18c4e)

This is an automated email from the ASF dual-hosted git repository.

heneveld pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/brooklyn-server.git


    from 98e04b606c Merge remote-tracking branch 'algairim/enhancements/string-constraint-parser'
     new 11d9f10d85 fix bug where new DslPredicate didn't properly test sensors
     new ee64a18c4e allow `groups` to be omitted for GroupsChangePolicy

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../brooklyn/entity/group/GroupsChangePolicy.java  | 10 +++++++
 .../util/core/predicates/DslPredicates.java        | 35 ++++++++++++++++------
 .../core/predicates/DslPredicateEntityTest.java    | 27 ++++++++++++++---
 3 files changed, 59 insertions(+), 13 deletions(-)


[brooklyn-server] 01/02: fix bug where new DslPredicate didn't properly test sensors

Posted by he...@apache.org.
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

commit 11d9f10d85235e625594f2d1a3e6d21ea299bc64
Author: Alex Heneveld <al...@cloudsoft.io>
AuthorDate: Thu Jul 14 13:17:24 2022 +0100

    fix bug where new DslPredicate didn't properly test sensors
    
    and passed if no checks where applicable
---
 .../util/core/predicates/DslPredicates.java        | 35 ++++++++++++++++------
 .../core/predicates/DslPredicateEntityTest.java    | 27 ++++++++++++++---
 2 files changed, 49 insertions(+), 13 deletions(-)

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 8a079e2c3e..210bfbcc7f 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
@@ -18,6 +18,7 @@
  */
 package org.apache.brooklyn.util.core.predicates;
 
+import com.fasterxml.jackson.annotation.JsonInclude;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.core.JsonParser;
 import com.fasterxml.jackson.databind.*;
@@ -168,6 +169,7 @@ public class DslPredicates {
         return isStringOrPrimitive(value) ? test.test(value.toString()) : false;
     }
 
+    @JsonInclude(JsonInclude.Include.NON_NULL)
     public static class DslPredicateBase<T> {
         public Object implicitEquals;
         public Object equals;
@@ -189,25 +191,39 @@ public class DslPredicates {
         public @JsonProperty("java-instance-of") Object javaInstanceOf;
 
         public static class CheckCounts {
-            int checksTried = 0;
+            int checksDefined = 0;
+            int checksApplicable = 0;
             int checksPassed = 0;
             public <T> void check(T test, java.util.function.Predicate<T> check) {
                 if (test!=null) {
-                    checksTried++;
+                    checksDefined++;
+                    checksApplicable++;
                     if (check.test(test)) checksPassed++;
                 }
             }
             public <T> void check(T test, Maybe<Object> value, java.util.function.BiPredicate<T,Object> check) {
-                if (value.isPresent()) check(test, t -> check.test(t, value.get()));
+                if (value.isPresent()) {
+                    check(test, t -> check.test(t, value.get()));
+                } else {
+                    if (test!=null) {
+                        checksDefined++;
+                    }
+                }
             }
 
+            @Deprecated /** @deprecated since 1.1 when introduced; pass boolean */
             public boolean allPassed() {
-                return checksPassed == checksTried;
+                return checksPassed == checksDefined;
+            }
+
+            public boolean allPassed(boolean requireAtLeastOne) {
+                if (checksDefined ==0 && requireAtLeastOne) return false;
+                return checksPassed == checksDefined;
             }
 
             public void add(CheckCounts other) {
                 checksPassed += other.checksPassed;
-                checksTried += other.checksTried;
+                checksDefined += other.checksDefined;
             }
         }
 
@@ -223,7 +239,8 @@ public class DslPredicates {
         public boolean applyToResolved(Maybe<Object> result) {
             CheckCounts counts = new CheckCounts();
             applyToResolved(result, counts);
-            return counts.allPassed();
+            if (counts.checksDefined==0) throw new IllegalStateException("Predicate does not define any checks; if always true or always false is desired, use 'when'");
+            return counts.allPassed(true);
         }
 
         public void applyToResolved(Maybe<Object> result, CheckCounts checker) {
@@ -346,7 +363,7 @@ public class DslPredicates {
                 for (Object v : ((Iterable) result.get())) {
                     CheckCounts checker2 = new CheckCounts();
                     applyToResolvedFlattened(v instanceof Maybe ? (Maybe) v : Maybe.of(v), checker2);
-                    if (checker2.allPassed()) {
+                    if (checker2.allPassed(true)) {
                         checker.add(checker2);
                         return;
                     }
@@ -392,8 +409,8 @@ public class DslPredicates {
             super.applyToResolved(result, checker);
             checker.check(tag, result, this::checkTag);
 
-            if (checker.checksTried==0) {
-                if (target!=null || config!=null) {
+            if (checker.checksDefined==0) {
+                if (target!=null || config!=null || sensor!=null) {
                     // if no test specified, but test or config is, then treat as implicit presence check
                     checkWhen(WhenPresencePredicate.PRESENT_NON_NULL, result, checker);
                 }
diff --git a/core/src/test/java/org/apache/brooklyn/util/core/predicates/DslPredicateEntityTest.java b/core/src/test/java/org/apache/brooklyn/util/core/predicates/DslPredicateEntityTest.java
index 24e3b06ee3..2465003544 100644
--- a/core/src/test/java/org/apache/brooklyn/util/core/predicates/DslPredicateEntityTest.java
+++ b/core/src/test/java/org/apache/brooklyn/util/core/predicates/DslPredicateEntityTest.java
@@ -26,12 +26,14 @@ import org.apache.brooklyn.api.entity.Entity;
 import org.apache.brooklyn.api.location.Location;
 import org.apache.brooklyn.core.entity.EntityPredicates;
 import org.apache.brooklyn.core.resolve.jackson.BeanWithTypeUtils;
+import org.apache.brooklyn.core.sensor.Sensors;
 import org.apache.brooklyn.core.test.BrooklynAppUnitTestSupport;
 import org.apache.brooklyn.core.test.entity.TestApplication;
 import org.apache.brooklyn.core.test.entity.TestEntity;
 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.task.Tasks;
 import org.apache.brooklyn.util.yaml.Yamls;
 import org.testng.annotations.Test;
 
@@ -50,11 +52,28 @@ public class DslPredicateEntityTest extends BrooklynAppUnitTestSupport {
                 "config", TestEntity.CONF_OBJECT.getName(),
                 "equals", "x"), DslPredicates.DslPredicate.class);
 
-        app.config().set(TestEntity.CONF_OBJECT, "x");
-        Asserts.assertTrue(p.test(app));
+        app.getExecutionContext().submit(Tasks.create("test", () -> {
+            app.config().set(TestEntity.CONF_OBJECT, "x");
+            Asserts.assertTrue(p.test(app));
 
-        app.config().set(TestEntity.CONF_OBJECT, "y");
-        Asserts.assertFalse(p.test(app));
+            app.config().set(TestEntity.CONF_OBJECT, "y");
+            Asserts.assertFalse(p.test(app));
+        })).getUnchecked();
+    }
+
+    @Test
+    public void testSensorEquals() {
+        DslPredicates.DslPredicate p = TypeCoercions.coerce(MutableMap.of(
+                "sensor", "sensor1",
+                "equals", "x"), DslPredicates.DslPredicate.class);
+
+        app.getExecutionContext().submit(Tasks.create("test", () -> {
+            app.sensors().set(Sensors.newStringSensor("sensor1"), "x");
+            Asserts.assertTrue(p.test(app));
+
+            app.sensors().set(Sensors.newStringSensor("sensor1"), "y");
+            Asserts.assertFalse(p.test(app));
+        })).getUnchecked();
     }
 
     @Test


[brooklyn-server] 02/02: allow `groups` to be omitted for GroupsChangePolicy

Posted by he...@apache.org.
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

commit ee64a18c4ea2539cb7a00698eebe42b34ac06b9f
Author: Alex Heneveld <al...@cloudsoft.io>
AuthorDate: Thu Jul 14 14:24:38 2022 +0100

    allow `groups` to be omitted for GroupsChangePolicy
---
 .../org/apache/brooklyn/entity/group/GroupsChangePolicy.java   | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/core/src/main/java/org/apache/brooklyn/entity/group/GroupsChangePolicy.java b/core/src/main/java/org/apache/brooklyn/entity/group/GroupsChangePolicy.java
index 23055bd14e..ab6adfd17e 100644
--- a/core/src/main/java/org/apache/brooklyn/entity/group/GroupsChangePolicy.java
+++ b/core/src/main/java/org/apache/brooklyn/entity/group/GroupsChangePolicy.java
@@ -23,6 +23,7 @@ import com.google.common.collect.ImmutableMap;
 import com.google.common.reflect.TypeToken;
 import org.apache.brooklyn.api.entity.Entity;
 import org.apache.brooklyn.api.entity.EntityInitializer;
+import org.apache.brooklyn.api.entity.Group;
 import org.apache.brooklyn.api.location.Location;
 import org.apache.brooklyn.api.location.LocationSpec;
 import org.apache.brooklyn.api.mgmt.ExecutionContext;
@@ -233,4 +234,13 @@ public class GroupsChangePolicy extends AbstractMembershipTrackingPolicy {
         Maybe<Object> rawInitializers = config().getRaw(key);
         return rawInitializers.isPresent() ? (List<Map<String, Object>>) rawInitializers.get() : ImmutableList.of();
     }
+
+    /** default to the entity where attached, eg if attached to a group no need to specify $brooklyn:self() */
+    protected Group getGroup() {
+        Group result = super.getGroup();
+        if (result!=null) return result;
+        if (entity instanceof Group) return (Group)entity;
+        return null;
+    }
+
 }