Uploaded image for project: 'Brooklyn'
  1. Brooklyn
  2. BROOKLYN-267

brooklyn.parameter default value not picked up via inherited config

Attach filesAttach ScreenshotVotersWatch issueWatchersCreate sub-taskLinkCloneUpdate Comment AuthorReplace String in CommentUpdate Comment VisibilityDelete Comments
    XMLWordPrintableJSON

Details

    • Bug
    • Status: Resolved
    • Minor
    • Resolution: Fixed
    • 0.9.0
    • 0.11.0
    • None

    Description

      When adding the item below to the catalog, I get surprising behaviour when retrieving the "test.myconf" parameter at different levels.

      When inside a child entity, trying to do $brooklyn:config("test.myconf"), it returns null. But if I do $brooklyn:root().config("test.myconf") then it works as I'd expect (i.e. I get the default value).

      brooklyn.catalog:
        id: my-example
        version: 1.2.3
        item:
          brooklyn.parameters:
          - name: test.myconf
            type:  string
            default: myval
          services:
          - type: org.apache.brooklyn.entity.stock.BasicApplication
            brooklyn.config:
              myconf2: $brooklyn:config("test.myconf")
              myconf2.from.root: $brooklyn:root().config("test.myconf")
            brooklyn.children:
            - type: org.apache.brooklyn.entity.stock.BasicEntity
              brooklyn.config:
                myconf3: $brooklyn:config("test.myconf")
                myconf3.from.root: $brooklyn:root().config("test.myconf")
      

      The reason, I believe, is that $brooklyn:config("test.myconf") on the child will lookup the child's explicitly defined config keys and not find any. It will therefore create a new ConfigKey object with no default value. It looks up its own config and then the inherited config, but sees no explicit value set. So it falls back to the configKey.defaultValue. But because we synthesised a new config key object, we don't get the default value that was defined in the brooklyn.parameters section.


      Overall, I think it's best if:

      • our exemplar blueprints use things like $brooklyn:root().config("test.myconf") (because that has a very clear meaning);
      • and we change our config key lookup so that we only synthesis a config key object if none of the current entity or any of its ancestors in the parent hierarchy has a matching config key.

      For point (2), this could lead to surprising behaviour in edge cases where a hierarchy of entities includes something pulled in from another entity type in the catalog, and where that entity type happens to declare a config key by the same name with a default value. At that point, the user looking at their own yaml file might be surprised that it didn't pick up the default value they are looking at in front of them.

      Attachments

        Activity

          This comment will be Viewable by All Users Viewable by All Users
          Cancel

          People

            Unassigned Unassigned
            aled.sage Aled Sage
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved:

              Slack

                Issue deployment