On Jun 24, 2011, at 4:05 PM, Stefan Schulte wrote:

> On Fri, Jun 24, 2011 at 03:00:20PM -0700, Luke Kanies wrote:
>> On Jun 23, 2011, at 11:08 AM, Carl Caum wrote:
>> 
>>> 
>>> On Jun 22, 2011, at 10:55 PM, Luke Kanies wrote:
>>> 
>>>> On Jun 22, 2011, at 6:05 PM, Carl Caum wrote:
>>>> 
>>>>> I'm not clear at all on how to do prefetching in custom providers.  Can 
>>>>> someone shed some light? Perhaps point to very detailed documentation 
>>>>> with example code?
>>>>> 
>>>>> A few questions right off the bat:
>>>>> 
>>>>> 1) Is @property_hash a convention or implementation?  If implementation, 
>>>>> do I structure it a certain way to get certain behavior from puppet?
>>>> 
>>>> It's convention, and one I've always been a bit embarrassed by.
>>>> 
>>>>> 2) If I prefetch, do I still need to have getter methods for properties?
>>>> 
>>>> Um, I *think* you don't need them any more.  That is, I'm confident normal 
>>>> puppet usage doesn't require them, but I'm not sure if things like ralsh 
>>>> use requires them.  Maybe try 'ralsh <mytype>' and 'ralsh <mytype> <name>' 
>>>> as tests?
>>> 
>>> Looks like I still need getter methods for ralsh.  Also, I need to 
>>> implement self.instances.
>>> 
>>>> 
>>>>> 3) Does my prefetch methods have to accept a hash of properties from the 
>>>>> manifest?  What am I supposed to do with it?
>>>> 
>>>> Hash of properties?
>>>> 
>>>> I'm pretty sure they have to accept a hash of resources, and set the 
>>>> provider instance on each resource.
>>> 
>>> Err,  I meant resources.  Digging through the code, it looks like prefetch 
>>> doesn't have to take in a hash of resources.  I can instead call instances 
>>> and iterate through that list, modifying the resource as necessary.  I 
>>> haven't gotten far enough to see if that allows me to know if a provided 
>>> resource is insync though. 
>> 
>> Hmm.  I wouldn't recommend that - normall, 'instances' calls prefetch, so if 
>> prefetch also calls instances... bad things will likely result.
>> 
> 
> Using instances inside prefetch looks like as basic approach to me.

Sorry, I got confused between the provider 'instances' method and the type 
'instances' method - it's true that if the provider does both, it makes sense 
for one to call the other.

> Instances should return an array of providers for all resources puppet
> can find on your system, (not necessarily in your manifest). This is
> often achived by parsing a file, or running a command and parsing the
> output.
> 
> The instances method is also used when you run puppet resource my_type.
> 
> Let's say you write an instances method of a package provider. You will
> do something like
> 
>    def self.instances
>      packages = [] ## Array of providers for each installed package
>      output_of_a_list_command.each_line do |packagename|
>        packages << new(:name => packagename, :ensure => :installed)
>      end
>      packages
>    end
> 
> When you create a new instance of your provider class and pass a hash,
> the hash is automatically stored as the @property_hash variable of your
> new provider instance. So you should stick to that name.
> 
> The prefetch method is used to assign providers to all resources the
> user specified in the manifest.  Puppet will pass a hash of resources to
> the prefetch method.  This hash includes every resource in the catalog
> and the namevar of each resource is used as a hashkey.  A simple
> approach is to just call instances to collect providers for all possible
> resources and iterate over them.  If a resource with a matching name
> is also found in the catalog (= the user wants to manage this resource)
> we can now simply assign the provider to this resource.  The assigned
> providers alreay have the correct values stored in @property_hash
> 
> Sample prefetch method in package.rb
> 
>    # Prefetch our package list, yo.
>    self.prefetch(packages)
>      instances.each do |prov|
>        if pkg = packages[prov.name]
>          pkg.provider = prov
>        end
>      end
>    end
> 
> More reasons to use @property_hash to store property values:
> * you can use get(:property) and set(:property) inside the provider
>  class
> * you can use the classmethod mk_resource_methods to generate getter and
>  setter methods for all your properties.
> 
> -Stefan


-- 
Love truth, and pardon error.       -- Voltaire
---------------------------------------------------------------------
Luke Kanies  -|-   http://puppetlabs.com   -|-   http://about.me/lak




-- 
You received this message because you are subscribed to the Google Groups 
"Puppet Developers" 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-dev?hl=en.

Reply via email to