This scheme is extensible - adding more hooks is a simple matter
of adding more plugin methods to SourcePlugin and derived classes.
The code that then needs to call the plugin methods uses
- plugin.get_source_plugin_methods() to find the method(s) needed by
+ plugin.get_plugin_methods() to find the method(s) needed by
the call; this is done by filling up a dict with keys containing
the method names of interest - on success, these will be filled in
with the actual methods. Please see the implementation for
splitted = self.sourceparams.split(',')
srcparams_dict = dict(par.split('=') for par in splitted if par)
- partition_methods = {
- "do_stage_partition": None,
- "do_prepare_partition": None,
- "do_configure_partition": None
- }
-
- methods = PluginMgr.get_source_plugin_methods(self.source,
- partition_methods)
+ partition_methods = ["do_configure_partition", "do_stage_partition",
+ "do_prepare_partition"]
+
+ methods = PluginMgr.get_plugin_methods('source', self.source,
+ partition_methods)
methods["do_configure_partition"](self, srcparams_dict, creator,
cr_workdir, oe_builddir, bootimg_dir,
kernel_dir, native_sysroot)
return pluginbase.get_plugins(ptype)
@classmethod
- def get_source_plugin_methods(cls, source_name, methods):
+ def get_plugin_methods(cls, ptype, pname, methods):
"""
The methods param is a dict with the method names to find. On
return, the dict values will be filled in with pointers to the
corresponding methods. If one or more methods are not found,
None is returned.
"""
- return_methods = None
- for _source_name, klass in cls.get_plugins('source').items():
- if _source_name == source_name:
- for _method_name in methods:
- if not hasattr(klass, _method_name):
- logger.warning("Unimplemented %s source interface for: %s",
- _method_name, _source_name)
- return None
- func = getattr(klass, _method_name)
- methods[_method_name] = func
- return_methods = methods
- return return_methods
+ result = {}
+ plugin = cls.get_plugins(ptype).get(pname)
+ for method in methods:
+ if not hasattr(plugin, method):
+ raise WicError("Unimplemented %s plugin interface for: %s" %
+ (method, pname))
+ result[method] = getattr(plugin, method)
+ return result
disk_name = self.parts[0].disk
if source_plugin:
name = "do_install_disk"
- methods = PluginMgr.get_source_plugin_methods(source_plugin,
- {name: None})
- methods["do_install_disk"](self._image, disk_name, self, self.workdir,
- self.oe_builddir, self.bootimg_dir,
- self.kernel_dir, self.native_sysroot)
+ method = PluginMgr.get_plugin_methods('source', source_plugin,
+ [name])[name]
+ method(self._image, disk_name, self, self.workdir,
+ self.oe_builddir, self.bootimg_dir,
+ self.kernel_dir, self.native_sysroot)
full_path = self._image.path
# Generate .bmap