From 138686f389fe48139ddc4a57ac5de363e71b38e7 Mon Sep 17 00:00:00 2001 From: Yaroslav Brustinov Date: Tue, 13 Sep 2016 17:30:14 +0300 Subject: dpdk Python scripts small fixes ensure log dir exists for trex daemon regression: add trex24 setup Sphinx docs remove "capture" tag for compatibility with 1.2 version --- .../regression/setups/trex24/benchmark.yaml | 155 +++++++++++++++++++++ .../regression/setups/trex24/config.yaml | 39 ++++++ scripts/automation/regression/trex_unit_test.py | 16 ++- .../trex_control_plane/doc_stl/api/client_code.rst | 12 +- .../doc_stl/api/field_engine.rst | 6 +- .../doc_stl/api/profile_code.rst | 6 +- .../trex_control_plane/server/CCustomLogger.py | 1 + .../stl/trex_stl_lib/trex_stl_client.py | 2 +- .../trex_stl_lib/trex_stl_packet_builder_scapy.py | 53 +++---- .../stl/trex_stl_lib/trex_stl_streams.py | 40 +++--- scripts/dpdk_nic_bind.py | 4 +- scripts/dpdk_setup_ports.py | 2 +- scripts/ko/4.4.0-36-generic/igb_uio.ko | Bin 0 -> 17320 bytes 13 files changed, 277 insertions(+), 59 deletions(-) create mode 100644 scripts/automation/regression/setups/trex24/benchmark.yaml create mode 100644 scripts/automation/regression/setups/trex24/config.yaml create mode 100644 scripts/ko/4.4.0-36-generic/igb_uio.ko (limited to 'scripts') diff --git a/scripts/automation/regression/setups/trex24/benchmark.yaml b/scripts/automation/regression/setups/trex24/benchmark.yaml new file mode 100644 index 00000000..96d27981 --- /dev/null +++ b/scripts/automation/regression/setups/trex24/benchmark.yaml @@ -0,0 +1,155 @@ +############################################################### +#### TRex benchmark configuration file #### +############################################################### + +### stateful ### + +test_jumbo: + multiplier : 2.8 + cores : 1 + bw_per_core : 67.030 + + +test_routing_imix: + multiplier : 1 + cores : 1 + bw_per_core : 3.979 + + +test_routing_imix_64: + multiplier : 50 + cores : 1 + bw_per_core : .681 + + +test_static_routing_imix_asymmetric: + multiplier : 0.8 + cores : 1 + bw_per_core : 13.742 + + + +### stateless ### + +test_CPU_benchmark: + profiles: + - name : stl/udp_for_benchmarks.py + kwargs : {packet_len: 64} + cpu_util : 1 + bw_per_core : 1 + + - name : stl/udp_for_benchmarks.py + kwargs : {packet_len: 64, stream_count: 10} + cpu_util : 1 + bw_per_core : 1 + + - name : stl/udp_for_benchmarks.py + kwargs : {packet_len: 64, stream_count: 100} + cpu_util : 1 + bw_per_core : 1 + +# causes queue full +# - name : stl/udp_for_benchmarks.py +# kwargs : {packet_len: 64, stream_count: 1000} +# cpu_util : 1 +# bw_per_core : 1 + + - name : stl/udp_for_benchmarks.py + kwargs : {packet_len: 128} + cpu_util : 1 + bw_per_core : 1 + + - name : stl/udp_for_benchmarks.py + kwargs : {packet_len: 256} + cpu_util : 1 + bw_per_core : 1 + + - name : stl/udp_for_benchmarks.py + kwargs : {packet_len: 512} + cpu_util : 1 + bw_per_core : 1 + + - name : stl/udp_for_benchmarks.py + kwargs : {packet_len: 1500} + cpu_util : 1 + bw_per_core : 1 + + - name : stl/udp_for_benchmarks.py + kwargs : {packet_len: 4000} + cpu_util : 1 + bw_per_core : 1 + + - name : stl/udp_for_benchmarks.py + kwargs : {packet_len: 9000} + cpu_util : 1 + bw_per_core : 1 + + - name : stl/udp_for_benchmarks.py + kwargs : {packet_len: 9000, stream_count: 10} + cpu_util : 1 + bw_per_core : 1 + + - name : stl/udp_for_benchmarks.py + kwargs : {packet_len: 9000, stream_count: 100} + cpu_util : 1 + bw_per_core : 1 + +# not enough memory + queue full if memory increase +# - name : stl/udp_for_benchmarks.py +# kwargs : {packet_len: 9000, stream_count: 1000} +# cpu_util : 1 +# bw_per_core : 1 + + - name : stl/imix.py + cpu_util : 1 + bw_per_core : 1 + + - name : stl/udp_1pkt_tuple_gen.py + kwargs : {packet_len: 64} + cpu_util : 1 + bw_per_core : 1 + + - name : stl/udp_1pkt_tuple_gen.py + kwargs : {packet_len: 128} + cpu_util : 1 + bw_per_core : 1 + + - name : stl/udp_1pkt_tuple_gen.py + kwargs : {packet_len: 256} + cpu_util : 1 + bw_per_core : 1 + + - name : stl/udp_1pkt_tuple_gen.py + kwargs : {packet_len: 512} + cpu_util : 1 + bw_per_core : 1 + + - name : stl/udp_1pkt_tuple_gen.py + kwargs : {packet_len: 1500} + cpu_util : 1 + bw_per_core : 1 + + - name : stl/udp_1pkt_tuple_gen.py + kwargs : {packet_len: 4000} + cpu_util : 1 + bw_per_core : 1 + + - name : stl/udp_1pkt_tuple_gen.py + kwargs : {packet_len: 9000} + cpu_util : 1 + bw_per_core : 1 + + - name : stl/pcap.py + kwargs : {ipg_usec: 2, loop_count: 0} + cpu_util : 1 + bw_per_core : 1 + + - name : stl/udp_rand_len_9k.py + cpu_util : 1 + bw_per_core : 1 + + - name : stl/hlt/hlt_udp_rand_len_9k.py + cpu_util : 1 + bw_per_core : 1 + + diff --git a/scripts/automation/regression/setups/trex24/config.yaml b/scripts/automation/regression/setups/trex24/config.yaml new file mode 100644 index 00000000..f4eecdf9 --- /dev/null +++ b/scripts/automation/regression/setups/trex24/config.yaml @@ -0,0 +1,39 @@ +################################################################ +#### TRex nightly test configuration file #### +################################################################ + + +### TRex configuration: +# hostname - can be DNS name or IP for the TRex machine for ssh to the box +# is_dual - should the TRex inject with -p ? +# version_path - path to the TRex version and executable +# cores - how many cores should be used +# latency - rate of latency packets injected by the TRex +# modes - list of modes (tagging) of this setup (loopback, virtual etc.) +# * loopback - Trex works via loopback. Router and TFTP configurations may be skipped. +# * VM - Virtual OS (accept low CPU utilization in tests, latency can get spikes) +# * virt_nics - NICs are virtual (VMXNET3 etc.) + +### Router configuration: +# hostname - the router hostname as apears in ______# cli prefix +# ip_address - the router's ip that can be used to communicate with +# image - the desired imaged wished to be loaded as the router's running config +# line_password - router password when access via Telent +# en_password - router password when changing to "enable" mode +# interfaces - an array of client-server pairs, representing the interfaces configurations of the router +# configurations - an array of configurations that could possibly loaded into the router during the test. +# The "clean" configuration is a mandatory configuration the router will load with to run the basic test bench + +### TFTP configuration: +# hostname - the tftp hostname +# ip_address - the tftp's ip address +# images_path - the tftp's relative path in which the router's images are located + +### Test_misc configuration: +# expected_bw - the "golden" bandwidth (in Gbps) results planned on receiving from the test + +trex: + hostname : csi-trex-24 + cores : 1 + modes : [VM, virt_nics, loopback] + diff --git a/scripts/automation/regression/trex_unit_test.py b/scripts/automation/regression/trex_unit_test.py index 4f13a50f..7c2e317b 100755 --- a/scripts/automation/regression/trex_unit_test.py +++ b/scripts/automation/regression/trex_unit_test.py @@ -224,9 +224,13 @@ class CTRexTestConfiguringPlugin(Plugin): def begin (self): - if self.pkg and self.kill_running and not CTRexScenario.is_copied: + client = CTRexScenario.trex + if self.pkg and not CTRexScenario.is_copied: + if client.master_daemon.is_trex_daemon_running() and client.get_trex_cmds() and not self.kill_running: + print("Can't update TRex, it's running") + sys.exit(-1) print('Updating TRex to %s' % self.pkg) - if not CTRexScenario.trex.master_daemon.update_trex(self.pkg): + if not client.master_daemon.update_trex(self.pkg): print('Failed updating TRex') sys.exit(-1) else: @@ -236,16 +240,16 @@ class CTRexTestConfiguringPlugin(Plugin): return if not self.no_daemon: print('Restarting TRex daemon server') - res = CTRexScenario.trex.restart_trex_daemon() + res = client.restart_trex_daemon() if not res: print('Could not restart TRex daemon server') sys.exit(-1) print('Restarted.') if self.kill_running: - CTRexScenario.trex.kill_all_trexes() + client.kill_all_trexes() else: - if CTRexScenario.trex.get_trex_cmds(): + if client.get_trex_cmds(): print('TRex is already running') sys.exit(-1) @@ -254,7 +258,7 @@ class CTRexTestConfiguringPlugin(Plugin): if 'virt_nics' in self.modes and cores > 1: raise Exception('Number of cores should be 1 with virtual NICs') if not self.no_daemon: - CTRexScenario.trex.start_stateless(c = cores) + client.start_stateless(c = cores) CTRexScenario.stl_trex = STLClient(username = 'TRexRegression', server = self.configuration.trex['trex_name'], verbose_level = self.json_verbose) diff --git a/scripts/automation/trex_control_plane/doc_stl/api/client_code.rst b/scripts/automation/trex_control_plane/doc_stl/api/client_code.rst index 08720e8d..953c5c84 100755 --- a/scripts/automation/trex_control_plane/doc_stl/api/client_code.rst +++ b/scripts/automation/trex_control_plane/doc_stl/api/client_code.rst @@ -69,7 +69,8 @@ STLClient snippet .. code-block:: python - :caption: Example 1: Minimal example of client interacting with the TRex server + + # Example 1: Minimal example of client interacting with the TRex server c = STLClient() @@ -102,7 +103,8 @@ STLClient snippet .. code-block:: python - :caption: Example 2: Client can execute other functions while the TRex server is generating traffic + + # Example 2: Client can execute other functions while the TRex server is generating traffic c = STLClient() @@ -128,7 +130,8 @@ STLClient snippet .. code-block:: python - :caption: Example 3: Console-like API interface + + # Example 3: Console-like API interface def simple (): @@ -224,7 +227,8 @@ Example 4: Load profile from a file:: .. code-block:: python - :caption: Example 5: pin cores to ports + + # Example 5: pin cores to ports c = STLClient() diff --git a/scripts/automation/trex_control_plane/doc_stl/api/field_engine.rst b/scripts/automation/trex_control_plane/doc_stl/api/field_engine.rst index d4f95170..39afa38b 100755 --- a/scripts/automation/trex_control_plane/doc_stl/api/field_engine.rst +++ b/scripts/automation/trex_control_plane/doc_stl/api/field_engine.rst @@ -153,7 +153,8 @@ Field Engine snippet -------------------- .. code-block:: python - :caption: FE Example1 + + # FE Example1 base_pkt = Ether()/IP(src="16.0.0.1",dst="48.0.0.1")/UDP(dport=12,sport=1025) @@ -177,7 +178,8 @@ Field Engine snippet .. code-block:: python - :caption: FE Example2 + + # FE Example2 #range of source mac-addr diff --git a/scripts/automation/trex_control_plane/doc_stl/api/profile_code.rst b/scripts/automation/trex_control_plane/doc_stl/api/profile_code.rst index 335105f1..8a0d7a2a 100755 --- a/scripts/automation/trex_control_plane/doc_stl/api/profile_code.rst +++ b/scripts/automation/trex_control_plane/doc_stl/api/profile_code.rst @@ -88,7 +88,8 @@ STLProfile snippet .. code-block:: python - :caption: STLProfile Example1 + + # STLProfile Example1 size = self.fsize - 4; # no FCS @@ -119,7 +120,8 @@ STLProfile snippet .. code-block:: python - :caption: STLProfile Example2 + + # STLProfile Example2 class STLS1(object): diff --git a/scripts/automation/trex_control_plane/server/CCustomLogger.py b/scripts/automation/trex_control_plane/server/CCustomLogger.py index 6d3974a6..fd9a32ad 100755 --- a/scripts/automation/trex_control_plane/server/CCustomLogger.py +++ b/scripts/automation/trex_control_plane/server/CCustomLogger.py @@ -10,6 +10,7 @@ def prepare_dir(log_path): def setup_custom_logger(name, log_path = None): # first make sure path availabe + prepare_dir(log_path) logging.basicConfig(level = logging.INFO, format = '%(asctime)s %(name)-10s %(module)-20s %(levelname)-8s %(message)s', datefmt = '%m-%d %H:%M') diff --git a/scripts/automation/trex_control_plane/stl/trex_stl_lib/trex_stl_client.py b/scripts/automation/trex_control_plane/stl/trex_stl_lib/trex_stl_client.py index fc49bf77..3fe31d4d 100755 --- a/scripts/automation/trex_control_plane/stl/trex_stl_lib/trex_stl_client.py +++ b/scripts/automation/trex_control_plane/stl/trex_stl_lib/trex_stl_client.py @@ -482,8 +482,8 @@ class STLClient(object): the ASYNC port .. code-block:: python - :caption: Example + # Example # connect to local TRex server c = STLClient() diff --git a/scripts/automation/trex_control_plane/stl/trex_stl_lib/trex_stl_packet_builder_scapy.py b/scripts/automation/trex_control_plane/stl/trex_stl_lib/trex_stl_packet_builder_scapy.py index e12efaf9..b97cc5f8 100755 --- a/scripts/automation/trex_control_plane/stl/trex_stl_lib/trex_stl_packet_builder_scapy.py +++ b/scripts/automation/trex_control_plane/stl/trex_stl_lib/trex_stl_packet_builder_scapy.py @@ -202,8 +202,8 @@ class STLScVmRaw(CTRexScriptsBase): The following example splits the generated traffic by "ip_src" variable. .. code-block:: python - :caption: Split by + # Split by # TCP SYN base_pkt = Ether()/IP(dst="48.0.0.1")/TCP(dport=80,flags="S") @@ -612,8 +612,8 @@ class STLVmFlowVar(CTRexVmDescBase): Possible values: "inc", "dec", "random" .. code-block:: python - :caption: Example1 + # Example1 # input STLVmFlowVar(min_value=0, max_value=3, size=1,op="inc") @@ -676,7 +676,8 @@ class STLVmFixIpv4(CTRexVmDescBase): in could be string in case of scapy packet. format IP[:[id]] .. code-block:: python - :caption: Example2 + + # Example2 pkt = Ether()/IP(src="16.0.0.1",dst="48.0.0.1")/UDP(dport=12,sport=1025) @@ -729,7 +730,8 @@ class STLVmWrFlowVar(CTRexVmDescBase): How to write the variable to the the packet. True=big-endian, False=little-endian .. code-block:: python - :caption: Example3 + + # Example3 pkt = Ether()/IP(src="16.0.0.1",dst="48.0.0.1")/UDP(dport=12,sport=1025) @@ -1036,7 +1038,8 @@ class STLVmTupleGen(CTRexVmDescBase): ="0.0.0.10", port_min=1025, port_max=65535, limit_flows=100000, flags=0 .. code-block:: python - :caption: Example5 + + # Example5 def create_stream (self): # pkt @@ -1113,35 +1116,35 @@ class STLPktBuilder(CTrexPktBuilderInterface): .. code-block:: python - :caption: Example6 - - # packet is scapy - STLPktBuilder( pkt = Ether()/IP(src="16.0.0.1",dst="48.0.0.1")/UDP(dport=12,sport=1025)/(10*'x') ) + # Example6 + + # packet is scapy + STLPktBuilder( pkt = Ether()/IP(src="16.0.0.1",dst="48.0.0.1")/UDP(dport=12,sport=1025)/(10*'x') ) - # packet is taken from pcap file relative to python - STLPktBuilder( pkt ="stl/yaml/udp_64B_no_crc.pcap") + # packet is taken from pcap file relative to python + STLPktBuilder( pkt ="stl/yaml/udp_64B_no_crc.pcap") - # packet is taken from pcap file relative to profile file - STLPktBuilder( pkt ="stl/yaml/udp_64B_no_crc.pcap", - path_relative_to_profile = True ) + # packet is taken from pcap file relative to profile file + STLPktBuilder( pkt ="stl/yaml/udp_64B_no_crc.pcap", + path_relative_to_profile = True ) - vm = STLScVmRaw( [ STLVmTupleGen ( ip_min="16.0.0.1", ip_max="16.0.0.2", - port_min=1025, port_max=65535, - name="tuple"), # define tuple gen + vm = STLScVmRaw( [ STLVmTupleGen ( ip_min="16.0.0.1", ip_max="16.0.0.2", + port_min=1025, port_max=65535, + name="tuple"), # define tuple gen - STLVmWrFlowVar (fv_name="tuple.ip", pkt_offset= "IP.src" ), # write ip to packet IP.src - STLVmFixIpv4(offset = "IP"), # fix checksum - STLVmWrFlowVar (fv_name="tuple.port", pkt_offset= "UDP.sport" ) #write udp.port - ] - ) + STLVmWrFlowVar (fv_name="tuple.ip", pkt_offset= "IP.src" ), # write ip to packet IP.src + STLVmFixIpv4(offset = "IP"), # fix checksum + STLVmWrFlowVar (fv_name="tuple.port", pkt_offset= "UDP.sport" ) #write udp.port + ] + ) - base_pkt = Ether()/IP(src="16.0.0.1",dst="48.0.0.1")/UDP(dport=12,sport=1025) - pad = max(0, size - len(base_pkt)) * 'x' + base_pkt = Ether()/IP(src="16.0.0.1",dst="48.0.0.1")/UDP(dport=12,sport=1025) + pad = max(0, size - len(base_pkt)) * 'x' - STLPktBuilder(pkt = base_pkt/pad, vm= vm) + STLPktBuilder(pkt = base_pkt/pad, vm= vm) :parameters: diff --git a/scripts/automation/trex_control_plane/stl/trex_stl_lib/trex_stl_streams.py b/scripts/automation/trex_control_plane/stl/trex_stl_lib/trex_stl_streams.py index 50751111..bfcf063a 100755 --- a/scripts/automation/trex_control_plane/stl/trex_stl_lib/trex_stl_streams.py +++ b/scripts/automation/trex_control_plane/stl/trex_stl_lib/trex_stl_streams.py @@ -41,15 +41,16 @@ class STLTXMode(object): Link interface percent (0-100). Example: 10 is 10% of the port link setup .. code-block:: python - :caption: STLTXMode Example - mode = STLTXCont(pps = 10) + # STLTXMode Example - mode = STLTXCont(bps_L1 = 10000000) #10mbps L1 + mode = STLTXCont(pps = 10) - mode = STLTXCont(bps_L2 = 10000000) #10mbps L2 + mode = STLTXCont(bps_L1 = 10000000) #10mbps L1 - mode = STLTXCont(percentage = 10) #10% + mode = STLTXCont(bps_L2 = 10000000) #10mbps L2 + + mode = STLTXCont(percentage = 10) #10% """ @@ -106,9 +107,10 @@ class STLTXCont(STLTXMode): see :class:`trex_stl_lib.trex_stl_streams.STLTXMode` for rate .. code-block:: python - :caption: STLTXCont Example - mode = STLTXCont(pps = 10) + # STLTXCont Example + + mode = STLTXCont(pps = 10) """ super(STLTXCont, self).__init__(**kwargs) @@ -135,9 +137,10 @@ class STLTXSingleBurst(STLTXMode): see :class:`trex_stl_lib.trex_stl_streams.STLTXMode` for rate .. code-block:: python - :caption: STLTXSingleBurst Example - mode = STLTXSingleBurst( pps = 10, total_pkts = 1) + # STLTXSingleBurst Example + + mode = STLTXSingleBurst( pps = 10, total_pkts = 1) """ @@ -180,9 +183,10 @@ class STLTXMultiBurst(STLTXMode): see :class:`trex_stl_lib.trex_stl_streams.STLTXMode` for rate .. code-block:: python - :caption: STLTXMultiBurst Example - mode = STLTXMultiBurst(pps = 10, pkts_per_burst = 1,count 10, ibg=10.0) + # STLTXMultiBurst Example + + mode = STLTXMultiBurst(pps = 10, pkts_per_burst = 1,count 10, ibg=10.0) """ @@ -230,7 +234,8 @@ class STLFlowStats(STLFlowStatsInterface): """ Define per stream basic stats .. code-block:: python - :caption: STLFlowStats Example + + # STLFlowStats Example flow_stats = STLFlowStats(pg_id = 7) @@ -245,7 +250,8 @@ class STLFlowLatencyStats(STLFlowStatsInterface): """ Define per stream basic stats + latency, jitter, packet reorder/loss .. code-block:: python - :caption: STLFlowLatencyStats Example + + # STLFlowLatencyStats Example flow_stats = STLFlowLatencyStats(pg_id = 7) @@ -260,7 +266,8 @@ class STLStream(object): """ One stream object. Includes mode, Field Engine mode packet template and Rx stats .. code-block:: python - :caption: STLStream Example + + # STLStream Example base_pkt = Ether()/IP(src="16.0.0.1",dst="48.0.0.1")/UDP(dport=12,sport=1025) @@ -825,9 +832,10 @@ class STLProfile(object): """ Describe a list of streams .. code-block:: python - :caption: STLProfile Example - profile = STLProfile( [ STLStream( isg = 10.0, # star in delay + # STLProfile Example + + profile = STLProfile( [ STLStream( isg = 10.0, # star in delay name ='S0', packet = STLPktBuilder(pkt = base_pkt/pad), mode = STLTXSingleBurst( pps = 10, total_pkts = self.burst_size), diff --git a/scripts/dpdk_nic_bind.py b/scripts/dpdk_nic_bind.py index 1242e3e3..528a8132 100755 --- a/scripts/dpdk_nic_bind.py +++ b/scripts/dpdk_nic_bind.py @@ -368,7 +368,7 @@ def read_pid_cmdline(pid): def confirm(msg, default = False): if not os.isatty(1): return default - termios.tcflush(sys.stdin, termios.TCIOFLUSH) + termios.tcflush(sys.stdin, termios.TCIFLUSH) try: return strtobool(raw_input(msg)) except KeyboardInterrupt: @@ -380,7 +380,7 @@ def confirm(msg, default = False): def read_line(msg = '', default = ''): if not os.isatty(1): return default - termios.tcflush(sys.stdin, termios.TCIOFLUSH) + termios.tcflush(sys.stdin, termios.TCIFLUSH) try: return raw_input(msg).strip() except KeyboardInterrupt: diff --git a/scripts/dpdk_setup_ports.py b/scripts/dpdk_setup_ports.py index 84c44e4a..509de2e2 100755 --- a/scripts/dpdk_setup_ports.py +++ b/scripts/dpdk_setup_ports.py @@ -360,7 +360,7 @@ Other network devices 'rte_i40e_pmd': 'i40e', 'rte_em_pmd': 'e1000', 'rte_vmxnet3_pmd': 'vmxnet3', - 'rte_virtio_pmd': 'virtio', + 'rte_virtio_pmd': 'virtio-pci', 'rte_enic_pmd': 'enic', } for pci, info in dpdk_nic_bind.get_info_from_trex(dpdk_interfaces).items(): diff --git a/scripts/ko/4.4.0-36-generic/igb_uio.ko b/scripts/ko/4.4.0-36-generic/igb_uio.ko new file mode 100644 index 00000000..7f46079e Binary files /dev/null and b/scripts/ko/4.4.0-36-generic/igb_uio.ko differ -- cgit 1.2.3-korg