[Kimchi-devel] [PATCH 2/7] add a method to load vms sub collection automatically

shaohef at linux.vnet.ibm.com shaohef at linux.vnet.ibm.com
Thu Jan 16 15:56:36 UTC 2014


From: ShaoHe Feng <shaohef at linux.vnet.ibm.com>

When define a new vms sub collection, we do not need to touch vms module any more.

such as:
add a ifaces, we can define it as follow in vm/ifaces.py:

from kimchi.control.vm import SubCollection

@SubCollection('ifaces')
class VmIfaces(Collection):
    def __init__(self, model, vm):
        super(VmIfaces, self).__init__(model)

Then access URL: /vms/vm-name/ifaces/mac
VM resource can dispatch ifaces automatically

Signed-off-by: ShaoHe Feng <shaohef at linux.vnet.ibm.com>
---
 src/kimchi/control/vm/__init__.py | 44 +++++++++++++++++++++++++++++++++++++++
 1 file changed, 44 insertions(+)

diff --git a/src/kimchi/control/vm/__init__.py b/src/kimchi/control/vm/__init__.py
index f22e568..f3f6e48 100644
--- a/src/kimchi/control/vm/__init__.py
+++ b/src/kimchi/control/vm/__init__.py
@@ -20,3 +20,47 @@
 # You should have received a copy of the GNU Lesser General Public
 # License along with this library; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA
+
+import os
+import imp
+
+
+class SubCollection(object):
+    def __init__(self, name):
+        self.name = name
+
+    def __call__(self, fun):
+        fun._sub_collection_name = {"name": self.name}
+        return fun
+
+
+def _listPathModules(path):
+    modules = set()
+    for f in os.listdir(path):
+        base, ext = os.path.splitext(f)
+        if ext in ('.py', '.pyc', '.pyo'):
+            modules.add(base)
+    return sorted(modules)
+
+
+def _load_sub_collections(path):
+    for mod_name in _listPathModules(path):
+        if mod_name.startswith("_"):
+            continue
+
+        mod_fobj, mod_absp, mod_desc = imp.find_module(mod_name, [path])
+        module = imp.load_module(mod_name, mod_fobj,
+                                 mod_absp, mod_desc)
+        sub_collections = {}
+
+        for collection in [getattr(module, x) for x in dir(module)]:
+            if not hasattr(collection, "_sub_collection_name"):
+                continue
+
+            name = collection._sub_collection_name["name"]
+            sub_collections.update({name: collection})
+
+        return sub_collections
+
+
+VmDevices = _load_sub_collections(os.path.dirname(__file__))
-- 
1.8.4.2




More information about the Kimchi-devel mailing list