]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/dashboard: Improved Exception handling in Tasks
authorSebastian Wagner <sebastian.wagner@suse.com>
Mon, 23 Apr 2018 10:55:25 +0000 (12:55 +0200)
committerSebastian Wagner <sebastian.wagner@suse.com>
Tue, 8 May 2018 14:36:44 +0000 (16:36 +0200)
* Set default status code to 400
* Added tests
* Fixed globbing in `test_task.py`

Signed-off-by: Sebastian Wagner <sebastian.wagner@suse.com>
qa/tasks/mgr/dashboard/test_rbd.py
src/pybind/mgr/dashboard/controllers/__init__.py
src/pybind/mgr/dashboard/tests/test_exceptions.py
src/pybind/mgr/dashboard/tests/test_task.py
src/pybind/mgr/dashboard/tools.py

index 85ffa01a47c2af873cb6521016cffd34c45242bc..73267d11dbd0ba2f6b2a4dc239ee34881c1dd55e 100644 (file)
@@ -316,8 +316,8 @@ class RbdTest(DashboardTestCase):
 
     def test_delete_non_existent_image(self):
         res = self.remove_image('rbd', 'i_dont_exist')
-        self.assertStatus(409)
-        self.assertEqual(res, {"errno": 2, "status": 409, "component": "rbd",
+        self.assertStatus(400)
+        self.assertEqual(res, {"errno": 2, "status": 400, "component": "rbd",
                                "detail": "[errno 2] error removing image"})
 
     def test_image_delete(self):
index 3c47ef96c4869d192e2444943a19286585f6cc57..b0fdf02faae0297010418df4e2801a8ae839401f 100644 (file)
@@ -319,7 +319,7 @@ class Task(object):
                     if 'status' in task.ret_value:
                         status = task.ret_value['status']
                     else:
-                        status = 500
+                        status = getattr(ex, 'status', 500)
                     cherrypy.response.status = status
                     return task.ret_value
                 raise ex
@@ -327,7 +327,6 @@ class Task(object):
                 cherrypy.response.status = 202
                 return {'name': self.name, 'metadata': md}
             return value
-        wrapper.__wrapped__ = func
         return wrapper
 
 
index ae11192487b7be59be91e99df97462d290ecdca1..78472022a4c18e74ffbdfd9608a3175eebe4da2e 100644 (file)
@@ -1,20 +1,23 @@
 # -*- coding: utf-8 -*-
 from __future__ import absolute_import
 
+import time
+
 import cherrypy
 
 import rados
 from ..services.ceph_service import SendCommandError
-from ..controllers import RESTController, ApiController
+from ..controllers import RESTController, ApiController, Task
 from .helper import ControllerTestCase
 from ..services.exception import handle_rados_error, handle_send_command_error, \
     serialize_dashboard_exception
-from ..tools import ViewCache, TaskManager
+from ..tools import ViewCache, TaskManager, NotificationQueue
 
 
 # pylint: disable=W0613
 @ApiController('foo')
 class FooResource(RESTController):
+
     @cherrypy.expose
     @cherrypy.tools.json_out()
     @handle_rados_error('foo')
@@ -43,7 +46,6 @@ class FooResource(RESTController):
     def vc_no_data(self):
         @ViewCache(timeout=0)
         def _no_data():
-            import time
             time.sleep(0.2)
 
         _no_data()
@@ -90,9 +92,10 @@ class Root(object):
 
 
 class RESTControllerTest(ControllerTestCase):
-
     @classmethod
     def setup_server(cls):
+        NotificationQueue.start_queue()
+        TaskManager.init()
         cls.setup_controllers([FooResource])
 
     def test_no_exception(self):
@@ -145,6 +148,18 @@ class RESTControllerTest(ControllerTestCase):
             {'detail': '[errno -42] hi', 'code': "42", 'component': 'foo'}
         )
 
+    def test_task_exception(self):
+        self._get('/foo/task_exception')
+        self.assertStatus(400)
+        self.assertJsonBody(
+            {'detail': '[errno -42] hi', 'code': "42", 'component': 'foo'}
+        )
+
+        self._get('/foo/wait_task_exception')
+        while self.jsonBody():
+            time.sleep(0.5)
+            self._get('/foo/wait_task_exception')
+
     def test_internal_server_error(self):
         self._get('/foo/internal_server_error')
         self.assertStatus(500)
index 0547a00a43e4af38b95a5a5469a3ebd4ac45a289..872deb6fa1ee38589b9d9a89549d1ccd094a8f64 100644 (file)
@@ -183,7 +183,7 @@ class TaskTest(unittest.TestCase):
         state, result = task1.run('test5/task1', 0.5)
         self.assertEqual(state, TaskManager.VALUE_EXECUTING)
         self.assertIsNone(result)
-        ex_t, _ = TaskManager.list()
+        ex_t, _ = TaskManager.list('test5/*')
         self.assertEqual(len(ex_t), 1)
         self.assertEqual(ex_t[0].name, 'test5/task1')
         self.assertEqual(ex_t[0].progress, 30)
@@ -199,12 +199,12 @@ class TaskTest(unittest.TestCase):
                 self.assertEqual(task.progress, 60)
         task2.resume()
         self.wait_for_task('test5/task2')
-        ex_t, _ = TaskManager.list()
+        ex_t, _ = TaskManager.list('test5/*')
         self.assertEqual(len(ex_t), 1)
         self.assertEqual(ex_t[0].name, 'test5/task1')
         task1.resume()
         self.wait_for_task('test5/task1')
-        ex_t, _ = TaskManager.list()
+        ex_t, _ = TaskManager.list('test5/*')
         self.assertEqual(len(ex_t), 0)
 
     def test_task_idempotent(self):
@@ -213,13 +213,13 @@ class TaskTest(unittest.TestCase):
         state, result = task1.run('test6/task1', 0.5)
         self.assertEqual(state, TaskManager.VALUE_EXECUTING)
         self.assertIsNone(result)
-        ex_t, _ = TaskManager.list()
+        ex_t, _ = TaskManager.list('test6/*')
         self.assertEqual(len(ex_t), 1)
         self.assertEqual(ex_t[0].name, 'test6/task1')
         state, result = task1_clone.run('test6/task1', 0.5)
         self.assertEqual(state, TaskManager.VALUE_EXECUTING)
         self.assertIsNone(result)
-        ex_t, _ = TaskManager.list()
+        ex_t, _ = TaskManager.list('test6/*')
         self.assertEqual(len(ex_t), 1)
         self.assertEqual(ex_t[0].name, 'test6/task1')
         task1.resume()
index d1739e44eb0bd95edcc34a0b9db2c9084742a132..8e8e536288e71fe8682e96ff2a9a51e313f1a40d 100644 (file)
@@ -585,6 +585,9 @@ class Task(object):
         return "Task(ns={}, md={})" \
                .format(self.name, self.metadata)
 
+    def __repr__(self):
+        return str(self)
+
     def _run(self):
         with self.lock:
             assert not self.running