On Mon, May 07, 2007 at 02:57:02PM -0500, Michael E Brown wrote:
> On Mon, May 07, 2007 at 03:14:21PM -0400, Jeremy Katz wrote:
> > On Mon, 2007-05-07 at 11:59 -0500, Michael E Brown wrote:
> > > On Mon, May 07, 2007 at 11:56:00AM -0400, James Bowes wrote:
> > > > Most plugins come with a config file that only includes 'enabled = 1',
> > > > why bother making them ship this config file?
> > > > 
> > > > Maybe instead we should just enable any plugin that doesn't have a
> > > > config file, preferably doing it in a way that breaks API?
> > > 
> > > Is it safe to import the modules without running them? If so, we could
> > > easily just look for a variable in the module namespace instead.
> > > Something like "YUM_PLUGIN_API_CONFORMS = ...". 
> > > 
> > > Then, look for a variable in the module to populate default
> > > configuration options from. (config file could still be present in this
> > > case, it would override options.) I suppose you could even just skip the
> > > API check and just look for a config variable. PLUGIN_DEFAULT_CONF =
> > > ..., maybe?
> > > 
> > > Except for the plugin part, this is similar to how we've done mock. We
> > > define defaults for all the config options in the code. Then the config
> > > file can override any options.
> > 
> > It should be pretty straight-forward to get plugins to load
> > automatically...
> 
> Couple points:
>     0) The patch as posted doesnt appear to be able to work, as the
>     module hasnt been imported yet.
>     
>     1) I see only "requires_api_version" variable. It makes sense to me
>     that we also have a "conforms_to_api_version" variable for this
>     case. For example, my dellsysidplugin only requires api version 2.1,
>     but complies with a much newer version so that it is both backwards
>     and forwards compatible.
> 
>     2) we could generalize this more. Why not let the module give us
>     it's own config object?  Since sending untested patches seems to be
>     in-vogue, how about the attached? Much more generalized.

And here is a better, untested patch... :)
--
Michael
--- plugins.py  2007-05-07 14:52:28.000000000 -0500
+++ plugins.py-meb      2007-05-07 14:55:40.000000000 -0500
@@ -176,18 +176,18 @@
         dir, modname = os.path.split(modulefile)
         modname = modname.split('.py')[0]
 
-        conf = self._getpluginconf(modname)
-        if not conf or not config.getOption(conf, 'main', 'enabled', 
-                config.BoolOption(False)):
-            self.verbose_logger.debug('"%s" plugin is disabled', modname)
-            return
-
         fp, pathname, description = imp.find_module(modname, [dir])
         try:
             module = imp.load_module(modname, fp, pathname, description)
         finally:
             fp.close()
 
+        conf = self._getpluginconf(modname, module)
+        if not conf or not config.getOption(conf, 'main', 'enabled', 
+                config.BoolOption(False)):
+            self.verbose_logger.debug('"%s" plugin is disabled', modname)
+            return
+
         # Check API version required by the plugin
         if not hasattr(module, 'requires_api_version'):
              raise Errors.ConfigError(
@@ -245,18 +245,21 @@
                 # Found configuration file
                 break
             self.verbose_logger.log(logginglevels.INFO_2, "Configuration file 
%s not found" % conffilename)
-        else: # for
-            # Configuration files for the plugin not found
-            self.verbose_logger.log(logginglevels.INFO_2, "Unable to find 
configuration file for plugin %s"
-                % modname)
-            return None
-        parser = ConfigParser.ConfigParser()
-        confpp_obj = ConfigPreProcessor(conffilename)
-        try:
-            parser.readfp(confpp_obj)
-        except ParsingError, e:
-            raise Errors.ConfigError("Couldn't parse %s: %s" % (conffilename,
-                str(e)))
+
+        parser = None
+        if hasattr(modname, module_default_config):
+            parser = module.module_default_config
+        else:
+            parser = ConfigParser.ConfigParser()
+            confpp_obj = ConfigPreProcessor(conffilename)
+
+        if parser is not None:
+            try:
+                parser.readfp(confpp_obj)
+            except ParsingError, e:
+                raise Errors.ConfigError("Couldn't parse %s: %s" % 
(conffilename,
+                    str(e)))
+
         return parser
 
     def setCmdLine(self, opts, commands):
_______________________________________________
Yum-devel mailing list
Yum-devel@linux.duke.edu
https://lists.dulug.duke.edu/mailman/listinfo/yum-devel

Reply via email to