Issue #8425 has been updated by Jacob Helwig.

Status changed from Needs Decision to Unreviewed
Assignee deleted (Jacob Helwig)


----------------------------------------
Bug #8425: exported resources with hashes for param values (and probably 
arrays) require multiple runs
https://projects.puppetlabs.com/issues/8425

Author: Ken Barber
Status: Unreviewed
Priority: Normal
Assignee: 
Category: stored configuration
Target version: 
Affected Puppet version: 2.7.1
Keywords: serialization hashes stored configs exported resources
Branch: 


So I've been working through a bug in puppet whereby when I export a resource 
that contains a hash in a property, it requires 2 runs before it works 
correctly. The first run returns errors in my types - because the hashes get 
munged (much like when one does {"a"=>"b"}.to_s).

The problem is tracked back to the param_value being set gets converted naively 
to a string during creation before serialization - which messes up the entry in 
the database. So things like:

    {"a"=>"b"}

Get stored as:

    ab

Instead of the yaml format:

    --- 
    a: b

This traces back to a single call to 'v.to_s' in the method munge_parser_values 
in puppet/rails/param_value.rb. Upon the second run, the update call directly 
to value=() does the correct thing and corrects it ... but its rather silly to 
have to require 2 runs.

So the fix is something like:

    diff -ru puppet.bak//rails/param_value.rb puppet/rails/param_value.rb
    --- puppet.bak//rails/param_value.rb        2011-07-14 19:16:55.000000000 
+0200
    +++ puppet/rails/param_value.rb     2011-07-14 20:54:28.000000000 +0200
    @@ -9,7 +9,7 @@
    # Store a new parameter in a Rails db.
    def self.from_parser_param(param, values)
    -    values = munge_parser_values(values)
    +    values = values.is_a?(Array) ? values : [values]
    param_name = Puppet::Rails::ParamName.find_or_create_by_name(param.to_s)
    return values.collect do |v|
    @@ -17,21 +17,6 @@
    end
    end
    -  # Make sure an array (or possibly not an array) of values is correctly
    -  # set up for Rails.  The main thing is that Resource::Reference objects
    -  # should stay objects, so they just get serialized.
    -  def self.munge_parser_values(value)
    -    values = value.is_a?(Array) ? value : [value]
    -    values.map do |v|
    -      if v.is_a?(Puppet::Resource)
    -        v
    -      else
    -        v.to_s
    -      end
    -    end
    -  end
    -
    -
    def value
    unserialize_value(self[:value])
    end

I've removed the need for the extra method here because it seems silly to have 
1 conversion mechanism for creation and have it not applied during update. This 
works each time - and serializes hashes, strings, resources etc. each time the 
first time.

I'm pretty sure this is a duplicate but I can't find any others ... I think its 
been around since Brice introduced hashes in 2009 or something.

Not sure if anyone can confirm what I'm saying is sane or not ...


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