a lot of chenges
diff --git a/wally/utils.py b/wally/utils.py
index 1fa74c5..cdee319 100644
--- a/wally/utils.py
+++ b/wally/utils.py
@@ -1,5 +1,6 @@
 import re
 import os
+import sys
 import time
 import psutil
 import socket
@@ -31,6 +32,41 @@
         self.orig_exc = orig_exc
 
 
+@contextlib.contextmanager
+def log_block(message, exc_logger=None):
+    logger.debug("Starts : " + message)
+    with log_error(message, exc_logger):
+        yield
+    # try:
+    #     yield
+    # except Exception as exc:
+    #     if isinstance(exc, types) and not isinstance(exc, StopIteration):
+    #         templ = "Error during {0} stage: {1!s}"
+    #         logger.debug(templ.format(action, exc))
+    #     raise
+
+
+class log_error(object):
+    def __init__(self, message, exc_logger=None):
+        self.message = message
+        self.exc_logger = exc_logger
+
+    def __enter__(self):
+        return self
+
+    def __exit__(self, tp, value, traceback):
+        if value is None or isinstance(value, StopTestError):
+            return
+
+        if self.exc_logger is None:
+            exc_logger = sys._getframe(1).f_globals.get('logger', logger)
+        else:
+            exc_logger = self.exc_logger
+
+        exc_logger.exception(self.message, exc_info=(tp, value, traceback))
+        raise StopTestError(self.message, value)
+
+
 def check_input_param(is_ok, message):
     if not is_ok:
         logger.error(message)
@@ -79,22 +115,6 @@
             self.exited = True
 
 
-@contextlib.contextmanager
-def log_error(action, types=(Exception,)):
-    if not action.startswith("!"):
-        logger.debug("Starts : " + action)
-    else:
-        action = action[1:]
-
-    try:
-        yield
-    except Exception as exc:
-        if isinstance(exc, types) and not isinstance(exc, StopIteration):
-            templ = "Error during {0} stage: {1!s}"
-            logger.debug(templ.format(action, exc))
-        raise
-
-
 SMAP = dict(k=1024, m=1024 ** 2, g=1024 ** 3, t=1024 ** 4)
 
 
@@ -259,3 +279,13 @@
 def iter_clean_func():
     while CLEANING != []:
         yield CLEANING.pop()
+
+
+def flatten(data):
+    res = []
+    for i in data:
+        if isinstance(i, (list, tuple, set)):
+            res.extend(flatten(i))
+        else:
+            res.append(i)
+    return res