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

Royce Lv lvroyce at linux.vnet.ibm.com
Mon Jan 13 05:50:15 UTC 2014


Sheldon,
    As we discussed, pls refer to demo decorator of PATCH 2/8. If you 
want to support GET_LIST of some function without change model.py, pls 
wrap it with my decorator and it will work. Also, if guys agree, I will 
put all these wrap in a single patchset.

On 2014?01?11? 08:48, Sheldon wrote:
> *Not sure 'GET' method always mean "get_list"
>
> I have tried just add validate_params at the entry of check 'GET', it 
> can works well.*
>
> @@ -242,11 +245,13 @@ class Collection(object):
>          return kimchi.template.render(get_class_name(self), data)
>
>      @cherrypy.expose
> -    def index(self, *args):
> +    def index(self, *args, **argv):
>          method = validate_method(('GET', 'POST'))
>          if method == 'GET':
>              try:
> +                params = cherrypy.request.params
> +                validate_params(params, self, 'get_list')
>                  return self.get()
>              except InvalidOperation, param:
>                  error = "Invalid operation: '%s'" % param
>                  raise cherrypy.HTTPError(400, error)
>
> *add a test for **
> **/storagepools?pool_type=dir**
> **and**
> **storagepools/default/storagevolumes?volume_type=file*
>
> diff --git a/src/kimchi/API.json b/src/kimchi/API.json
> index 19b1c51..fe3a85a 100644
> --- a/src/kimchi/API.json
> +++ b/src/kimchi/API.json
> @@ -73,6 +73,26 @@
>                  }
>              }
>          },
> +        "storagepools_get_list": {
> +            "type": "object",
> +            "properties": {
> +                "pool_type": {
> +                    "description": "type of storagepools",
> +                    "type": "string",
> +                    "pattern": "^dir$"
> +                }
> +            }
> +        },
> +        "storagevolumes_get_list": {
> +            "type": "object",
> +            "properties": {
> +                "volume_type": {
> +                    "description": "type of storagevolumes",
> +                    "type": "string",
> +                    "pattern": "^file$"
> +                }
> +            }
> +        },
>          "vms_create": {
>              "type": "object",
>              "properties": {
>
>
>
>
>
> *$ curl -u <user>:<password> -H 'Content-type: application/json' -H 
> 'Accept: application/json' -X GET 
> http//localhost:8000/storagepools?pool_type=dir*
> /[//
> //  {//
> //    "available":27511504896,//
> //    "source":{},//
> //    "state":"active",//
> //    "capacity":195949113344,//
> //    "name":"default",//
> //    "nr_volumes":2,//
> //    "path":"/home/shhfeng/var/lib/libvirt/images",//
> //    "allocated":168437608448,//
> //    "autostart":true,//
> //    "type":"dir"//
> //  },//
> //  {//
> //    "state":"active",//
> //    "type":"kimchi-iso",//
> //    "name":"kimchi_isos"//
> //  }//
> //]/
> *$ curl -u <user>:<password> -H 'Content-type: application/json' -H 
> 'Accept: application/json' -X GET 
> http//localhost:8000/storagepools?pool_type=dirxxx*
> /{//
> //  "reason":"The server encountered an unexpected condition which 
> prevented it from fulfilling the request.",//
> //  "code":"500 Internal Server Error",//
> //  "call_stack":"Traceback (most recent call last):\n File 
> \"/usr/lib/python2.7/site-packages/cherrypy/_cprequest.py\", line 656, 
> in respond\n    response.body = self.handler()\n File 
> \"/usr/lib/python2.7/site-packages/cherrypy/lib/encoding.py\", line 
> 188, in __call__\n    self.body = self.oldhandler(*args, **kwargs)\n  
> File \"/usr/lib/python2.7/site-packages/cherrypy/_cpdispatch.py\", 
> line 34, in __call__\n    return self.callable(*self.args, 
> **self.kwargs)\n  File 
> \"/home/shhfeng/work/workdir/kimchi/src/kimchi/control/base.py\", line 
> 254, in index\n validate_params(cherrypy.request.params, self, 
> 'get_list')\n File 
> \"/home/shhfeng/work/workdir/kimchi/src/kimchi/control/utils.py\", 
> line 105, in validate_params\n    e.message for e in 
> validator.iter_errors(request)))\nInvalidParameter: u'dirxxx' does not 
> match u'^dir$'\n"/
>
> *
> **$ curl -u <user>:<password> -H 'Content-type: application/json' -H 
> 'Accept: application/json' -X GET 
> http//localhost:8000/storagepools/default/storagevolumes?volume_type=file*
> /[//
> //  {//
> //    "capacity":21474836480,//
> //    "name":"RHEL6.5.img",//
> //    "format":"qcow2",//
> //    "allocation":5200818176,//
> //"path":"/home/shhfeng/var/lib/libvirt/images/RHEL6.5.img",//
> //    "type":"file"//
> //  },//
> //  {//
> //    "capacity":21474836480,//
> //    "name":"RHEL6.5.img.back",//
> //    "format":"qcow2",//
> //    "allocation":3681751040,//
> //"path":"/home/shhfeng/var/lib/libvirt/images/RHEL6.5.img.back",//
> //    "type":"file"//
> //  }//
> //]/
> *$ curl -u <user>:<password> -H 'Content-type: application/json' -H 
> 'Accept: application/json' -X GET 
> http//localhost:8000/storagepools/default/storagevolumes?volume_type=filexxx*
> /{//
> //  "reason":"The server encountered an unexpected condition which 
> prevented it from fulfilling the request.",//
> //  "code":"500 Internal Server Error",//
> //  "call_stack":"Traceback (most recent call last):\n File 
> \"/usr/lib/python2.7/site-packages/cherrypy/_cprequest.py\", line 656, 
> in respond\n    response.body = self.handler()\n File 
> \"/usr/lib/python2.7/site-packages/cherrypy/lib/encoding.py\", line 
> 188, in __call__\n    self.body = self.oldhandler(*args, **kwargs)\n  
> File \"/usr/lib/python2.7/site-packages/cherrypy/_cpdispatch.py\", 
> line 34, in __call__\n    return self.callable(*self.args, 
> **self.kwargs)\n  File 
> \"/home/shhfeng/work/workdir/kimchi/src/kimchi/control/base.py\", line 
> 254, in index\n validate_params(cherrypy.request.params, self, 
> 'get_list')\n File 
> \"/home/shhfeng/work/workdir/kimchi/src/kimchi/control/utils.py\", 
> line 105, in validate_params\n    e.message for e in 
> validator.iter_errors(request)))\nInvalidParameter: u'filexxx' does 
> not match u'^file$'\n"//
> /
>
>
> On 01/08/2014 11:50 PM, lvroyce0210 at gmail.com wrote:
>> From: Royce Lv<lvroyce at linux.vnet.ibm.com>
>>
>> Add support for passing params for GET method,
>> we will call it like:
>>      GET /vms?state=running
>>
>> Signed-off-by: Royce Lv<lvroyce at linux.vnet.ibm.com>
>> ---
>>   src/kimchi/control/base.py         | 26 +++++++++++++++++++-------
>>   src/kimchi/control/storagepools.py |  4 ++--
>>   src/kimchi/control/utils.py        |  2 ++
>>   3 files changed, 23 insertions(+), 9 deletions(-)
>>
>> diff --git a/src/kimchi/control/base.py b/src/kimchi/control/base.py
>> index 185c8d8..73b70fb 100644
>> --- a/src/kimchi/control/base.py
>> +++ b/src/kimchi/control/base.py
>> @@ -28,7 +28,7 @@ import urllib2
>>
>>   import kimchi.template
>>   from kimchi.control.utils import get_class_name, internal_redirect, model_fn
>> -from kimchi.control.utils import parse_request, validate_method
>> +from kimchi.control.utils import parse_request, parse_param, validate_method
>>   from kimchi.control.utils import validate_params
>>   from kimchi.exception import InvalidOperation, InvalidParameter
>>   from kimchi.exception import MissingParameter, NotFoundError,  OperationFailed
>> @@ -212,10 +212,11 @@ class Collection(object):
>>
>>           return res.get()
>>
>> -    def _get_resources(self):
>> +    def _get_resources(self, filter_params):
>>           try:
>> +            validate_params(filter_params, self, 'get_list')
>>               get_list = getattr(self.model, model_fn(self, 'get_list'))
>> -            idents = get_list(*self.model_args)
>> +            idents = get_list(*self.model_args, **filter_params)
>>               res_list = []
>>               for ident in idents:
>>                   # internal text, get_list changes ident to unicode for sorted
>> @@ -234,15 +235,26 @@ 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, filter_params):
>>           data = []
>>           for res in resources:
>> -            data.append(res.data)
>> +            valid = True
>> +            for key, val in filter_params.items():
>> +                if not ( key in res.data and res.data[key] == val):
>> +                    valid = False
>> +                    break
>> +            if valid:
>> +                data.append(res.data)
>> +        return data
>> +
>> +    def get(self):
>> +        filter_params = parse_param()
>> +        resources = self._get_resources(filter_params)
>> +        data = self.filter_data(resources, filter_params)
>>           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:
>> diff --git a/src/kimchi/control/storagepools.py b/src/kimchi/control/storagepools.py
>> index 466b4b6..0df14c5 100644
>> --- a/src/kimchi/control/storagepools.py
>> +++ b/src/kimchi/control/storagepools.py
>> @@ -61,9 +61,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/utils.py b/src/kimchi/control/utils.py
>> index c3c5f8e..4b3c4b0 100644
>> --- a/src/kimchi/control/utils.py
>> +++ b/src/kimchi/control/utils.py
>> @@ -81,6 +81,8 @@ def parse_request():
>>           raise cherrypy.HTTPError(415, "This API only supports"
>>                                         " 'application/json'")
>>
>> +def parse_param():
>> +    return cherrypy.request.params
>>
>>   def internal_redirect(url):
>>       raise cherrypy.InternalRedirect(url.encode("utf-8"))
>
>
> -- 
> Thanks and best regards!
>
> Sheldon Feng(???)<shaohef at linux.vnet.ibm.com>
> IBM Linux Technology Center
>
>
> _______________________________________________
> Kimchi-devel mailing list
> Kimchi-devel at ovirt.org
> http://lists.ovirt.org/mailman/listinfo/kimchi-devel

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.ovirt.org/pipermail/kimchi-devel/attachments/20140113/0a876bd7/attachment.html>


More information about the Kimchi-devel mailing list