[openstack-dev] [Heat] New function: first_nonnull

Steven Hardy shardy at redhat.com
Thu Nov 6 19:44:54 UTC 2014

On Wed, Nov 05, 2014 at 02:46:43PM +0000, Lee, Alexis wrote:
>    I'm considering adding a function which takes a list and returns the first
>    non-null, non-empty value in that list.
>    So you could do EG:
>        some_thing:
>            config:
>                ControlVIP:
>                    first_nonnull:
>                    - {get_param: ControlVIP}
>                    - {get_attr: [ControlVirtualIP, fixed_ips, 0,
>    ip_address]}]}
>    I'm open to other names, EG "some", "or", "fallback_list" etc.
>    Steve Hardy suggested building this into get_attr or Fn::Select. My
>    feeling is that those each do one job well right now, I'm happy to
>    take a steer though.

Ah, from our IRC discussion I was thinking you wanted primarily list
filtering of get_attr output, thus thinking an optional argument would make
more sense than a new function.

I see now that you're actually looking for something of a poor-mans
conditional, so you choose either the ControlVIP parameter, or the
ControlVirtualIP attribute, for which your proposal is probably cleaner -
my concern is just that we avoid a proliferation of different list
select/filter functions, when we could just have one.

To clarify I wasn't suggesting we add anything into Fn::Select, but
possibly implementing a native alternative which does what Fn::Select does
and includes optional list filtering, e.g something flexible which can do
more than just select a non-null value, e.g something like:

        - {get_param: ControlVIP}
        - {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}]}
        - 0
        - non_null

This would take any number of list arguments, join them, then take an
index value, and an optional filter value.  Maybe we could even make the
"0" optional and default to zero, provided there's a non-overlapping range
of input allowed for the index and filter arguments.

Don't have a very strong opinion on the name, but FWIW I prefer
first_nonnull over coalesce, just because the latter is really clear
if you know the mysql function, and really not if you don't :)

Happy to hear other ideas, but I think it's good that we discuss this
before committing to an interface (either here or in a spec review).


More information about the OpenStack-dev mailing list