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 [email protected] or file a JIRA ticket
with INFRA.
---