diff options
-rw-r--r-- | tests/functest/odl-sfc/SSHUtils.py | 120 | ||||
-rw-r--r-- | tests/functest/odl-sfc/config.py | 6 | ||||
-rw-r--r-- | tests/functest/odl-sfc/config.yaml | 6 | ||||
-rw-r--r-- | tests/functest/odl-sfc/ovs_utils.py | 138 | ||||
-rw-r--r-- | tests/functest/odl-sfc/run_tests.py | 6 | ||||
-rwxr-xr-x | tests/functest/odl-sfc/sfc.py | 9 | ||||
-rwxr-xr-x | tests/functest/odl-sfc/sfc_one_chain_two_service_functions_different_computes.py | 4 | ||||
-rw-r--r-- | tests/functest/odl-sfc/utils.py | 26 |
8 files changed, 45 insertions, 270 deletions
diff --git a/tests/functest/odl-sfc/SSHUtils.py b/tests/functest/odl-sfc/SSHUtils.py deleted file mode 100644 index 9c8c2c72..00000000 --- a/tests/functest/odl-sfc/SSHUtils.py +++ /dev/null @@ -1,120 +0,0 @@ -############################################################################## -# 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) diff --git a/tests/functest/odl-sfc/config.py b/tests/functest/odl-sfc/config.py index d7498327..3b76e3bc 100644 --- a/tests/functest/odl-sfc/config.py +++ b/tests/functest/odl-sfc/config.py @@ -36,6 +36,12 @@ class CommonConfig(object): } self.flavor = ft_utils.get_parameter_from_yaml( "defaults.flavor", self.config_file) + self.ram_size_in_mb = ft_utils.get_parameter_from_yaml( + "defaults.ram_size_in_mb", self.config_file) + self.disk_size_in_gb = ft_utils.get_parameter_from_yaml( + "defaults.disk_size_in_gb", self.config_file) + self.vcpu_count = ft_utils.get_parameter_from_yaml( + "defaults.vcpu_count", self.config_file) self.image_name = ft_utils.get_parameter_from_yaml( "defaults.image_name", self.config_file) self.image_file_name = ft_utils.get_parameter_from_yaml( diff --git a/tests/functest/odl-sfc/config.yaml b/tests/functest/odl-sfc/config.yaml index 7861d771..78cf42fb 100644 --- a/tests/functest/odl-sfc/config.yaml +++ b/tests/functest/odl-sfc/config.yaml @@ -1,5 +1,9 @@ defaults: - flavor: custom #odl-sfc uses custom flavor + #odl-sfc uses custom flavors as per below params + flavor: custom + ram_size_in_mb: 1500 + disk_size_in_gb: 10 + vcpu_count: 1 image_name: sf_nsh_colorado image_file_name: sf_nsh_colorado.qcow2 fuel_master_ip: 10.20.0.2 diff --git a/tests/functest/odl-sfc/ovs_utils.py b/tests/functest/odl-sfc/ovs_utils.py deleted file mode 100644 index 48dfd620..00000000 --- a/tests/functest/odl-sfc/ovs_utils.py +++ /dev/null @@ -1,138 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Ericsson AB and others. -# Author: George Paraskevopoulos (geopar@intracom-telecom.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 functest.utils.functest_logger as rl -import os -import time -import shutil -import re - -logger = rl.Logger('ovs_utils').getLogger() - - -class OVSLogger(object): - def __init__(self, basedir, ft_resdir): - self.ovs_dir = basedir - self.ft_resdir = ft_resdir - self.__mkdir_p(self.ovs_dir) - self.__mkdir_p(self.ft_resdir) - - def __mkdir_p(self, dirpath): - if not os.path.exists(dirpath): - os.makedirs(dirpath) - - def __ssh_host(self, ssh_conn, host_prefix='10.20.0'): - try: - _, stdout, _ = ssh_conn.exec_command('hostname -I') - hosts = stdout.readline().strip().split(' ') - found_host = [h for h in hosts if h.startswith(host_prefix)][0] - return found_host - except Exception, e: - logger.error(e) - - def __dump_to_file(self, operation, host, text, timestamp=None): - ts = (timestamp if timestamp is not None - else time.strftime("%Y%m%d-%H%M%S")) - dumpdir = os.path.join(self.ovs_dir, ts) - self.__mkdir_p(dumpdir) - fname = '{0}_{1}'.format(operation, host) - with open(os.path.join(dumpdir, fname), 'w') as f: - f.write(text) - - def __remote_cmd(self, ssh_conn, cmd): - try: - _, stdout, stderr = ssh_conn.exec_command(cmd) - errors = stderr.readlines() - if len(errors) > 0: - host = self.__ssh_host(ssh_conn) - logger.error(''.join(errors)) - raise Exception('Could not execute {0} in {1}' - .format(cmd, host)) - output = ''.join(stdout.readlines()) - return output - except Exception, e: - logger.error('[__remote_command(ssh_client, {0})]: {1}' - .format(cmd, e)) - return None - - def create_artifact_archive(self): - shutil.make_archive(self.ovs_dir, - 'zip', - root_dir=os.path.dirname(self.ovs_dir), - base_dir=self.ovs_dir) - shutil.copy2('{0}.zip'.format(self.ovs_dir), self.ft_resdir) - - def ofctl_dump_flows(self, ssh_conn, br='br-int', - choose_table=None, timestamp=None): - try: - cmd = 'ovs-ofctl -OOpenFlow13 dump-flows {0}'.format(br) - if choose_table is not None: - cmd = '{0} table={1}'.format(cmd, choose_table) - output = self.__remote_cmd(ssh_conn, cmd) - operation = 'ofctl_dump_flows' - host = self.__ssh_host(ssh_conn) - self.__dump_to_file(operation, host, output, timestamp=timestamp) - return output - except Exception, e: - logger.error('[ofctl_dump_flows(ssh_client, {0}, {1})]: {2}' - .format(br, choose_table, e)) - return None - - def vsctl_show(self, ssh_conn, timestamp=None): - try: - cmd = 'ovs-vsctl show' - output = self.__remote_cmd(ssh_conn, cmd) - operation = 'vsctl_show' - host = self.__ssh_host(ssh_conn) - self.__dump_to_file(operation, host, output, timestamp=timestamp) - return output - except Exception, e: - logger.error('[vsctl_show(ssh_client)]: {0}'.format(e)) - return None - - def dump_ovs_logs(self, controller_clients, compute_clients, - related_error=None, timestamp=None): - if timestamp is None: - timestamp = time.strftime("%Y%m%d-%H%M%S") - - for controller_client in controller_clients: - self.ofctl_dump_flows(controller_client, - timestamp=timestamp) - self.vsctl_show(controller_client, - timestamp=timestamp) - - for compute_client in compute_clients: - self.ofctl_dump_flows(compute_client, - timestamp=timestamp) - self.vsctl_show(compute_client, - timestamp=timestamp) - - if related_error is not None: - dumpdir = os.path.join(self.ovs_dir, timestamp) - with open(os.path.join(dumpdir, 'error'), 'w') as f: - f.write(related_error) - - def ofctl_time_counter(self, ssh_conn): - try: - # We get the flows from table 11 - table = 11 - br = "br-int" - output = self.ofctl_dump_flows(ssh_conn, br, table) - pattern = "NXM_NX_NSP" - rsps = [] - lines = output.split(",") - for line in lines: - is_there = re.findall(pattern, line) - if is_there: - value = line.split(":")[1].split("-")[0] - rsps.append(value) - return rsps - except Exception, e: - logger.error('Error when countering %s' % e) - return None diff --git a/tests/functest/odl-sfc/run_tests.py b/tests/functest/odl-sfc/run_tests.py index 451ce564..cb96c206 100644 --- a/tests/functest/odl-sfc/run_tests.py +++ b/tests/functest/odl-sfc/run_tests.py @@ -14,12 +14,12 @@ import importlib import os import sys import time -import ovs_utils +import opnfv.utils.ovs_logger as ovs_log import functest.utils.functest_logger as ft_logger import functest.utils.functest_utils as ft_utils import yaml import utils -import SSHUtils as ssh_utils +import opnfv.utils.SSHUtils as ssh_utils parser = argparse.ArgumentParser() @@ -69,7 +69,7 @@ def set_tacker_rc_file_env(): def main(): set_tacker_rc_file_env() - ovs_logger = ovs_utils.OVSLogger( + ovs_logger = ovs_log.OVSLogger( os.path.join(COMMON_CONFIG.sfc_test_dir, 'ovs-logs'), COMMON_CONFIG.functest_results_dir) diff --git a/tests/functest/odl-sfc/sfc.py b/tests/functest/odl-sfc/sfc.py index 22301a28..5d1024db 100755 --- a/tests/functest/odl-sfc/sfc.py +++ b/tests/functest/odl-sfc/sfc.py @@ -5,7 +5,7 @@ import functest.utils.functest_logger as ft_logger import functest.utils.openstack_utils as os_utils import functest.utils.openstack_tacker as os_tacker import threading -import ovs_utils +import opnfv.utils.ovs_logger as ovs_log import utils as test_utils import config as sfc_config from results import Results @@ -55,7 +55,10 @@ def main(): test_utils.download_image(COMMON_CONFIG.url, COMMON_CONFIG.image_path) _, custom_flv_id = os_utils.get_or_create_flavor( - COMMON_CONFIG.flavor, 1500, 10, 1, public=True) + COMMON_CONFIG.flavor, + COMMON_CONFIG.ram_size_in_mb, + COMMON_CONFIG.disk_size_in_gb, + COMMON_CONFIG.vcpu_count, public=True) if not custom_flv_id: logger.error("Failed to create custom flavor") sys.exit(1) @@ -70,7 +73,7 @@ def main(): compute_clients = test_utils.get_ssh_clients("compute", COMMON_CONFIG.fuel_proxy) - ovs_logger = ovs_utils.OVSLogger( + ovs_logger = ovs_log.OVSLogger( os.path.join(COMMON_CONFIG.sfc_test_dir, 'ovs-logs'), COMMON_CONFIG.functest_results_dir) diff --git a/tests/functest/odl-sfc/sfc_one_chain_two_service_functions_different_computes.py b/tests/functest/odl-sfc/sfc_one_chain_two_service_functions_different_computes.py index b903f837..8f289670 100755 --- a/tests/functest/odl-sfc/sfc_one_chain_two_service_functions_different_computes.py +++ b/tests/functest/odl-sfc/sfc_one_chain_two_service_functions_different_computes.py @@ -7,7 +7,7 @@ import functest.utils.functest_utils as ft_utils import functest.utils.openstack_utils as os_utils import functest.utils.openstack_tacker as os_tacker import re -import ovs_utils +import opnfv.utils.ovs_logger as ovs_log import utils as test_utils import config as sfc_config @@ -112,7 +112,7 @@ def main(): controller_clients = test_utils.get_ssh_clients("controller", PROXY) compute_clients = test_utils.get_ssh_clients("compute", PROXY) - ovs_logger = ovs_utils.OVSLogger( + ovs_logger = ovs_log.OVSLogger( os.path.join(COMMON_CONFIG.sfc_test_dir, 'ovs-logs'), COMMON_CONFIG.functest_results_dir) diff --git a/tests/functest/odl-sfc/utils.py b/tests/functest/odl-sfc/utils.py index de23b812..4bff0a77 100644 --- a/tests/functest/odl-sfc/utils.py +++ b/tests/functest/odl-sfc/utils.py @@ -6,7 +6,7 @@ import functest.utils.functest_utils as ft_utils import functest.utils.openstack_utils as os_utils import re import json -import SSHUtils as ssh_utils +import opnfv.utils.SSHUtils as ssh_utils import functools @@ -355,14 +355,34 @@ def timethis(func): return timed +def ofctl_time_counter(ovs_logger, ssh_conn): + try: + # We get the flows from table 11 + table = 11 + br = "br-int" + output = ovs_logger.ofctl_dump_flows(ssh_conn, br, table) + pattern = "NXM_NX_NSP" + rsps = [] + lines = output.split(",") + for line in lines: + is_there = re.findall(pattern, line) + if is_there: + value = line.split(":")[1].split("-")[0] + rsps.append(value) + return rsps + except Exception, e: + logger.error('Error when countering %s' % e) + return None + + @timethis def capture_time_log(ovs_logger, compute_clients, timeout=200): - rsps = ovs_logger.ofctl_time_counter(compute_clients[0]) + rsps = ofctl_time_counter(ovs_logger, compute_clients[0]) first_RSP = rsps[0] if len(rsps) > 0 else '' while not ((len(rsps) > 1) and (first_RSP != rsps[0]) and (rsps[0] == rsps[1])): - rsps = ovs_logger.ofctl_time_counter(compute_clients[0]) + rsps = ofctl_time_counter(ovs_logger, compute_clients[0]) timeout -= 1 if timeout == 0: logger.error( |