X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=resources%2Flibraries%2Fpython%2FTrafficGenerator.py;h=1b519d57131b0b47d51dc960ef3d83d45b735a05;hb=6bcf4d40d83bbf026f9fd0105bebf579423c65a6;hp=007079f254eaf150705fe183bcda5e0e71bef2fa;hpb=063abf35e81deaf749ebbcfee339fbd1d9e89412;p=csit.git diff --git a/resources/libraries/python/TrafficGenerator.py b/resources/libraries/python/TrafficGenerator.py index 007079f254..1b519d5713 100644 --- a/resources/libraries/python/TrafficGenerator.py +++ b/resources/libraries/python/TrafficGenerator.py @@ -1,4 +1,4 @@ -# Copyright (c) 2019 Cisco and/or its affiliates. +# Copyright (c) 2020 Cisco and/or its affiliates. # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at: @@ -18,16 +18,18 @@ import time from robot.api import logger from robot.libraries.BuiltIn import BuiltIn -from .DropRateSearch import DropRateSearch from .Constants import Constants -from .ssh import exec_cmd_no_error, exec_cmd -from .topology import NodeType -from .topology import NodeSubTypeTG -from .topology import Topology +from .CpuUtils import CpuUtils +from .DropRateSearch import DropRateSearch from .MLRsearch.AbstractMeasurer import AbstractMeasurer from .MLRsearch.MultipleLossRatioSearch import MultipleLossRatioSearch from .MLRsearch.ReceiveRateMeasurement import ReceiveRateMeasurement from .PLRsearch.PLRsearch import PLRsearch +from .OptionString import OptionString +from .ssh import exec_cmd_no_error, exec_cmd +from .topology import NodeType +from .topology import NodeSubTypeTG +from .topology import Topology __all__ = [u"TGDropRateSearchImpl", u"TrafficGenerator", u"OptimizedSearch"] @@ -277,6 +279,11 @@ class TrafficGenerator(AbstractMeasurer): if1_adj_addr, if2_adj_addr = if2_adj_addr, if1_adj_addr self._ifaces_reordered = True + master_thread_id, latency_thread_id, socket, threads = \ + CpuUtils.get_affinity_trex( + self._node, tg_if1, tg_if2, + tg_dtc=Constants.TREX_CORE_COUNT) + if osi_layer in (u"L2", u"L3"): dst_mac0 = f"0x{if1_adj_addr.replace(u':', u',0x')}" src_mac0 = f"0x{if1_addr.replace(u':', u',0x')}" @@ -286,31 +293,47 @@ class TrafficGenerator(AbstractMeasurer): self._node, f"sh -c 'cat << EOF > /etc/trex_cfg.yaml\n" f"- version: 2\n" + f" c: {len(threads)}\n" + f" limit_memory: {Constants.TREX_LIMIT_MEMORY}\n" f" interfaces: [\"{if1_pci}\",\"{if2_pci}\"]\n" f" port_info:\n" f" - dest_mac: [{dst_mac0}]\n" f" src_mac: [{src_mac0}]\n" f" - dest_mac: [{dst_mac1}]\n" f" src_mac: [{src_mac1}]\n" + f" platform :\n" + f" master_thread_id: {master_thread_id}\n" + f" latency_thread_id: {latency_thread_id}\n" + f" dual_if:\n" + f" - socket: {socket}\n" + f" threads: {threads}\n" f"EOF'", - sudo=True, message=u"TRex config generation error" + sudo=True, message=u"TRex config generation!" ) elif osi_layer == u"L7": exec_cmd_no_error( self._node, f"sh -c 'cat << EOF > /etc/trex_cfg.yaml\n" f"- version: 2\n" + f" c: {len(threads)}\n" + f" limit_memory: {Constants.TREX_LIMIT_MEMORY}\n" f" interfaces: [\"{if1_pci}\",\"{if2_pci}\"]\n" f" port_info:\n" f" - ip: [{if1_addr}]\n" f" default_gw: [{if1_adj_addr}]\n" f" - ip: [{if2_addr}]\n" f" default_gw: [{if2_adj_addr}]\n" + f" platform :\n" + f" master_thread_id: {master_thread_id}\n" + f" latency_thread_id: {latency_thread_id}\n" + f" dual_if:\n" + f" - socket: {socket}\n" + f" threads: {threads}\n" f"EOF'", - sudo=True, message=u"TRex config generation error" + sudo=True, message=u"TRex config generation!" ) else: - raise ValueError(u"Unknown Test Type") + raise ValueError(u"Unknown Test Type!") self._startup_trex(osi_layer) @@ -342,11 +365,17 @@ class TrafficGenerator(AbstractMeasurer): ) # Start TRex. - cmd = f"sh -c \"cd {Constants.TREX_INSTALL_DIR}/scripts/ && " \ - f"nohup ./t-rex-64 " \ - f"--hdrh{u' --astf' if osi_layer == u'L7' else u''} " \ - f"--prefix $(hostname) -i -c 7 > /tmp/trex.log 2>&1 &\" > " \ - f"/dev/null" + cd_cmd = f"cd '{Constants.TREX_INSTALL_DIR}/scripts/'" + trex_cmd = OptionString([u"nohup", u"./t-rex-64"]) + trex_cmd.add(u"-i") + trex_cmd.add(u"--prefix $(hostname)") + trex_cmd.add(u"--hdrh") + trex_cmd.add(u"--no-scapy-server") + trex_cmd.add_if(u"--astf", osi_layer == u"L7") + # OptionString does not create double space if extra is empty. + trex_cmd.add(f"{Constants.TREX_EXTRA_CMDLINE}") + inner_command = f"{cd_cmd} && {trex_cmd} > /tmp/trex.log 2>&1 &" + cmd = f"sh -c \"{inner_command}\" > /dev/null" try: exec_cmd_no_error(self._node, cmd, sudo=True) except RuntimeError: @@ -369,6 +398,7 @@ class TrafficGenerator(AbstractMeasurer): return # After max retries TRex is still not responding to API critical error # occurred. + exec_cmd(self._node, u"cat /tmp/trex.log", sudo=True) raise RuntimeError(u"Start TRex failed after multiple retries!") @staticmethod @@ -381,8 +411,6 @@ class TrafficGenerator(AbstractMeasurer): :rtype: bool :raises RuntimeError: If node type is not a TG. """ - # No need to check subtype, we know it is TREX. - ret, _, _ = exec_cmd(node, u"pidof t-rex", sudo=True) return bool(int(ret) == 0)