itest.py code reorganization, move test node logs to /var/wally folder to survive test node reboot
diff --git a/wally/config.py b/wally/config.py
index 7c5d377..8eafecc 100644
--- a/wally/config.py
+++ b/wally/config.py
@@ -55,6 +55,9 @@
     cfg_dict['log_file'] = in_var_dir('log.txt')
     cfg_dict['sensor_storage'] = in_var_dir('sensor_storage.txt')
 
+    cfg_dict['default_test_local_folder'] = \
+        "/var/wally/{0}/{{name}}".format(cfg_dict['run_uuid'])
+
     cfg_dict['test_log_directory'] = in_var_dir('test_logs')
     mkdirs_if_unxists(cfg_dict['test_log_directory'])
 
diff --git a/wally/run_test.py b/wally/run_test.py
index b0a3bf1..0b20657 100755
--- a/wally/run_test.py
+++ b/wally/run_test.py
@@ -97,7 +97,7 @@
         res_q.put(exc)
 
 
-def run_tests(test_block, nodes, test_uuid):
+def run_tests(cfg, test_block, nodes):
     tool_type_mapper = {
         "io": IOPerfTest,
         "pgbench": PgBenchTest,
@@ -116,6 +116,7 @@
         barrier = utils.Barrier(len(test_nodes))
         coord_q = Queue.Queue()
         test_cls = tool_type_mapper[name]
+        rem_folder = cfg['default_test_local_folder'].format(name=name)
 
         for node in test_nodes:
             msg = "Starting {0} test on {1} node"
@@ -129,7 +130,8 @@
             if not os.path.exists(dr):
                 os.makedirs(dr)
 
-            test = test_cls(params, res_q.put, test_uuid, node,
+            test = test_cls(params, res_q.put, cfg['run_uuid'], node,
+                            remote_dir=rem_folder,
                             log_directory=dr,
                             coordination_queue=coord_q)
             th = threading.Thread(None, test_thread, None,
@@ -351,12 +353,11 @@
 
                 if not cfg['no_tests']:
                     for test_group in config.get('tests', []):
-                        test_res = run_tests(test_group, ctx.nodes,
-                                             cfg['run_uuid'])
+                        test_res = run_tests(cfg, test_group, ctx.nodes)
                         ctx.results.extend(test_res)
         else:
             if not cfg['no_tests']:
-                test_res = run_tests(group, ctx.nodes, cfg['run_uuid'])
+                test_res = run_tests(cfg, group, ctx.nodes)
                 ctx.results.extend(test_res)
 
 
diff --git a/wally/suits/itest.py b/wally/suits/itest.py
index 57fd3e7..57592da 100644
--- a/wally/suits/itest.py
+++ b/wally/suits/itest.py
@@ -26,12 +26,18 @@
 
 class IPerfTest(object):
     def __init__(self, on_result_cb, test_uuid, node,
-                 log_directory=None, coordination_queue=None):
+                 log_directory=None,
+                 coordination_queue=None,
+                 remote_dir="/tmp/wally"):
         self.on_result_cb = on_result_cb
         self.log_directory = log_directory
         self.node = node
         self.test_uuid = test_uuid
         self.coordination_queue = coordination_queue
+        self.remote_dir = remote_dir
+
+    def join_remote(self, path):
+        return os.path.join(self.remote_dir, path)
 
     def coordinate(self, data):
         if self.coordination_queue is not None:
@@ -62,8 +68,6 @@
 
 
 class TwoScriptTest(IPerfTest):
-    remote_tmp_dir = '/tmp'
-
     def __init__(self, opts, *dt, **mp):
         IPerfTest.__init__(self, *dt, **mp)
         self.opts = opts
@@ -115,10 +119,6 @@
 
 
 class IOPerfTest(IPerfTest):
-    io_py_remote_templ = "/tmp/test/{0}/io/disk_test_agent.py"
-    log_fl_templ = "/tmp/test/{0}/io/disk_test_agent_log.txt"
-    pid_file_templ = "/tmp/test/{0}/io/disk_test_agent_pid_file"
-    task_file_templ = "/tmp/test/{0}/io/io_task.cfg"
 
     def __init__(self, test_options, *dt, **mp):
         IPerfTest.__init__(self, *dt, **mp)
@@ -134,10 +134,10 @@
         cmd_log = os.path.join(self.log_directory, "task_compiled.cfg")
         raw_res = os.path.join(self.log_directory, "raw_results.txt")
 
-        self.io_py_remote = self.io_py_remote_templ.format(self.test_uuid)
-        self.log_fl = self.log_fl_templ.format(self.test_uuid)
-        self.pid_file = self.pid_file_templ.format(self.test_uuid)
-        self.task_file = self.task_file_templ.format(self.test_uuid)
+        self.io_py_remote = self.join_remote("agent.py")
+        self.log_fl = self.join_remote("log.txt")
+        self.pid_file = self.join_remote("pid")
+        self.task_file = self.join_remote("task.cfg")
 
         fio_command_file = open_for_append_or_create(cmd_log)
 
@@ -151,70 +151,75 @@
         # Need to remove tempo files, used for testing
         pass
 
+    def prefill_test_files(self):
+        files = {}
+
+        for section in self.configs:
+            sz = ssize_to_b(section.vals['size'])
+            msz = sz / (1024 ** 2)
+
+            if sz % (1024 ** 2) != 0:
+                msz += 1
+
+            fname = section.vals['filename']
+
+            # if already has other test with the same file name
+            # take largest size
+            files[fname] = max(files.get(fname, 0), msz)
+
+        cmd_templ = "dd oflag=direct " + \
+                    "if=/dev/zero of={0} bs={1} count={2}"
+
+        if self.options.get("use_sudo", True):
+            cmd_templ = "sudo " + cmd_templ
+
+        ssize = 0
+        stime = time.time()
+
+        for fname, curr_sz in files.items():
+            cmd = cmd_templ.format(fname, 1024 ** 2, curr_sz)
+            ssize += curr_sz
+            self.run_over_ssh(cmd, timeout=curr_sz)
+
+        ddtime = time.time() - stime
+        if ddtime > 1E-3:
+            fill_bw = int(ssize / ddtime)
+            mess = "Initiall dd fill bw is {0} MiBps for this vm"
+            logger.info(mess.format(fill_bw))
+
+    def install_utils(self, max_retry=3, timeout=5):
+        need_install = []
+        for bin_name, package in (('fio', 'fio'), ('screen', 'screen')):
+            try:
+                self.run_over_ssh('which ' + bin_name, nolog=True)
+            except OSError:
+                need_install.append(package)
+
+        cmd = "sudo apt-get -y install " + " ".join(need_install)
+
+        for i in range(max_retry):
+            try:
+                self.run_over_ssh(cmd)
+                break
+            except OSError as err:
+                time.sleep(timeout)
+        else:
+            raise OSError("Can't install - " + str(err))
+
     def pre_run(self):
         with self.node.connection.open_sftp() as sftp:
-            ssh_mkdir(sftp,
-                      os.path.dirname(self.io_py_remote),
-                      intermediate=True)
+            ssh_mkdir(sftp, self.remote_dir, intermediate=True)
 
-        try:
-            self.run_over_ssh('which fio')
-        except OSError:
-            # TODO: install fio, if not installed
-            for i in range(3):
-                try:
-                    self.run_over_ssh("sudo apt-get -y install fio")
-                    break
-                except OSError as err:
-                    time.sleep(3)
-            else:
-                raise OSError("Can't install fio - " + str(err))
+        self.install_utils()
 
         local_fname = os.path.splitext(io_agent.__file__)[0] + ".py"
-
-        self.files_to_copy = {
-            local_fname: self.io_py_remote,
-        }
-
-        copy_paths(self.node.connection, self.files_to_copy)
+        files_to_copy = {local_fname: self.io_py_remote}
+        copy_paths(self.node.connection, files_to_copy)
 
         if self.options.get('prefill_files', True):
-            files = {}
-
-            for section in self.configs:
-                sz = ssize_to_b(section.vals['size'])
-                msz = sz / (1024 ** 2)
-
-                if sz % (1024 ** 2) != 0:
-                    msz += 1
-
-                fname = section.vals['filename']
-
-                # if already has other test with the same file name
-                # take largest size
-                files[fname] = max(files.get(fname, 0), msz)
-
-            cmd_templ = "dd oflag=direct " + \
-                        "if=/dev/zero of={0} bs={1} count={2}"
-
-            if self.options.get("use_sudo", True):
-                cmd_templ = "sudo " + cmd_templ
-
-            ssize = 0
-            stime = time.time()
-
-            for fname, curr_sz in files.items():
-                cmd = cmd_templ.format(fname, 1024 ** 2, curr_sz)
-                ssize += curr_sz
-                self.run_over_ssh(cmd, timeout=curr_sz)
-
-            ddtime = time.time() - stime
-            if ddtime > 1E-3:
-                fill_bw = int(ssize / ddtime)
-                mess = "Initiall dd fill bw is {0} MiBps for this vm"
-                logger.info(mess.format(fill_bw))
+            self.prefill_test_files()
         else:
-            logger.warning("Test files prefill disabled")
+            logger.warning("Prefilling of test files is disabled")
 
     def run(self, barrier):
         cmd_templ = "screen -S {screen_name} -d -m " + \