[Kimchi-devel] [PATCHv3 2/2] issue#382: Validate form for adding guest cdrom

Aline Manera alinefm at linux.vnet.ibm.com
Thu Jun 26 20:23:01 UTC 2014


On 06/26/2014 03:47 AM, lvroyce at linux.vnet.ibm.com wrote:
> From: Royce Lv <lvroyce at linux.vnet.ibm.com>
>
> Add function for cdrom and disk form validation,
> so that cdrom will not be created when no path given.

Royce, the backend should be able to handle those cases.

It is the error I got when I tried to add a cdrom without passing a 
"path" using curl

alinefm at alinefm:~/mail-patches$ curl -u banana:linux99 -H "Content-Type: 
application/json" -H "Accept: application/json" 
https://localhost:8001/vms/Ubuntu13-10/storages -d'{"type": "cdrom"}' -X 
POST -k
{
   "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/dist-packages/cherrypy/_cprequest.py\", line 656, 
in respond\n    response.body = self.handler()\n  File 
\"/usr/lib/python2.7/dist-packages/cherrypy/lib/encoding.py\", line 188, 
in __call__\n    self.body = self.oldhandler(*args, **kwargs)\n  File 
\"/usr/lib/python2.7/dist-packages/cherrypy/_cpdispatch.py\", line 34, 
in __call__\n    return self.callable(*self.args, **self.kwargs)\n  File 
\"/home/alinefm/kimchi/src/kimchi/control/base.py\", line 270, in 
index\n    return self.create(parse_request(), *args)\n  File 
\"/home/alinefm/kimchi/src/kimchi/control/base.py\", line 209, in 
create\n    name = create(*args)\n  File 
\"/home/alinefm/kimchi/src/kimchi/model/vmstorages.py\", line 171, in 
create\n    params['src_type'] = _check_path(params['path'])\nKeyError: 
'path'\n"

And in console:

127.0.0.1 - - [26/Jun/2014:17:19:12] "POST /vms/Ubuntu13-10/storages 
HTTP/1.0" 500 1009 "" "curl/7.27.0"
[26/Jun/2014:17:19:14] HTTP
Request Headers:
   AUTHORIZATION: Basic YmFuYW5hOmxpbnV4OTk=
   Content-Length: 17
   HOST: localhost
   CONNECTION: close
   Remote-Addr: 127.0.0.1
   X-REAL-IP: 127.0.0.1
   ACCEPT: application/json
   USER-AGENT: curl/7.27.0
   X-FORWARDED-FOR: 127.0.0.1
   Content-Type: application/json
[26/Jun/2014:17:19:14] HTTP Traceback (most recent call last):
   File "/usr/lib/python2.7/dist-packages/cherrypy/_cprequest.py", line 
656, in respond
     response.body = self.handler()
   File "/usr/lib/python2.7/dist-packages/cherrypy/lib/encoding.py", 
line 188, in __call__
     self.body = self.oldhandler(*args, **kwargs)
   File "/usr/lib/python2.7/dist-packages/cherrypy/_cpdispatch.py", line 
34, in __call__
     return self.callable(*self.args, **self.kwargs)
   File "/home/alinefm/kimchi/src/kimchi/control/base.py", line 270, in 
index
     return self.create(parse_request(), *args)
   File "/home/alinefm/kimchi/src/kimchi/control/base.py", line 209, in 
create
     name = create(*args)
   File "/home/alinefm/kimchi/src/kimchi/model/vmstorages.py", line 171, 
in create
     params['src_type'] = _check_path(params['path'])
KeyError: 'path'

The same error occurs when I used type == 'disk'

alinefm at alinefm:~/mail-patches$ curl -u banana:linux99 -H "Content-Type: 
application/json" -H "Accept: application/json" 
https://localhost:8001/vms/Ubuntu13-10/storages -d'{"type": "disk"}' -X 
POST -k
{
   "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/dist-packages/cherrypy/_cprequest.py\", line 656, 
in respond\n    response.body = self.handler()\n  File 
\"/usr/lib/python2.7/dist-packages/cherrypy/lib/encoding.py\", line 188, 
in __call__\n    self.body = self.oldhandler(*args, **kwargs)\n  File 
\"/usr/lib/python2.7/dist-packages/cherrypy/_cpdispatch.py\", line 34, 
in __call__\n    return self.callable(*self.args, **self.kwargs)\n  File 
\"/home/alinefm/kimchi/src/kimchi/control/base.py\", line 270, in 
index\n    return self.create(parse_request(), *args)\n  File 
\"/home/alinefm/kimchi/src/kimchi/control/base.py\", line 209, in 
create\n    name = create(*args)\n  File 
\"/home/alinefm/kimchi/src/kimchi/model/vmstorages.py\", line 171, in 
create\n    params['src_type'] = _check_path(params['path'])\nKeyError: 
'path'\n"


> Signed-off-by: Royce Lv <lvroyce at linux.vnet.ibm.com>
> ---
>   ui/js/src/kimchi.guest_storage_add.main.js | 28 ++++++++++++++++++++++++++++
>   ui/pages/i18n.json.tmpl                    |  7 +++++--
>   2 files changed, 33 insertions(+), 2 deletions(-)
>
> diff --git a/ui/js/src/kimchi.guest_storage_add.main.js b/ui/js/src/kimchi.guest_storage_add.main.js
> index 80045d3..a7e4c4c 100644
> --- a/ui/js/src/kimchi.guest_storage_add.main.js
> +++ b/ui/js/src/kimchi.guest_storage_add.main.js
> @@ -135,6 +135,25 @@ kimchi.guest_storage_add_main = function() {
>           });
>       });
>
> +    var validateCDROM = function(settings) {
> +        if (/(^\/.*)$/.test(settings['path']))
> +            return true;
> +        else {
> +            kimchi.message.error.code('KCHVMSTOR0001E');
> +            return false;
> +        }
> +    }
> +
> +    var validateDisk = function(settings) {
> +        if (settings['pool'] && settings['vol'])
> +            return true;
> +        else {
> +            kimchi.message.error.code('KCHVMSTOR0002E');
> +            return false;
> +        }
> +    }
> +
> +    validator = {cdrom: validateCDROM, disk: validateDisk};
>       var submitForm = function(event) {
>           if (submitButton.prop('disabled')) {
>               return false;
> @@ -155,6 +174,15 @@ kimchi.guest_storage_add_main = function() {
>                   settings[$(c).attr('name')] = $(c).val();
>               }
>           });
> +        // Validate form for cdrom and disk
> +        validateSpecifiedForm = validator[settings['type']];
> +        if (!validateSpecifiedForm(settings)) {
> +            $(submitButton).prop('disabled', false);
> +            $.each([submitButton, nameTextbox, pathTextbox, poolTextbox, volTextbox], function(i, c) {
> +                $(c).prop('disabled', false);
> +            });
> +            return false;
> +        }
>           $(submitButton).addClass('loading').text(i18n['KCHVMCD6003M']);
>
>           kimchi.addVMStorage(settings, function(result) {
> diff --git a/ui/pages/i18n.json.tmpl b/ui/pages/i18n.json.tmpl
> index ce23bc4..d765cf2 100644
> --- a/ui/pages/i18n.json.tmpl
> +++ b/ui/pages/i18n.json.tmpl
> @@ -162,5 +162,8 @@
>       "KCHPOOL6009E": "$_("This is not a valid Server Name or IP. please, modify it.")",
>       "KCHPOOL6010M": "$_("Looking for available partitions ...")",
>       "KCHPOOL6011M": "$_("No available partitions found.")",
> -    "KCHPOOL6012M": "$_("This storage pool is not persistent. Instead of deactivate, this action will permanently delete it. Would you like to continue?")"
> -}
> \ No newline at end of file
> +    "KCHPOOL6012M": "$_("This storage pool is not persistent. Instead of deactivate, this action will permanently delete it. Would you like to continue?")",
> +
> +    "KCHVMSTOR0001E": "$_("CDROM path need to be a valid local path and cannot be blank.")",
> +    "KCHVMSTOR0002E": "$_("Disk pool or volume cannot be blank.")"
> +}




More information about the Kimchi-devel mailing list