Merge "move flatten dict key to common utils"
[yardstick.git] / yardstick / benchmark / scenarios / compute / cyclictest.py
index e8fc63c..998463e 100644 (file)
@@ -6,9 +6,16 @@
 # which accompanies this distribution, and is available at
 # http://www.apache.org/licenses/LICENSE-2.0
 ##############################################################################
-import pkg_resources
+from __future__ import absolute_import
+from __future__ import print_function
+
 import logging
-import json
+import os
+import re
+import time
+
+import pkg_resources
+from oslo_serialization import jsonutils
 
 import yardstick.ssh as ssh
 from yardstick.benchmark.scenarios import base
@@ -53,58 +60,128 @@ class Cyclictest(base.Scenario):
     __scenario_type__ = "Cyclictest"
 
     TARGET_SCRIPT = "cyclictest_benchmark.bash"
+    WORKSPACE = "/root/workspace/"
+    REBOOT_CMD_PATTERN = r";\s*reboot\b"
 
     def __init__(self, scenario_cfg, context_cfg):
         self.scenario_cfg = scenario_cfg
         self.context_cfg = context_cfg
         self.setup_done = False
 
-    def setup(self):
-        '''scenario setup'''
-        self.target_script = pkg_resources.resource_filename(
-            "yardstick.benchmark.scenarios.compute",
-            Cyclictest.TARGET_SCRIPT)
+    def _put_files(self, client):
+        setup_options = self.scenario_cfg["setup_options"]
+        rpm_dir = setup_options["rpm_dir"]
+        script_dir = setup_options["script_dir"]
+        image_dir = setup_options["image_dir"]
+        LOG.debug("Send RPMs from %s to workspace %s",
+                  rpm_dir, self.WORKSPACE)
+        client.put(rpm_dir, self.WORKSPACE, recursive=True)
+        LOG.debug("Send scripts from %s to workspace %s",
+                  script_dir, self.WORKSPACE)
+        client.put(script_dir, self.WORKSPACE, recursive=True)
+        LOG.debug("Send guest image from %s to workspace %s",
+                  image_dir, self.WORKSPACE)
+        client.put(image_dir, self.WORKSPACE, recursive=True)
+
+    def _connect_host(self):
+        host = self.context_cfg["host"]
+
+        self.host = ssh.SSH.from_node(host, defaults={"user": "root"})
+        self.host.wait(timeout=600)
+
+    def _connect_guest(self):
         host = self.context_cfg["host"]
-        user = host.get("user", "root")
-        ip = host.get("ip", None)
-        key_filename = host.get("key_filename", "~/.ssh/id_rsa")
+        # why port 5555?
+        self.guest = ssh.SSH.from_node(host,
+                                       defaults={
+                                           "user": "root", "ssh_port": 5555
+                                       })
+        self.guest.wait(timeout=600)
+
+    def _run_setup_cmd(self, client, cmd):
+        LOG.debug("Run cmd: %s", cmd)
+        status, stdout, stderr = client.execute(cmd)
+        if status:
+            if re.search(self.REBOOT_CMD_PATTERN, cmd):
+                LOG.debug("Error on reboot")
+            else:
+                raise RuntimeError(stderr)
+
+    def _run_host_setup_scripts(self, scripts):
+        setup_options = self.scenario_cfg["setup_options"]
+        script_dir = os.path.basename(setup_options["script_dir"])
 
-        LOG.debug("user:%s, host:%s", user, ip)
-        print "key_filename:" + key_filename
-        self.client = ssh.SSH(user, ip, key_filename=key_filename)
-        self.client.wait(timeout=600)
+        for script in scripts:
+            cmd = "cd %s/%s; export PATH=./:$PATH; %s" %\
+                  (self.WORKSPACE, script_dir, script)
+            self._run_setup_cmd(self.host, cmd)
+
+            if re.search(self.REBOOT_CMD_PATTERN, cmd):
+                time.sleep(3)
+                self._connect_host()
+
+    def _run_guest_setup_scripts(self, scripts):
+        setup_options = self.scenario_cfg["setup_options"]
+        script_dir = os.path.basename(setup_options["script_dir"])
+
+        for script in scripts:
+            cmd = "cd %s/%s; export PATH=./:$PATH; %s" %\
+                  (self.WORKSPACE, script_dir, script)
+            self._run_setup_cmd(self.guest, cmd)
+
+            if re.search(self.REBOOT_CMD_PATTERN, cmd):
+                time.sleep(3)
+                self._connect_guest()
+
+    def setup(self):
+        """scenario setup"""
+        setup_options = self.scenario_cfg["setup_options"]
+        host_setup_seqs = setup_options["host_setup_seqs"]
+        guest_setup_seqs = setup_options["guest_setup_seqs"]
+
+        self._connect_host()
+        self._put_files(self.host)
+        self._run_host_setup_scripts(host_setup_seqs)
+
+        self._connect_guest()
+        self._put_files(self.guest)
+        self._run_guest_setup_scripts(guest_setup_seqs)
 
         # copy script to host
-        self.client.run("cat > ~/cyclictest_benchmark.sh",
-                        stdin=open(self.target_script, "rb"))
+        self.target_script = pkg_resources.resource_filename(
+            "yardstick.benchmark.scenarios.compute",
+            Cyclictest.TARGET_SCRIPT)
+        self.guest._put_file_shell(
+            self.target_script, '~/cyclictest_benchmark.sh')
 
         self.setup_done = True
 
     def run(self, result):
         """execute the benchmark"""
-        default_args = "-m -n -q"
+        default_args = "-m -n -q --notrace"
 
         if not self.setup_done:
             self.setup()
 
         options = self.scenario_cfg["options"]
         affinity = options.get("affinity", 1)
+        breaktrace = options.get("breaktrace", 1000)
         interval = options.get("interval", 1000)
         priority = options.get("priority", 99)
         loops = options.get("loops", 1000)
         threads = options.get("threads", 1)
         histogram = options.get("histogram", 90)
 
-        cmd_args = "-a %s -i %s -p %s -l %s -t %s -h %s %s" \
-                   % (affinity, interval, priority, loops,
+        cmd_args = "-a %s -b %s -i %s -p %s -l %s -t %s -h %s %s" \
+                   % (affinity, breaktrace, interval, priority, loops,
                       threads, histogram, default_args)
-        cmd = "sudo bash cyclictest_benchmark.sh %s" % (cmd_args)
+        cmd = "bash cyclictest_benchmark.sh %s" % (cmd_args)
         LOG.debug("Executing command: %s", cmd)
-        status, stdout, stderr = self.client.execute(cmd)
+        status, stdout, stderr = self.guest.execute(cmd)
         if status:
             raise RuntimeError(stderr)
 
-        result.update(json.loads(stdout))
+        result.update(jsonutils.loads(stdout))
 
         if "sla" in self.scenario_cfg:
             sla_error = ""
@@ -121,8 +198,8 @@ class Cyclictest(base.Scenario):
             assert sla_error == "", sla_error
 
 
-def _test():
-    '''internal test function'''
+def _test():    # pragma: no cover
+    """internal test function"""
     key_filename = pkg_resources.resource_filename("yardstick.resources",
                                                    "files/yardstick_key")
     ctx = {
@@ -138,6 +215,7 @@ def _test():
 
     options = {
         "affinity": 2,
+        "breaktrace": 1000,
         "interval": 100,
         "priority": 88,
         "loops": 10000,
@@ -157,7 +235,8 @@ def _test():
 
     cyclictest = Cyclictest(args, ctx)
     cyclictest.run(result)
-    print result
+    print(result)
+
 
-if __name__ == '__main__':
+if __name__ == '__main__':    # pragma: no cover
     _test()