On 10/08/17 20:48, ggun wrote:
Thanks, but the main point to merge the hash is that the sub hash header
value is not fixed in the example I have mentioned as
esa-user-profile-service or esa-group-service. It can be anything. I
need to make the code free from using direct Key value .
So 'was_dmgr_data' is a hash of unknown hashes. Did we understand
correctly that the "common part" is some kind of default?
Can you change the original structure, or are you stuck with this design?
In puppet 5.0.0 there is a function named 'tree_each' that can be used
together with 'map()' and the result of that fed into a Hash.new with an
option of 'tree', or 'tree_hash'. This is a very powerful function but
requires a little bit of setup.
I also included a simpler variant using the reduce() function.
That works well here since the task is to map one level of data in a
known way, so using tree_each is a bit of an overkill.
Using tree_each
===============
---------example.pp
# Sample data for illustration
$hash = {
common => { x => 10, y => 20},
was_data => {
thing => {a => 'in thing'},
other_thing => {a => 'in other thing', x => 1000 }
}
}
# The common to part to merge as defaults
#
$common = $hash[common]
# Map the tree to a flat structure. Skip the root
# (we want data one level down),
# and skip all values as they are included in the hash containers (and
# we do not need to transform them)
#
$flat_tree = $hash[was_data]
.tree_each({include_root => false, include_values => false} )
.map |$entry| {
# assign the path and value in $entry to separate variables
[$path, $val] = $entry
# only map top level keys (the path has length == 1) to a new value
# and make all other entries undef.
# The mapped entries is the common part with the specific data
# merged ($common + $val)
#
if $path =~ Array[1,1] {
[ $path, $common + $val ]
}
}.filter |$x| { $x != undef } # filter out the undef entries
# create a new hash and notice it
notice Hash($flat_tree, 'hash_tree')
--------------<eof>
When running this the output would be:
{thing => {x => 10, y => 20, a => in thing},
other_thing => {x => 1000, y => 20, a => in other thing}}
As you can see the result is a hash with the keys under 'was_data'
with the expected merged data.
Using reduce
============
If you are on a version before Puppet 5.0.0 it can be done with the
reduce function.
-------------example.pp
# Sample data for illustration
$hash = {
common => { x => 10, y => 20},
was_data => {
thing => {a => 'in thing'},
other_thing => {a => 'in other thing', x => 1000 }
}
}
$common = $hash[common]
$mapped = $hash[was_data].reduce({}) |$memo, $entry| {
[$k, $v] = $entry
$memo + { $k => $common + $v}
}
notice $mapped
-------------<eof>
I hope these two examples help.
Regards
- henrik
On Wednesday, August 9, 2017 at 2:24:34 PM UTC-4, Reid Vandewiele wrote:
If you're just trying to transform the data in Puppet code and
assuming (as Henrik was) that you can't change how the data is
stored, something like this might work.
# Assuming $was_data is the hash of data from Hiera
$common_data = $was_data.filter |$pair| { $pair[0] != 'was_dmgr_data' }
$hash1 = {'esa-group-service' => $common_data +
$was_data['was_dmgr_data']['esa-group-service'] }
$hash2 = {'esa-user-profile-service' => $common_data +
$was_data['was_dmgr_data']['esa-user-profile-service'] }
~Reid
On Wednesday, August 9, 2017 at 6:15:41 AM UTC-7, ggun wrote:
Thanks
On Tuesday, August 8, 2017 at 7:10:13 PM UTC-4, ggun wrote:
Hi Experts,
I have a requirement as below.
I need to create a Hash from below hiera data.
was_data:
hs3sourcepath: 'glic.binaries/websphere'
hdaresponse_file: /opt/software/WAS8.5.5.10_Install.xml
hibmagentpath:
/opt/software/agent.installer.linux.gtk.x86_64_1.8.2000.20150303_1526.zip
hbase_dir: '/opt/was/was855'
hinstance_name: WebSphere
was_dmgr_data:
esa-group-service:
hgroup: websph
hdmgr_profile: TST
hdmgr_cell: CELL
hcluster_name: CLUSTER
hpptdmgrsrvport: 8080
esa-user-profile-service:
hdmgr_profile: ABC
hdmgr_cell: PQS
hcluster_name: IOP
hpptdmgrsrvport: 0000
I need a hash of above data as
Hash 1 :
esa-group-service:
hgroup: websph
hdmgr_profile: TST
hdmgr_cell: CELL
hcluster_name: CLUSTER
hpptdmgrsrvport: 8080
hs3sourcepath: 'glic.binaries/websphere'
hdaresponse_file: /opt/software/WAS8.5.5.10_Install.xml
hibmagentpath:
/opt/software/agent.installer.linux.gtk.x86_64_1.8.2000.20150303_1526.zip
hbase_dir: '/opt/was/was855'
hinstance_name: WebSphere
Hash 2
esa-user-profile-service:
hdmgr_profile: ABC
hdmgr_cell: PQS
hcluster_name: IOP
hpptdmgrsrvport: 0000
hs3sourcepath: 'glic.binaries/websphere'
hdaresponse_file: /opt/software/WAS8.5.5.10_Install.xml
hibmagentpath:
/opt/software/agent.installer.linux.gtk.x86_64_1.8.2000.20150303_1526.zip
hbase_dir: '/opt/was/was855'
hinstance_name: WebSphere
So I trying to merge the has of esa-group-service to
was_data and esa-user-profile-service to was_data
Please let me know if there is a way
--
You received this message because you are subscribed to the Google
Groups "Puppet Developers" group.
To unsubscribe from this group and stop receiving emails from it, send
an email to puppet-dev+unsubscr...@googlegroups.com
<mailto:puppet-dev+unsubscr...@googlegroups.com>.
To view this discussion on the web visit
https://groups.google.com/d/msgid/puppet-dev/a7e5b925-2c85-4cb6-beaa-892ca1c1c80e%40googlegroups.com
<https://groups.google.com/d/msgid/puppet-dev/a7e5b925-2c85-4cb6-beaa-892ca1c1c80e%40googlegroups.com?utm_medium=email&utm_source=footer>.
For more options, visit https://groups.google.com/d/optout.
--
Visit my Blog "Puppet on the Edge"
http://puppet-on-the-edge.blogspot.se/
--
You received this message because you are subscribed to the Google Groups "Puppet
Developers" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to puppet-dev+unsubscr...@googlegroups.com.
To view this discussion on the web visit
https://groups.google.com/d/msgid/puppet-dev/omivrk%24u4j%241%40blaine.gmane.org.
For more options, visit https://groups.google.com/d/optout.