I'm not sure about any rules of thumb. It comes with time. I generally work on these kinds of questions by reducing them to and experimenting with an abstraction of the problem at hand, without the heft of the entity you ultimately want to use. The VanillaSoftwareProcess and EmptySoftwareProcess entities are very helpful for this, as is deploying to localhost or a bring-your-own-node location [1].

Regarding documentation I intend to get Brooklyn's various enrichers described alongside entities, policies and locations at https://brooklyn.apache.org/learnmore/catalog/ in the near future.

Sam

1. https://brooklyn.apache.org/v/latest/ops/locations/index.html#byon

On 07/03/2017 17:05, Graham Ashby wrote:
Thanks, Sam
Yes, that did work.
I was thinking of doing something like that myself, but I didn't know how
to translate the Java concepts into yaml.  Is there a rule of thumb about
how to do that translation?

G



From:   Sam Corbett <sam.corb...@cloudsoftcorp.com>
To:     dev@brooklyn.apache.org
Date:   03/07/2017 07:39 AM
Subject:        Re: How to express aggregator in yaml



Hi Graham,

You need a value for resources.runtime.latch or resources.install.latch
that indicates that all values in cm_host_port_list are non-null. My
suggestion is to use a parallel set of of sensors rather than trying to
do everything with cm_host_port_list: have each cluster member publish a
boolean value indicating its readiness, have the cluster aggregate those
into a single AND-ed value, and use that as the latch.

Here's an example Transformer to add to cluster members that publishes
whether mySensor is non-null:

    - type: org.apache.brooklyn.enricher.stock.Transformer
      brooklyn.config:
        enricher.sourceSensor: mySensor
        enricher.targetSensor: mySensorIsNonNull
        enricher.transformation:
          $brooklyn:object:
            type: com.google.common.base.Functions
            factoryMethod.name: forPredicate
            factoryMethod.args:
            -
              $brooklyn:object:
                type: com.google.common.base.Predicates
                factoryMethod.name: notNull

It's using the $brooklyn:object syntax [1] to create instances of a
Guava Function and a Predicate by referencing Guava's static helper
methods.

To reduce mySensorIsNonNull into a single true/false value for the latch
use an Aggregator on the cluster:

    - type: org.apache.brooklyn.enricher.stock.Aggregator
      brooklyn.config:
        enricher.sourceSensor: mySensorIsNonNull
        enricher.targetSensor: aggregated-ready
        enricher.aggregating.fromMembers: true
        enricher.transformation.untyped: isQuorate
        quorum.check.type: all
        quorum.total.size: $brooklyn:config("cluster.initial.size")

The isQuorate check computes whether there are at least
quorum.total.size true values in the input. Refer to the JavaDoc on
quorum checks [2] for more information on the valid values for
quorum.check.type.

With the aggregator in place you can use aggregated-ready as a latch in
another entity to guard the use of cm_host_port_list.

There are a number of improvements we should make to Brooklyn to help
your use case. First and foremost, Aggregators should expose an
equivalent of Joiner's minimum. If we had that we wouldn't need this
parallel set of sensors and enrichers at all. Secondly, we badly need to
improve the documentation for each of these components. I'm not sure
there's any way to find out that isQuorate is a valid value for
enricher.transformation.untyped without reading the source code for
Aggregator.

I hope this helps.

Sam

On 06/03/2017 16:10, Graham Ashby wrote:
Hi Sam
I've got an iterator in my template:

      <#list config['cm_host_port_list'] as cm_item>
        <crn:item xsi:type="xsd:anyURI">http://$
{cm_item}/p2pd/servlet</crn:item>
      </#list>

So, that's why I have an array.

So, I think I could do something with a Predicate, but I have no idea
how
I would wire this into the yaml.

Thanks
Graham




From:   Sam Corbett <sam.corb...@cloudsoftcorp.com>
To:     dev@brooklyn.apache.org
Date:   03/06/2017 10:36 AM
Subject:        Re: How to express aggregator in yaml



Hi Graham,

May I ask how you intend to use the values in your template?

If it would be sufficient to combine them into a single string you
should use a `Joiner` enricher whose minimum size is the initial size of
the cluster:

     brooklyn.config:
       cluster.initial.size: 4
     brooklyn.enrichers:
     - type: org.apache.brooklyn.enricher.stock.Aggregator
       brooklyn.config:
         enricher.sourceSensor: mySensor
         enricher.targetSensor: aggregated
         enricher.aggregating.fromMembers: true
     - type: org.apache.brooklyn.enricher.stock.Joiner
       brooklyn.config:
         enricher.sourceSensor: aggregated
         enricher.targetSensor: joinedUp
         enricher.joiner.quote: false
         enricher.joiner.minimum:
$brooklyn:config("cluster.initial.size")
In this example the value for `joinedUp` won't be published until the
`aggregated` sensor contains four non-null values.

With this approach you wouldn't need to use a latch; in your other
entity you'd assign the joiner's value to a config key:

     brooklyn.config:
       valueForTemplate:
$brooklyn:entity("cluster").attributeWhenReady("joinedUp")

And in your template write:

     ${config['valueForTemplate']

There is no equivalent of `enricher.joiner.minimum` for Aggregators so
if this approach is unsuitable - perhaps you want to iterate over the
values in your template - then it seems to be considerably more complex
to achieve what you want. I've got a few ideas but will wait to hear
whether the above is of any help before digging into them.

Sam


On 03/03/2017 19:12, Graham Ashby wrote:
OK, I've got this problem:
I have a list of hosts_ports that I've created in a cluster using an
Aggregator.  So far so good.. .By using attributeWhenReady, it fills in
when all the values are ready.
Now in another part of my application, I want to use this in a
template.
The thing is, I want to wait until all the elements in the list are not
null before I do the template.install.
I've got a resources.install.latch, which seems to be the right latch
to
use.  However, it needs a boolean

So my question is:  How can I write an Aggregator in yaml that will
only
be true if all the elements of the list are not null?
    I'm sure it's possible, and I could do it if I was writing Java. But
there isn't a lot of documentation on how to do this.

Thanks
Graham Ashby
graham.as...@ca.ibm.com












Reply via email to