From: huangtianhua <huangtianhua@huawei.com>
Date: Fri, 22 Nov 2013 07:22:07 +0000 (+0800)
Subject: Migrate volume should check para "host" in request
X-Git-Url: https://review.fuel-infra.org/gitweb?a=commitdiff_plain;h=58db021240cafb33f602aba50fdaa9060c15d84a;p=openstack-build%2Fcinder-build.git

Migrate volume should check para "host" in request

The server doesn't check whether the parameter "host" is in request
body. So the 500 error has been thrown.

We should catch the KeyError and transfer the KeyError to
400 (HTTPBadRequest) instead of 500.

Closes-Bug: #1253904
Change-Id: I3fb07113816a87f284b47e32bacd57f78a32676c
---

diff --git a/cinder/api/contrib/admin_actions.py b/cinder/api/contrib/admin_actions.py
index 6ccae0a1e..57e06b7d3 100644
--- a/cinder/api/contrib/admin_actions.py
+++ b/cinder/api/contrib/admin_actions.py
@@ -148,7 +148,10 @@ class VolumeAdminController(AdminController):
         except exception.NotFound:
             raise exc.HTTPNotFound()
         params = body['os-migrate_volume']
-        host = params['host']
+        try:
+            host = params['host']
+        except KeyError:
+            raise exc.HTTPBadRequest("Must specify 'host'")
         force_host_copy = params.get('force_host_copy', False)
         if isinstance(force_host_copy, basestring):
             try:
diff --git a/cinder/tests/api/contrib/test_admin_actions.py b/cinder/tests/api/contrib/test_admin_actions.py
index 8ee821477..d4dad0bfc 100644
--- a/cinder/tests/api/contrib/test_admin_actions.py
+++ b/cinder/tests/api/contrib/test_admin_actions.py
@@ -584,6 +584,23 @@ class AdminActionsTest(test.TestCase):
         volume = self._migrate_volume_prep()
         self._migrate_volume_exec(ctx, volume, host, expected_status)
 
+    def test_migrate_volume_without_host_parameter(self):
+        expected_status = 400
+        host = 'test3'
+        ctx = context.RequestContext('admin', 'fake', True)
+        volume = self._migrate_volume_prep()
+        # build request to migrate without host
+        req = webob.Request.blank('/v2/fake/volumes/%s/action' % volume['id'])
+        req.method = 'POST'
+        req.headers['content-type'] = 'application/json'
+        body = {'os-migrate_volume': {'host': host,
+                                      'force_host_copy': False}}
+        req.body = jsonutils.dumps(body)
+        req.environ['cinder.context'] = ctx
+        resp = req.get_response(app())
+        # verify status
+        self.assertEqual(resp.status_int, expected_status)
+
     def test_migrate_volume_host_no_exist(self):
         expected_status = 400
         host = 'test3'