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 0716b3f14f26c1e12d6400785defc35feb7a30c8 Author: Alex Heneveld <[email protected]> AuthorDate: Fri Dec 2 19:39:41 2022 +0000 ensure anonymous config is restored on adjuncts after persistence --- .../brooklyn/camp/brooklyn/EnrichersYamlTest.java | 18 ++++++++++++++---- .../brooklyn/camp/brooklyn/PoliciesYamlTest.java | 19 ++++++++++++++++--- .../test/policy/failover/ElectPrimaryTest.java | 14 +++++++++++--- .../apache/brooklyn/core/entity/AbstractEntity.java | 2 +- .../brooklyn/core/objs/AbstractEntityAdjunct.java | 1 + .../apache/brooklyn/util/core/flags/FlagUtils.java | 21 ++++++++++++++++----- .../brooklyn/util/core/internal/FlagUtilsTest.java | 3 ++- 7 files changed, 61 insertions(+), 17 deletions(-) diff --git a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/EnrichersYamlTest.java b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/EnrichersYamlTest.java index 37c04fb571..04b85040fc 100644 --- a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/EnrichersYamlTest.java +++ b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/EnrichersYamlTest.java @@ -31,6 +31,7 @@ import org.apache.brooklyn.core.entity.Entities; import org.apache.brooklyn.core.entity.EntityAdjuncts; import org.apache.brooklyn.core.entity.EntityAsserts; import org.apache.brooklyn.core.entity.EntityInternal; +import org.apache.brooklyn.core.objs.BrooklynObjectInternal; import org.apache.brooklyn.core.sensor.Sensors; import org.apache.brooklyn.core.test.entity.TestEntity; import org.apache.brooklyn.core.test.policy.TestEnricher; @@ -83,10 +84,14 @@ public class EnrichersYamlTest extends AbstractYamlTest { return enricher.getConfig(TestEnricher.TARGET_ENTITY_FROM_FLAG); }}).get(); Assert.assertEquals(targetFromFlag, target); + Map<?, ?> leftoverProperties = ((TestEnricher) enricher).getLeftoverProperties(); +// Assert.assertEquals(leftoverProperties.size(), 2); // 2022-12 there are never any leftover properties + Assert.assertEquals(leftoverProperties.size(), 0); + + leftoverProperties = ((BrooklynObjectInternal.ConfigurationSupportInternal)enricher.config()).getBag().getAllConfigMutable(); Assert.assertEquals(leftoverProperties.get("enricherLiteralValue1"), "Hello"); Assert.assertEquals(leftoverProperties.get("enricherLiteralValue2"), "World"); - Assert.assertEquals(leftoverProperties.size(), 2); } @Test @@ -112,9 +117,14 @@ public class EnrichersYamlTest extends AbstractYamlTest { Assert.assertTrue(enricher instanceof TestEnricher, "enricher=" + enricher + "; type=" + enricher.getClass()); Assert.assertEquals(enricher.getConfig(TestEnricher.CONF_NAME), "Name from YAML"); Assert.assertEquals(enricher.getConfig(TestEnricher.CONF_FROM_FUNCTION), "$brooklyn: is a fun place"); - - Assert.assertEquals(((TestEnricher) enricher).getLeftoverProperties(), - ImmutableMap.of("enricherLiteralValue1", "Hello", "enricherLiteralValue2", "World")); + + Map<?, ?> leftoverProperties = ((TestEnricher) enricher).getLeftoverProperties(); + // Assert.assertEquals(leftoverProperties.size(), 2); // 2022-12 there are never any leftover properties + Assert.assertEquals(leftoverProperties.size(), 0); + + leftoverProperties = ((BrooklynObjectInternal.ConfigurationSupportInternal)enricher.config()).getBag().getAllConfigMutable(); + Assert.assertEquals(leftoverProperties.get("enricherLiteralValue1"), "Hello"); + Assert.assertEquals(leftoverProperties.get("enricherLiteralValue2"), "World"); } @Test diff --git a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/PoliciesYamlTest.java b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/PoliciesYamlTest.java index d56c4aea6a..ed5a216542 100644 --- a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/PoliciesYamlTest.java +++ b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/PoliciesYamlTest.java @@ -26,7 +26,9 @@ import org.apache.brooklyn.api.policy.Policy; import org.apache.brooklyn.config.ConfigKey; import org.apache.brooklyn.core.entity.Dumper; import org.apache.brooklyn.core.entity.EntityInternal; +import org.apache.brooklyn.core.objs.BrooklynObjectInternal; import org.apache.brooklyn.core.test.entity.TestEntity; +import org.apache.brooklyn.core.test.policy.TestEnricher; import org.apache.brooklyn.core.test.policy.TestPolicy; import org.apache.brooklyn.test.Asserts; import org.apache.brooklyn.util.collections.MutableMap; @@ -58,10 +60,14 @@ public class PoliciesYamlTest extends AbstractYamlTest { Assert.assertTrue(policy instanceof TestPolicy); Assert.assertEquals(policy.getConfig(TestPolicy.CONF_NAME), "Name from YAML"); Assert.assertEquals(policy.getConfig(TestPolicy.CONF_FROM_FUNCTION), "$brooklyn: is a fun place"); + Map<?, ?> leftoverProperties = ((TestPolicy) policy).getLeftoverProperties(); + // Assert.assertEquals(leftoverProperties.size(), 2); // 2022-12 there are never any leftover properties + Assert.assertEquals(leftoverProperties.size(), 0); + + leftoverProperties = ((BrooklynObjectInternal.ConfigurationSupportInternal)policy.config()).getBag().getAllConfigMutable(); Assert.assertEquals(leftoverProperties.get("policyLiteralValue1"), "Hello"); Assert.assertEquals(leftoverProperties.get("policyLiteralValue2"), "World"); - Assert.assertEquals(leftoverProperties.size(), 2); } @Test @@ -82,8 +88,15 @@ public class PoliciesYamlTest extends AbstractYamlTest { Assert.assertTrue(policy instanceof TestPolicy, "policy=" + policy + "; type=" + policy.getClass()); Assert.assertEquals(policy.getConfig(TestPolicy.CONF_NAME), "Name from YAML"); Assert.assertEquals(policy.getConfig(TestPolicy.CONF_FROM_FUNCTION), "$brooklyn: is a fun place"); - Assert.assertEquals(((TestPolicy) policy).getLeftoverProperties(), - ImmutableMap.of("policyLiteralValue1", "Hello", "policyLiteralValue2", "World")); + + Map<?, ?> leftoverProperties = ((TestPolicy) policy).getLeftoverProperties(); + // Assert.assertEquals(leftoverProperties.size(), 2); // 2022-12 there are never any leftover properties + Assert.assertEquals(leftoverProperties.size(), 0); + + leftoverProperties = ((BrooklynObjectInternal.ConfigurationSupportInternal)policy.config()).getBag().getAllConfigMutable(); + Assert.assertEquals(leftoverProperties.get("policyLiteralValue1"), "Hello"); + Assert.assertEquals(leftoverProperties.get("policyLiteralValue2"), "World"); + Assert.assertEquals(policy.getConfig(TestPolicy.TEST_ATTRIBUTE_SENSOR), TestEntity.NAME); } diff --git a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/test/policy/failover/ElectPrimaryTest.java b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/test/policy/failover/ElectPrimaryTest.java index 84974a6216..4963c4f47e 100644 --- a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/test/policy/failover/ElectPrimaryTest.java +++ b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/test/policy/failover/ElectPrimaryTest.java @@ -22,6 +22,7 @@ import java.util.Collection; import java.util.Collections; import java.util.List; +import com.google.common.collect.Iterables; import org.apache.brooklyn.api.effector.Effector; import org.apache.brooklyn.api.entity.Entity; import org.apache.brooklyn.api.entity.EntityLocal; @@ -41,6 +42,8 @@ import org.apache.brooklyn.core.entity.EntityPredicates; import org.apache.brooklyn.core.entity.StartableApplication; import org.apache.brooklyn.core.entity.lifecycle.Lifecycle; import org.apache.brooklyn.core.entity.trait.Startable; +import org.apache.brooklyn.core.mgmt.rebind.RebindTestUtils; +import org.apache.brooklyn.core.objs.BrooklynObjectInternal; import org.apache.brooklyn.core.sensor.Sensors; import org.apache.brooklyn.core.test.entity.TestEntity; import org.apache.brooklyn.policy.failover.ElectPrimaryConfig; @@ -106,11 +109,16 @@ public class ElectPrimaryTest extends AbstractYamlRebindTest { @Test public void testSimpleRebind() throws Exception { - runSetPreferredViaWeightConfigOnB(); - + origApp = (StartableApplication) runSetPreferredViaWeightConfigOnB(); + Asserts.assertEquals(Iterables.getOnlyElement(app().policies()).config().get(ElectPrimaryConfig.BEST_WAIT_TIMEOUT), Duration.ZERO); + ((BrooklynObjectInternal.ConfigurationSupportInternal)Iterables.getOnlyElement(app().policies()).config()).setRaw(TestEntity.CONF_MAP_THING.subKey("x"), true, "X"); + mgmt().getRebindManager().getChangeListener().onChanged(Iterables.getOnlyElement(app().policies())); + StartableApplication app = rebind(); Assert.assertEquals(app.sensors().get(PRIMARY).getDisplayName(), "b"); - + Asserts.assertEquals(Iterables.getOnlyElement(app().policies()).config().get(ElectPrimaryConfig.BEST_WAIT_TIMEOUT), Duration.ZERO); + Asserts.assertEquals(Iterables.getOnlyElement(app().policies()).config().get(TestEntity.CONF_MAP_THING.subKey("x")), "X"); + Entity a = (Entity)mgmt().<Entity>lookup(EntityPredicates.displayNameEqualTo("a")); Entity b = (Entity)mgmt().<Entity>lookup(EntityPredicates.displayNameEqualTo("b")); a.sensors().set(WEIGHT_SENSOR, 2.0d); diff --git a/core/src/main/java/org/apache/brooklyn/core/entity/AbstractEntity.java b/core/src/main/java/org/apache/brooklyn/core/entity/AbstractEntity.java index 7f3df7ade1..c488c5a2dc 100644 --- a/core/src/main/java/org/apache/brooklyn/core/entity/AbstractEntity.java +++ b/core/src/main/java/org/apache/brooklyn/core/entity/AbstractEntity.java @@ -408,7 +408,7 @@ public abstract class AbstractEntity extends AbstractBrooklynObject implements E // TODO the default values on flags are not used? (we should remove that support, since ConfigKeys gives a better way) if (flags.size() > 0) { FlagUtils.setFieldsFromFlags(flags, this); - flags = FlagUtils.setAllConfigKeys(flags, this, false); + flags = FlagUtils.setAllConfigKeys(flags, this, false, false); } // finally all config keys specified in map should be set as config diff --git a/core/src/main/java/org/apache/brooklyn/core/objs/AbstractEntityAdjunct.java b/core/src/main/java/org/apache/brooklyn/core/objs/AbstractEntityAdjunct.java index 75c1fc6d0a..ff2d2bae2f 100644 --- a/core/src/main/java/org/apache/brooklyn/core/objs/AbstractEntityAdjunct.java +++ b/core/src/main/java/org/apache/brooklyn/core/objs/AbstractEntityAdjunct.java @@ -83,6 +83,7 @@ public abstract class AbstractEntityAdjunct extends AbstractBrooklynObject imple /** * @deprecated since 0.7.0; leftover properties are put into config, since when coming from yaml this is normal. + * since 1.1.0 this will likely always be empty. */ @Deprecated protected Map<String,Object> leftoverProperties = Maps.newLinkedHashMap(); diff --git a/core/src/main/java/org/apache/brooklyn/util/core/flags/FlagUtils.java b/core/src/main/java/org/apache/brooklyn/util/core/flags/FlagUtils.java index 4ee493044d..631923cc04 100644 --- a/core/src/main/java/org/apache/brooklyn/util/core/flags/FlagUtils.java +++ b/core/src/main/java/org/apache/brooklyn/util/core/flags/FlagUtils.java @@ -36,6 +36,7 @@ import org.apache.brooklyn.api.objs.Configurable; import org.apache.brooklyn.api.objs.SpecParameter; import org.apache.brooklyn.config.ConfigKey; import org.apache.brooklyn.config.ConfigKey.HasConfigKey; +import org.apache.brooklyn.core.config.ConfigKeys; import org.apache.brooklyn.util.core.config.ConfigBag; import org.apache.brooklyn.util.exceptions.Exceptions; import org.apache.brooklyn.util.groovy.GroovyJavaMethods; @@ -147,15 +148,22 @@ public class FlagUtils { /** sets _all_ accessible _{@link ConfigKey}_ and {@link HasConfigKey} fields on the given object, * using the indicated flags/config-bag */ - public static Map<String, ?> setAllConfigKeys(Map<String, ?> flagsOrConfig, Configurable instance, boolean includeFlags) { + public static void setAllConfigKeys(Map<String, ?> flagsOrConfig, Configurable instance, boolean includeFlags) { + setAllConfigKeys(flagsOrConfig, instance, includeFlags, true); + } + public static Map<String, ?> setAllConfigKeys(Map<String, ?> flagsOrConfig, Configurable instance, boolean includeFlags, boolean writeExtraAsAnonymousConfig) { ConfigBag bag = new ConfigBag().putAll(flagsOrConfig); - setAllConfigKeys(instance, bag, includeFlags); + setAllConfigKeys(instance, bag, includeFlags, writeExtraAsAnonymousConfig); return bag.getUnusedConfigMutable(); } - - /** sets _all_ accessible _{@link ConfigKey}_ and {@link HasConfigKey} fields on the given object, - * using the indicated flags/config-bag */ + public static void setAllConfigKeys(Configurable o, ConfigBag bag, boolean includeFlags) { + setAllConfigKeys(o, bag, includeFlags, true); + } + + /** sets _all_ accessible _{@link ConfigKey}_ and {@link HasConfigKey} fields on the given object, + * using the indicated flags/config-bag, and then the rest as general purpose config */ + public static void setAllConfigKeys(Configurable o, ConfigBag bag, boolean includeFlags, boolean writeExtrasAsAnonymousConfig) { for (Field f: getAllFields(o.getClass())) { ConfigKey<?> key = getFieldAsConfigKey(o, f); if (key!=null) { @@ -165,6 +173,9 @@ public class FlagUtils { } } } + if (writeExtrasAsAnonymousConfig) { + bag.getUnusedConfig().keySet().forEach(k -> o.config().set(ConfigKeys.newConfigKey(Object.class, k), bag.getStringKey(k))); + } } public static class FlagConfigKeyAndValueRecord { diff --git a/core/src/test/java/org/apache/brooklyn/util/core/internal/FlagUtilsTest.java b/core/src/test/java/org/apache/brooklyn/util/core/internal/FlagUtilsTest.java index b4ace3afaf..f22db62e2e 100644 --- a/core/src/test/java/org/apache/brooklyn/util/core/internal/FlagUtilsTest.java +++ b/core/src/test/java/org/apache/brooklyn/util/core/internal/FlagUtilsTest.java @@ -210,7 +210,8 @@ public class FlagUtilsTest { @Test public void testSetAllConfigKeys() { FooCK f = new FooCK(); - Map<?,?> unused = FlagUtils.setAllConfigKeys(ImmutableMap.of("f1", 9, "ck1", "do-set", "ck2", "do-set-2", "c3", "do-set"), f, true); + Map<?,?> unused = FlagUtils.setAllConfigKeys( + ImmutableMap.of("f1", 9, "ck1", "do-set", "ck2", "do-set-2", "c3", "do-set"), f, true, false); assertEquals(f.bag.get(FooCK.CK1), "do-set"); assertEquals(f.bag.get(FooCK.CK3), "do-set"); assertEquals(f.bag.containsKey(FooCK.CK2), true);
