On Mon, 2008-08-25 at 09:55 -0500, Luke Kanies wrote:
> On Aug 25, 2008, at 3:30 AM, Brice Figureau wrote:
> >
> > I have quite hard time understanding how the provider class is
> > built :-(
>
> I'll do what I can to help.
Thanks,
> >> You'd access resource attributes like: status = resource[:hasstatus].
> >
> > The currently defined services seems to use @resource[:hasstatus].
> > Is your code snippet a typo error or is it the real syntax?
>
> Providers have a 'resource' attribute, so using 'resource' (without
> the '@') is equivalent.
>
> I just makes it easier to test. For instance, if you use '@resource',
> then you have to do this in your test:
>
> provider.resource = mock 'resource'
> ...use provider...
>
> If you're using the attribute, you can just mock it:
>
> provider.expects(:resource).returns mock('resource')
>
> Same amount of code in this case, but you can actually test whether
> the resource is used and how many times, which you can't as easily do
> when assigning.
>
> Really, it's kinda six of one 2pi of the other, but as a general rule
> I've switched to using attributes rather than instance variables
> whenever possible (and yes, I know the attributes just point to
> instance variables -- it's a question of what your code directly uses,
> rather than how it works internally).
OK, understood.
> >
> >> Note that versions prior to, I think, 0.24.4 required you to use
> >> 'resource.should(:property)' for properties. and 'resource[:param]'
> >> for parameters, for backward compatbility. This has been fixed now,
> >> thankfully, and the [] syntax works everywhere.
> >
> > OK, good to know.
> >
> > I have some other questions related to this provider:
> >
> > * I know from the provider documentation that the "commands" keyword
> > check a command is present and change the suitability accordingly. I
> > know about optional_command. As asked by Adam in another e-mail, if
> > the
> > provider supports runit, it should use another subset of commands.
> > The question is how I can check the presence of the executable and
> > choose a command subset instead than another?
>
> Look at the synaptic provider -- you're going to want to create a
> second 'runit' provider that just swaps out the commands.
I like that.
> >
> > * A question related to the previous one. I want to be able to detect
> > the service directory (which is usually /service or /etc/service on
> > debian lenny, or /var/lib/svscan on old debian fhs). What would be the
> > best way to do that?
> > Should it be a new fact, or can I place FileTest heuristic directly in
> > the provider class (my fear is that the class is loaded in the
> > puppetmaster, hence the heuristic could be wrong)?
>
> The class is only actually loaded on the client, and the heuristic is
> definitely the right one.
>
> Just note that you will probably want to detect it as late as possible
> -- that is, don't detect it when reading the provider in, instead test
> it when the provider is first used.
>
> Something like:
>
> # Find the service directory
> def self.servicedir
> unless defined?(@servicedir) and @servicedir
> if FileTest.exist?("/service")...end
> raise "Could not find service directory" unless @servicedir
> end
> end
>
> Then use that method to access the service dir.
>
> This way if you've got a transaction that both creates the service dir
> and uses it (i.e., a package creates the dir and a service entry uses
> it) then you'll be able to do it all in one go.
Thanks for this invaluable information. It will be really helpful.
I'll try to send a new revision (along with a rspec test) later this
week.
If I can't meet this deadline, then it will be around mid-september
after my vacations :-)
--
Brice Figureau <[EMAIL PROTECTED]>
--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---