Ping: Fix TypeError without SLA in timeout scenario
[yardstick.git] / yardstick / benchmark / scenarios / networking / ping.py
index d208146..1c95102 100644 (file)
@@ -15,6 +15,7 @@ import pkg_resources
 import logging
 
 import yardstick.ssh as ssh
+from yardstick.common import utils
 from yardstick.benchmark.scenarios import base
 
 LOG = logging.getLogger(__name__)
@@ -23,6 +24,8 @@ LOG = logging.getLogger(__name__)
 class Ping(base.Scenario):
     """Execute ping between two hosts
 
+    If ping error, RTT will be set to 999999
+
   Parameters
     packetsize - number of data bytes to send
         type:    int
@@ -32,6 +35,8 @@ class Ping(base.Scenario):
 
     __scenario_type__ = "Ping"
 
+    PING_ERROR_RTT = 999999
+
     TARGET_SCRIPT = 'ping_benchmark.bash'
 
     def __init__(self, scenario_cfg, context_cfg):
@@ -40,22 +45,8 @@ class Ping(base.Scenario):
         self.target_script = pkg_resources.resource_filename(
             'yardstick.benchmark.scenarios.networking', Ping.TARGET_SCRIPT)
         host = self.context_cfg['host']
-        user = host.get('user', 'ubuntu')
-        ssh_port = host.get("ssh_port", ssh.DEFAULT_PORT)
-        ip = host.get('ip', None)
-        key_filename = host.get('key_filename', '/root/.ssh/id_rsa')
-        password = host.get('password', None)
-
-        if password is not None:
-            LOG.info("Log in via pw, user:%s, host:%s, pw:%s",
-                     user, ip, password)
-            self.connection = ssh.SSH(user, ip, password=password,
-                                      port=ssh_port)
-        else:
-            LOG.info("Log in via key, user:%s, host:%s, key_filename:%s",
-                     user, ip, key_filename)
-            self.connection = ssh.SSH(user, ip, key_filename=key_filename,
-                                      port=ssh_port)
+
+        self.connection = ssh.SSH.from_node(host, defaults={"user": "ubuntu"})
 
         self.connection.wait(timeout=600)
 
@@ -71,8 +62,9 @@ class Ping(base.Scenario):
         destination = self.context_cfg['target'].get('ipaddr', '127.0.0.1')
         dest_list = [s.strip() for s in destination.split(',')]
 
-        result["rtt"] = {}
-        rtt_result = result["rtt"]
+        rtt_result = {}
+        ping_result = {"rtt": rtt_result}
+        sla_max_rtt = self.scenario_cfg.get("sla", {}).get("max_rtt")
 
         for pos, dest in enumerate(dest_list):
             if 'targets' in self.scenario_cfg:
@@ -80,7 +72,7 @@ class Ping(base.Scenario):
             else:
                 target_vm = self.scenario_cfg['target']
 
-            LOG.debug("ping '%s' '%s'", options, dest)
+            LOG.debug("ping %s %s", options, dest)
             with open(self.target_script, "r") as stdin_file:
                 exit_status, stdout, stderr = self.connection.execute(
                     "/bin/sh -s {0} {1}".format(dest, options),
@@ -89,16 +81,36 @@ class Ping(base.Scenario):
             if exit_status != 0:
                 raise RuntimeError(stderr)
 
-            if stdout:
+            if isinstance(target_vm, dict):
+                target_vm_name = target_vm.get("name")
+            else:
                 target_vm_name = target_vm.split('.')[0]
-                rtt_result[target_vm_name] = float(stdout)
-                if "sla" in self.scenario_cfg:
-                    sla_max_rtt = int(self.scenario_cfg["sla"]["max_rtt"])
-                    assert rtt_result[target_vm_name] <= sla_max_rtt,\
-                        "rtt %f > sla: max_rtt(%f); " % \
-                        (rtt_result[target_vm_name], sla_max_rtt)
+            if stdout:
+                rtt_result[target_vm_name] = float(stdout.strip())
+                # store result before potential AssertionError
+                result.update(utils.flatten_dict_key(ping_result))
+                if sla_max_rtt is not None:
+                    sla_max_rtt = float(sla_max_rtt)
+                    self.verify_SLA(
+                        rtt_result[target_vm_name] <= sla_max_rtt,
+                        "rtt %f > sla: max_rtt(%f); "
+                        % (rtt_result[target_vm_name], sla_max_rtt))
             else:
                 LOG.error("ping '%s' '%s' timeout", options, target_vm)
+                # we need to specify a result to satisfy influxdb schema
+                # choose a very large number to inidcate timeout
+                # in this case choose an order of magnitude greater than the SLA
+                rtt_result[target_vm_name] = float(self.PING_ERROR_RTT)
+                # store result before potential AssertionError
+                result.update(utils.flatten_dict_key(ping_result))
+                if sla_max_rtt is not None:
+                    self.verify_SLA(rtt_result[target_vm_name] <= sla_max_rtt,
+                                    "packet dropped rtt %f > sla: max_rtt(%f)"
+                                    % (rtt_result[target_vm_name], sla_max_rtt))
+                else:
+                    self.verify_SLA(False,
+                                    "packet dropped rtt %f"
+                                    % (rtt_result[target_vm_name]))
 
 
 def _test():    # pragma: no cover