Hi Raj, It is true that native hash merging has its own limitations which would lead to data duplication in some cases. But we need to analyze the trade-off between data duplication against readability and trace-ability aspects. IMHO, it's okay to have few data duplication if it makes things more simple and less error prone.
My concern is that what if this accidentally leads to unexpected data merging? I understand that native merging will merge the top level keys as well, but that is less susceptible for human errors compared to N-level deep merge. Also have a look at Puppet official docs about deep merging [1]. Looks like it is mainly intended for complex data structures and converting them to Puppet resources. We can ask the users to create their own Hiera data structures with deeper merging if they are comfortable with it. But given the additional complexity involved in configuring and installing deep_merge library [2], shall we ship native merge data structures by default? [1] https://docs.puppetlabs.com/hiera/3.0/lookup_types.html#deep-merging-in-hiera [2] https://docs.puppetlabs.com/hiera/3.0/lookup_types.html#deep-merging-in-hiera Thanks. On Fri, Dec 25, 2015 at 10:45 AM, Rajkumar Rajaratnam <[email protected]> wrote: > Hi Devs, > > We are using *Native* hash merge right now. *It merges only the top-level > keys and values in each source hash. If the same key exists in both a lower > priority source and a higher priority source, the higher priority value > will be used. *But it doesn't allow us to override a nested hash. > > Lets take an example, > > *hiera.yaml* > > --- > :hierarchy: > - "wso2/%{::product_name}/%{::product_version}/default" > - wso2/common > :backends: > - yaml > :yaml: > :datadir: "hieradata/%{::environment}" > > *wso2/common.yaml* > > --- > # Deployment synchronization configuration > wso2::dep_sync : > enabled : false > auto_checkout : true > auto_commit : false > repository_type : svn > svn : > url : http://svnrepo.example.com/repos/ > user : username > password : password > append_tenant_id: true > > *wso2/wso2esb/4.9.0/default.yaml* > > --- > wso2::dep_sync : > enabled : true > svn : > url : http://rajkumar.com/repos/ > > > *Native* hash merge would return the following; > > { > "enabled" =>true, > "auto_checkout" =>true, > "auto_commit" =>false, > "repository_type" =>"svn", > "svn" => { > "url" =>"http://rajkumar.com/repos/" > } > } > > *Deeper* hash merge would return the following; > > { > "enabled" =>true, > "auto_checkout" =>true, > "auto_commit" =>false, > "repository_type" =>"svn", > "svn" => { > "url" =>"http://rajkumar.com/repos/", > "user" =>"username", > "password" =>"password", > "append_tenant_id" =>true > } > } > > > If we use *Native* hash merging, we need to copy the complete nested hash > ("svn" in above example) and override it. If we use *Deeper* hash > merging, we can copy only a part of a nested hash and override it. As you > can see, *Deeper* hash merge reduces data duplication. > > Thoughts please. > > Thanks, > Raj. > > -- > Rajkumar Rajaratnam > Committer & PMC Member, Apache Stratos > Software Engineer, WSO2 > > Mobile : +94777568639 > Blog : rajkumarr.com > -- Akila Ravihansa Perera WSO2 Inc.; http://wso2.com/ Blog: http://ravihansa3000.blogspot.com
_______________________________________________ Dev mailing list [email protected] http://wso2.org/cgi-bin/mailman/listinfo/dev
