Merge "jjb: xci: bifrost-cleanup: Retry 'gsutil rm' on failures"
[releng.git] / modules / opnfv / utils / ssh_utils.py
index f900455..4c5ff5c 100644 (file)
@@ -15,6 +15,27 @@ import paramiko
 from opnfv.utils import opnfv_logger as logger
 
 logger = logger.Logger("SSH utils").getLogger()
+SSH_TIMEOUT = 60
+
+''' Monkey Patch paramiko _custom_start_client '''
+# We are using paramiko 2.1.1 and in the CI in the SFC
+# test we are facing this issue:
+# https://github.com/robotframework/SSHLibrary/issues/158
+# The fix was merged in paramiko 2.1.3 in this PR:
+# https://github.com/robotframework/SSHLibrary/pull/159/files
+# Until we upgrade we can use this monkey patch to work
+# around the issue
+
+
+def _custom_start_client(self, *args, **kwargs):
+    self.banner_timeout = 45
+    self._orig_start_client(*args, **kwargs)
+
+
+paramiko.transport.Transport._orig_start_client = \
+    paramiko.transport.Transport.start_client
+paramiko.transport.Transport.start_client = _custom_start_client
+''' Monkey Patch paramiko _custom_start_client '''
 
 
 def get_ssh_client(hostname,
@@ -40,14 +61,16 @@ def get_ssh_client(hostname,
             client.load_system_host_keys()
             client.connect(hostname,
                            username=username,
-                           pkey=key)
+                           pkey=key,
+                           timeout=SSH_TIMEOUT)
         else:
             client.connect(hostname,
                            username=username,
-                           password=password)
+                           password=password,
+                           timeout=SSH_TIMEOUT)
 
         return client
-    except Exception, e:
+    except Exception as e:
         logger.error(e)
         return None
 
@@ -57,7 +80,7 @@ def get_file(ssh_conn, src, dest):
         sftp = ssh_conn.open_sftp()
         sftp.get(src, dest)
         return True
-    except Exception, e:
+    except Exception as e:
         logger.error("Error [get_file(ssh_conn, '%s', '%s']: %s" %
                      (src, dest, e))
         return None
@@ -68,7 +91,7 @@ def put_file(ssh_conn, src, dest):
         sftp = ssh_conn.open_sftp()
         sftp.put(src, dest)
         return True
-    except Exception, e:
+    except Exception as e:
         logger.error("Error [put_file(ssh_conn, '%s', '%s']: %s" %
                      (src, dest, e))
         return None
@@ -96,7 +119,8 @@ class ProxyHopClient(paramiko.SSHClient):
         self.proxy_ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
         self.proxy_ssh.connect(jh_ip,
                                username=jh_user,
-                               password=jh_pass)
+                               password=jh_pass,
+                               timeout=SSH_TIMEOUT)
         self.proxy_transport = self.proxy_ssh.get_transport()
 
     def connect(self, hostname, port=22, username='root', password=None,
@@ -126,7 +150,8 @@ class ProxyHopClient(paramiko.SSHClient):
             super(ProxyHopClient, self).connect(hostname,
                                                 username=username,
                                                 pkey=proxy_key,
-                                                sock=self.proxy_channel)
+                                                sock=self.proxy_channel,
+                                                timeout=timeout)
             os.remove(self.local_ssh_key)
-        except Exception, e:
+        except Exception as e:
             logger.error(e)