[openstack-dev] [heat][yaql] Deep merge map of lists?
Steven Hardy
shardy at redhat.com
Tue Aug 30 08:17:52 UTC 2016
On Mon, Aug 29, 2016 at 04:03:27PM +0200, Thomas Herve wrote:
> On Mon, Aug 29, 2016 at 3:16 PM, Steven Hardy <shardy at redhat.com> wrote:
> > On Mon, Aug 29, 2016 at 07:07:09AM +0200, Thomas Herve wrote:
> >> dict($.groupBy($.keys().toList()[0], $.values().toList()[0][0]))
> >>
> >> ought to work, I believe?
> >
> > So, as it turns out, my example above was bad, and groupBy only works if
> > you have a list of maps with exactly one key, we actually need this:
> >
> > # Example of tripleo format
> > # We need an output of
> > # "gnocchi_metricd_node_names": ["overcloud-controller-0"]
> > # "tripleo_packages_node_names": ["overcloud-controller-0", "overcloud-compute-0"]
> > # "nova_compute_node_names": ["overcloud-compute-0"]
> > debug_tripleo:
> > value:
> > yaql:
> > expression: dict($.data.l.groupBy($.keys().toList()[0], $.values().toList()[0][0]))
> > data:
> > l:
> > - "gnocchi_metricd_node_names": ["overcloud-controller-0"]
> > "tripleo_packages_node_names": ["overcloud-controller-0"]
> > - "nova_compute_node_names": ["overcloud-compute-0"]
> > "tripleo_packages_node_names": ["overcloud-compute-0"]
> >
> > So, I'm back to wondering how we make the intermediate assignement of tripleo_packages_node_names
>
> Well I didn't know all the constraints :).
Heh, thanks for the help, I appreciate it!
> $.selectMany($.items()).groupBy($[0], $[1][0])
>
> is another attempt. It won't work if you have more than one value per
> key in the original data, but I think it will handle multiple keys.
Yeah, that gets us closer, but we do need to handle more than one value
(list entry) per key, e.g:
data:
l:
- "gnocchi_metricd_node_names": ["a0", "a1", "a2"]
"tripleo_packages_node_names": ["a0", "a1", "a2"]
- "nova_compute_node_names": ["b0"]
"tripleo_packages_node_names": ["b0"]
Output needs to be like:
"gnocchi_metricd_node_names": ["a0", "a1", "a2"]
"tripleo_packages_node_names": ["a0", "a1", "a2", "b0"]
"nova_compute_node_names": ["b0"]
I'm almost tempted to just write a map_deep_merge patch for heat, but I'm
guessing we won't be able to land it for newton at this point anyway.
Thanks!
Steve
More information about the OpenStack-dev
mailing list