A notice function with a hash as a title causes catalog validation to fail
Description of problem
- What did you do? Running octocatalog-diff
octocatalog-diff --puppetdb_url http://localhost:8080 --bootstrapped-from-dir /var/tmp/production/ --bootstrapped-to-dir /var/tmp/development/ --puppet_binary /usr/local/bin/puppet --pe-enc-url https://localhost:4433/classifier-api --pe-enc-token-file /root/.puppetlabs/token -n appserver.example.com --catalog-only
- What happened? Catalog failed to compile with invalid json
- What did you expect to happen? Catalog to compile
- How can someone reproduce the problem? Create an array of hashes and call one of those hashes. ie
class iaas_linux_ibm_tivoli_monitoring_client (
Array[Hash] $gateway_list = [ { primary => '',servername.domainname
standby => 'servername2.domainname' } ],
) {
$gateways = $::iaas_linux_ibm_tivoli_monitoring_client::gateway_list
$rand = fqdn_rand(length($gateways))
$randomly_chosen_gateways = "$gateways[$rand]"
}
Command used and debugging output
octocatalog-diff --puppetdb_url http://localhost:8080 --bootstrapped-from-dir /var/tmp/production/ --bootstrapped-to-dir /var/tmp/development/ --puppet_binary /usr/local/bin/puppet --pe-enc-url https://localhost:4433/classifier-api --pe-enc-token-file /root/.puppetlabs/token -n appserver.example.com --catalog-only
"/opt/puppetlabs/puppet/lib/ruby/gems/2.4.0/gems/octocatalog-diff-1.5.4/lib/octocatalog-diff/util/catalogs.rb:259:in `catalog_validator': Catalog failed: Catalog has invalid JSON: 751: unexpected token at '{primary => servername.domainname, standby => servername2.domainname} (OctocatalogDiff::Errors::CatalogError)
"
Platform and version information
- Your OS: RHEL 7.4 x86
- Your Ruby version: ruby 2.4.4p296 (2018-03-28 revision 63013) [x86_64-linux]
- Your version of Puppet: PE 2018.1.4 5.5.6
- Your version of octocatalog-diff: octocatalog-diff 1.5.4
Do the tests pass from a clean checkout? yes
Anything else to add that you think will be helpful?
On further investigation the issue was down to the hash being used on the notice function which broke the validation, replacing these notices with notify resource calls fixed our issue.
class iaas_linux_ibm_tivoli_monitoring_client (
Array[Hash] $gateway_list = [ { primary => 'hostname.dopmainname',
standby => 'hostname.domainname' } ],
) {
$gateways = $::iaas_linux_ibm_tivoli_monitoring_client::gateway_list
$rand = fqdn_rand(length($gateways))
notice($gateways[$rand])
$randomly_chosen_gateways = $gateways[$rand]
notice("Choosen gateways list: ${randomly_chosen_gateways}")
@davidsandilands I can reproduce this problem--
failing CI run: https://github.com/github/octocatalog-diff/commit/40a1c8b5eb1dffd6b8500050b14cd1d7c1d6a54b/checks?check_suite_id=289284170
failing test case: https://github.com/github/octocatalog-diff/commit/40a1c8b5eb1dffd6b8500050b14cd1d7c1d6a54b
I'm curious - does the failing "notify called with a hash parameter" both compile and execute successfully on a host in your fleet? I'm wondering if this behavior is actually supported by puppet servers and clients in the wild - or maybe it only works with certain formats of catalogs?