Issue #22455 has been reported by James Shubin.

----------------------------------------
Bug #22455: Changing a variable in a custom fact, after the fact changes the 
earlier set fact
https://projects.puppetlabs.com/issues/22455

* Author: James Shubin
* Status: Unreviewed
* Priority: High
* Assignee: 
* Category: 
* Target version: 
* Affected Puppet version: 
* Keywords: 
* Branch: 
----------------------------------------
Okay, I think I've totally earned my keep on this one. I was hitting an 
unbelievable condition while hacking on 
https://github.com/purpleidea/puppet-gluster *cough, plug*, and after a lot of 
head scratching I narrowed it down. I've come up with a demonstration test 
case/example. Look at the following fact:

<pre>
# XXX: demonstrate a surprising bug in puppet/facter

require 'facter'

value = 'hello'
Facter.add('foo') do
  setcode {
    value
  }
end

thing = {}
thing['a'] = 'puppet'
thing['b'] = 'works'

thing.keys.each do |x|
  value = thing[x]
  Facter.add('foo_'+x) do
    setcode {
      value     # bork
      # Facter::Util::Resolution.exec("/bin/echo -n '"+value+"'")       # bork!
      # thing[x]        # works as expected
    }
  end
end

value = 'BROKEN'        # shouldn't matter
</pre>

The issue is that if you use a variable in the setcode block, that variable 
*cannot* be changed without changing the earlier set value! In other words, you 
would expect:

<pre>
$ facter -p | grep foo
foo => hello
foo_a => puppet
foo_b => works
</pre>

but you actually get:

<pre>
$ facter -p | grep foo
foo => BROKEN
foo_a => BROKEN
foo_b => BROKEN
</pre>

FWIW:
<pre>
$ puppet --version
3.2.4
$ facter --version
1.7.2
</pre>

The workaround is to not reuse variables, and if you're creating facts in a 
loop, you have to do it in two steps, firstly create a dictionary of the fact 
names/values you want as a result, and then loop through that setting the facts.

The big issue is that this is highly unexpected in ruby code, and at best is 
not a documented gotcha. You can uncomment the various parts of my example to 
try different variations.

If this was an awesome catch, I guess I'd like some cool twitter followers 
@purpleidea or something :P

Cheers,
James



-- 
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 unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/puppet-bugs.
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to