improve OS preparation, change config structure
diff --git a/wally/run_test.py b/wally/run_test.py
index fbe676f..6606d04 100755
--- a/wally/run_test.py
+++ b/wally/run_test.py
@@ -326,7 +326,7 @@
 
 @contextlib.contextmanager
 def create_vms_ctx(ctx, cfg, config):
-    params = config['vm_params'].copy()
+    params = cfg['vm_configs'][config['cfg_name']].copy()
     os_nodes_ids = []
 
     os_creds_type = config['creds']
@@ -335,11 +335,14 @@
     start_vms.nova_connect(**os_creds)
 
     logger.info("Preparing openstack")
-    start_vms.prepare_os_subpr(**os_creds)
+    params.update(config)
+    params['keypair_file_private'] = params['keypair_name'] + ".pem"
+    params['group_name'] = cfg_dict['run_uuid']
+
+    start_vms.prepare_os_subpr(params=params, **os_creds)
 
     new_nodes = []
     try:
-        params['group_name'] = cfg_dict['run_uuid']
         for new_node, node_id in start_vms.launch_vms(params):
             new_node.roles.append('testnode')
             ctx.nodes.append(new_node)
@@ -368,7 +371,12 @@
         key, config = group.items()[0]
 
         if 'start_test_nodes' == key:
-            with create_vms_ctx(ctx, cfg, config) as new_nodes:
+            if 'openstack' not in config:
+                msg = "No openstack block in config - can't spawn vm's"
+                logger.error(msg)
+                raise utils.StopTestError(msg)
+
+            with create_vms_ctx(ctx, cfg, config['openstack']) as new_nodes:
                 connect_all(new_nodes, True)
 
                 for node in new_nodes:
@@ -584,13 +592,17 @@
     if cfg_dict.get('run_web_ui', False):
         start_web_ui(cfg_dict, ctx)
 
+    msg_templ = "Exception during {0.__name__}: {1!s}"
+    msg_templ_no_exc = "During {0.__name__}"
+
     try:
         for stage in stages:
             logger.info("Start {0.__name__} stage".format(stage))
             stage(cfg_dict, ctx)
-    except Exception as exc:
-        msg = "Exception during {0.__name__}: {1!s}".format(stage, exc)
-        logger.error(msg)
+    except utils.StopTestError as exc:
+        logger.error(msg_templ.format(stage, exc))
+    except Exception:
+        logger.exception(msg_templ_no_exc.format(stage))
     finally:
         exc, cls, tb = sys.exc_info()
         for stage in ctx.clear_calls_stack[::-1]:
@@ -598,13 +610,9 @@
                 logger.info("Start {0.__name__} stage".format(stage))
                 stage(cfg_dict, ctx)
             except utils.StopTestError as exc:
-                msg = "During {0.__name__} stage: {1}".format(stage, exc)
-                logger.error(msg)
-            except Exception as exc:
-                logger.exception("During {0.__name__} stage".format(stage))
-
-        # if exc is not None:
-        #     raise exc, cls, tb
+                logger.error(msg_templ.format(stage, exc))
+            except Exception:
+                logger.exception(msg_templ_no_exc.format(stage))
 
     if exc is None:
         for report_stage in report_stages: