[libvirt] [sandbox PATCH 03/11] Image: Add Hooking Mechanism
Daniel P. Berrange
berrange at redhat.com
Thu Jul 30 10:51:12 UTC 2015
On Thu, Jul 23, 2015 at 03:57:29PM +0000, Eren Yagdiran wrote:
> Any custom source provider can be added to virt-sandbox-image as a source
> ---
> virt-sandbox-image/sources/Source.py | 8 ++++++++
> virt-sandbox-image/virt-sandbox-image.py | 30 +++++++++++++++++++++++++++++-
> 2 files changed, 37 insertions(+), 1 deletion(-)
> create mode 100644 virt-sandbox-image/sources/Source.py
>
> diff --git a/virt-sandbox-image/sources/Source.py b/virt-sandbox-image/sources/Source.py
> new file mode 100644
> index 0000000..cfc75d3
> --- /dev/null
> +++ b/virt-sandbox-image/sources/Source.py
> @@ -0,0 +1,8 @@
> +#!/usr/bin/python
> +
> +from abc import ABCMeta, abstractmethod
> +
> +class Source():
> + __metaclass__ = ABCMeta
> + def __init__(self):
> + pass
> diff --git a/virt-sandbox-image/virt-sandbox-image.py b/virt-sandbox-image/virt-sandbox-image.py
> index 324e568..99ed46e 100644
> --- a/virt-sandbox-image/virt-sandbox-image.py
> +++ b/virt-sandbox-image/virt-sandbox-image.py
> @@ -1,5 +1,5 @@
> #!/usr/bin/python -Es
> -#
> +# -*- coding: utf-8 -*-
> # Authors: Daniel P. Berrange <berrange at redhat.com>
> # Eren Yagdiran <erenyagdiran at gmail.com>
> #
> @@ -38,6 +38,34 @@ default_template_dir = "/var/lib/libvirt/templates"
> debug = True
> verbose = True
>
> +sys.dont_write_bytecode = True
> +
> +
> +##Hook mechanism starts##
> +import __builtin__
> +from sources.Source import Source
> +__builtin__.hookHolder = {}
> +def add_hook(driverName,clazz):
> + holder = __builtin__.hookHolder
> + if not issubclass(clazz,Source):
> + raise Exception("Loading %s failed. Make sure it is a subclass Of %s" %(clazz,Source))
> + holder[driverName] = clazz
> +
> +def init_from_name(name):
> + holder = __builtin__.hookHolder
> + return holder.get(name,None)
> +
> +__builtin__.add_hook = add_hook
> +__builtin__.init_from_name = init_from_name
> +from sources import *
> +
> +def dynamic_source_loader(name):
> + obj = init_from_name(name)
> + if obj == None:
> + raise IOError
> + return obj()
> +##Hook mechanism ends
I think this can be a hell of alot simpler if we just define
a fixed convention for module and class naming.
eg something like this:
import importlib
def dynamic_source_loader(name)
modname = "sources." + name
mod = importlib.import_module(modname)
classname = name[0].upper() + name[1:] + "Source"
classimpl = mod.getattr(classname)
return classimpl()
Regards,
Daniel
--
|: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org -o- http://virt-manager.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|
More information about the libvir-list
mailing list