add local sensor datastore, make IO tests granular
diff --git a/wally/run_test.py b/wally/run_test.py
index 891b9d3..9cea103 100755
--- a/wally/run_test.py
+++ b/wally/run_test.py
@@ -2,6 +2,7 @@
 
 import os
 import sys
+import time
 import Queue
 import pprint
 import logging
@@ -16,11 +17,16 @@
 from concurrent.futures import ThreadPoolExecutor
 
 from wally import pretty_yaml
-from wally.sensors_utils import deploy_sensors_stage
 from wally.discover import discover, Node, undiscover
 from wally import utils, report, ssh_utils, start_vms
 from wally.suits.itest import IOPerfTest, PgBenchTest
 from wally.config import cfg_dict, load_config, setup_loggers
+from wally.sensors_utils import deploy_sensors_stage, SensorDatastore
+
+try:
+    from wally import webui
+except ImportError:
+    webui = None
 
 
 logger = logging.getLogger("wally")
@@ -478,6 +484,22 @@
     return load_data_from_file
 
 
+def start_web_ui(cfg, ctx):
+    if webui is None:
+        logger.error("Can't start webui. Install cherrypy module")
+        ctx.web_thread = None
+    else:
+        th = threading.Thread(None, webui.web_main_thread, "webui", (None,))
+        th.daemon = True
+        th.start()
+        ctx.web_thread = th
+
+
+def stop_web_ui(cfg, ctx):
+    webui.web_main_stop()
+    time.sleep(1)
+
+
 def parse_args(argv):
     descr = "Disk io performance test suite"
     parser = argparse.ArgumentParser(prog='wally', description=descr)
@@ -547,11 +569,15 @@
     ctx.build_meta['build_descrption'] = opts.build_description
     ctx.build_meta['build_type'] = opts.build_type
     ctx.build_meta['username'] = opts.username
+    ctx.sensors_data = SensorDatastore()
 
     cfg_dict['keep_vm'] = opts.keep_vm
     cfg_dict['no_tests'] = opts.no_tests
     cfg_dict['dont_discover_nodes'] = opts.dont_discover_nodes
 
+    if cfg_dict.get('run_web_ui', False):
+        start_web_ui(cfg_dict, ctx)
+
     try:
         for stage in stages:
             logger.info("Start {0.__name__} stage".format(stage))
@@ -580,6 +606,9 @@
 
     logger.info("All info stored in {0} folder".format(cfg_dict['var_dir']))
 
+    if cfg_dict.get('run_web_ui', False):
+        stop_web_ui(cfg_dict, ctx)
+
     if exc is None:
         logger.info("Tests finished successfully")
         return 0