Hello,
I'm attempting to use the reduce function(
https://puppet.com/docs/puppet/6.2/function.html#reduce) to consolidate hiera facts into data structures I can use with puppet resources. I've run into an issue that I'm not sure how to solve. When the data passed to the reduce function results in 2 or more iterations, I get the data return I expect. When the data passed only results in 1 iterations, I get back no results when I expect one result. Here is the applicable code snippet (hiera lookups replaced with dummy data):
~~~
$groups = {
"group1" => {
"gid" => 901,
"members" => ["user1","user2","user3","user4"],
},
"group2" => {
"gid" => 902,
"members" => ["user2"],
}
}
$hostgroups = [ "group1", "group2" ]
$usernames = ["user1","user2"]
$usernames.each |$username| {
$usergroups = $hostgroups.reduce([]) |$result, $group| {
$members = $groups[$group]["members"]
warning("[$username] $group: $members")
if ( $username in $members ) {
warning("[$username] Added $group")
$result + $group
}
}
warning("[$username] groups: $usergroups")
warning()
}
~~~
The output of this code shows user1 with an empty array of groups when it should have group1 while user2 has the expected 2 group output:
~~~
Warning: Scope(Class[Base::Test]): [user1] group1: [user1, user2, user3, user4]
Warning: Scope(Class[Base::Test]): [user1] Added group1
Warning: Scope(Class[Base::Test]): [user1] group2: [user2]
Warning: Scope(Class[Base::Test]): [user1] groups:
Warning: Scope(Class[Base::Test]):
Warning: Scope(Class[Base::Test]): [user2] group1: [user1, user2, user3, user4]
Warning: Scope(Class[Base::Test]): [user2] Added group1
Warning: Scope(Class[Base::Test]): [user2] group2: [user2]
Warning: Scope(Class[Base::Test]): [user2] Added group2
Warning: Scope(Class[Base::Test]): [user2] groups: [group1, group2]
Warning: Scope(Class[Base::Test]):
~~~
Let me know if I'm missing something otherwise this seems like it might be a bug.
Thanks,
-Dan