Github user aledsage commented on the issue: https://github.com/apache/brooklyn-server/pull/440 Thanks @neykov - `ConfigNestedYamlTest.testCatalogParameterFromSuperYamlTypeAsSoftware` is a very annoying and valid failure! There is a `MapConfigKey` defined on the java type (`SoftwareProcess.TEMPLATE_SUBSTITUTIONS`). In the yaml (`config-nested-tests,bom`), the super-type declares a brooklyn.parameters for this: brooklyn.parameters: [ {name: template.substitutions, type: java.util.Map} ]`. Note the difference in type for the config keys: the first is a `MapConfigKey` and the latter is a `BasicConfigKey<java.util.Map>`. When the config values are written into the entity's spec, it uses the `MapConfigKey` so the value of `{field: val}` is actually written as `{template.substitutions.field: val}`. When the config value is later read, it uses the `BasicConfigKey<java.util.Map>`, so it just looks up `template.substitutions` and thus returns an empty map. --- A few things spring to mind: 1. don't try to change the type of a config key when you're overriding it in brooklyn.parameters. (However, the user doesn't think they've done this - it's of type map!) 2. write creating the spec, use the same config key as will subsequently be used for reading the value back out again. 3. I really don't like the `MapConfigKey` stuff. Particularly now that we have capabilities for defining the merge-semantics of map config keys, the need for the `MapConfigKey` is greatly reduced. Let's not try to tackle (3) right now, but that is one for the mailing list! (2) feels like the right thing to do. But it's fiddly. We're in the middle of the stacktrace below for (one of the places?) where we're writing the config value using the `MapConfigKey`: ``` "main" prio=5 tid=0x00007fdbab000000 nid=0x1703 at breakpoint[0x0000700000217000] java.lang.Thread.State: RUNNABLE at org.apache.brooklyn.api.internal.AbstractBrooklynObjectSpec.configure(AbstractBrooklynObjectSpec.java:293) at org.apache.brooklyn.camp.brooklyn.spi.creation.BrooklynComponentTemplateResolver.configureEntityConfig(BrooklynComponentTemplateResolver.java:337) at org.apache.brooklyn.camp.brooklyn.spi.creation.BrooklynComponentTemplateResolver.decorateSpec(BrooklynComponentTemplateResolver.java:259) at org.apache.brooklyn.camp.brooklyn.spi.creation.BrooklynComponentTemplateResolver.populateSpec(BrooklynComponentTemplateResolver.java:250) at org.apache.brooklyn.camp.brooklyn.spi.creation.BrooklynComponentTemplateResolver.resolveSpec(BrooklynComponentTemplateResolver.java:189) at org.apache.brooklyn.camp.brooklyn.spi.creation.BrooklynAssemblyTemplateInstantiator.buildTemplateServicesAsSpecs(BrooklynAssemblyTemplateInstantiator.java:114) at org.apache.brooklyn.camp.brooklyn.spi.creation.BrooklynAssemblyTemplateInstantiator.createServiceSpecs(BrooklynAssemblyTemplateInstantiator.java:73) at org.apache.brooklyn.camp.brooklyn.spi.creation.BrooklynAssemblyTemplateInstantiator.createApplicationSpec(BrooklynAssemblyTemplateInstantiator.java:90) at org.apache.brooklyn.camp.brooklyn.spi.creation.CampResolver.createEntitySpecFromServicesBlock(CampResolver.java:145) at org.apache.brooklyn.camp.brooklyn.spi.creation.CampResolver.createSpecFromFull(CampResolver.java:111) at org.apache.brooklyn.camp.brooklyn.spi.creation.CampToSpecTransformer.createCatalogSpec(CampToSpecTransformer.java:102) at org.apache.brooklyn.core.catalog.internal.BasicBrooklynCatalog$1.apply(BasicBrooklynCatalog.java:331) at org.apache.brooklyn.core.catalog.internal.BasicBrooklynCatalog$1.apply(BasicBrooklynCatalog.java:1) at org.apache.brooklyn.core.plan.PlanToSpecFactory.attemptWithLoaders(PlanToSpecFactory.java:126) at org.apache.brooklyn.core.plan.PlanToSpecFactory.attemptWithLoaders(PlanToSpecFactory.java:118) at org.apache.brooklyn.core.catalog.internal.BasicBrooklynCatalog.internalCreateSpecLegacy(BasicBrooklynCatalog.java:328) at org.apache.brooklyn.core.catalog.internal.BasicBrooklynCatalog$PlanInterpreterGuessingType.attemptType(BasicBrooklynCatalog.java:808) at org.apache.brooklyn.core.catalog.internal.BasicBrooklynCatalog$PlanInterpreterGuessingType.reconstruct(BasicBrooklynCatalog.java:735) at org.apache.brooklyn.core.catalog.internal.BasicBrooklynCatalog.collectCatalogItems(BasicBrooklynCatalog.java:508) at org.apache.brooklyn.core.catalog.internal.BasicBrooklynCatalog.collectCatalogItems(BasicBrooklynCatalog.java:476) at org.apache.brooklyn.core.catalog.internal.BasicBrooklynCatalog.collectCatalogItems(BasicBrooklynCatalog.java:383) at org.apache.brooklyn.core.catalog.internal.BasicBrooklynCatalog.collectCatalogItems(BasicBrooklynCatalog.java:372) at org.apache.brooklyn.core.catalog.internal.BasicBrooklynCatalog.addItems(BasicBrooklynCatalog.java:929) at org.apache.brooklyn.core.catalog.internal.BasicBrooklynCatalog.addItems(BasicBrooklynCatalog.java:1) at org.apache.brooklyn.camp.brooklyn.AbstractYamlTest.addCatalogItems(AbstractYamlTest.java:199) at org.apache.brooklyn.camp.brooklyn.ConfigNestedYamlTest.testCatalogParameterFromSuperYamlTypeAsSoftware(ConfigNestedYamlTest.java:89) ``` Maybe this is one to document and defer? Thoughts?
--- If your project is set up for it, you can reply to this email and have your reply appear on GitHub as well. If your project does not have this feature enabled and wishes so, or if the feature is enabled but not working, please contact infrastructure at infrastruct...@apache.org or file a JIRA ticket with INFRA. ---