5 # see license for license details
10 import vstf.common.decorator as deco
11 from vstf.common import perfmark as mark
12 from vstf.common.utils import kill_by_name, my_popen
14 LOG = logging.getLogger(__name__)
19 self._send_processes = []
20 self._receive_processes = []
22 @deco.check("protocol", choices=['tcp_lat', 'udp_lat'])
23 @deco.check("namespace", defaults=None)
25 @deco.check("time", defaults=10)
26 @deco.check("size", defaults=64)
27 def send_start(self, **kwargs):
28 cmd = self.format_send_start(**kwargs)
29 LOG.info("cmd:%s", cmd)
30 process = my_popen(cmd.split(), stdout=subprocess.PIPE, stderr=subprocess.PIPE)
35 error_str = "start qperf send success"
36 self._send_processes.append(process)
39 error_str = "start qperf send failed, %s" % (str(kwargs))
45 def format_send_start(self, **kwargs):
46 cmd = "qperf %(dst_ip)s -t %(time)s -m %(pkt_size)s -vu %(type)s "
48 'dst_ip': kwargs['dst'][0]['ip'],
49 'type': kwargs['protocol'],
50 'time': kwargs['time'],
51 'pkt_size': kwargs['size'],
56 def send_stop(self, **kwargs):
58 for process in self._send_processes:
60 read = process.stdout.read()
61 read = self._parse_data(read)
63 results.append((ret, read))
64 self._send_processes = []
68 def format_receive_start(self, **kwargs):
72 def receive_start(self, **kwargs):
73 cmd = self.format_receive_start(**kwargs)
74 LOG.info("cmd:%s", cmd)
76 process = my_popen(cmd.split(), stdout=subprocess.PIPE, stderr=subprocess.PIPE)
81 error_str = "start qperf receive success"
82 self._receive_processes.append(process)
85 error_str = "start qperf receive failed, %s" % (str(kwargs))
87 raise Exception(error_str)
90 def receive_stop(self, **kwargs):
92 for process in self._receive_processes:
95 self._receive_processes = []
96 error_str = "stop qperf receive success"
99 def receive_kill(self):
100 kill_by_name('qperf')
101 self._receive_processes = []
105 for process in self._receive_processes:
108 LOG.info("process.kill(qperf daemon:%s)", process.pid)
109 for process in self._send_processes:
110 LOG.info("process.wait(qperf client:%s)", process.pid)
112 self._receive_processes = []
113 self._send_processes = []
116 def force_clean(self):
117 LOG.info("%s %s start", self.__class__, self.force_clean.__name__)
118 kill_by_name('qperf')
119 self._send_processes = []
120 self._receive_processes = []
123 def _parse_data(self, data):
127 buf = data.splitlines()
128 if "latency" in buf[1]:
129 data = buf[1].strip().split()
131 latency = float(data[2]) / 1000
133 latency = float(data[2]) / 1000
135 mark.minLatency: latency,
136 mark.avgLatency: latency,
137 mark.maxLatency: latency
144 perf.receive_start(namespace='receive')
148 "protocol": "udp_lat",
150 {"ip": "192.168.1.102"}
154 print perf.send_start(**send)
156 print perf.send_stop()
157 print perf.receive_stop()
160 if __name__ == "__main__":
161 from vstf.common.log import setup_logging
163 setup_logging(level=logging.DEBUG, log_file="/var/log/vstf/vstf-qperf.log", clevel=logging.DEBUG)