Improvements to ssh remote client
* Added a ping check before trying to SSH * Using servers config to determine timeouts * (patch) Statically set ssh connect timeout to 20s. This should come from the config Change-Id: Id8c7314079dd0af4b196111de0668ab230c28fde
This commit is contained in:
		@@ -28,7 +28,8 @@ class InstanceClientFactory(object):
 | 
			
		||||
                  'arch': 'LinuxClient', 'freebsd': 'FreeBSDClient'}
 | 
			
		||||
 | 
			
		||||
    @classmethod
 | 
			
		||||
    def get_instance_client(cls, ip_address, username, password, os_distro, server_id):
 | 
			
		||||
    def get_instance_client(cls, ip_address=None, username=None, password=None,
 | 
			
		||||
                            os_distro=None, server_id=None, config=None):
 | 
			
		||||
        """
 | 
			
		||||
        @summary: Returns utility class based on the OS type of server
 | 
			
		||||
        @param ip_address: IP Address of the server
 | 
			
		||||
@@ -50,7 +51,7 @@ class InstanceClientFactory(object):
 | 
			
		||||
 | 
			
		||||
        return instanceClient(ip_address=ip_address, username=username,
 | 
			
		||||
                              password=password, os_distro=os_distro,
 | 
			
		||||
                              server_id=server_id)
 | 
			
		||||
                              server_id=server_id, config=config)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class InstanceClient(object):
 | 
			
		||||
@@ -58,8 +59,14 @@ class InstanceClient(object):
 | 
			
		||||
    @summary: Wrapper class around different operating system utilities.
 | 
			
		||||
    """
 | 
			
		||||
 | 
			
		||||
    def __init__(self, ip_address, password, os_distro, username=None, server_id=None):
 | 
			
		||||
        self._client = InstanceClientFactory.get_instance_client(ip_address, password, os_distro, username, server_id)
 | 
			
		||||
    def __init__(self, ip_address=None, password=None, os_distro=None,
 | 
			
		||||
                 config=None, username=None, server_id=None):
 | 
			
		||||
        self._client = InstanceClientFactory.get_instance_client(ip_address=ip_address,
 | 
			
		||||
                                                                 password=password,
 | 
			
		||||
                                                                 os_distro=os_distro,
 | 
			
		||||
                                                                 username=username,
 | 
			
		||||
                                                                 server_id=server_id,
 | 
			
		||||
                                                                 config=config)
 | 
			
		||||
        self.client_log = cclogging.getLogger(cclogging.get_object_namespace(self.__class__))
 | 
			
		||||
 | 
			
		||||
    def can_authenticate(self):
 | 
			
		||||
 
 | 
			
		||||
@@ -28,10 +28,11 @@ from cloudcafe.compute.common.exceptions import FileNotFoundException, ServerUnr
 | 
			
		||||
 | 
			
		||||
class LinuxClient(BasePersistentLinuxClient):
 | 
			
		||||
 | 
			
		||||
    def __init__(self, ip_address, server_id, os_distro, username, password):
 | 
			
		||||
    def __init__(self, ip_address=None, server_id=None, username=None,
 | 
			
		||||
                 password=None, config=None, os_distro=None):
 | 
			
		||||
        self.client_log = cclogging.getLogger \
 | 
			
		||||
                (cclogging.get_object_namespace(self.__class__))
 | 
			
		||||
        ssh_timeout = 600
 | 
			
		||||
        ssh_timeout = config.connection_timeout
 | 
			
		||||
        if ip_address is None:
 | 
			
		||||
            raise ServerUnreachable("None")
 | 
			
		||||
        self.ip_address = ip_address
 | 
			
		||||
@@ -41,6 +42,15 @@ class LinuxClient(BasePersistentLinuxClient):
 | 
			
		||||
        self.password = password
 | 
			
		||||
        self.server_id = server_id
 | 
			
		||||
 | 
			
		||||
        start = int(time.time())
 | 
			
		||||
        reachable = False
 | 
			
		||||
        while not reachable:
 | 
			
		||||
            reachable = PingClient.ping(ip_address,
 | 
			
		||||
                                        config.ip_address_version_for_ssh)
 | 
			
		||||
            time.sleep(config.connection_retry_interval)
 | 
			
		||||
            if int(time.time()) - start >= config.connection_timeout:
 | 
			
		||||
                raise ServerUnreachable(ip_address)
 | 
			
		||||
 | 
			
		||||
        self.ssh_client = SSHBaseClient(self.ip_address,
 | 
			
		||||
                                        self.username,
 | 
			
		||||
                                        self.password,
 | 
			
		||||
 
 | 
			
		||||
@@ -59,13 +59,13 @@ class SSHBaseClient(BaseClient):
 | 
			
		||||
            try:
 | 
			
		||||
                if not log_attempted:
 | 
			
		||||
                    self._log.debug('Attempting to SSH connect to: ')
 | 
			
		||||
                    self._log.debug('host: %s, username: %s' %
 | 
			
		||||
                                    (self.host, self.username))
 | 
			
		||||
                    self._log.debug('host: %s, username: %s, password: %s' %
 | 
			
		||||
                                    (self.host, self.username, self.password))
 | 
			
		||||
                    log_attempted = True
 | 
			
		||||
                ssh.connect(hostname=self.host,
 | 
			
		||||
                            username=self.username,
 | 
			
		||||
                            password=self.password,
 | 
			
		||||
                            timeout=self.timeout,
 | 
			
		||||
                            timeout=20,
 | 
			
		||||
                            key_filename=[],
 | 
			
		||||
                            look_for_keys=False,
 | 
			
		||||
                            allow_agent=False)
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user