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.

Reply via email to