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 2017/03/23 11:15:42 UTC

[jira] [Created] (BROOKLYN-458) Cluster can't use transformer to get "host.name" sensor of "cluster.first.entity"

Aled Sage created BROOKLYN-458:
----------------------------------

             Summary: Cluster can't use transformer to get "host.name" sensor of "cluster.first.entity"
                 Key: BROOKLYN-458
                 URL: https://issues.apache.org/jira/browse/BROOKLYN-458
             Project: Brooklyn
          Issue Type: Improvement
            Reporter: Aled Sage


Mike shared the blueprint below (which I've turned into a unit test, against 0.11.0-SNAPSHOT):
{noformat}
    @Test
    public void testClusterGetsAttributeOfChild() throws Exception {
        String yaml = Joiner.on("\n").join(
                "brooklyn.catalog:",
                "    version: 0.2-SNAPSHOT",
                "    items:",
                "    - id: test-cluster",
                "      name: test-cluster",
                "      item:",
                "        type: org.apache.brooklyn.entity.group.DynamicCluster",
                "        memberSpec:",
                "          $brooklyn:entitySpec:",
                "            type: org.apache.brooklyn.entity.software.base.EmptySoftwareProcess",
                "            name: \"Node\"",
                "        brooklyn.enrichers:",
                "          - type: org.apache.brooklyn.enricher.stock.Transformer",
                "            brooklyn.config:",
                "              enricher.sourceSensor: $brooklyn:sensor(\"cluster.first.entity\")",
                "              enricher.targetSensor: $brooklyn:sensor(\"cluster_first_host\")",
                "              enricher.targetValue:",
                "                $brooklyn:formatString:",
                "                - \"%s\"",
                "                - $brooklyn:entity($brooklyn:attributeWhenReady(\"cluster.first.entity\")).attributeWhenReady(\"host.name\")");

                        addCatalogItems(yaml);
                
        String appYaml = Joiner.on("\n").join(
                "location: localhost",
                "services:",
                "- type: test-cluster");
        
        Entity app = createAndStartApplication(appYaml);
        Entity cluster = Iterables.getOnlyElement(app.getChildren());
        
        EntityAsserts.assertAttributeEqualsEventually(app, Attributes.SERVICE_UP, true);
        EntityAsserts.assertAttributeEqualsEventually(app, Attributes.SERVICE_STATE_ACTUAL, Lifecycle.RUNNING);
        EntityAsserts.assertAttributeEventually(cluster, Sensors.newStringSensor("cluster_first_host"), StringPredicates.isNonBlank());
    }
{noformat}

It fails because sensor {{cluster_first_host}} is never set on the cluster entity. This is because the targetValue evaluation is triggered whenever the sourceSensor changes. However, when {{clsuter.first.entity}} is set, that entity does not yet have a {{host.name}}. Therefore the {{attributeWhenReady}} is not yet available. (Under-the-covers, it discovers this by using {{getImmediately}}, and thus returns immediately without blocking).

Mike tried to work around this by setting the {{producer}} for the transformer enricher, but that led to him hitting https://issues.apache.org/jira/browse/BROOKLYN-457.

This is not really a bug (but could probably do with improvements in our docs to explain it!).

We'd like a way to elegantly write this blueprint though (hence marking this as an "improvement").



--
This message was sent by Atlassian JIRA
(v6.3.15#6346)