[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