You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@brooklyn.apache.org by "Aled Sage (JIRA)" <ji...@apache.org> on 2018/01/30 09:39:00 UTC
[jira] [Comment Edited] (BROOKLYN-565) brooklyn:object with nested
DSL inside list is not resolved
[ https://issues.apache.org/jira/browse/BROOKLYN-565?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16264592#comment-16264592 ]
Aled Sage edited comment on BROOKLYN-565 at 1/30/18 9:38 AM:
-------------------------------------------------------------
My attempted fix was to do a deep inspection of the {{$brooklyn:object}} to see if it contained any dsl (i.e. any {{DeferredSupplier}}{{}} s. If it did, then don't construct the object immediately and instead return a deferred {{DslObject}}.
{{}}Unfortunately that broke the test {{EnrichersYamlTest.testWithTransformerValueFunctionUsingDsl}}, which demonstrates a pattern used in some blueprints out in the wild. For example, something like:
{noformat}
brooklyn.enrichers:
- type: org.apache.brooklyn.enricher.stock.Transformer
brooklyn.config:
enricher.sourceSensor: $brooklyn:sensor("service.status")
enricher.targetSensor: $brooklyn:sensor("master.registrationDetails")
enricher.transformation:
$brooklyn:object:
type: com.google.common.base.Functions
factoryMethod.name: forMap
factoryMethod.args:
- "MASTER": $brooklyn:attributeWhenReady("registrationDetails")
- "not master"
{noformat}
Therefore reverting the fix.
was (Author: aled.sage):
My attempted fix was to do a deep inspection of the {{$brooklyn:object}} to see if it contained any dsl (i.e. any {{DeferredSupplier}}s. If it did, then don't construct the object immediately and instead return a deferred {{DslObject}}.
Unfortunately that broke the test {{EnrichersYamlTest.testWithTransformerValueFunctionUsingDsl}}, which demonstrates a pattern used in some blueprints out in the wild. For example, something like:
{noformat}
brooklyn.enrichers:
- type: org.apache.brooklyn.enricher.stock.Transformer
brooklyn.config:
enricher.sourceSensor: $brooklyn:sensor("service.status")
enricher.targetSensor: $brooklyn:sensor("master.registrationDetails")
enricher.transformation:
$brooklyn:object:
type: com.google.common.base.Functions
factoryMethod.name: forMap
factoryMethod.args:
- "MASTER": $brooklyn:attributeWhenReady("registrationDetails")
- "not master"
{noformat}
Therefore reverting the fix.
> brooklyn:object with nested DSL inside list is not resolved
> -----------------------------------------------------------
>
> Key: BROOKLYN-565
> URL: https://issues.apache.org/jira/browse/BROOKLYN-565
> Project: Brooklyn
> Issue Type: Bug
> Reporter: Aled Sage
> Priority: Major
>
> When using {{$brooklyn:object}} with a nested DSL expression that is contained within a list, it does not resolve the nested DSL expression.
> This is because it thinks that deferred-evaluation is not necessary. It constructs the object immediately - we end up with a DSL object in the list rather than the resolved value.
> The workaround is to include {{deferred: true}} inside the brooklyn object.
> The problem does not happen if there are any other top-level values in {{brooklyn.fields}} that are DSL expressions (it realises then that it must defer the evaluation).
> This is demonstrated by adding the following tests to {{ObjectsYamlTest}}:
> {noformat}
> @Test
> public void testFieldOfTypeListAsDeferredSuppliersExplicitlyDeferred() throws Exception {
> // Using explicit `deferred: true`
> Entity testEntity = setupAndCheckTestEntityInBasicYamlWith(
> " brooklyn.config:",
> " mystring: myval",
> " myint: 123",
> " test.confObject:",
> " $brooklyn:object:",
> " type: "+ObjectsYamlTest.class.getName()+"$TestObject",
> " deferred: true",
> " object.fields:",
> " list: ",
> " - $brooklyn:config(\"mystring\")");
> TestObject testObject = (TestObject) testEntity.getConfig(TestEntity.CONF_OBJECT);
> Assert.assertEquals(testObject.getList(), ImmutableList.of("myval"));
> }
>
> // Fails if don't include `deferred: true`
> // see {@link #testFieldOfTypeListAsDeferredSuppliersExplicitlyDeferred()}
> @Test(groups="Broken")
> public void testFieldOfTypeListAsDeferredSuppliers() throws Exception {
> // should defer evaluation automatically, and resolve config
> Entity testEntity = setupAndCheckTestEntityInBasicYamlWith(
> " brooklyn.config:",
> " mystring: myval",
> " myint: 123",
> " test.confObject:",
> " $brooklyn:object:",
> " type: "+ObjectsYamlTest.class.getName()+"$TestObject",
> " object.fields:",
> " list: ",
> " - $brooklyn:config(\"mystring\")");
> TestObject testObject = (TestObject) testEntity.getConfig(TestEntity.CONF_OBJECT);
> Assert.assertEquals(testObject.getList(), ImmutableList.of("myval"));
> }
> {noformat}
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)