Currently if the command timeouts due to the nature of script execution
we are trying to again read from socket after timeout on seesion
expired. This patch is supposed to fix the behaviour and eliminate the
second read from channel after it was cloed.
Change-Id: Ib0028e901eb6ff4d10ca77d2ea19f9e770e6cef4
Signed-off-by: Peter Mikus <pmikus@cisco.com>
"""Traffic script executor library."""
"""Traffic script executor library."""
-from robot.api import logger
-
from resources.libraries.python.constants import Constants
from resources.libraries.python.ssh import SSH
from resources.libraries.python.constants import Constants
from resources.libraries.python.ssh import SSH
:raises RuntimeError: ARP reply timeout.
:raises RuntimeError: Traffic script execution failed.
"""
:raises RuntimeError: ARP reply timeout.
:raises RuntimeError: Traffic script execution failed.
"""
- logger.trace("{}".format(timeout))
ssh = SSH()
ssh.connect(node)
cmd = ("cd {}; " +
ssh = SSH()
ssh.connect(node)
cmd = ("cd {}; " +
"resources/traffic_scripts/{} {}") \
.format(Constants.REMOTE_FW_DIR, script_file_name,
script_args)
"resources/traffic_scripts/{} {}") \
.format(Constants.REMOTE_FW_DIR, script_file_name,
script_args)
- (ret_code, stdout, stderr) = ssh.exec_command_sudo(
- 'sh -c "{}"'.format(TrafficScriptExecutor._escape(cmd)),
+ ret_code, stdout, stderr = ssh.exec_command_sudo(
+ 'sh -c "{cmd}"'.format(cmd=TrafficScriptExecutor._escape(cmd)),
- logger.debug("stdout: {}".format(stdout))
- logger.debug("stderr: {}".format(stderr))
- logger.debug("ret_code: {}".format(ret_code))
if ret_code != 0:
if "RuntimeError: ICMP echo Rx timeout" in stderr:
raise RuntimeError("ICMP echo Rx timeout")
if ret_code != 0:
if "RuntimeError: ICMP echo Rx timeout" in stderr:
raise RuntimeError("ICMP echo Rx timeout")
stderr = StringIO.StringIO()
try:
chan = self._ssh.get_transport().open_session(timeout=5)
stderr = StringIO.StringIO()
try:
chan = self._ssh.get_transport().open_session(timeout=5)
+ peer = self._ssh.get_transport().getpeername()
except AttributeError:
self._reconnect()
chan = self._ssh.get_transport().open_session(timeout=5)
except AttributeError:
self._reconnect()
chan = self._ssh.get_transport().open_session(timeout=5)
+ peer = self._ssh.get_transport().getpeername()
except SSHException:
self._reconnect()
chan = self._ssh.get_transport().open_session(timeout=5)
except SSHException:
self._reconnect()
chan = self._ssh.get_transport().open_session(timeout=5)
+ peer = self._ssh.get_transport().getpeername()
- logger.trace('exec_command on {0}: {1}'
- .format(self._ssh.get_transport().getpeername(), cmd))
+
+ logger.trace('exec_command on {peer} with timeout {timeout}: {cmd}'
+ .format(peer=peer, timeout=timeout, cmd=cmd))
start = time()
chan.exec_command(cmd)
start = time()
chan.exec_command(cmd)
if time() - start > timeout:
raise SSHTimeout(
if time() - start > timeout:
raise SSHTimeout(
- 'Timeout exception during execution of command: {0}\n'
- 'Current contents of stdout buffer: {1}\n'
- 'Current contents of stderr buffer: {2}\n'
- .format(cmd, stdout.getvalue(), stderr.getvalue())
+ 'Timeout exception during execution of command: {cmd}\n'
+ 'Current contents of stdout buffer: {stdout}\n'
+ 'Current contents of stderr buffer: {stderr}\n'
+ .format(cmd=cmd, stdout=stdout.getvalue(),
+ stderr=stderr.getvalue())
stderr.write(chan.recv_stderr(self.__MAX_RECV_BUF))
end = time()
stderr.write(chan.recv_stderr(self.__MAX_RECV_BUF))
end = time()
- logger.trace('exec_command on {0} took {1} seconds'.format(
- self._ssh.get_transport().getpeername(), end-start))
+ logger.trace('exec_command on {peer} took {total} seconds'.
+ format(peer=peer, total=end-start))
- logger.trace('return RC {}'.format(return_code))
- logger.trace('return STDOUT {}'.format(stdout.getvalue()))
- logger.trace('return STDERR {}'.format(stderr.getvalue()))
+ logger.trace('return RC {rc}'.format(rc=return_code))
+ logger.trace('return STDOUT {stdout}'.format(stdout=stdout.getvalue()))
+ logger.trace('return STDERR {stderr}'.format(stderr=stderr.getvalue()))
return return_code, stdout.getvalue(), stderr.getvalue()
def exec_command_sudo(self, cmd, cmd_input=None, timeout=30):
return return_code, stdout.getvalue(), stderr.getvalue()
def exec_command_sudo(self, cmd, cmd_input=None, timeout=30):