aboutsummaryrefslogtreecommitdiffstats
path: root/resources/libraries/python/ssh.py
diff options
context:
space:
mode:
Diffstat (limited to 'resources/libraries/python/ssh.py')
-rw-r--r--resources/libraries/python/ssh.py37
1 files changed, 25 insertions, 12 deletions
diff --git a/resources/libraries/python/ssh.py b/resources/libraries/python/ssh.py
index b470e86ccc..287ad31d65 100644
--- a/resources/libraries/python/ssh.py
+++ b/resources/libraries/python/ssh.py
@@ -11,6 +11,8 @@
# See the License for the specific language governing permissions and
# limitations under the License.
+"""Library for SSH connection management."""
+
import StringIO
from time import time, sleep
@@ -19,7 +21,7 @@ import paramiko
from paramiko import RSAKey
from paramiko.ssh_exception import SSHException
from scp import SCPClient
-from interruptingcow import timeout
+from interruptingcow import timeout as icTimeout
from robot.api import logger
from robot.utils.asserts import assert_equal
@@ -29,6 +31,7 @@ __all__ = ["exec_cmd", "exec_cmd_no_error"]
class SSH(object):
+ """Contains methods for managing and using SSH connections."""
__MAX_RECV_BUF = 10*1024*1024
__existing_connections = {}
@@ -39,6 +42,14 @@ class SSH(object):
@staticmethod
def _node_hash(node):
+ """Get IP address and port hash from node dictionary.
+
+ :param node: Node in topology.
+ :type node: dict
+ :return: IP address and port for the specified node.
+ :rtype: int
+ """
+
return hash(frozenset([node['host'], node['port']]))
def connect(self, node):
@@ -56,7 +67,7 @@ class SSH(object):
pkey = None
if 'priv_key' in node:
pkey = RSAKey.from_private_key(
- StringIO.StringIO(node['priv_key']))
+ StringIO.StringIO(node['priv_key']))
self._ssh = paramiko.SSHClient()
self._ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
@@ -90,6 +101,8 @@ class SSH(object):
ssh.close()
def _reconnect(self):
+ """Close the SSH connection and open it again."""
+
node = self._node
self.disconnect(node)
self.connect(node)
@@ -100,8 +113,8 @@ class SSH(object):
"""Execute SSH command on a new channel on the connected Node.
:param cmd: Command to run on the Node.
- :param timeout: Maximal time in seconds to wait while the command is
- done. If is None then wait forever.
+ :param timeout: Maximal time in seconds to wait until the command is
+ done. If set to None then wait forever.
:type cmd: str
:type timeout: int
:return return_code, stdout, stderr
@@ -203,7 +216,7 @@ class SSH(object):
buf = ''
try:
- with timeout(time_out, exception=RuntimeError):
+ with icTimeout(time_out, exception=RuntimeError):
while not buf.endswith(':~$ '):
if chan.recv_ready():
buf = chan.recv(4096)
@@ -235,7 +248,7 @@ class SSH(object):
chan.sendall('{c}\n'.format(c=cmd))
buf = ''
try:
- with timeout(time_out, exception=RuntimeError):
+ with icTimeout(time_out, exception=RuntimeError):
while not buf.endswith(prompt):
if chan.recv_ready():
buf += chan.recv(4096)
@@ -283,8 +296,8 @@ def exec_cmd(node, cmd, timeout=600, sudo=False):
ssh = SSH()
try:
ssh.connect(node)
- except Exception, e:
- logger.error("Failed to connect to node" + str(e))
+ except Exception as err:
+ logger.error("Failed to connect to node" + str(err))
return None, None, None
try:
@@ -293,8 +306,8 @@ def exec_cmd(node, cmd, timeout=600, sudo=False):
else:
(ret_code, stdout, stderr) = ssh.exec_command_sudo(cmd,
timeout=timeout)
- except Exception, e:
- logger.error(e)
+ except Exception as err:
+ logger.error(err)
return None, None, None
return ret_code, stdout, stderr
@@ -307,7 +320,7 @@ def exec_cmd_no_error(node, cmd, timeout=600, sudo=False):
Returns (stdout, stderr).
"""
- (rc, stdout, stderr) = exec_cmd(node, cmd, timeout=timeout, sudo=sudo)
- assert_equal(rc, 0, 'Command execution failed: "{}"\n{}'.
+ (ret_code, stdout, stderr) = exec_cmd(node, cmd, timeout=timeout, sudo=sudo)
+ assert_equal(ret_code, 0, 'Command execution failed: "{}"\n{}'.
format(cmd, stderr))
return stdout, stderr