
From: ShaoHe Feng <shaohef@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@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
On 01/16/2014 11:56 PM, shaohef@linux.vnet.ibm.com wrote: metaclass for resource and load its sub collection in "__new__"