Description
Description of problem
When dealing with parameters that are contains arrays of objects, octocatalog-diff doesn't report any differences.
For instance the following Puppet resource:
testtype { 'test':
'testparam' => {
'another-one' => {
'an-array' => [
{
'env' => [
{ 'name' => 'HOST', 'value' => 'localhost' },
]
},
]
}
}
Modifying any object of the env
nested array (that is the keys or the values), or adding or removing objects from it will not trigger any diff to be displayed.
Command used and debugging output
octocatalog-diff --debug --fact-file ci/facts/ubuntu.yaml --from-fact-override "role=k8s" --to-fact-override "role=k8s" --bootstrap-environment "V=1" --display-detail-add --from origin/production --master-cache-branch origin/production
The above commands just generate the following warning regarding the resource:
W, [2020-05-14T06:30:36.666653 #1771] WARN -- : Resource key testtype[test] parameters => testparam => another-one => an-array[0] => env appears to depend on catalog compilation directory. Suppressed from results.
Note that there's no mention of the compilation directory in the parameters value, so there's no reason for it to be ignored.
Running with --display-datatype-changes
still doesn't display the changes, but produces the following debug log:
D, [2020-05-13T12:03:46.273101 #1] DEBUG -- : Adjust display for testtype::test::parameters::testparam::another-one::an-array[0]::env: nil != nil DELETED
Interesting, apparently octocatalog-diff thinks both before and after parameters are nil
.
After looking at the code and debugging, it appears that the values of those nested parameters are removed in hashdiff_nested_changes
and more precisely in dig_out_key
.
Indeed, dig_out_key
doesn't seem to support array indices (like an-array[0]
) as key names and thus bails out returning nil without descending into the pointed object.
Platform and version information
- Your OS: ubuntu bionic 18.04
- Your Ruby version: 2.5.1p57
- Your version of Puppet: 5.5.17
- Your version of octocatalog-diff: 1.6.0
Do the tests pass from a clean checkout?
Yes.
Anything else to add that you think will be helpful?
A PR will soon be published to fix this issue :)