Implement MOL-168 - Allow to run set of tests on single vm
diff --git a/run_test.py b/run_test.py
index 04176b6..bc1f8fc 100644
--- a/run_test.py
+++ b/run_test.py
@@ -5,6 +5,7 @@
 import pprint
 import os.path
 import argparse
+import traceback
 
 import io_scenario
 from itest import IOPerfTest
@@ -46,9 +47,12 @@
                         help="print some extra log info")
 
     parser.add_argument("-o", "--io-opts", dest='io_opts',
-                        required=True,
                         help="cmd line options for io.py")
 
+    parser.add_argument("-f", "--io-opts-file", dest='io_opts_file',
+                        type=argparse.FileType('r'), default=None,
+                        help="file with cmd line options for io.py")
+
     parser.add_argument("-t", "--test-directory", help="directory with test",
                         dest="test_directory", required=True)
 
@@ -69,65 +73,7 @@
     return parser.parse_args(argv)
 
 
-def main(argv):
-    opts = parse_args(argv)
-
-    if not opts.extra_logs:
-        def nolog(x):
-            pass
-
-        setlogger(nolog)
-
-    script_args = [opt.strip()
-                   for opt in opts.io_opts.split(" ")
-                   if opt.strip() != ""]
-
-    if opts.runner == "rally":
-        runner = rally_runner.get_rally_runner(
-            files_dir=os.path.dirname(io_scenario.__file__),
-            rally_extra_opts=opts.runner_opts.split(" "),
-            max_preparation_time=opts.max_preparation_time,
-            keep_temp_files=opts.keep_temp_files)
-        res = run_io_test(opts.tool_type,
-                          script_args,
-                          runner,
-                          opts.keep_temp_files)
-    elif opts.runner == "ssh":
-        user, key_file = opts.runner_opts.split(" ", 1)
-
-        latest_start_time = opts.max_preparation_time + time.time()
-
-        nova = nova_connect()
-
-        # nova, amount, keypair_name, img_name,
-        # flavor_name, vol_sz=None, network_zone_name=None,
-        # flt_ip_pool=None, name_templ='ceph-test-{}',
-        # scheduler_hints=None
-
-        try:
-            ips = [i[0] for i in create_vms_mt(nova, 3,
-                                               keypair_name='ceph',
-                                               img_name='ubuntu',
-                                               flavor_name='ceph.512',
-                                               network_zone_name='net04',
-                                               flt_ip_pool='net04_ext')]
-
-            uris = ["{0}@{1}::{2}".format(user, ip, key_file) for ip in ips]
-
-            runner = ssh_runner.get_ssh_runner(uris,
-                                               latest_start_time,
-                                               opts.keep_temp_files)
-            res = run_io_test(opts.tool_type,
-                              script_args,
-                              runner,
-                              opts.keep_temp_files)
-        finally:
-            clear_all(nova)
-
-    print "=" * 80
-    print pprint.pformat(res)
-    print "=" * 80
-
+def print_measurements_stat(res):
     if len(res) != 0:
         bw_mean = 0.0
         for measurement in res:
@@ -148,6 +94,126 @@
         print
         print "=" * 80
 
+
+def get_io_opts(io_opts_file, io_opts):
+    if io_opts_file is not None and io_opts is not None:
+        print "Options --io-opts-file and --io-opts can't be " + \
+            "provided same time"
+        exit(1)
+
+    if io_opts_file is None and io_opts is None:
+        print "Either --io-opts-file or --io-opts should " + \
+            "be provided"
+        exit(1)
+
+    if io_opts_file is not None:
+        io_opts = []
+
+        opt_lines = io_opts_file.readlines()
+        opt_lines = [i for i in opt_lines if i != "" and not i.startswith("#")]
+
+        for opt_line in opt_lines:
+            io_opts.append([opt.strip()
+                           for opt in opt_line.split(" ")
+                           if opt.strip() != ""])
+    else:
+        io_opts = [[opt.strip()
+                   for opt in io_opts.split(" ")
+                   if opt.strip() != ""]]
+
+    if len(io_opts) == 0:
+        print "Can't found parameters for io. Check" + \
+            "--io-opts-file or --io-opts options"
+        exit(1)
+
+    return io_opts
+
+
+def main(argv):
+    opts = parse_args(argv)
+
+    if not opts.extra_logs:
+        def nolog(x):
+            pass
+
+        setlogger(nolog)
+
+    io_opts = get_io_opts(opts.io_opts_file, opts.io_opts)
+
+    if opts.runner == "rally":
+        for script_args in io_opts:
+            runner = rally_runner.get_rally_runner(
+                files_dir=os.path.dirname(io_scenario.__file__),
+                rally_extra_opts=opts.runner_opts.split(" "),
+                max_preparation_time=opts.max_preparation_time,
+                keep_temp_files=opts.keep_temp_files)
+
+            res = run_io_test(opts.tool_type,
+                              script_args,
+                              runner,
+                              opts.keep_temp_files)
+
+            print "=" * 80
+            print pprint.pformat(res)
+            print "=" * 80
+
+            print_measurements_stat(res)
+
+    elif opts.runner == "ssh":
+        create_vms_opts = {}
+        for opt in opts.runner_opts.split(","):
+            name, val = opt.split("=", 1)
+            create_vms_opts[name] = val
+
+        user = create_vms_opts.pop("user")
+        key_file = create_vms_opts.pop("key_file")
+        aff_group = create_vms_opts.pop("aff_group", None)
+        raw_count = create_vms_opts.pop("count", "x1")
+
+        if raw_count.startswith("x"):
+            raise NotImplementedError("xXXXX count not implemented yet")
+        else:
+            count = int(raw_count)
+
+        if aff_group is not None:
+            scheduler_hints = {'group': aff_group}
+        else:
+            scheduler_hints = None
+
+        create_vms_opts['scheduler_hints'] = scheduler_hints
+
+        latest_start_time = opts.max_preparation_time + time.time()
+
+        nova = nova_connect()
+
+        # nova, amount, keypair_name, img_name,
+        # flavor_name, vol_sz=None, network_zone_name=None,
+        # flt_ip_pool=None, name_templ='ceph-test-{}',
+        # scheduler_hints=None
+
+        try:
+            ips = [i[0] for i in create_vms_mt(nova, count, **create_vms_opts)]
+
+            uris = ["{0}@{1}::{2}".format(user, ip, key_file) for ip in ips]
+
+            for script_args in io_opts:
+                runner = ssh_runner.get_ssh_runner(uris,
+                                                   latest_start_time,
+                                                   opts.keep_temp_files)
+                res = run_io_test(opts.tool_type,
+                                  script_args,
+                                  runner,
+                                  opts.keep_temp_files)
+                print "=" * 80
+                print pprint.pformat(res)
+                print "=" * 80
+
+                print_measurements_stat(res)
+        except:
+            traceback.print_exc()
+        finally:
+            clear_all(nova)
+
     return 0