mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-07 19:10:35 +00:00
bgp_multiview_topo1: Skip remaining on fatal error and try to get more crash info of daemon is not running
This commit is contained in:
parent
586e15c4fb
commit
2cda38e488
@ -33,6 +33,8 @@ import re
|
|||||||
import sys
|
import sys
|
||||||
import difflib
|
import difflib
|
||||||
import StringIO
|
import StringIO
|
||||||
|
import glob
|
||||||
|
import subprocess
|
||||||
|
|
||||||
from mininet.topo import Topo
|
from mininet.topo import Topo
|
||||||
from mininet.net import Mininet
|
from mininet.net import Mininet
|
||||||
@ -46,6 +48,8 @@ from time import sleep
|
|||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
|
fatal_error = ""
|
||||||
|
|
||||||
def int2dpid(dpid):
|
def int2dpid(dpid):
|
||||||
"Converting Integer to DPID"
|
"Converting Integer to DPID"
|
||||||
|
|
||||||
@ -82,6 +86,11 @@ class QuaggaRouter(Node):
|
|||||||
# Enable forwarding on the router
|
# Enable forwarding on the router
|
||||||
self.cmd('sysctl net.ipv4.ip_forward=1')
|
self.cmd('sysctl net.ipv4.ip_forward=1')
|
||||||
self.cmd('sysctl net.ipv6.conf.all.forwarding=1')
|
self.cmd('sysctl net.ipv6.conf.all.forwarding=1')
|
||||||
|
# Enable coredumps
|
||||||
|
self.cmd('sysctl kernel.core_uses_pid=1')
|
||||||
|
self.cmd('sysctl fs.suid_dumpable=2')
|
||||||
|
self.cmd("sysctl kernel.core_pattern=/tmp/%s_%%e_core-sig_%%s-pid_%%p.dmp" % self.name)
|
||||||
|
# Set ownership of config files
|
||||||
self.cmd('chown quagga:quaggavty /etc/quagga')
|
self.cmd('chown quagga:quaggavty /etc/quagga')
|
||||||
self.daemons = {'zebra': 0, 'ripd': 0, 'ripngd': 0, 'ospfd': 0,
|
self.daemons = {'zebra': 0, 'ripd': 0, 'ripngd': 0, 'ospfd': 0,
|
||||||
'ospf6d': 0, 'isisd': 0, 'bgpd': 0, 'pimd': 0}
|
'ospf6d': 0, 'isisd': 0, 'bgpd': 0, 'pimd': 0}
|
||||||
@ -121,6 +130,10 @@ class QuaggaRouter(Node):
|
|||||||
with open("/etc/quagga/vtysh.conf", "w") as vtyshfile:
|
with open("/etc/quagga/vtysh.conf", "w") as vtyshfile:
|
||||||
vtyshfile.write('no service integrated-vtysh-config')
|
vtyshfile.write('no service integrated-vtysh-config')
|
||||||
self.cmd('chown quagga:quaggavty /etc/quagga/vtysh.conf')
|
self.cmd('chown quagga:quaggavty /etc/quagga/vtysh.conf')
|
||||||
|
# Try to find relevant old logfiles in /tmp and delete them
|
||||||
|
map(os.remove, glob.glob("/tmp/*%s*.log" % self.name))
|
||||||
|
# Remove old core files
|
||||||
|
map(os.remove, glob.glob("/tmp/%s*.dmp" % self.name))
|
||||||
# Remove IP addresses from OS first - we have them in zebra.conf
|
# Remove IP addresses from OS first - we have them in zebra.conf
|
||||||
self.removeIPs()
|
self.removeIPs()
|
||||||
# Start Zebra first
|
# Start Zebra first
|
||||||
@ -139,11 +152,27 @@ class QuaggaRouter(Node):
|
|||||||
self.waitOutput()
|
self.waitOutput()
|
||||||
print('%s: %s started' % (self, daemon))
|
print('%s: %s started' % (self, daemon))
|
||||||
def checkQuaggaRunning(self):
|
def checkQuaggaRunning(self):
|
||||||
|
global fatal_error
|
||||||
|
|
||||||
daemonsRunning = self.cmd('vtysh -c "show log" | grep "Logging configuration for"')
|
daemonsRunning = self.cmd('vtysh -c "show log" | grep "Logging configuration for"')
|
||||||
for daemon in self.daemons:
|
for daemon in self.daemons:
|
||||||
if (self.daemons[daemon] == 1):
|
if (self.daemons[daemon] == 1) and not (daemon in daemonsRunning):
|
||||||
assert daemon in daemonsRunning, "Daemon %s not running" % daemon
|
sys.stderr.write("%s: Daemon %s not running\n" % (self.name, daemon))
|
||||||
|
# Look for core file
|
||||||
|
corefiles = glob.glob("/tmp/%s_%s_core*.dmp" % (self.name, daemon))
|
||||||
|
if (len(corefiles) > 0):
|
||||||
|
backtrace = subprocess.check_output(["gdb /usr/lib/quagga/%s %s --batch -ex bt" % (daemon, corefiles[0])], shell=True)
|
||||||
|
sys.stderr.write("%s %s crashed. Core file found - Backtrace follows:\n" % (self.name, daemon))
|
||||||
|
sys.stderr.write("%s\n" % backtrace)
|
||||||
|
else:
|
||||||
|
# No core found - If we find matching logfile in /tmp, then print last 20 lines from it.
|
||||||
|
if os.path.isfile("/tmp/%s-%s.log" % (self.name, daemon)):
|
||||||
|
log_tail = subprocess.check_output(["tail -n20 /tmp/%s-%s.log" % (self.name, daemon)], shell=True)
|
||||||
|
sys.stderr.write("From quagga %s %s log file:\n" % (self.name, daemon))
|
||||||
|
sys.stderr.write("%s\n" % log_tail)
|
||||||
|
|
||||||
|
fatal_error = "%s: Daemon %s not running" % (self.name, daemon)
|
||||||
|
assert False, "%s: Daemon %s not running" % (self.name, daemon)
|
||||||
|
|
||||||
class LegacySwitch(OVSSwitch):
|
class LegacySwitch(OVSSwitch):
|
||||||
"A Legacy Switch without OpenFlow"
|
"A Legacy Switch without OpenFlow"
|
||||||
@ -256,8 +285,13 @@ def teardown_module(module):
|
|||||||
net.stop()
|
net.stop()
|
||||||
|
|
||||||
def test_quagga_running():
|
def test_quagga_running():
|
||||||
|
global fatal_error
|
||||||
global net
|
global net
|
||||||
|
|
||||||
|
# Skip if previous fatal error condition is raised
|
||||||
|
if (fatal_error != ""):
|
||||||
|
pytest.skip(fatal_error)
|
||||||
|
|
||||||
print("\n\n** Check if Quagga is running on each Router node")
|
print("\n\n** Check if Quagga is running on each Router node")
|
||||||
print("******************************************\n")
|
print("******************************************\n")
|
||||||
sleep(5)
|
sleep(5)
|
||||||
@ -269,8 +303,13 @@ def test_quagga_running():
|
|||||||
def test_bgp_converge():
|
def test_bgp_converge():
|
||||||
"Check for BGP converged on all peers and BGP views"
|
"Check for BGP converged on all peers and BGP views"
|
||||||
|
|
||||||
|
global fatal_error
|
||||||
global net
|
global net
|
||||||
|
|
||||||
|
# Skip if previous fatal error condition is raised
|
||||||
|
if (fatal_error != ""):
|
||||||
|
pytest.skip(fatal_error)
|
||||||
|
|
||||||
# Wait for BGP to converge (All Neighbors in either Full or TwoWay State)
|
# Wait for BGP to converge (All Neighbors in either Full or TwoWay State)
|
||||||
print("\n\n** Verify for BGP to converge")
|
print("\n\n** Verify for BGP to converge")
|
||||||
print("******************************************\n")
|
print("******************************************\n")
|
||||||
@ -297,7 +336,6 @@ def test_bgp_converge():
|
|||||||
else:
|
else:
|
||||||
# Bail out with error if a router fails to converge
|
# Bail out with error if a router fails to converge
|
||||||
bgpStatus = net['r%s' % i].cmd('show ip bgp view %s summary"')
|
bgpStatus = net['r%s' % i].cmd('show ip bgp view %s summary"')
|
||||||
|
|
||||||
assert False, "BGP did not converge:\n%s" % bgpStatus
|
assert False, "BGP did not converge:\n%s" % bgpStatus
|
||||||
|
|
||||||
print("BGP converged.")
|
print("BGP converged.")
|
||||||
@ -311,8 +349,13 @@ def test_bgp_converge():
|
|||||||
# CLI(net)
|
# CLI(net)
|
||||||
|
|
||||||
def test_bgp_routingTable():
|
def test_bgp_routingTable():
|
||||||
|
global fatal_error
|
||||||
global net
|
global net
|
||||||
|
|
||||||
|
# Skip if previous fatal error condition is raised
|
||||||
|
if (fatal_error != ""):
|
||||||
|
pytest.skip(fatal_error)
|
||||||
|
|
||||||
thisDir = os.path.dirname(os.path.realpath(__file__))
|
thisDir = os.path.dirname(os.path.realpath(__file__))
|
||||||
|
|
||||||
# Verify OSPFv3 Routing Table
|
# Verify OSPFv3 Routing Table
|
||||||
@ -362,5 +405,7 @@ def test_bgp_routingTable():
|
|||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
|
||||||
setLogLevel('info')
|
setLogLevel('info')
|
||||||
|
# To suppress tracebacks, either use the following pytest call or add "--tb=no" to cli
|
||||||
|
# retval = pytest.main(["-s", "--tb=no"])
|
||||||
retval = pytest.main(["-s"])
|
retval = pytest.main(["-s"])
|
||||||
sys.exit(retval)
|
sys.exit(retval)
|
||||||
|
Loading…
Reference in New Issue
Block a user