[dts] [PATCH V1 6/6] pmd_bonded_8023ad: framework etgen/ixia
yufengx.mo at intel.com
yufengx.mo at intel.com
Wed Jun 6 07:38:33 CEST 2018
From: yufengmx <yufengx.mo at intel.com>
extend ixia class to support continuous sending stream, app will stop it after
app complete sample statistics data.
Signed-off-by: yufengmx <yufengx.mo at intel.com>
---
framework/etgen.py | 125 +++++++++++++++++++++++++++++++++++++++++++++++++++-
framework/tester.py | 115 ++++++++++++++++++++++++++++++++++++++++++++++-
2 files changed, 238 insertions(+), 2 deletions(-)
mode change 100755 => 100644 framework/tester.py
diff --git a/framework/etgen.py b/framework/etgen.py
index 2856a28..96acf79 100644
--- a/framework/etgen.py
+++ b/framework/etgen.py
@@ -1,6 +1,6 @@
# BSD LICENSE
#
-# Copyright(c) 2010-2014 Intel Corporation. All rights reserved.
+# Copyright(c) 2010-2018 Intel Corporation. All rights reserved.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
@@ -168,6 +168,8 @@ class IxiaPacketGenerator(SSHConnection):
"""
def __init__(self, tester):
+ self.bpsRate, self.oversize, self.rate = 0, 0, 0
+ self.rxPortlist, self.txPortlist = None, None
self.tester = tester
self.NAME = 'ixia'
self.logger = getLogger(self.NAME)
@@ -442,6 +444,14 @@ class IxiaPacketGenerator(SSHConnection):
self.send_expect("ixLogout", "%")
self.send_expect("ixDisconnectTclServer %s" % self.tclServerIP, "%")
+ def clean_ownership(self):
+ self.send_expect("ixClearOwnership [list %s]" % string.join(
+ ['[list %d %d %d]' % (self.chasId, item['card'], item['port']) \
+ for item in self.ports], ' '), "% ", 10)
+ self.send_expect("ixTakeOwnership [list %s] force" % string.join(
+ ['[list %d %d %d]' % (self.chasId, item['card'], item['port']) \
+ for item in self.ports], ' '), "% ", 10)
+
def config_port(self, pList):
"""
Configure ports and make them ready for performance validation.
@@ -527,6 +537,43 @@ class IxiaPacketGenerator(SSHConnection):
return {'card': int(m.group(1)), 'port': int(m.group(2))}
+ def get_port_stats(self, rxPortlist, txPortlist, delay=5):
+ """
+ Get RX/TX packet statistics and calculate loss rate.
+ """
+ time.sleep(delay)
+
+ #self.send_expect("ixStopTransmit portList", "%", 10)
+ time.sleep(2)
+ sendNumber = 0
+ for port in txPortlist:
+ self.stat_get_stat_all_stats(port)
+ sendNumber += self.get_frames_sent()
+ time.sleep(0.5)
+
+ self.logger.info("send :%f" % sendNumber)
+
+ assert sendNumber != 0
+
+ revNumber = 0
+ for port in rxPortlist:
+ self.stat_get_stat_all_stats(port)
+ revNumber += self.get_frames_received()
+ self.logger.info("rev :%f" % revNumber)
+
+ return sendNumber, revNumber
+
+ def port_stats(self, portList, ratePercent, delay=5):
+ rxPortlist, txPortlist = self.rxPortlist, self.txPortlist
+ return self.get_port_stats(rxPortlist, txPortlist, delay)
+
+ def port_line_rate(self):
+ chasId = '1'
+ port_line_rate = []
+ for port in self.ports:
+ port_line_rate.append(self.get_line_rate(chasId, port))
+ return port_line_rate
+
def loss(self, portList, ratePercent, delay=5):
"""
Run loss performance test and return loss rate.
@@ -560,6 +607,39 @@ class IxiaPacketGenerator(SSHConnection):
return float(sendNumber - revNumber) / sendNumber, sendNumber, revNumber
+ def loop_latency(self, portList, ratePercent, delay=5):
+ """
+ Run latency performance test and return latency statistics.
+ """
+ rxPortlist, txPortlist = self._configure_everything(portList, ratePercent, True)
+ self.rxPortlist, self.txPortlist = rxPortlist, txPortlist
+ return True
+
+ def stop_latency(self, portList, ratePercent, delay=5):
+ """
+ Run latency performance test and return latency statistics.
+ """
+ return self.loop_get_packet_latency(self.rxPortlist)
+
+ def loop_get_packet_latency(self, rxPortlist):
+ """
+ Stop IXIA transmit and return latency statistics.
+ """
+ latencyList = []
+ time.sleep(10)
+
+ self.send_expect("ixStopTransmit portList", "%", 10)
+ for rx_port in rxPortlist:
+ self.pktGroup_get_stat_all_stats(rx_port)
+ latency = {"port": rx_port,
+ "stdDeviation": self.get_standard_deviation(),
+ "avgDeviation": self.get_average_deviation(),
+ "min": self.get_min_latency(),
+ "max": self.get_max_latency(),
+ "average": self.get_average_latency()}
+ latencyList.append(latency)
+ return latencyList
+
def latency(self, portList, ratePercent, delay=5):
"""
Run latency performance test and return latency statistics.
@@ -589,6 +669,21 @@ class IxiaPacketGenerator(SSHConnection):
"""
rxPortlist, txPortlist = self._configure_everything(port_list, rate_percent)
return self.get_transmission_results(rxPortlist, txPortlist, delay)
+
+ def loop_throughput(self, port_list, rate_percent=100, delay=5):
+ """
+ Run throughput performance test and return throughput statistics.
+ """
+ rxPortlist, txPortlist = self._configure_everything(port_list, rate_percent)
+ self.rxPortlist, self.txPortlist = rxPortlist, txPortlist
+ return True
+
+ def stop_loop_throughput(self, port_list, rate_percent=100, delay=5):
+ """
+ Run throughput performance test and return throughput statistics.
+ """
+
+ return self.stop_loop_transmission(self.rxPortlist, self.txPortlist, delay)
"""
This function could be used to check the packets' order whether same as the receive sequence.
@@ -686,6 +781,34 @@ class IxiaPacketGenerator(SSHConnection):
def hook_transmission_func(self):
pass
+ def loop_get_transmission_results(self, rx_port_list, tx_port_list, delay=5):
+ """
+ Override this method if you want to change the way of getting results
+ back from IXIA.
+ """
+ time.sleep(delay)
+ bpsRate = self.bpsRate
+ rate = self.rate
+ oversize = self.oversize
+ for port in rx_port_list:
+ self.stat_get_rate_stat_all_stats(port)
+ out = self.send_expect("stat cget -framesReceived", '%', 10)
+ rate += int(out.strip())
+ out = self.send_expect("stat cget -bitsReceived", '% ', 10)
+ self.logger.debug("port %d bits rate:" % (port) + out)
+ bpsRate += int(out.strip())
+ out = self.send_expect("stat cget -oversize", '%', 10)
+ oversize += int(out.strip())
+
+ self.logger.info("Rate: %f Mpps" % (rate * 1.0 / 1000000))
+ self.logger.info("Mbps rate: %f Mbps" % (bpsRate * 1.0 / 1000000))
+ self.hook_transmissoin_func()
+
+ return True
+
+ def stop_loop_transmission(self, rx_port_list, tx_port_list, delay=5):
+ return self.get_transmission_results(self.rxPortlist, self.txPortlist, delay)
+
def get_transmission_results(self, rx_port_list, tx_port_list, delay=5):
"""
Override this method if you want to change the way of getting results
diff --git a/framework/tester.py b/framework/tester.py
old mode 100755
new mode 100644
index a775f68..9b665ca
--- a/framework/tester.py
+++ b/framework/tester.py
@@ -1,6 +1,6 @@
# BSD LICENSE
#
-# Copyright(c) 2010-2014 Intel Corporation. All rights reserved.
+# Copyright(c) 2010-2018 Intel Corporation. All rights reserved.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
@@ -46,6 +46,9 @@ from utils import GREEN, convert_int2ip, convert_ip2int
from exception import ParameterInvalidException
from multiprocessing import Process
+from settings import SWITCH
+from switch import Switch
+from exception import SwitchException
class Tester(Crb):
@@ -79,6 +82,15 @@ class Tester(Crb):
self.ixia_packet_gen = IxiaPacketGenerator(self)
self.packet_gen = SoftwarePacketGenerator(self)
+ def init_switch(self):
+ '''
+ Create switch work scene.
+ '''
+ if self.it_uses_switch():
+ switch = Switch()
+ switch.init_scenes(self)
+ self.switch_scenes = switch.switch_grp
+
def set_re_run(self, re_run_time):
"""
set failed case re-run time
@@ -127,6 +139,30 @@ class Tester(Crb):
"""
return load_global_setting(PERF_SETTING) == 'yes' and self.has_external_traffic_generator()
+ def get_switch_crb(self):
+ """
+ Return SWITCH object.
+ """
+ return self.crb[SWITCH]
+
+ def has_switch(self):
+ """
+ Check whether test will base on switch equipment.
+ """
+ try:
+ if self.crb[SWITCH] is not None:
+ return True
+ except Exception as e:
+ return False
+
+ return False
+
+ def it_uses_switch(self):
+ """
+ Check whether switch is ready for test.
+ """
+ return self.has_switch()
+
def tester_prerequisites(self):
"""
Prerequest function should be called before execute any test case.
@@ -201,6 +237,15 @@ class Tester(Crb):
if self.ports_info[localPort]['type'] == 'ixia':
return "00:00:00:00:00:01"
+ # switch
+ elif self.ports_info[localPort]['type'] == 'switch':
+ for name, sw_obj in self.switch_scenes.iteritems():
+ if localPort in sw_obj.ports():
+ mac = sw_obj.get_mac(localPort)
+ return mac
+ else:
+ msg_fmt = "local port {0} is not in any switch scene".format
+ raise SwitchException(msg_fmt(localPort))
else:
return self.ports_info[localPort]['mac']
@@ -294,6 +339,9 @@ class Tester(Crb):
self.scan_ports_uncached()
if self.it_uses_external_generator():
self.ports_info.extend(self.ixia_packet_gen.get_ports())
+ if self.it_uses_switch():
+ for name, sw_obj in self.switch_scenes.iteritems():
+ self.ports_info.extend(sw_obj.get_ports())
self.save_serializer_ports()
for port_info in self.ports_info:
@@ -306,6 +354,8 @@ class Tester(Crb):
for port_info in self.ports_info:
if port_info['type'] == 'ixia':
continue
+ if port_info['type'] == 'switch':
+ continue
addr_array = port_info['pci'].split(':')
domain_id = addr_array[0]
@@ -394,6 +444,10 @@ class Tester(Crb):
"""
if self.ports_info[localPort]['type'] == 'ixia':
return self.ixia_packet_gen.send_ping6(self.ports_info[localPort]['pci'], mac, ipv6)
+ elif self.ports_info[localPort]['type'] == 'switch':
+ for name, sw_obj in self.switch_scenes.iteritems():
+ if localPort in sw_obj.ports():
+ return 'empty'
else:
return self.send_expect("ping6 -w 5 -c 5 -A %s%%%s" % (ipv6, self.ports_info[localPort]['intf']), "# ", 10)
@@ -426,6 +480,9 @@ class Tester(Crb):
if ftype == 'ixia' and dtype != ftype:
return False
+ if ftype == 'switch' and dtype != ftype:
+ return False
+
return True
def scapy_append(self, cmd):
@@ -502,6 +559,24 @@ class Tester(Crb):
return None
return self.packet_gen.throughput(portList, rate_percent)
+ def loop_traffic_generator_throughput(self, portList, rate_percent=100, delay=5):
+ """
+ Run throughput performance test on specified ports.
+ """
+ if self.check_port_list(portList, 'ixia'):
+ return self.ixia_packet_gen.loop_throughput(portList, rate_percent, delay)
+ if not self.check_port_list(portList):
+ self.logger.warning("exception by mixed port types")
+ return None
+ result = self.packet_gen.loop_throughput(portList, rate_percent)
+ return result
+
+ def stop_traffic_generator_throughput_loop(self, portList, rate_percent=100, delay=5):
+ """
+ Run throughput performance test on specified ports.
+ """
+ return self.ixia_packet_gen.stop_loop_throughput(portList, rate_percent, delay)
+
def verify_packet_order(self, portList, delay):
if self.check_port_list(portList, 'ixia'):
return self.ixia_packet_gen.is_packet_ordered(portList, delay)
@@ -536,6 +611,41 @@ class Tester(Crb):
return None
return self.packet_gen.loss(portList, ratePercent, delay)
+ def traffic_get_port_stats(self, portList, delay=60):
+ """
+ Run loss performance test on specified ports.
+ """
+ ratePercent = float(100)
+ if self.check_port_list(portList, 'ixia'):
+ return self.ixia_packet_gen.port_stats(portList, ratePercent, delay)
+ elif not self.check_port_list(portList):
+ self.logger.warning("exception by mixed port types")
+ return None
+ else:
+ return None
+
+ def get_port_line_rate(self):
+ return self.ixia_packet_gen.port_line_rate()
+
+ def loop_traffic_generator_latency(self, portList, ratePercent=100, delay=5):
+ """
+ Run latency performance test on specified ports.
+ """
+ if self.check_port_list(portList, 'ixia'):
+ return self.ixia_packet_gen.loop_latency(portList, ratePercent, delay)
+ else:
+ return None
+
+ def stop_traffic_generator_latency(self, portList, ratePercent=100, delay=5):
+ """
+ Run latency performance test on specified ports.
+ """
+ if self.check_port_list(portList, 'ixia'):
+ return self.ixia_packet_gen.stop_latency(portList, ratePercent, delay)
+ else:
+ return None
+
+
def traffic_generator_latency(self, portList, ratePercent=100, delay=5):
"""
Run latency performance test on specified ports.
@@ -725,6 +835,9 @@ class Tester(Crb):
self.alt_session = None
if self.it_uses_external_generator():
self.ixia_packet_gen.close()
+ if self.it_uses_switch():
+ for name, sw_obj in self.switch_scenes.iteritems():
+ sw_obj.close()
def crb_exit(self):
"""
--
1.9.3
More information about the dts
mailing list