- raise ValueError("Unknown Test Type")
- if int(ret) != 0:
- raise RuntimeError('TRex config generation error')
-
- for _ in range(0, 3):
- # kill TRex only if it is already running
- ssh.exec_command(
- "sh -c 'pgrep t-rex && sudo pkill t-rex && sleep 3'")
-
- # configure TRex
- (ret, _, _) = ssh.exec_command(
- "sh -c 'cd {0}/scripts/ && sudo ./trex-cfg'"\
- .format(Constants.TREX_INSTALL_DIR))
- if int(ret) != 0:
- raise RuntimeError('trex-cfg failed')
-
- # start TRex
- if osi_layer == 'L2' or osi_layer == 'L3':
- (ret, _, _) = ssh.exec_command(
- "sh -c 'cd {0}/scripts/ && "
- "sudo nohup ./t-rex-64 -i -c 7 --iom 0 > /tmp/trex.log "
- "2>&1 &' > /dev/null"\
- .format(Constants.TREX_INSTALL_DIR))
- elif osi_layer == 'L7':
- (ret, _, _) = ssh.exec_command(
- "sh -c 'cd {0}/scripts/ && "
- "sudo nohup ./t-rex-64 --astf -i -c 7 --iom 0 > "
- "/tmp/trex.log 2>&1 &' > /dev/null"\
- .format(Constants.TREX_INSTALL_DIR))
- else:
- raise ValueError("Unknown Test Type")
- if int(ret) != 0:
- ssh.exec_command("sh -c 'cat /tmp/trex.log'")
- raise RuntimeError('t-rex-64 startup failed')
-
- # get TRex server info
- (ret, _, _) = ssh.exec_command(
- "sh -c 'sleep 3; "
- "{0}/resources/tools/trex/trex_server_info.py'"\
- .format(Constants.REMOTE_FW_DIR),
- timeout=120)
- if int(ret) == 0:
- # If we get info TRex is running
- return
- # after max retries TRex is still not responding to API
- # critical error occurred
- raise RuntimeError('t-rex-64 startup failed')
+ raise ValueError(u"Unknown Test Type")
+
+ self._startup_trex(osi_layer)
+
+ def _startup_trex(self, osi_layer):
+ """Startup sequence for the TRex traffic generator.
+
+ :param osi_layer: 'L2', 'L3' or 'L7' - OSI Layer testing type.
+ :type osi_layer: str
+ :raises RuntimeError: If node subtype is not a TREX or startup failed.
+ """
+ # No need to check subtype, we know it is TREX.
+ for _ in range(0, 3):
+ # Kill TRex only if it is already running.
+ cmd = u"sh -c \"pgrep t-rex && pkill t-rex && sleep 3 || true\""
+ exec_cmd_no_error(
+ self._node, cmd, sudo=True, message=u"Kill TRex failed!"
+ )
+
+ # Configure TRex.
+ ports = ''
+ for port in self._node[u"interfaces"].values():
+ ports += f" {port.get(u'pci_address')}"
+
+ cmd = f"sh -c \"cd {Constants.TREX_INSTALL_DIR}/scripts/ && " \
+ f"./dpdk_nic_bind.py -u {ports} || true\""
+ exec_cmd_no_error(
+ self._node, cmd, sudo=True,
+ message=u"Unbind PCI ports from driver failed!"
+ )
+
+ # 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"
+ try:
+ exec_cmd_no_error(self._node, cmd, sudo=True)
+ except RuntimeError:
+ cmd = u"sh -c \"cat /tmp/trex.log\""
+ exec_cmd_no_error(
+ self._node, cmd, sudo=True, message=u"Get TRex logs failed!"
+ )
+ raise RuntimeError(u"Start TRex failed!")
+
+ # Test if TRex starts successfuly.
+ cmd = f"sh -c \"{Constants.REMOTE_FW_DIR}/resources/tools/trex/" \
+ f"trex_server_info.py\""
+ try:
+ exec_cmd_no_error(
+ self._node, cmd, sudo=True, message=u"Test TRex failed!",
+ retries=20
+ )
+ except RuntimeError:
+ continue
+ return
+ # After max retries TRex is still not responding to API critical error
+ # occurred.
+ raise RuntimeError(u"Start TRex failed after multiple retries!")