On Nov 19, 2008, at 1:12 PM, Nigel Kersten wrote:
> On Wed, Nov 19, 2008 at 6:17 AM, Luke Kanies <[EMAIL PROTECTED]> wrote:
>
>>> Would it make more sense to define this in type.rb than in a  
>>> specific
>>> service type?
>>>
>>> That would seem more sensible if I'm understanding all the  
>>> inheritance
>>> correctly?
>>
>> Yeah, that's kind of what I was suggesting.
>
> ok, so I think I have most of it working, I'm just not quite sure how
> to specify the File resource to be returned.

Because autorequire is declared with a given resource type (at least,  
in its current incarnation) you just return an array of names and the  
transaction will create the resources for you.  Or you can create the  
resources and return them, which works fine, too.

>
> I've tried to make this as generic as possible.
>
> type.rb already has an autorequire method that checks class
> autorequires, so I'm adding the provider autorequires there.
>
>        self.class.suitableprovider.each do |provider|
>            if provider.respond_to?(:autorequire)
>                provider.autorequire(self).each do |req|
>                    Puppet.notice("got an autorequire of: #{req}")
>                end
>            end
>        end
>
> Obviously I'm not doing anything with it yet, but it will get appended
> to the existing array of requirements.
>
> I have two questions:
>
> a) Should I be passing "self" to the provider autorequire method?
> I need some way for the provider in its own autorequire method to know
> what resource it needs to build the autorequire list for, and this
> works, but I'm not sure if it is consistent with the rest of the
> Puppet code.

The provider has a '@resource' instance variable and related  
'resource' accessor, so you can just use that.  So you shouldn't need  
to pass anything to the autorequire method.

>
> b) On the other side in my provider, once I have the resource name,
> and thus can work out what files it should autorequire, how do I build
> a File resource to return back based upon the path(s) ?
>
> from my provider:
>
>    def self.autorequire(resource)
>        Puppet.notice("provider.self.autorequire: resource:  
> #{resource[:name]}")
>        job_path, job_plist = self.plist_from_label(resource[:name])
>        Puppet.notice("provider.self.autorequire: path: #{job_path}")
>        # how do I return an array of required file resources at this  
> point?
>        []
>    end


So, the current implementation of 'autorequire' has you declare a  
given type/block tuple.  So, you'd say:

autorequire(:file) do
   ...return array of file names...
end

autorequire(:user) do
   ...return array of user names...
end

I hadn't looked at how this works internally in a while, but it looks  
like it won't necessarily scale that well to the provider.  That is,  
there's a decent bit of plumbing to make this interface work, and my  
guess is it makes more sense to just have the provider either directly  
find the resource in the catalog:

   if resource = resource.catalog(:file, "/what/ever")
     return [resource]
   end

Or maybe do a small amount of plumbing so you can return resource  
references:

   return [Puppet::ResourceReference.new(:file, "/what/ever")]

The latter probably makes more sense.  I didn't have this  
ResourceReference class when I created the autorequire plumbing.

Does that all make sense?

-- 
Always read stuff that will make you look good if you die in the
middle of it. -- P. J. O'Rourke
---------------------------------------------------------------------
Luke Kanies | http://reductivelabs.com | http://madstop.com


--~--~---------~--~----~------------~-------~--~----~
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 [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/puppet-dev?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to