tests: Collect info on failure of conn_tester

Whenever instance of ConnectionTester raises ConnectionTesterException
then custom info is collected and printed into debug log. This is useful
for debugging non-deterministic gate failures.

Change-Id: Ie886dec9c0e805fa8710af8ae3cb70855fd4ad29
This commit is contained in:
Jakub Libosvar 2016-02-09 12:26:29 +00:00
parent 5b7fd5f0f1
commit 00ffb557d6
2 changed files with 28 additions and 0 deletions

View File

@ -15,11 +15,16 @@
import functools
import fixtures
from oslo_log import log as logging
from neutron.agent import firewall
from neutron.agent.linux import ip_lib
from neutron.agent.linux import utils
from neutron.tests.common import machine_fixtures
from neutron.tests.common import net_helpers
LOG = logging.getLogger(__name__)
class ConnectionTesterException(Exception):
pass
@ -108,6 +113,12 @@ class ConnectionTester(fixtures.Fixture):
def peer_ip_address(self):
return self._peer.ip
def collect_debug_info(self, exc_info):
conntrack_entries = utils.execute(['conntrack', '-L'],
run_as_root=True,
check_exit_code=False)
LOG.debug("Conntrack entries:\n%s", conntrack_entries)
def flush_arp_tables(self):
"""Flush arptables in all used namespaces"""
for machine in (self._peer, self._vm):
@ -305,3 +316,19 @@ class LinuxBridgeConnectionTester(ConnectionTester):
def flush_arp_tables(self):
self._bridge.neigh.flush(4, 'all')
super(LinuxBridgeConnectionTester, self).flush_arp_tables()
def collect_debug_info(self, exc_info):
super(LinuxBridgeConnectionTester, self).collect_debug_info(exc_info)
ip_wrapper = ip_lib.IPWrapper(self.bridge_namespace)
ipt_rules = ip_wrapper.netns.execute(['iptables', '-L', '-nv'],
run_as_root=True)
LOG.debug('iptables rules in %s namespace:\n%s',
self.bridge_namespace,
ipt_rules)
for namespace in (self.vm_namespace, self.peer_namespace):
ip_wrapper = ip_lib.IPWrapper(namespace)
ip_output = ip_wrapper.netns.execute(['ip', 'a'],
run_as_root=True)
LOG.debug('"ip a" in namespace %s:\n%s',
namespace,
ip_output)

View File

@ -86,6 +86,7 @@ class FirewallTestCase(base.BaseSudoTestCase):
super(FirewallTestCase, self).setUp()
self.tester = self.useFixture(
conn_testers.LinuxBridgeConnectionTester())
self.addOnException(self.tester.collect_debug_info)
self.firewall = self.create_iptables_firewall()
vm_mac = self.tester.vm_mac_address
vm_port_id = self.tester.vm_port_id