diff options
author | George Paraskevopoulos <geopar@intracom-telecom.com> | 2016-11-11 11:05:07 +0200 |
---|---|---|
committer | George Paraskevopoulos <geopar@intracom-telecom.com> | 2016-11-15 10:19:47 +0200 |
commit | 45e3e5662af2997d633bd02a2eb0c7553f442e6e (patch) | |
tree | e938c410c58e0d43b37e4bd0d618df21c2245bed /tests/functest/odl-sfc/SSHUtils.py | |
parent | 73c4d745bf2bba060dc8301a9127482f01318de1 (diff) |
Copy odl-sfc test from functest to the sfc repo
Migrate odl-sfc testcase from functest repo
First related functest commit: 65a5f65fa06c97456f37ca2434cf9e6fc9b758aa
Last related functest commit: caa06d8d7b55a1c0608a72f809785d8f418cf541
Change-Id: I206f25d6fb44564b8b163ebb9c43e038851bea71
Signed-off-by: George Paraskevopoulos <geopar@intracom-telecom.com>
Diffstat (limited to 'tests/functest/odl-sfc/SSHUtils.py')
-rw-r--r-- | tests/functest/odl-sfc/SSHUtils.py | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/tests/functest/odl-sfc/SSHUtils.py b/tests/functest/odl-sfc/SSHUtils.py new file mode 100644 index 00000000..9c8c2c72 --- /dev/null +++ b/tests/functest/odl-sfc/SSHUtils.py @@ -0,0 +1,120 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# Authors: George Paraskevopoulos (geopar@intracom-telecom.com) +# Jose Lausuch (jose.lausuch@ericsson.com) +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + + +import paramiko +import functest.utils.functest_logger as rl +import os + +logger = rl.Logger('SSHUtils').getLogger() + + +def get_ssh_client(hostname, username, password=None, proxy=None): + client = None + try: + if proxy is None: + client = paramiko.SSHClient() + else: + client = ProxyHopClient() + client.configure_jump_host(proxy['ip'], + proxy['username'], + proxy['password']) + + if client is None: + raise Exception('Could not connect to client') + + client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) + client.connect(hostname, + username=username, + password=password) + return client + except Exception, e: + logger.error(e) + return None + + +def get_file(ssh_conn, src, dest): + try: + sftp = ssh_conn.open_sftp() + sftp.get(src, dest) + return True + except Exception, e: + logger.error("Error [get_file(ssh_conn, '%s', '%s']: %s" % + (src, dest, e)) + return None + + +def put_file(ssh_conn, src, dest): + try: + sftp = ssh_conn.open_sftp() + sftp.put(src, dest) + return True + except Exception, e: + logger.error("Error [put_file(ssh_conn, '%s', '%s']: %s" % + (src, dest, e)) + return None + + +class ProxyHopClient(paramiko.SSHClient): + ''' + Connect to a remote server using a proxy hop + ''' + def __init__(self, *args, **kwargs): + self.logger = rl.Logger("ProxyHopClient").getLogger() + self.proxy_ssh = None + self.proxy_transport = None + self.proxy_channel = None + self.proxy_ip = None + self.proxy_ssh_key = None + self.local_ssh_key = os.path.join(os.getcwd(), 'id_rsa') + super(ProxyHopClient, self).__init__(*args, **kwargs) + + def configure_jump_host(self, jh_ip, jh_user, jh_pass, + jh_ssh_key='/root/.ssh/id_rsa'): + self.proxy_ip = jh_ip + self.proxy_ssh_key = jh_ssh_key + self.proxy_ssh = paramiko.SSHClient() + self.proxy_ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) + self.proxy_ssh.connect(jh_ip, + username=jh_user, + password=jh_pass) + self.proxy_transport = self.proxy_ssh.get_transport() + + def connect(self, hostname, port=22, username='root', password=None, + pkey=None, key_filename=None, timeout=None, allow_agent=True, + look_for_keys=True, compress=False, sock=None, gss_auth=False, + gss_kex=False, gss_deleg_creds=True, gss_host=None, + banner_timeout=None): + try: + if self.proxy_ssh is None: + raise Exception('You must configure the jump ' + 'host before calling connect') + + get_file_res = get_file(self.proxy_ssh, + self.proxy_ssh_key, + self.local_ssh_key) + if get_file_res is None: + raise Exception('Could\'t fetch SSH key from jump host') + proxy_key = (paramiko.RSAKey + .from_private_key_file(self.local_ssh_key)) + + self.proxy_channel = self.proxy_transport.open_channel( + "direct-tcpip", + (hostname, 22), + (self.proxy_ip, 22)) + + self.set_missing_host_key_policy(paramiko.AutoAddPolicy()) + super(ProxyHopClient, self).connect(hostname, + username=username, + pkey=proxy_key, + sock=self.proxy_channel) + os.remove(self.local_ssh_key) + except Exception, e: + self.logger.error(e) |