CSIT-898: WRK improvments
[csit.git] / resources / tools / wrk / wrk.py
index 33cfd08..a891fd6 100644 (file)
@@ -16,6 +16,9 @@
 
 import re
 
+from copy import deepcopy
+from time import sleep
+
 from robot.api import logger
 
 from resources.libraries.python.ssh import SSH
@@ -100,17 +103,19 @@ def destroy_wrk(tg_node):
         raise RuntimeError('Removal of wrk from the TG node failed.')
 
 
-def run_wrk(tg_node, profile_name, tg_numa, test_type):
+def run_wrk(tg_node, profile_name, tg_numa, test_type, warm_up=False):
     """Send the traffic as defined in the profile.
 
     :param tg_node: Traffic generator node.
     :param profile_name: The name of wrk traffic profile.
     :param tg_numa: Numa node on which wrk will run.
     :param test_type: The type of the tests: cps, rps, bw
+    :param warm_up: If True, warm-up traffic is generated before test traffic.
     :type profile_name: str
     :type tg_node: dict
     :type tg_numa: int
     :type test_type: str
+    :type warm_up: bool
     :returns: Message with measured data.
     :rtype: str
     :raises: RuntimeError if node type is not a TG.
@@ -140,6 +145,9 @@ def run_wrk(tg_node, profile_name, tg_numa, test_type):
             str(profile["latency"]),
             "'{0}'".format(" ".join(profile["urls"]))
         ]
+        if warm_up:
+            warm_up_params = deepcopy(params)
+            warm_up_params[4] = "10s"
     elif len(profile["urls"]) == profile["cpus"]:
         params = [
             "traffic_n_urls_n_cores",
@@ -153,6 +161,9 @@ def run_wrk(tg_node, profile_name, tg_numa, test_type):
             str(profile["latency"]),
             "'{0}'".format(" ".join(profile["urls"]))
         ]
+        if warm_up:
+            warm_up_params = deepcopy(params)
+            warm_up_params[4] = "10s"
     else:
         params = [
             "traffic_n_urls_m_cores",
@@ -167,11 +178,24 @@ def run_wrk(tg_node, profile_name, tg_numa, test_type):
             str(profile["latency"]),
             "'{0}'".format(" ".join(profile["urls"]))
         ]
+        if warm_up:
+            warm_up_params = deepcopy(params)
+            warm_up_params[5] = "10s"
+
     args = " ".join(params)
 
     ssh = SSH()
     ssh.connect(tg_node)
 
+    if warm_up:
+        warm_up_args = " ".join(warm_up_params)
+        ret, _, _ = ssh.exec_command(
+            "{0}/resources/tools/wrk/wrk_utils.sh {1}".
+            format(Constants.REMOTE_FW_DIR, warm_up_args), timeout=1800)
+        if int(ret) != 0:
+            raise RuntimeError('wrk runtime error.')
+        sleep(60)
+
     ret, stdout, _ = ssh.exec_command(
         "{0}/resources/tools/wrk/wrk_utils.sh {1}".
         format(Constants.REMOTE_FW_DIR, args), timeout=1800)
@@ -190,7 +214,7 @@ def run_wrk(tg_node, profile_name, tg_numa, test_type):
         log_msg += "Requests/sec: Avg / Stdev / Max  / +/- Stdev\n"
         for item in stats["rps-stats-lst"]:
             log_msg += "{0} / {1} / {2} / {3}\n".format(*item)
-        log_msg += "Total rps: {0}cps\n".format(stats["rps-sum"])
+        log_msg += "Total rps: {0}rps\n".format(stats["rps-sum"])
     elif test_type == "bw":
         log_msg += "Transfer/sec: {0}Bps".format(stats["bw-sum"])