- 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 test_type == 'L2' or test_type == '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 test_type == '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')
+
+ 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 = "sh -c 'pgrep t-rex && pkill t-rex && sleep 3 || true'"
+ exec_cmd_no_error(
+ self._node, cmd, sudo=True, message='Kill TRex failed!')
+
+ # Configure TRex.
+ ports = ''
+ for port in self._node['interfaces'].values():
+ ports += ' {pci}'.format(pci=port.get('pci_address'))
+
+ cmd = ("sh -c 'cd {dir}/scripts/ && "
+ "./dpdk_nic_bind.py -u {ports} || true'"
+ .format(dir=Constants.TREX_INSTALL_DIR, ports=ports))
+ exec_cmd_no_error(
+ self._node, cmd, sudo=True,
+ message='Unbind PCI ports from driver failed!')
+
+ cmd = ("sh -c 'cd {dir}/scripts/ && ./trex-cfg'"
+ .format(dir=Constants.TREX_INSTALL_DIR))
+ exec_cmd_no_error(
+ self._node, cmd, sudo=True, message='Config TRex failed!')
+
+ # Start TRex.
+ cmd = ("sh -c 'cd {dir}/scripts/ && "
+ "nohup ./t-rex-64 {mode} -i -c 7 > "
+ "/tmp/trex.log 2>&1 &' > /dev/null"
+ .format(dir=Constants.TREX_INSTALL_DIR,
+ mode='--astf' if osi_layer == 'L7' else ''))
+ try:
+ exec_cmd_no_error(self._node, cmd, sudo=True)
+ except RuntimeError:
+ cmd = "sh -c 'cat /tmp/trex.log'"
+ exec_cmd_no_error(
+ self._node, cmd, sudo=True, message='Get TRex logs failed!')
+ raise RuntimeError('Start TRex failed!')
+
+ # Test if TRex starts successfuly.
+ cmd = ("sh -c '{dir}/resources/tools/trex/trex_server_info.py'"
+ .format(dir=Constants.REMOTE_FW_DIR))
+ try:
+ exec_cmd_no_error(
+ self._node, cmd, sudo=True, message='Test TRex failed!',
+ retries=20)
+ except RuntimeError:
+ continue
+ return
+ # After max retries TRex is still not responding to API critical error
+ # occurred.
+ raise RuntimeError('Start TRex failed after multiple retries!')