You have to figure out the resource[:name] var yourself for self.instances. The resource hash is not meant to be used at that stage.
The goal for self.instances is to retrieve all existing resources (and their attributes) without prior knowledge from Puppet. This is how Puppet creates its internal representation of what resources exist on the current system - and is used for purge and also for 'puppet resource foo' :-). The methodology is going to differ depending on the implementation but for iptables for example we use the --comment field, extract that & stuff it into :name. For onecluster/onehost from Opennebula its in the initial list I get from onecluster/onehost list etc. etc. ken. On Mon, Jun 13, 2011 at 4:49 AM, Dan Bode <bod...@gmail.com> wrote: > Hi all, > > I am trying to understand how self.instances is supposed to work. > > I have implemented it as below (which I tried to construct based on examples > I found in puppet's source) : > > def self.instances > rabbitmqctl('list_users').split(/\n/)[1..-2].collect do |line| > if line =~ /^(\S+)\s+(\S+)$/ > new(:name => $1, :admin => $2) > else > raise Puppet::Error, "Cannot parse invalid user line: #{line}" > end > end > end > > By making a single call, I can retrieve all namevars and their properties > (which I return as an array of Provider instances) > > When running: > > puppet resource rabbitmq_user > > I get the following error: > > /vagrant/modules/rabbitmq/lib/puppet/provider/rabbitmq_user/rabbitmqctl.rb:41:in > `admin': undefined method `[]' for nil:NilClass (NoMethodError) > from > /vagrant/modules/rabbitmq/lib/puppet/provider/rabbitmq_user/rabbitmqctl.rb:40:in > `each' > from > /vagrant/modules/rabbitmq/lib/puppet/provider/rabbitmq_user/rabbitmqctl.rb:40:in > `admin' > from /vagrant/puppet/lib/puppet/property.rb:246:in `send' > from /vagrant/puppet/lib/puppet/property.rb:246:in `retrieve' > from /vagrant/puppet/lib/puppet/type.rb:710:in `retrieve' > from /vagrant/puppet/lib/puppet/type.rb:704:in `each' > from /vagrant/puppet/lib/puppet/type.rb:704:in `retrieve' > from /vagrant/puppet/lib/puppet/type.rb:718:in `retrieve_resource' > from /vagrant/puppet/lib/puppet/type.rb:1893:in `to_trans' > from /vagrant/puppet/lib/puppet/type.rb:1918:in `to_resource' > from /vagrant/puppet/lib/puppet/indirector/resource/ral.rb:16:in > `search' > from /vagrant/puppet/lib/puppet/indirector/resource/ral.rb:14:in `map' > from /vagrant/puppet/lib/puppet/indirector/resource/ral.rb:14:in > `search' > from /vagrant/puppet/lib/puppet/indirector/indirection.rb:248:in > `search' > from /vagrant/puppet/lib/puppet/application/resource.rb:186:in `main' > from /vagrant/puppet/lib/puppet/application.rb:315:in `run_command' > from /vagrant/puppet/lib/puppet/application.rb:307:in `run' > from /vagrant/puppet/lib/puppet/application.rb:411:in `hook' > from /vagrant/puppet/lib/puppet/application.rb:307:in `run' > from /vagrant/puppet/lib/puppet/application.rb:402:in `exit_on_fail' > from /vagrant/puppet/lib/puppet/application.rb:307:in `run' > from /vagrant/puppet/lib/puppet/util/command_line.rb:62:in `execute' > from /vagrant/puppet/bin/puppet:4 > > The error is because retrieve is being called on the type (which causes > retrieve to be called for the admin property) > > This causes the following code to be invoked: > > def admin > #puts resource.inspect > rabbitmqctl('list_users').split(/\n/)[1..-2].each do |line| > return line.match(/^#{resource[:name]}\s+(\S+)$/)[1].to_sym > end > raise 'Admin field is only supported on version 2.4.1' > end > > which fails b/c resource is not set > > my questions follow: > > 1. Am I doing something blatantly wrong? > 2. Is self.instances just supposed to set parameters and then rely on > calling type.retrieve to fill in its properties? > if this is the case, how am I supposed to set the :name param (or any > other params it may need) > > -- > You received this message because you are subscribed to the Google Groups > "Puppet Developers" group. > To post to this group, send email to puppet-dev@googlegroups.com. > To unsubscribe from this group, send email to > puppet-dev+unsubscr...@googlegroups.com. > For more options, visit this group at > http://groups.google.com/group/puppet-dev?hl=en. > -- You received this message because you are subscribed to the Google Groups "Puppet Developers" group. To post to this group, send email to puppet-dev@googlegroups.com. To unsubscribe from this group, send email to puppet-dev+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/puppet-dev?hl=en.