From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by dpdk.org (Postfix) with ESMTP id 68A141B7E2 for ; Wed, 6 Jun 2018 07:38:37 +0200 (CEST) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga008.jf.intel.com ([10.7.209.65]) by fmsmga101.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 05 Jun 2018 22:38:36 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.49,482,1520924400"; d="scan'208";a="47109266" Received: from shecgisg006.sh.intel.com ([10.239.39.68]) by orsmga008.jf.intel.com with ESMTP; 05 Jun 2018 22:38:35 -0700 Received: from shecgisg006.sh.intel.com (localhost [127.0.0.1]) by shecgisg006.sh.intel.com with ESMTP id w565cZG8026717; Wed, 6 Jun 2018 13:38:35 +0800 Received: (from yufengmx@localhost) by shecgisg006.sh.intel.com with œ id w565cZkx026713; Wed, 6 Jun 2018 13:38:35 +0800 From: yufengx.mo@intel.com To: dts@dpdk.org Cc: yufengmx Date: Wed, 6 Jun 2018 13:38:33 +0800 Message-Id: <1528263513-26500-7-git-send-email-yufengx.mo@intel.com> X-Mailer: git-send-email 1.7.0.7 In-Reply-To: <1528263513-26500-1-git-send-email-yufengx.mo@intel.com> References: <1528263513-26500-1-git-send-email-yufengx.mo@intel.com> Subject: [dts] [PATCH V1 6/6] pmd_bonded_8023ad: framework etgen/ixia X-BeenThere: dts@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: test suite reviews and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 06 Jun 2018 05:38:39 -0000 From: yufengmx extend ixia class to support continuous sending stream, app will stop it after app complete sample statistics data. Signed-off-by: yufengmx --- 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