X-Git-Url: https://gerrit.opnfv.org/gerrit/gitweb?a=blobdiff_plain;f=yardstick%2Fbenchmark%2Fscenarios%2Fnetworking%2Fping.py;h=ae21666875c6713da2dabe45a4349a6eaef9a9b1;hb=5cc6023d88bb6f57cc86957369f5f0516a466c8a;hp=aa1a500cfeeed01b34179f959b67ea97ea407d08;hpb=41dde94d0a4e575317c297e124ba0624e64c8552;p=yardstick.git diff --git a/yardstick/benchmark/scenarios/networking/ping.py b/yardstick/benchmark/scenarios/networking/ping.py index aa1a500cf..6caeab5ef 100644 --- a/yardstick/benchmark/scenarios/networking/ping.py +++ b/yardstick/benchmark/scenarios/networking/ping.py @@ -9,10 +9,13 @@ # ping scenario +from __future__ import print_function +from __future__ import absolute_import 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__) @@ -21,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 @@ -30,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): @@ -38,15 +45,10 @@ 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') - ip = host.get('ip', None) - key_filename = host.get('key_filename', '~/.ssh/id_rsa') - password = host.get('password', 'root') - LOG.info("user:%s, host:%s", user, ip) - self.connection = ssh.SSH(user, ip, key_filename=key_filename, - password=password) - self.connection.wait() + self.connection = ssh.SSH.from_node(host, defaults={"user": "ubuntu"}) + + self.connection.wait(timeout=600) def run(self, result): """execute the benchmark""" @@ -57,30 +59,60 @@ class Ping(base.Scenario): else: options = "" - destination = self.context_cfg['target'].get("ipaddr", '127.0.0.1') - - LOG.debug("ping '%s' '%s'", options, destination) - - exit_status, stdout, stderr = self.connection.execute( - "/bin/sh -s {0} {1}".format(destination, options), - stdin=open(self.target_script, "r")) - - if exit_status != 0: - raise RuntimeError(stderr) - - if stdout: - result["rtt"] = float(stdout) - - if "sla" in self.scenario_cfg: - sla_max_rtt = int(self.scenario_cfg["sla"]["max_rtt"]) - assert result["rtt"] <= sla_max_rtt, \ - "rtt %f > sla:max_rtt(%f); " % (result["rtt"], sla_max_rtt) - else: - LOG.error("ping '%s' '%s' timeout", options, destination) - - -def _test(): - '''internal test function''' + destination = self.context_cfg['target'].get('ipaddr', '127.0.0.1') + dest_list = [s.strip() for s in destination.split(',')] + + 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: + target_vm = self.scenario_cfg['targets'][pos] + else: + target_vm = self.scenario_cfg['target'] + + 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), + stdin=stdin_file) + + if exit_status != 0: + raise RuntimeError(stderr) + + if isinstance(target_vm, dict): + target_vm_name = target_vm.get("name") + else: + target_vm_name = target_vm.split('.')[0] + 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)) + self.verify_SLA(sla_max_rtt is None, + "packet dropped rtt %f > sla: max_rtt(%f)" + % (rtt_result[target_vm_name], sla_max_rtt)) + self.verify_SLA(False, + "packet dropped rtt %f" + % (rtt_result[target_vm_name])) + + +def _test(): # pragma: no cover + """internal test function""" key_filename = pkg_resources.resource_filename("yardstick.resources", "files/yardstick_key") ctx = { @@ -102,7 +134,8 @@ def _test(): p = Ping(args, ctx) p.run(result) - print result + print(result) + -if __name__ == '__main__': +if __name__ == '__main__': # pragma: no cover _test()