Issue #5662 has been updated by James Turnbull.

Status changed from Available In Testing Branch to Closed
Target version changed from 2.6.x to 2.6.7


----------------------------------------
Bug #5662: Parsedfile provider does not work with composite keys
https://projects.puppetlabs.com/issues/5662

Author: Stefan Schulte
Status: Closed
Priority: Normal
Assignee: Stefan Schulte
Category: provider
Target version: 2.6.7
Affected Puppet version: 2.6.0
Keywords: 
Branch: https://github.com/stschulte/puppet/tree/ticket/2.6.x/5662


When one uses the parsedfileprovider for a type with multiple key_attributes 
the propertyhash is not filled with all keyattributes.

I found the bug while creating the following parsedfile provider:

    # This provider parses /etc/services. name and protocol are key_attributes
    record_line :parsed, :fields => %w{name number protocol port_aliases 
description},
      :optional   => %w{port_aliases description},
      :match      => /^(\S*)\s+(\d*)\/(\S*)\s*(.*?)?\s*(?:#\s*(.*))?$/,
      :post_parse => proc { |hash|
        # Remark: I can see that hash[:protocol] exists and is valid
        hash[:protocol] = hash[:protocol].intern if hash[:protocol]
        # [... some more ruby code that does not touch hash[:protocol] in any 
way ...]
      },
      :to_line => proc { |hash|
        # :protocol is NOT set here thus raising an error
        [:name, :number, :protocol].each do |n|
          raise Puppet::Error, "#{n} is a required attribute for port but not 
included in #{hash.inspect}" unless hash[n] and hash[n] != :absent
        end
        # [... some more ruby code to build a /etc/service line ..]
    }

Raised error:
    Could not evaluate: protocol is a required attribute for port but not 
included in
    {:on_disk=>true, :number=>"25", :target=>"/etc/services", ensure=>:present, 
:name=>"foo", :record_type=>:parsed

If I understand the parsedfileprovider correctly this is causing the bug:

* The create method in puppet/provider/parsedfile.rb is putting all 
validproperties in the property_hash hash
* Keyattributes are parameters and thus are not landing in the hash so name and 
protocol are not stored in that hash
* The flush method in `parsedfile.rb` has some special handling for name 
because it does a final
`@property_hash[:name] ||= @resource.name`
* The flush method does not treat other key_attributes in this special way so 
all other keyattributes are not present in the to_line hook,


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