Issue #7422 has been updated by Jeff McCune.

Status changed from Accepted to Merged - Pending Release
Target version changed from 3.x to 2.7.20

# Fixed

Big thanks to Dan Bode for fixing this issue over the weekend.  If anyone is 
able to try the 2.7.x branch please do so and let us know if it resolves all of 
the issues mentioned in this ticket.

This will be included in the 2.7.20, 3.0.2, and 3.1.0 release of Puppet as 
[0524a0a](https://github.com/puppetlabs/puppet/commit/0524a0a)

-Jeff


----------------------------------------
Bug #7422: undefined method `<<' for {}:Hash when combining resource chaining, 
metaparameters, and autorequire
https://projects.puppetlabs.com/issues/7422#change-75799

Author: Nick Fagerlund
Status: Merged - Pending Release
Priority: Normal
Assignee: 
Category: parser
Target version: 2.7.20
Affected Puppet version: 2.6.4
Keywords: BD
Branch: 


So I was talking with Markus and Dan about some weird autorequire behavior, and 
ran into this. Assume you have the requisite files in /tmp:

    # tree /tmp
    /tmp
    |-- a
    |   `-- b
    `-- c

Then, if you run this manifest:

    # autocycle.pp 
    file { "/tmp/a": 
      ensure => absent, 
      force => true,
    }
    file { "/tmp/a/b": 
      ensure => absent, 
      content => 'foo', 
      before => File['/tmp/a'], 
    }
    file { "/tmp/c": 
      ensure => absent, 
      content => 'bar', 
    }
    File['/tmp/a/b'] -> File['/tmp/c'] -> File['/tmp/a']

...you get this:

    [root@puppet learning-manifests]# puppet apply --trace autocycle.pp 
    /opt/puppet/lib/ruby/site_ruby/1.8/puppet/resource.rb:103:in `send'
    /opt/puppet/lib/ruby/site_ruby/1.8/puppet/resource.rb:103:in `<<'
    /opt/puppet/lib/ruby/site_ruby/1.8/puppet/parser/relationship.rb:41:in 
`mk_relationship'
    /opt/puppet/lib/ruby/site_ruby/1.8/puppet/parser/relationship.rb:19:in 
`evaluate'
    /opt/puppet/lib/ruby/site_ruby/1.8/puppet/parser/relationship.rb:18:in 
`each'
    /opt/puppet/lib/ruby/site_ruby/1.8/puppet/parser/relationship.rb:18:in 
`evaluate'
    /opt/puppet/lib/ruby/site_ruby/1.8/puppet/parser/relationship.rb:17:in 
`each'
    /opt/puppet/lib/ruby/site_ruby/1.8/puppet/parser/relationship.rb:17:in 
`evaluate'
    /opt/puppet/lib/ruby/site_ruby/1.8/puppet/parser/compiler.rb:162:in 
`evaluate_relationships'
    /opt/puppet/lib/ruby/site_ruby/1.8/puppet/parser/compiler.rb:162:in `each'
    /opt/puppet/lib/ruby/site_ruby/1.8/puppet/parser/compiler.rb:162:in 
`evaluate_relationships'
    /opt/puppet/lib/ruby/site_ruby/1.8/puppet/parser/compiler.rb:341:in `finish'
    /opt/puppet/lib/ruby/site_ruby/1.8/puppet/parser/compiler.rb:109:in 
`compile'
    /opt/puppet/lib/ruby/site_ruby/1.8/puppet/parser/compiler.rb:18:in `compile'
    
/opt/puppet/lib/ruby/site_ruby/1.8/puppet/indirector/catalog/compiler.rb:77:in 
`compile'
    /opt/puppet/lib/ruby/site_ruby/1.8/puppet/util.rb:197:in `benchmark'
    
/opt/puppet/lib/ruby/site_ruby/1.8/puppet/indirector/catalog/compiler.rb:75:in 
`compile'
    
/opt/puppet/lib/ruby/site_ruby/1.8/puppet/indirector/catalog/compiler.rb:34:in 
`find'
    /opt/puppet/lib/ruby/site_ruby/1.8/puppet/indirector/indirection.rb:193:in 
`find'
    /opt/puppet/lib/ruby/site_ruby/1.8/puppet/indirector.rb:50:in `find'
    /opt/puppet/lib/ruby/site_ruby/1.8/puppet/application/apply.rb:115:in `main'
    /opt/puppet/lib/ruby/site_ruby/1.8/puppet/application/apply.rb:35:in 
`run_command'
    /opt/puppet/lib/ruby/site_ruby/1.8/puppet/application.rb:287:in `run'
    /opt/puppet/lib/ruby/site_ruby/1.8/puppet/application.rb:393:in 
`exit_on_fail'
    /opt/puppet/lib/ruby/site_ruby/1.8/puppet/application.rb:287:in `run'
    /opt/puppet/lib/ruby/site_ruby/1.8/puppet/util/command_line.rb:55:in 
`execute'
    /usr/local/bin/puppet:4
    /opt/puppet/lib/ruby/site_ruby/1.8/puppet/parser/compiler.rb:21:in `compile'
    
/opt/puppet/lib/ruby/site_ruby/1.8/puppet/indirector/catalog/compiler.rb:77:in 
`compile'
    /opt/puppet/lib/ruby/site_ruby/1.8/puppet/util.rb:197:in `benchmark'
    
/opt/puppet/lib/ruby/site_ruby/1.8/puppet/indirector/catalog/compiler.rb:75:in 
`compile'
    
/opt/puppet/lib/ruby/site_ruby/1.8/puppet/indirector/catalog/compiler.rb:34:in 
`find'
    /opt/puppet/lib/ruby/site_ruby/1.8/puppet/indirector/indirection.rb:193:in 
`find'
    /opt/puppet/lib/ruby/site_ruby/1.8/puppet/indirector.rb:50:in `find'
    /opt/puppet/lib/ruby/site_ruby/1.8/puppet/application/apply.rb:115:in `main'
    /opt/puppet/lib/ruby/site_ruby/1.8/puppet/application/apply.rb:35:in 
`run_command'
    /opt/puppet/lib/ruby/site_ruby/1.8/puppet/application.rb:287:in `run'
    /opt/puppet/lib/ruby/site_ruby/1.8/puppet/application.rb:393:in 
`exit_on_fail'
    /opt/puppet/lib/ruby/site_ruby/1.8/puppet/application.rb:287:in `run'
    /opt/puppet/lib/ruby/site_ruby/1.8/puppet/util/command_line.rb:55:in 
`execute'
    /usr/local/bin/puppet:4
    undefined method `<<' for {}:Hash on node puppet.localdomain

What it SHOULD do is reverse /tmp/a/b's autorequire of /tmp/a (to avoid the 
cycle we would otherwise get), then delete /tmp/a/b, /tmp/c, and /tmp/a in that 
order. Instead, we have an exposed internal Ruby error. Any clues?



-- 
You have received this notification because you have either subscribed to it, 
or are involved in it.
To change your notification preferences, please click here: 
http://projects.puppetlabs.com/my/account

-- 
You received this message because you are subscribed to the Google Groups 
"Puppet Bugs" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/puppet-bugs?hl=en.

Reply via email to