X-Git-Url: https://gerrit.opnfv.org/gerrit/gitweb?a=blobdiff_plain;f=yardstick%2Fbenchmark%2Fscenarios%2Fnetworking%2Fping.py;h=d2081469751c9d53e2a0883d97d4abd6b553b4cf;hb=1025a5d703cec7a479f7644dc916dfa82a84ffaf;hp=a027c817ab83dc72c9ca8c766e53d660dd952280;hpb=f68ce570fd0eefb17bfc9e1e75c57b24050db89e;p=yardstick.git diff --git a/yardstick/benchmark/scenarios/networking/ping.py b/yardstick/benchmark/scenarios/networking/ping.py index a027c817a..d20814697 100644 --- a/yardstick/benchmark/scenarios/networking/ping.py +++ b/yardstick/benchmark/scenarios/networking/ping.py @@ -9,6 +9,8 @@ # ping scenario +from __future__ import print_function +from __future__ import absolute_import import pkg_resources import logging @@ -19,43 +21,111 @@ LOG = logging.getLogger(__name__) class Ping(base.Scenario): - """Executes a ping benchmark between two hosts""" + """Execute ping between two hosts + + Parameters + packetsize - number of data bytes to send + type: int + unit: bytes + default: 56 + """ + __scenario_type__ = "Ping" TARGET_SCRIPT = 'ping_benchmark.bash' - def __init__(self, context): - self.context = context + def __init__(self, scenario_cfg, context_cfg): + self.scenario_cfg = scenario_cfg + self.context_cfg = context_cfg self.target_script = pkg_resources.resource_filename( 'yardstick.benchmark.scenarios.networking', Ping.TARGET_SCRIPT) - user = self.context.get('user', 'ubuntu') - host = self.context.get('host', None) - key_filename = self.context.get('key_filename', '~/.ssh/id_rsa') - - LOG.debug("user:%s, host:%s", user, host) - - self.connection = ssh.SSH(user, host, key_filename=key_filename) - self.connection.wait() - - def run(self, args): + 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.wait(timeout=600) + + def run(self, result): """execute the benchmark""" - self.options = "-s %s" % args['options'].get("packetsize", '56') - self.ipaddr = args.get("ipaddr", '127.0.0.1') - - LOG.debug("ping %s %s", self.options, self.ipaddr) - - exit_status, stdout, stderr = self.connection.execute( - "/bin/sh -s {0} {1}".format(self.ipaddr, self.options), - stdin=open(self.target_script, "r")) - - if exit_status != 0: - raise RuntimeError(stderr) - - rtt = float(stdout) - - if "sla" in args: - sla_max_rtt = int(args["sla"]["max_rtt"]) - assert rtt <= sla_max_rtt, "rtt %f > sla_max_rtt" % rtt - - return rtt + if "options" in self.scenario_cfg: + options = "-s %s" % \ + self.scenario_cfg['options'].get("packetsize", '56') + else: + options = "" + + 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"] + + 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 stdout: + 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) + else: + LOG.error("ping '%s' '%s' timeout", options, target_vm) + + +def _test(): # pragma: no cover + """internal test function""" + key_filename = pkg_resources.resource_filename("yardstick.resources", + "files/yardstick_key") + ctx = { + "host": { + "ip": "10.229.47.137", + "user": "root", + "key_filename": key_filename + }, + "target": { + "ipaddr": "10.229.17.105", + } + } + + logger = logging.getLogger("yardstick") + logger.setLevel(logging.DEBUG) + + args = {} + result = {} + + p = Ping(args, ctx) + p.run(result) + print(result) + + +if __name__ == '__main__': # pragma: no cover + _test()