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

Aline Manera alinefm at linux.vnet.ibm.com
Mon Jan 20 19:21:05 UTC 2014


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

+1. That way all application can use it.

>
> _______________________________________________
> Kimchi-devel mailing list
> Kimchi-devel at ovirt.org
> http://lists.ovirt.org/mailman/listinfo/kimchi-devel
>




More information about the Kimchi-devel mailing list