5 # see license for license details
8 import vstf.common.constants as cst
9 import vstf.common.decorator as deco
10 from vstf.common import perfmark as mark
11 from vstf.common.utils import kill_by_name, my_popen
15 LOG = logging.getLogger(__name__)
18 class Netperf(object):
20 self._send_processes = []
23 "tcp_lat": "TCP_STREAM",
24 "tcp_bw": "TCP_STREAM",
25 "udp_lat": "UDP_STREAM",
26 "udp_bw": "UDP_STREAM",
29 @deco.check("protocol", choices=cst.PROTOCOLS)
30 @deco.check("namespace", defaults=None)
32 @deco.check("time", defaults=0)
33 @deco.check("size", defaults=64)
34 @deco.check("threads", defaults=1)
35 def send_start(self, **kwargs):
36 threads = kwargs.pop('threads')
37 kwargs['buf'] = cst.SOCKET_BUF
38 if kwargs['protocol'] in ['tcp_lat', 'udp_lat']:
43 cmd = self.format_send_start(**kwargs)
44 LOG.info("cmd:%s", cmd)
46 for _ in range(threads):
47 process = my_popen(cmd.split(), stdout=subprocess.PIPE, stderr=subprocess.PIPE)
48 self._send_processes.append(process)
50 for process in self._send_processes:
54 error_str = "start netperf send success"
56 error_str = "start netperf send failed, %s" % (str(kwargs))
58 self._send_processes.remove(process)
62 def send_stop(self, **kwargs):
66 for process in self._send_processes:
71 read = "process is stopped by killed"
74 read = process.stdout.read()
75 read = self._parse_data(read)
76 results.append((ret, read))
77 self._send_processes = []
82 def _parse_data(data):
83 buf = data.splitlines()
84 data = buf[2].strip().split(',')
86 mark.minLatency: float(data[0]),
87 mark.avgLatency: float(data[1]),
88 mark.maxLatency: float(data[2])
93 def format_send_start(self, **kwargs):
94 # cmd = "netperf -H %(dst_ip)s -t %(type)s -l %(time)s -- -m %(pkt_size)s "
95 cmd = "netperf -H %(dst_ip)s -t %(type)s -l %(time)s " \
96 "-- -m %(pkt_size)s -s %(buf)s -S %(buf)s -o MIN_LATENCY,MEAN_LATENCY,MAX_LATENCY"
98 'dst_ip': kwargs['dst'][0]['ip'],
99 'type': self._typemap[kwargs['protocol']],
100 'time': kwargs['time'],
101 'pkt_size': kwargs['size'],
102 'buf': kwargs['buf'],
108 def format_receive_start(self, **kwargs):
112 @deco.check("namespace")
113 def receive_start(self, **kwargs):
115 cmd = self.format_receive_start(**kwargs)
116 LOG.info("cmd:%s", cmd)
118 process = my_popen(cmd.split(), stdout=subprocess.PIPE, stderr=subprocess.PIPE)
122 error_str = "start netserver failed, %s" % (str(kwargs))
125 error_str = "start netserver success"
127 return ret, error_str
129 def receive_stop(self, **kwargs):
130 LOG.info("receive_stop")
132 kill_by_name('netserver')
134 error_str = "stop netserver success"
135 return ret, error_str
142 def force_clean(self):
143 LOG.info("%s %s start", self.__class__, self.force_clean.__name__)
144 kill_by_name('netserver')
145 kill_by_name('netperf')
146 self._send_processes = []
147 self._receive_processes = []
153 ret = perf.receive_start(namespace='receive')
154 print "*********receive_start***********"
158 "protocol": "udp_lat",
160 {"ip": "192.168.1.102"}
166 print perf.send_start(**send)
167 print perf._send_processes
169 print perf.send_stop()
170 print perf.receive_stop()
173 if __name__ == "__main__":
174 from vstf.common.log import setup_logging
176 setup_logging(level=logging.DEBUG, log_file="/var/log/vstf/vstf-netperf.log", clevel=logging.DEBUG)