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.
---

Reply via email to