On 01/16/2014 11:56 PM, shaohef(a)linux.vnet.ibm.com wrote:
From: ShaoHe Feng <shaohef(a)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(a)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__))
I think it should be
done as a general facility. You could write a
metaclass for resource and load its sub collection in "__new__"