[Kimchi-devel] [PATCH V3 1/3] move RollbackContext from tests/utils to src/kimchi/utils

shaohef at linux.vnet.ibm.com shaohef at linux.vnet.ibm.com
Tue Dec 24 07:46:29 UTC 2013


From: ShaoHe Feng <shaohef at linux.vnet.ibm.com>

Then kimchi source code can make use of it

Signed-off-by: ShaoHe Feng <shaohef at linux.vnet.ibm.com>
Signed-off-by: Zhou Zheng Sheng <zhshzhou at linux.vnet.ibm.com>
---
 src/kimchi/utils.py | 46 ++++++++++++++++++++++++++++++++++++++++++++++
 tests/utils.py      | 47 ++---------------------------------------------
 2 files changed, 48 insertions(+), 45 deletions(-)

diff --git a/src/kimchi/utils.py b/src/kimchi/utils.py
index f7eda93..bf2a760 100644
--- a/src/kimchi/utils.py
+++ b/src/kimchi/utils.py
@@ -84,3 +84,49 @@ def import_class(class_path):
 
 def import_module(module_name):
     return __import__(module_name, fromlist=[''])
+
+
+class RollbackContext(object):
+    '''
+    A context manager for recording and playing rollback.
+    The first exception will be remembered and re-raised after rollback
+
+    Sample usage:
+    with RollbackContext() as rollback:
+        step1()
+        rollback.prependDefer(lambda: undo step1)
+        def undoStep2(arg): pass
+        step2()
+        rollback.prependDefer(undoStep2, arg)
+    '''
+    def __init__(self, *args):
+        self._finally = []
+
+    def __enter__(self):
+        return self
+
+    def __exit__(self, exc_type, exc_value, traceback):
+        firstException = exc_value
+
+        for undo, args, kwargs in self._finally:
+            try:
+                undo(*args, **kwargs)
+            except Exception as e:
+                # keep the earliest exception info
+                if not firstException:
+                    firstException = e
+                    # keep the original traceback info
+                    traceback = sys.exc_info()[2]
+
+        # re-raise the earliest exception
+        if firstException is not None:
+            if type(firstException) is str:
+                sys.stderr.write(firstException)
+            else:
+                raise firstException, None, traceback
+
+    def defer(self, func, *args, **kwargs):
+        self._finally.append((func, args, kwargs))
+
+    def prependDefer(self, func, *args, **kwargs):
+        self._finally.insert(0, (func, args, kwargs))
diff --git a/tests/utils.py b/tests/utils.py
index c114813..e8acb2b 100644
--- a/tests/utils.py
+++ b/tests/utils.py
@@ -32,6 +32,8 @@ from contextlib import closing
 import unittest
 import base64
 
+from kimchi.utils import RollbackContext
+
 import kimchi.server
 import kimchi.model
 
@@ -137,51 +139,6 @@ def https_request(host, port, path, data=None, method='GET', headers=None):
     return _request(conn, path, data, method, headers)
 
 
-class RollbackContext(object):
-    '''
-    A context manager for recording and playing rollback.
-    The first exception will be remembered and re-raised after rollback
-
-    Sample usage:
-    with RollbackContext() as rollback:
-        step1()
-        rollback.prependDefer(lambda: undo step1)
-        def undoStep2(arg): pass
-        step2()
-        rollback.prependDefer(undoStep2, arg)
-    '''
-    def __init__(self, *args):
-        self._finally = []
-
-    def __enter__(self):
-        return self
-
-    def __exit__(self, exc_type, exc_value, traceback):
-        firstException = exc_value
-
-        for undo, args, kwargs in self._finally:
-            try:
-                undo(*args, **kwargs)
-            except Exception as e:
-                # keep the earliest exception info
-                if not firstException:
-                    firstException = e
-                    # keep the original traceback info
-                    traceback = sys.exc_info()[2]
-
-        # re-raise the earliest exception
-        if firstException is not None:
-            if type(firstException) is str:
-                sys.stderr.write(firstException)
-            else:
-                raise firstException, None, traceback
-
-    def defer(self, func, *args, **kwargs):
-        self._finally.append((func, args, kwargs))
-
-    def prependDefer(self, func, *args, **kwargs):
-        self._finally.insert(0, (func, args, kwargs))
-
 def patch_auth():
     """
     Override the authenticate function with a simple test against an
-- 
1.8.4.2




More information about the Kimchi-devel mailing list