aboutsummaryrefslogtreecommitdiffstats
path: root/resources/libraries/python
diff options
context:
space:
mode:
authorselias <samelias@cisco.com>2016-09-13 16:51:37 +0200
committerPeter Mikus <pmikus@cisco.com>2016-10-03 06:41:33 +0000
commit19c91adadd57bfc4e7514993b2a711a826d52e04 (patch)
tree5c7656c69c6a3936838c5c6ddcf9313e7e98a6ba /resources/libraries/python
parentc75b9804c9510d0a342563e41407089145b38d50 (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.py5
-rw-r--r--resources/libraries/python/honeycomb/HcPersistence.py7
-rw-r--r--resources/libraries/python/honeycomb/HoneycombSetup.py41
-rw-r--r--resources/libraries/python/honeycomb/HoneycombUtil.py1
-rw-r--r--resources/libraries/python/topology.py34
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.