Apply flags for fields declared in the entity implementation
Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/b1a730a3 Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/b1a730a3 Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/b1a730a3 Branch: refs/heads/master Commit: b1a730a3d5bf49a0bb83663d268b87f78ee6b325 Parents: 68f5bd7 Author: Svetoslav Neykov <[email protected]> Authored: Thu Jul 16 18:46:54 2015 +0300 Committer: Svetoslav Neykov <[email protected]> Committed: Thu Jul 16 18:48:41 2015 +0300 ---------------------------------------------------------------------- .../brooklyn/camp/spi/resolve/PdpProcessor.java | 14 +++++- .../BrooklynComponentTemplateResolver.java | 20 +++++++- .../camp/brooklyn/EntitiesYamlTest.java | 21 +++++++++ .../brooklyn/catalog/CatalogYamlEntityTest.java | 49 ++++++++++++++++---- 4 files changed, 91 insertions(+), 13 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/b1a730a3/camp/camp-base/src/main/java/io/brooklyn/camp/spi/resolve/PdpProcessor.java ---------------------------------------------------------------------- diff --git a/camp/camp-base/src/main/java/io/brooklyn/camp/spi/resolve/PdpProcessor.java b/camp/camp-base/src/main/java/io/brooklyn/camp/spi/resolve/PdpProcessor.java index 44ea105..e4bc537 100644 --- a/camp/camp-base/src/main/java/io/brooklyn/camp/spi/resolve/PdpProcessor.java +++ b/camp/camp-base/src/main/java/io/brooklyn/camp/spi/resolve/PdpProcessor.java @@ -39,6 +39,7 @@ import org.apache.commons.compress.archivers.ArchiveInputStream; import org.apache.commons.compress.archivers.ArchiveStreamFactory; import org.yaml.snakeyaml.error.YAMLException; +import brooklyn.util.collections.MutableMap; import brooklyn.util.exceptions.Exceptions; import brooklyn.util.stream.Streams; import brooklyn.util.yaml.Yamls; @@ -104,8 +105,17 @@ public class PdpProcessor { } Map<String, Object> attrs = plan.getCustomAttributes(); - if (attrs!=null && !attrs.isEmpty()) - atc.addCustomAttributes(attrs); + if (attrs!=null && !attrs.isEmpty()) { + Map<String, Object> customAttrs = attrs; + if (customAttrs.containsKey("id")) { + // id shouldn't be leaking to entities, see InternalEntityFactory.createEntityAndDescendantsUninitialized. + // If set it will go through to the spec because AbstractBrooklynObject has @SetFromFlag("id") on the id property. + // Follows logic in BrooklynEntityMatcher.apply(...). + customAttrs = MutableMap.copyOf(attrs); + customAttrs.put("planId", customAttrs.remove("id")); + } + atc.addCustomAttributes(customAttrs); + } if (atc.getInstantiator()==null) // set a default instantiator which just invokes the component's instantiators http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/b1a730a3/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java ---------------------------------------------------------------------- diff --git a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java index ca4748f..cdf1beb 100644 --- a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java +++ b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java @@ -27,6 +27,7 @@ import io.brooklyn.camp.spi.ApplicationComponentTemplate; import io.brooklyn.camp.spi.AssemblyTemplate; import io.brooklyn.camp.spi.PlatformComponentTemplate; +import java.util.Collection; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; @@ -359,7 +360,7 @@ public class BrooklynComponentTemplateResolver { bagFlags.putAll((Map<String, Object>) attrs.getStringKey(BrooklynCampReservedKeys.BROOKLYN_FLAGS)); } - List<FlagConfigKeyAndValueRecord> topLevelApparentConfig = FlagUtils.findAllFlagsAndConfigKeys(null, spec.getType(), bagFlags); + Collection<FlagConfigKeyAndValueRecord> topLevelApparentConfig = findAllFlagsAndConfigKeys(spec, bagFlags); for (FlagConfigKeyAndValueRecord r: topLevelApparentConfig) { if (r.getConfigKeyMaybeValue().isPresent()) bag.putIfAbsent((ConfigKey)r.getConfigKey(), r.getConfigKeyMaybeValue().get()); @@ -368,7 +369,7 @@ public class BrooklynComponentTemplateResolver { } // now set configuration for all the items in the bag - List<FlagConfigKeyAndValueRecord> records = FlagUtils.findAllFlagsAndConfigKeys(null, spec.getType(), bag); + Collection<FlagConfigKeyAndValueRecord> records = findAllFlagsAndConfigKeys(spec, bag); Set<String> keyNamesUsed = new LinkedHashSet<String>(); for (FlagConfigKeyAndValueRecord r: records) { if (r.getFlagMaybeValue().isPresent()) { @@ -396,6 +397,21 @@ public class BrooklynComponentTemplateResolver { } } + /** + * Searches for config keys in the type, additional interfaces and the implementation (if specified) + */ + private Collection<FlagConfigKeyAndValueRecord> findAllFlagsAndConfigKeys(EntitySpec<?> spec, ConfigBag bagFlags) { + Set<FlagConfigKeyAndValueRecord> allKeys = MutableSet.of(); + allKeys.addAll(FlagUtils.findAllFlagsAndConfigKeys(null, spec.getType(), bagFlags)); + if (spec.getImplementation() != null) { + allKeys.addAll(FlagUtils.findAllFlagsAndConfigKeys(null, spec.getImplementation(), bagFlags)); + } + for (Class<?> iface : spec.getAdditionalInterfaces()) { + allKeys.addAll(FlagUtils.findAllFlagsAndConfigKeys(null, iface, bagFlags)); + } + return allKeys; + } + protected static class SpecialFlagsTransformer implements Function<Object, Object> { protected final ManagementContext mgmt; /* TODO find a way to make do without loader here? http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/b1a730a3/usage/camp/src/test/java/io/brooklyn/camp/brooklyn/EntitiesYamlTest.java ---------------------------------------------------------------------- diff --git a/usage/camp/src/test/java/io/brooklyn/camp/brooklyn/EntitiesYamlTest.java b/usage/camp/src/test/java/io/brooklyn/camp/brooklyn/EntitiesYamlTest.java index 9885686..ec0d6bd 100644 --- a/usage/camp/src/test/java/io/brooklyn/camp/brooklyn/EntitiesYamlTest.java +++ b/usage/camp/src/test/java/io/brooklyn/camp/brooklyn/EntitiesYamlTest.java @@ -156,6 +156,16 @@ public class EntitiesYamlTest extends AbstractYamlTest { } @Test + public void testFlagAtRootEntityImpl() throws Exception { + Entity app = createAndStartApplication( + "services:", + "- serviceType: " + TestEntityImpl.class.getName(), + " confName: Foo Bar"); + Entity testEntity = Iterables.getOnlyElement(app.getChildren()); + Assert.assertEquals(testEntity.getConfig(TestEntity.CONF_NAME), "Foo Bar"); + } + + @Test public void testConfigKeyAtRoot() throws Exception { Entity testEntity = setupAndCheckTestEntityInBasicYamlWith( " test.confName: Foo Bar"); @@ -180,6 +190,17 @@ public class EntitiesYamlTest extends AbstractYamlTest { } @Test + public void testExplicitFlagsEntityImpl() throws Exception { + Entity app = createAndStartApplication( + "services:", + "- serviceType: " + TestEntityImpl.class.getName(), + " brooklyn.flags:", + " confName: Foo Bar"); + Entity testEntity = Iterables.getOnlyElement(app.getChildren()); + Assert.assertEquals(testEntity.getConfig(TestEntity.CONF_NAME), "Foo Bar"); + } + + @Test public void testUndeclaredExplicitFlagsIgnored() throws Exception { Entity testEntity = setupAndCheckTestEntityInBasicYamlWith( " brooklyn.flags:", http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/b1a730a3/usage/camp/src/test/java/io/brooklyn/camp/brooklyn/catalog/CatalogYamlEntityTest.java ---------------------------------------------------------------------- diff --git a/usage/camp/src/test/java/io/brooklyn/camp/brooklyn/catalog/CatalogYamlEntityTest.java b/usage/camp/src/test/java/io/brooklyn/camp/brooklyn/catalog/CatalogYamlEntityTest.java index fecbe43..1639588 100644 --- a/usage/camp/src/test/java/io/brooklyn/camp/brooklyn/catalog/CatalogYamlEntityTest.java +++ b/usage/camp/src/test/java/io/brooklyn/camp/brooklyn/catalog/CatalogYamlEntityTest.java @@ -39,6 +39,7 @@ import brooklyn.management.osgi.OsgiStandaloneTest; import brooklyn.management.osgi.OsgiTestResources; import brooklyn.test.TestResourceUnavailableException; import brooklyn.test.entity.TestEntity; +import brooklyn.test.entity.TestEntityImpl; import brooklyn.util.ResourceUtils; import brooklyn.util.collections.MutableList; import brooklyn.util.exceptions.Exceptions; @@ -613,7 +614,7 @@ public class CatalogYamlEntityTest extends AbstractYamlTest { @Test public void testConfigAppliedToCatalogItem() throws Exception { - addTestEntityCatalogItem(); + addCatalogOSGiEntity("test", TestEntity.class.getName()); String testName = "test-applies-config-on-catalog-item"; Entity app = createAndStartApplication( "services:", @@ -626,7 +627,7 @@ public class CatalogYamlEntityTest extends AbstractYamlTest { @Test public void testFlagsAppliesToCatalogItem() throws Exception { - addTestEntityCatalogItem(); + addCatalogOSGiEntity("test", TestEntity.class.getName()); String testName = "test-applies-config-on-catalog-item"; Entity app = createAndStartApplication( "services:", @@ -638,7 +639,7 @@ public class CatalogYamlEntityTest extends AbstractYamlTest { @Test public void testExplicitFlagsAppliesToCatalogItem() throws Exception { - addTestEntityCatalogItem(); + addCatalogOSGiEntity("test", TestEntity.class.getName()); String testName = "test-applies-config-on-catalog-item"; Entity app = createAndStartApplication( "services:", @@ -649,15 +650,45 @@ public class CatalogYamlEntityTest extends AbstractYamlTest { assertEquals(testEntity.config().get(TestEntity.CONF_NAME), testName); } - private void addTestEntityCatalogItem() { - addCatalogItems( - "brooklyn.catalog:", - " id: test", - " version: " + TEST_VERSION, + + @Test + public void testConfigAppliedToCatalogItemImpl() throws Exception { + addCatalogOSGiEntity("test", TestEntityImpl.class.getName()); + String testName = "test-applies-config-on-catalog-item"; + Entity app = createAndStartApplication( + "services:", + "- type: " + ver("test"), + " brooklyn.config:", + " test.confName: " + testName); + Entity testEntity = Iterables.getOnlyElement(app.getChildren()); + assertEquals(testEntity.config().get(TestEntity.CONF_NAME), testName); + } + + @Test + public void testFlagsAppliesToCatalogItemImpl() throws Exception { + addCatalogOSGiEntity("test", TestEntityImpl.class.getName()); + String testName = "test-applies-config-on-catalog-item"; + Entity app = createAndStartApplication( "services:", - "- type: " + TestEntity.class.getName()); + "- type: " + ver("test"), + " confName: " + testName); + Entity testEntity = Iterables.getOnlyElement(app.getChildren()); + assertEquals(testEntity.config().get(TestEntity.CONF_NAME), testName); } + @Test + public void testExplicitFlagsAppliesToCatalogItemImpl() throws Exception { + addCatalogOSGiEntity("test", TestEntityImpl.class.getName()); + String testName = "test-applies-config-on-catalog-item"; + Entity app = createAndStartApplication( + "services:", + "- type: " + ver("test"), + " brooklyn.flags:", + " confName: " + testName); + Entity testEntity = Iterables.getOnlyElement(app.getChildren()); + assertEquals(testEntity.config().get(TestEntity.CONF_NAME), testName); + } + private void registerAndLaunchAndAssertSimpleEntity(String symbolicName, String serviceType) throws Exception { addCatalogOSGiEntity(symbolicName, serviceType); String yaml = "name: simple-app-yaml\n" +
