Source code for expyrimenter.ssh

from expyrimenter import Shell
from time import sleep
import logging
import random


[docs]class SSH(Shell): """ :param str params: shell SSH params (at least the hostname). :param str remote_cmd: Command to be run in remote host through SSH. :param str title: A title to be displayed in log outputs. If None, the shell command will be shown. :param bool stdout: Whether or not to display standard output. Default is *False*. :param bool stderr: Whether or not to display standard error. Default is *True*. """ def __init__(self, params, remote_cmd, title=None, stdout=False, stderr=True): remote_cmd = self._redirect_outputs(remote_cmd, stdout, stderr) cmd = "ssh %s '%s'" % (params, remote_cmd) super().__init__(cmd, title, stdout, stderr) @staticmethod
[docs] def await_availability(params, interval=5, max_rand=1): """Periodically tries SSH until it is successful. This function is very useful in cloud environmentes, because there can be a considerable amount of time after a VM is running and before SSH connections are available. :param str params: shell SSH params (at least the hostname). :param num interval: Time in seconds to wait before new trial. :param num max_rand: A float random number between 0 and ``max_rand`` will be added to ``interval``. """ ssh = SSH(params, 'exit') log = logging.getLogger('ssh') while ssh.has_failed(): sleep(random.uniform(0, max_rand)) log.debug('Trying "ssh %s" again in %d + [0, %.2f) sec' % (params, interval, max_rand)) sleep(interval)