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

Sheldon shaohef at linux.vnet.ibm.com
Sat Jan 11 00:48:22 UTC 2014


*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

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


More information about the Kimchi-devel mailing list