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/27 16:32:44 UTC

[brooklyn-server] branch master updated (168b66036c -> fc03710c07)

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 168b66036c fix problem where k8s logs are sometimes reset
     new 76d8846601 minor dsl serialization tidies and test
     new fc03710c07 don't unwrap applications in one edge case

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:
 .../spi/dsl/methods/BrooklynDslCommon.java         |  2 +-
 .../brooklyn/core/mgmt/EntityManagementUtils.java  | 44 ++++++++-------
 .../util/json/BrooklynJacksonSerializerTest.java   | 64 ++++++++++++++++++++--
 3 files changed, 82 insertions(+), 28 deletions(-)


[brooklyn-server] 02/02: don't unwrap applications in one edge case

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 fc03710c07f3aa803c5864ca5ddcaa2d538fb297
Author: Alex Heneveld <al...@cloudsoft.io>
AuthorDate: Wed Jul 27 17:31:35 2022 +0100

    don't unwrap applications in one edge case
    
    if parameter has default value at parent where config sets a real value.
    probably this indicates intention on the part of the user to have the parameter tracked separately.
---
 .../brooklyn/core/mgmt/EntityManagementUtils.java  | 44 +++++++++++-----------
 1 file changed, 23 insertions(+), 21 deletions(-)

diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/EntityManagementUtils.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/EntityManagementUtils.java
index a1ee6b9e5f..b042c1b065 100644
--- a/core/src/main/java/org/apache/brooklyn/core/mgmt/EntityManagementUtils.java
+++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/EntityManagementUtils.java
@@ -18,15 +18,14 @@
  */
 package org.apache.brooklyn.core.mgmt;
 
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.concurrent.Callable;
-
-import java.util.function.Function;
-import javax.annotation.Nullable;
-
+import com.google.common.annotations.Beta;
+import com.google.common.base.Optional;
+import com.google.common.base.Predicates;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Maps;
+import com.google.common.util.concurrent.Runnables;
 import org.apache.brooklyn.api.entity.Application;
 import org.apache.brooklyn.api.entity.Entity;
 import org.apache.brooklyn.api.entity.EntitySpec;
@@ -47,20 +46,16 @@ import org.apache.brooklyn.util.collections.MutableMap;
 import org.apache.brooklyn.util.collections.MutableSet;
 import org.apache.brooklyn.util.core.task.TaskBuilder;
 import org.apache.brooklyn.util.core.task.Tasks;
-import org.apache.brooklyn.util.guava.Maybe;
 import org.apache.brooklyn.util.text.Strings;
 import org.apache.brooklyn.util.time.Duration;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.annotations.Beta;
-import com.google.common.base.Optional;
-import com.google.common.base.Predicates;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Maps;
-import com.google.common.util.concurrent.Runnables;
+import javax.annotation.Nullable;
+import java.util.*;
+import java.util.concurrent.Callable;
+import java.util.function.Function;
+import java.util.stream.Collectors;
 
 /** Utility methods for working with entities and applications */
 public class EntityManagementUtils {
@@ -333,7 +328,7 @@ public class EntityManagementUtils {
      *
      * @see #WRAPPER_APP_MARKER  */
     public static boolean canUnwrapEntity(EntitySpec<? extends Entity> spec, boolean allowUnwrappingApplicationsWithoutWrapperAppMarker) {
-        return ((allowUnwrappingApplicationsWithoutWrapperAppMarker && Application.class.isAssignableFrom(spec.getType())) 
+        return ((allowUnwrappingApplicationsWithoutWrapperAppMarker && Application.class.isAssignableFrom(spec.getType()))
                 || isWrapperApp(spec)) &&
             hasMergeableSingleChild(spec);
     }
@@ -345,9 +340,16 @@ public class EntityManagementUtils {
         EntitySpec<? extends Entity> child = Iterables.getOnlyElement(spec.getChildren());
         if (!allParentSubsetOfChild(spec, child, EntitySpec::getEnricherSpecs, EntitySpec::getInitializers, EntitySpec::getPolicySpecs)) return false;
 
-        // prevent merge only if a location is defined at both levels
+        // prevent merge if a location is defined at both levels
         if (! ((spec.getLocations().isEmpty() && spec.getLocationSpecs().isEmpty()) ||
-                (Iterables.getOnlyElement(spec.getChildren()).getLocations().isEmpty()) && Iterables.getOnlyElement(spec.getChildren()).getLocationSpecs().isEmpty())) {
+                (Iterables.getOnlyElement(spec.getChildren()).getLocations().isEmpty()) && child.getLocationSpecs().isEmpty())) {
+            return false;
+        }
+
+        Set<String> parentParamsWithDefaults = spec.getParameters().stream().filter(p -> p.getConfigKey().getDefaultValue()!=null).map(p -> p.getConfigKey().getName()).collect(Collectors.toSet());
+        if (child.getConfig().keySet().stream().anyMatch(k -> parentParamsWithDefaults.contains(k.getName()))) {
+            // don't merge if child sets a config value where the parent declares a parameter with a default value
+            // the default value will be clobbered even though someone else might be depending on it
             return false;
         }
 


[brooklyn-server] 01/02: minor dsl serialization tidies and test

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 76d88466014ca39cc16ade030fc287831d1079b5
Author: Alex Heneveld <al...@cloudsoft.io>
AuthorDate: Wed Jul 27 16:49:07 2022 +0100

    minor dsl serialization tidies and test
---
 .../spi/dsl/methods/BrooklynDslCommon.java         |  2 +-
 .../util/json/BrooklynJacksonSerializerTest.java   | 64 ++++++++++++++++++++--
 2 files changed, 59 insertions(+), 7 deletions(-)

diff --git a/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/methods/BrooklynDslCommon.java b/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/methods/BrooklynDslCommon.java
index d729f585a1..62507b9f58 100644
--- a/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/methods/BrooklynDslCommon.java
+++ b/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/methods/BrooklynDslCommon.java
@@ -448,7 +448,7 @@ public class BrooklynDslCommon {
 
         public DslLiteral(Object input) {
             this.literalString = input instanceof String ? (String)input : null;
-            this.literalObjectJson = input instanceof String ? null : Jsonya.render(input);
+            this.literalObjectJson = (input==null || input instanceof String) ? null : Jsonya.render(input);
         }
 
         public String getLiteralObjectJson() {
diff --git a/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/util/json/BrooklynJacksonSerializerTest.java b/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/util/json/BrooklynJacksonSerializerTest.java
index 40d3b8f00b..fb92bdd47e 100644
--- a/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/util/json/BrooklynJacksonSerializerTest.java
+++ b/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/util/json/BrooklynJacksonSerializerTest.java
@@ -29,13 +29,15 @@ import org.apache.brooklyn.api.entity.Entity;
 import org.apache.brooklyn.api.entity.EntitySpec;
 import org.apache.brooklyn.api.mgmt.ManagementContext;
 import org.apache.brooklyn.api.objs.BrooklynObject;
+import org.apache.brooklyn.camp.brooklyn.BrooklynCampPlatform;
+import org.apache.brooklyn.camp.brooklyn.spi.dsl.DslUtils;
+import org.apache.brooklyn.camp.brooklyn.spi.dsl.methods.DslComponent;
+import org.apache.brooklyn.camp.spi.PlatformRootSummary;
 import org.apache.brooklyn.core.entity.Attributes;
 import org.apache.brooklyn.core.entity.Entities;
 import org.apache.brooklyn.core.mgmt.BrooklynTaskTags;
-import org.apache.brooklyn.core.resolve.jackson.BeanWithTypeUtils;
-import org.apache.brooklyn.core.resolve.jackson.BrooklynJacksonSerializationUtils;
-import org.apache.brooklyn.core.resolve.jackson.BrooklynJacksonType;
-import org.apache.brooklyn.core.resolve.jackson.WrappedValue;
+import org.apache.brooklyn.core.mgmt.internal.LocalManagementContext;
+import org.apache.brooklyn.core.resolve.jackson.*;
 import org.apache.brooklyn.core.test.entity.LocalManagementContextForTests;
 import org.apache.brooklyn.core.test.entity.TestEntity;
 import org.apache.brooklyn.entity.stock.BasicApplication;
@@ -46,13 +48,13 @@ import org.apache.brooklyn.util.core.flags.TypeCoercions;
 import org.apache.brooklyn.util.core.json.BidiSerialization;
 import org.apache.brooklyn.util.core.units.ByteSize;
 import org.apache.brooklyn.util.exceptions.Exceptions;
+import org.apache.brooklyn.util.javalang.Reflections;
 import org.apache.brooklyn.util.net.UserAndHostAndPort;
 import org.apache.brooklyn.util.stream.Streams;
 import org.apache.brooklyn.util.text.StringEscapes;
 import org.apache.brooklyn.util.text.Strings;
 import org.apache.brooklyn.util.time.Duration;
 import org.apache.brooklyn.util.time.Time;
-import org.apache.brooklyn.util.time.Timestamp;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.testng.Assert;
@@ -60,8 +62,12 @@ import org.testng.annotations.Test;
 
 import java.io.ByteArrayOutputStream;
 import java.io.NotSerializableException;
+import java.lang.reflect.Field;
 import java.time.Instant;
-import java.util.*;
+import java.util.Arrays;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
 import java.util.function.BiConsumer;
 import java.util.function.Consumer;
 
@@ -595,4 +601,50 @@ public class BrooklynJacksonSerializerTest {
         }
     }
 
+    public static class ObjectWithWrappedValueStringAndAnother extends WrappedValuesSerializationTest.ObjectWithWrappedValueString {
+        public String y;
+    }
+
+    @Test
+    public void testDslSupplier() throws Exception {
+        LocalManagementContext mgmt = LocalManagementContextForTests.newInstance();
+        try {
+            BrooklynCampPlatform platform = new BrooklynCampPlatform(
+                    PlatformRootSummary.builder().name("Brooklyn CAMP Platform").build(),
+                    mgmt)
+                    .setConfigKeyAtManagmentContext();
+            TestEntity entity = mgmt.getEntityManager().createEntity(EntitySpec.create(TestEntity.class).configure("fk", "foo"));
+            Object dsl = DslUtils.parseBrooklynDsl(mgmt, "$brooklyn:config(\"fk\")");
+            ObjectWithWrappedValueStringAndAnother obj = new ObjectWithWrappedValueStringAndAnother();
+            obj.x = WrappedValue.of(dsl);
+            obj.y = "yyy";
+
+            mgmt.getExecutionContext(entity).submit("resolve", () -> Asserts.assertEquals(obj.x.get(), "foo")).get();
+
+            List result = BeanWithTypeUtils.convert(mgmt, MutableList.of(obj), TypeToken.of(List.class), true, null, true);
+
+            mgmt.getExecutionContext(entity).submit("resolve", () -> Asserts.assertEquals(
+                    ((WrappedValuesSerializationTest.ObjectWithWrappedValueString) result.get(0)).x.get(), "foo")).get();
+
+            // if dsl field is cleared, we can still read it, this time using class instantiation
+            Field dslField = Reflections.findField(dsl.getClass(), "dsl");
+            dslField.setAccessible(true);
+            dslField.set(dsl, null);
+
+            dslField = Reflections.findField(((DslComponent.DslConfigSupplier)dsl).getComponent().getClass(), "dsl");
+            dslField.setAccessible(true);
+            dslField.set( ((DslComponent.DslConfigSupplier)dsl).getComponent() , null);
+
+            List result2 = BeanWithTypeUtils.convert(mgmt, MutableList.of(obj), TypeToken.of(List.class), true, null, true);
+
+            mgmt.getExecutionContext(entity).submit("resolve", () -> Asserts.assertEquals(
+                    ((WrappedValuesSerializationTest.ObjectWithWrappedValueString) result2.get(0)).x.get(), "foo")).get();
+
+            // (above test was to investigate a situation where ultimately a downstream "shorthand" serializer was using
+            // findRootValueDeserializer rather than findContextualValueDeserializer, so not attending to our custom type info rules;
+            // the test is useful however, so has been added
+        } finally {
+            Entities.destroyAll(mgmt);
+        }
+    }
 }