octocatalog-diff icon indicating copy to clipboard operation
octocatalog-diff copied to clipboard

A notice function with a hash as a title causes catalog validation to fail

Open davidsandilands-zz opened this issue 7 years ago • 2 comments

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?

davidsandilands-zz avatar Jan 25 '19 16:01 davidsandilands-zz

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-zz avatar Jan 29 '19 09:01 davidsandilands-zz

@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?

ahayworth avatar Oct 31 '19 03:10 ahayworth