[Kimchi-devel] [PATCHv9 1/8] Support params for GET method

Royce Lv lvroyce at linux.vnet.ibm.com
Tue Jan 21 09:36:57 UTC 2014


On 2014年01月21日 03:40, Aline Manera wrote:
> On 01/20/2014 07:32 AM, lvroyce at linux.vnet.ibm.com wrote:
>> From: Royce Lv <lvroyce at linux.vnet.ibm.com>
>>
>> GET filter parameter will be splited in two types:
>> 1. flag_filter: pass to libvirt api and filter when resource query.
>> flag_filters start with "_"
>> 2. field_filter: take effect in filter out final result.
>> field_filters are keys of dict returned by 'GET'
>
> So can't we assume if a key isn't in dict returned by GET it is a 
> flag_filters?
Yes, we can, inside we use "_" to distinguish params, but users don't 
need to worry about this.
>
>> Then we can call it like:
>> GET /collection?filter_field=value
>>
>> Signed-off-by: Royce Lv <lvroyce at linux.vnet.ibm.com>
>> ---
>> src/kimchi/control/base.py | 31 ++++++++++++++++++++++++-------
>> src/kimchi/control/storagepools.py | 4 ++--
>> src/kimchi/control/storagevolumes.py | 2 +-
>> 3 files changed, 27 insertions(+), 10 deletions(-)
>>
>> diff --git a/src/kimchi/control/base.py b/src/kimchi/control/base.py
>> index 185c8d8..55678b1 100644
>> --- a/src/kimchi/control/base.py
>> +++ b/src/kimchi/control/base.py
>> @@ -212,10 +212,10 @@ class Collection(object):
>>
>> return res.get()
>>
>> - def _get_resources(self):
>> + def _get_resources(self, flag_filter):
>> try:
>> get_list = getattr(self.model, model_fn(self, 'get_list'))
>> - idents = get_list(*self.model_args)
>> + idents = get_list(*self.model_args, **flag_filter)
>> res_list = []
>> for ident in idents:
>> # internal text, get_list changes ident to unicode for sorted
>> @@ -234,19 +234,36 @@ class Collection(object):
>> args = self.resource_args + [ident.decode("utf-8")]
>> return self.resource(self.model, *args)
>>
>> - def get(self):
>> - resources = self._get_resources()
>> + def filter_data(self, resources, fields_filter):
>> data = []
>> for res in resources:
>> - data.append(res.data)
>> + if all(key in res.data and res.data[key] == val \
>> + for key, val in fields_filter.iteritems()):
>> + data.append(res.data)
>> + return data
>> +
>> + def get(self, filter_params):
>> + def _split_filter(params):
>> + flag_filter = dict()
>> + fields_filter = params
>> + for key, val in params.items():
>> + if key.startswith('_'):
>> + flag_filter[key] = fields_filter.pop(key)
>> + return flag_filter, fields_filter
>> +
>> + flag_filter, fields_filter = _split_filter(filter_params)
>> + resources = self._get_resources(flag_filter)
>> + data = self.filter_data(resources, fields_filter)
>> return kimchi.template.render(get_class_name(self), data)
>>
>> @cherrypy.expose
>> - def index(self, *args):
>> + def index(self, *args, **kwargs):
>> method = validate_method(('GET', 'POST'))
>> if method == 'GET':
>> try:
>> - return self.get()
>> + filter_params = cherrypy.request.params
>> + validate_params(filter_params, self, 'get_list')
>> + return self.get(filter_params)
>> except InvalidOperation, param:
>> error = "Invalid operation: '%s'" % param
>> raise cherrypy.HTTPError(400, error)
>> diff --git a/src/kimchi/control/storagepools.py 
>> b/src/kimchi/control/storagepools.py
>> index 782f5a6..e3236a7 100644
>> --- a/src/kimchi/control/storagepools.py
>> +++ b/src/kimchi/control/storagepools.py
>> @@ -63,9 +63,9 @@ class StoragePools(Collection):
>>
>> return resp
>>
>> - def _get_resources(self):
>> + def _get_resources(self, filter_params):
>> try:
>> - res_list = super(StoragePools, self)._get_resources()
>> + res_list = super(StoragePools, self)._get_resources(filter_params)
>> # Append reserved pools
>> isos = getattr(self, ISO_POOL_NAME)
>> isos.lookup()
>> diff --git a/src/kimchi/control/storagevolumes.py 
>> b/src/kimchi/control/storagevolumes.py
>> index d541807..cd15bcc 100644
>> --- a/src/kimchi/control/storagevolumes.py
>> +++ b/src/kimchi/control/storagevolumes.py
>> @@ -70,7 +70,7 @@ class IsoVolumes(Collection):
>> super(IsoVolumes, self).__init__(model)
>> self.pool = pool
>>
>> - def get(self):
>> + def get(self, filter_params):
>> res_list = []
>> try:
>> get_list = getattr(self.model, model_fn(self, 'get_list'))
>




More information about the Kimchi-devel mailing list