diff options
author | selias <samelias@cisco.com> | 2016-09-13 16:51:37 +0200 |
---|---|---|
committer | Peter Mikus <pmikus@cisco.com> | 2016-10-03 06:41:33 +0000 |
commit | 19c91adadd57bfc4e7514993b2a711a826d52e04 (patch) | |
tree | 5c7656c69c6a3936838c5c6ddcf9313e7e98a6ba /resources/libraries/python | |
parent | c75b9804c9510d0a342563e41407089145b38d50 (diff) |
CSIT-405: Honeycomb test update and cleanup
- update suite setup and constants to allow test runs again
- cleanup basic interface keywords
- cleanup L2-fib test data
- add "continue on failure" keyword to some partially failing tests
- add teardown to all suites, restarts honeycomb if suite had test failures
- fix minor PEP-8 violations in Topology.py
Change-Id: Ic5b434af71f77855f81461b280299b8318932c5a
Signed-off-by: selias <samelias@cisco.com>
Diffstat (limited to 'resources/libraries/python')
-rw-r--r-- | resources/libraries/python/constants.py | 5 | ||||
-rw-r--r-- | resources/libraries/python/honeycomb/HcPersistence.py | 7 | ||||
-rw-r--r-- | resources/libraries/python/honeycomb/HoneycombSetup.py | 41 | ||||
-rw-r--r-- | resources/libraries/python/honeycomb/HoneycombUtil.py | 1 | ||||
-rw-r--r-- | resources/libraries/python/topology.py | 34 |
5 files changed, 73 insertions, 15 deletions
diff --git a/resources/libraries/python/constants.py b/resources/libraries/python/constants.py index 6e71eb0110..2978f46759 100644 --- a/resources/libraries/python/constants.py +++ b/resources/libraries/python/constants.py @@ -26,7 +26,10 @@ class Constants(object): VAT_BIN_NAME = 'vpp_api_test' # Honeycomb directory location at topology nodes: - REMOTE_HC_DIR = '/opt/honeycomb/vpp-integration-karaf-1.0.0-SNAPSHOT' + REMOTE_HC_DIR = '/opt/honeycomb' + + # Honeycomb persistence files location + REMOTE_HC_PERSIST = '/var/lib/honeycomb/persist' # Honeycomb templates location RESOURCES_TPL_HC = 'resources/templates/honeycomb' diff --git a/resources/libraries/python/honeycomb/HcPersistence.py b/resources/libraries/python/honeycomb/HcPersistence.py index 4d192525d8..3bbc52fa91 100644 --- a/resources/libraries/python/honeycomb/HcPersistence.py +++ b/resources/libraries/python/honeycomb/HcPersistence.py @@ -40,7 +40,7 @@ class HcPersistence(object): :type nodes: list :raises HoneycombError: If persisted configuration could not be removed. """ - cmd = "rm {0}/data/persistence/honeycomb/*".format(Const.REMOTE_HC_DIR) + cmd = "rm -rf {}/*".format(Const.REMOTE_HC_PERSIST) for node in nodes: if node['type'] == NodeType.DUT: ssh = SSH() @@ -60,7 +60,7 @@ class HcPersistence(object): @staticmethod def modify_persistence_files(node, find, replace): - """Searches contents of persistence file config.json for the provided + """Searches contents of persistence file data.json for the provided string, and replaces all occurrences with another string. :param node: Honeycomb node. @@ -74,8 +74,7 @@ class HcPersistence(object): """ argument = "\"s/{0}/{1}/g\"".format(find, replace) - path = "{0}/etc/opendaylight/honeycomb/config.json".format( - Const.REMOTE_HC_DIR) + path = "{0}/config/data.json".format(Const.REMOTE_HC_PERSIST) command = "sed -i {0} {1}".format(argument, path) ssh = SSH() diff --git a/resources/libraries/python/honeycomb/HoneycombSetup.py b/resources/libraries/python/honeycomb/HoneycombSetup.py index 04af9a5a8b..b8c47fac03 100644 --- a/resources/libraries/python/honeycomb/HoneycombSetup.py +++ b/resources/libraries/python/honeycomb/HoneycombSetup.py @@ -58,7 +58,7 @@ class HoneycombSetup(object): logger.console("\nStarting Honeycomb service ...") - cmd = "{0}/bin/start".format(Const.REMOTE_HC_DIR) + cmd = "sudo service honeycomb start" for node in nodes: if node['type'] == NodeType.DUT: @@ -86,7 +86,7 @@ class HoneycombSetup(object): """ logger.console("\nShutting down Honeycomb service ...") - cmd = "{0}/bin/stop".format(Const.REMOTE_HC_DIR) + cmd = "sudo service honeycomb stop" errors = [] for node in nodes: @@ -143,6 +143,13 @@ class HoneycombSetup(object): else: raise HoneycombError('Unexpected return code: {0}.'. format(status_code)) + + status_code, _ = HcUtil.get_honeycomb_data( + node, "config_vpp_interfaces") + if status_code != HTTPCodes.OK: + raise HoneycombError('Honeycomb on node {0} running but ' + 'not yet ready.'.format(node['host']), + enable_logging=False) return True @staticmethod @@ -157,7 +164,7 @@ class HoneycombSetup(object): :return: True if all GETs fail to connect. :rtype bool """ - cmd = "ps -ef | grep -v grep | grep karaf" + cmd = "ps -ef | grep -v grep | grep honeycomb" for node in nodes: if node['type'] == NodeType.DUT: try: @@ -191,6 +198,33 @@ class HoneycombSetup(object): return True @staticmethod + def configure_unsecured_access(*nodes): + """Configure Honeycomb to allow restconf requests through insecure HTTP + used by tests. By default this is only allowed for localhost. + + :param nodes: All nodes in test topology. + :type nodes: dict + :raises HoneycombError: If the configuration could not be changed. + """ + # TODO: Modify tests to use HTTPS instead. + + find = "restconf-binding-address" + replace = '\\"restconf-binding-address\\": \\"0.0.0.0\\",' + + argument = '"/{0}/c\\ {1}"'.format(find, replace) + path = "{0}/config/honeycomb.json".format(Const.REMOTE_HC_DIR) + command = "sed -i {0} {1}".format(argument, path) + + ssh = SSH() + for node in nodes: + if node['type'] == NodeType.DUT: + ssh.connect(node) + (ret_code, _, stderr) = ssh.exec_command_sudo(command) + if ret_code != 0: + raise HoneycombError("Failed to modify configuration on " + "node {0}, {1}".format(node, stderr)) + + @staticmethod def print_environment(nodes): """Print information about the nodes to log. The information is defined by commands in cmds tuple at the beginning of this method. @@ -239,3 +273,4 @@ class HoneycombSetup(object): ssh = SSH() ssh.connect(node) ssh.exec_command_sudo(cmd) + diff --git a/resources/libraries/python/honeycomb/HoneycombUtil.py b/resources/libraries/python/honeycomb/HoneycombUtil.py index 8f1392c972..2b8e28a5a6 100644 --- a/resources/libraries/python/honeycomb/HoneycombUtil.py +++ b/resources/libraries/python/honeycomb/HoneycombUtil.py @@ -86,7 +86,6 @@ class HoneycombError(Exception): self._msg = "{0}: {1}".format(self.__class__.__name__, msg) self._details = details if enable_logging: - logger.error(self._msg) logger.debug(self._details) def __repr__(self): diff --git a/resources/libraries/python/topology.py b/resources/libraries/python/topology.py index a5c67d313c..c02991fbde 100644 --- a/resources/libraries/python/topology.py +++ b/resources/libraries/python/topology.py @@ -278,11 +278,12 @@ class Topology(object): :return: Interface name of the interface connected to the given link. :rtype: str """ - return Topology._get_interface_by_key_value(node, "vpp_sw_index", sw_index) + return Topology._get_interface_by_key_value(node, "vpp_sw_index", + sw_index) @staticmethod def get_interface_sw_index(node, iface_key): - """Get VPP sw_if_index for the interface. + """Get VPP sw_if_index for the interface using interface key. :param node: Node to get interface sw_if_index on. :param iface_key: Interface key from topology file, or sw_index. @@ -300,6 +301,26 @@ class Topology(object): return None @staticmethod + def get_interface_sw_index_by_name(node, iface_name): + """Get VPP sw_if_index for the interface using interface name. + + :param node: Node to get interface sw_if_index on. + :param iface_name: Interface name. + :type node: dict + :type iface_name: str + :return: Return sw_if_index or None if not found. + :raises TypeError: If provided interface name is not a string. + """ + try: + if isinstance(iface_name, basestring): + iface_key = Topology.get_interface_by_name(node, iface_name) + return node['interfaces'][iface_key].get('vpp_sw_index') + else: + raise TypeError("Interface name must be a string.") + except (KeyError, ValueError): + return None + + @staticmethod def get_interface_mtu(node, iface_key): """Get interface MTU. @@ -514,7 +535,7 @@ class Topology(object): if filt == interface['model']: link_names.append(interface['link']) elif (filter_list is not None) and ('model' not in interface): - logger.trace("Cannot apply filter on interface: {}" \ + logger.trace("Cannot apply filter on interface: {}" .format(str(interface))) else: link_names.append(interface['link']) @@ -534,8 +555,8 @@ class Topology(object): :param filter_list_node2: Link filter criteria for node2. :type node1: dict :type node2: dict - :type filter_list1: list of strings - :type filter_list2: list of strings + :type filter_list_node1: list of strings + :type filter_list_node2: list of strings :return: List of strings that represent connecting link names. :rtype: list """ @@ -578,7 +599,8 @@ class Topology(object): else: return connecting_links[0] - @keyword('Get egress interfaces name on "${node1}" for link with "${node2}"') + @keyword('Get egress interfaces name on "${node1}" for link with ' + '"${node2}"') def get_egress_interfaces_name_for_nodes(self, node1, node2): """Get egress interfaces on node1 for link with node2. |