summaryrefslogtreecommitdiffstats
path: root/vstf/vstf/agent/perf/qperf.py
diff options
context:
space:
mode:
Diffstat (limited to 'vstf/vstf/agent/perf/qperf.py')
-rwxr-xr-xvstf/vstf/agent/perf/qperf.py164
1 files changed, 164 insertions, 0 deletions
diff --git a/vstf/vstf/agent/perf/qperf.py b/vstf/vstf/agent/perf/qperf.py
new file mode 100755
index 00000000..3cb9eafd
--- /dev/null
+++ b/vstf/vstf/agent/perf/qperf.py
@@ -0,0 +1,164 @@
+#!/usr/bin/python
+# -*- coding: utf8 -*-
+# author:
+# date: 2015-09-15
+# see license for license details
+
+import subprocess
+import time
+import logging
+import vstf.common.decorator as deco
+from vstf.common import perfmark as mark
+from vstf.common.utils import kill_by_name, my_popen
+
+LOG = logging.getLogger(__name__)
+
+
+class Qperf(object):
+ def __init__(self):
+ self._send_processes = []
+ self._receive_processes = []
+
+ @deco.check("protocol", choices=['tcp_lat', 'udp_lat'])
+ @deco.check("namespace", defaults=None)
+ @deco.check("dst")
+ @deco.check("time", defaults=10)
+ @deco.check("size", defaults=64)
+ def send_start(self, **kwargs):
+ cmd = self.format_send_start(**kwargs)
+ LOG.info("cmd:%s", cmd)
+ process = my_popen(cmd.split(), stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+ time.sleep(0.5)
+ ret = process.poll()
+ if ret is None:
+ ret = 0
+ error_str = "start qperf send success"
+ self._send_processes.append(process)
+ else:
+ print ret
+ error_str = "start qperf send failed, %s" % (str(kwargs))
+ process.wait()
+
+ return ret, error_str
+
+ @deco.namespace()
+ def format_send_start(self, **kwargs):
+ cmd = "qperf %(dst_ip)s -t %(time)s -m %(pkt_size)s -vu %(type)s "
+ context = {
+ 'dst_ip': kwargs['dst'][0]['ip'],
+ 'type': kwargs['protocol'],
+ 'time': kwargs['time'],
+ 'pkt_size': kwargs['size'],
+ }
+ cmd = cmd % context
+ return cmd
+
+ def send_stop(self, **kwargs):
+ results = []
+ for process in self._send_processes:
+ process.wait()
+ read = process.stdout.read()
+ read = self._parse_data(read)
+ ret = 0
+ results.append((ret, read))
+ self._send_processes = []
+ return results
+
+ @deco.namespace()
+ def format_receive_start(self, **kwargs):
+ cmd = 'qperf'
+ return cmd
+
+ def receive_start(self, **kwargs):
+ cmd = self.format_receive_start(**kwargs)
+ LOG.info("cmd:%s", cmd)
+
+ process = my_popen(cmd.split(), stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+ time.sleep(0.5)
+ ret = process.poll()
+ if ret is None:
+ ret = 0
+ error_str = "start qperf receive success"
+ self._receive_processes.append(process)
+ else:
+ print ret
+ error_str = "start qperf receive failed, %s" % (str(kwargs))
+ process.wait()
+ raise Exception(error_str)
+ return ret, error_str
+
+ def receive_stop(self, **kwargs):
+ ret = 0
+ for process in self._receive_processes:
+ process.kill()
+ process.wait()
+ self._receive_processes = []
+ error_str = "stop qperf receive success"
+ return ret, error_str
+
+ def receive_kill(self):
+ kill_by_name('qperf')
+ self._receive_processes = []
+ return True
+
+ def clean(self):
+ for process in self._receive_processes:
+ process.kill()
+ process.wait()
+ LOG.info("process.kill(qperf daemon:%s)", process.pid)
+ for process in self._send_processes:
+ LOG.info("process.wait(qperf client:%s)", process.pid)
+ process.wait()
+ self._receive_processes = []
+ self._send_processes = []
+ return True
+
+ def force_clean(self):
+ LOG.info("%s %s start", self.__class__, self.force_clean.__name__)
+ kill_by_name('qperf')
+ self._send_processes = []
+ self._receive_processes = []
+ return True
+
+ def _parse_data(self, data):
+ LOG.info(data)
+ latency = 0
+ if data:
+ buf = data.splitlines()
+ if "latency" in buf[1]:
+ data = buf[1].strip().split()
+ if data[3] == "us":
+ latency = float(data[2]) / 1000
+ else:
+ latency = float(data[2]) / 1000
+ result = {
+ mark.minLatency: latency,
+ mark.avgLatency: latency,
+ mark.maxLatency: latency
+ }
+ return result
+
+
+def unit_test():
+ perf = Qperf()
+ perf.receive_start(namespace='receive')
+
+ send = {
+ "namespace": "send",
+ "protocol": "udp_lat",
+ "dst": [
+ {"ip": "192.168.1.102"}
+ ],
+ "size": 64,
+ }
+ print perf.send_start(**send)
+ time.sleep(10)
+ print perf.send_stop()
+ print perf.receive_stop()
+
+
+if __name__ == "__main__":
+ from vstf.common.log import setup_logging
+
+ setup_logging(level=logging.DEBUG, log_file="/var/log/vstf/vstf-qperf.log", clevel=logging.DEBUG)
+ unit_test()