From: Martin Winter Date: Sun, 27 Nov 2016 01:30:22 +0000 (-0800) Subject: ospf6-topo1: Add check for Linux Kernel Routing Table as well and change to better... X-Git-Tag: frr-7.1-dev~151^2~364 X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=2bdcdbd1b8afbf1a0fedb9a14dc80ccc5f6dca9e;p=matthieu%2Ffrr.git ospf6-topo1: Add check for Linux Kernel Routing Table as well and change to better human readable context diff --- diff --git a/tests/topotests/ospf6-topo1/r1/ip_6_address.ref b/tests/topotests/ospf6-topo1/r1/ip_6_address.ref new file mode 100644 index 0000000000..2f7e246c15 --- /dev/null +++ b/tests/topotests/ospf6-topo1/r1/ip_6_address.ref @@ -0,0 +1,13 @@ +fc00:1:1:1::/64 dev r1-stubnet proto kernel metric 256 pref medium +fc00:2:2:2::/64 via fe80::__(r2-sw5)__ dev r1-sw5 proto zebra metric 20 pref medium +fc00:3:3:3::/64 via fe80::__(r3-sw5)__ dev r1-sw5 proto zebra metric 20 pref medium +fc00:4:4:4::/64 via fe80::__(r3-sw5)__ dev r1-sw5 proto zebra metric 20 pref medium +fc00:a:a:a::/64 dev r1-sw5 proto kernel metric 256 pref medium +fc00:b:b:b::/64 via fe80::__(r3-sw5)__ dev r1-sw5 proto zebra metric 20 pref medium +fc00:1111:1111:1111::/64 via fc00:1:1:1::1234 dev r1-stubnet proto zebra metric 20 pref medium +fc00:2222:2222:2222::/64 via fe80::__(r2-sw5)__ dev r1-sw5 proto zebra metric 20 pref medium +fc00:3333:3333:3333::/64 via fe80::__(r3-sw5)__ dev r1-sw5 proto zebra metric 20 pref medium +fc00:4444:4444:4444::/64 via fe80::__(r3-sw5)__ dev r1-sw5 proto zebra metric 20 pref medium +unreachable fe80::/64 dev lo proto kernel metric 256 error -101 pref medium +fe80::/64 dev r1-stubnet proto kernel metric 256 pref medium +fe80::/64 dev r1-sw5 proto kernel metric 256 pref medium diff --git a/tests/topotests/ospf6-topo1/r2/ip_6_address.ref b/tests/topotests/ospf6-topo1/r2/ip_6_address.ref new file mode 100644 index 0000000000..5dd539f038 --- /dev/null +++ b/tests/topotests/ospf6-topo1/r2/ip_6_address.ref @@ -0,0 +1,13 @@ +fc00:1:1:1::/64 via fe80::__(r1-sw5)__ dev r2-sw5 proto zebra metric 20 pref medium +fc00:2:2:2::/64 dev r2-stubnet proto kernel metric 256 pref medium +fc00:3:3:3::/64 via fe80::__(r3-sw5)__ dev r2-sw5 proto zebra metric 20 pref medium +fc00:4:4:4::/64 via fe80::__(r3-sw5)__ dev r2-sw5 proto zebra metric 20 pref medium +fc00:a:a:a::/64 dev r2-sw5 proto kernel metric 256 pref medium +fc00:b:b:b::/64 via fe80::__(r3-sw5)__ dev r2-sw5 proto zebra metric 20 pref medium +fc00:1111:1111:1111::/64 via fe80::__(r1-sw5)__ dev r2-sw5 proto zebra metric 20 pref medium +fc00:2222:2222:2222::/64 via fc00:2:2:2::1234 dev r2-stubnet proto zebra metric 20 pref medium +fc00:3333:3333:3333::/64 via fe80::__(r3-sw5)__ dev r2-sw5 proto zebra metric 20 pref medium +fc00:4444:4444:4444::/64 via fe80::__(r3-sw5)__ dev r2-sw5 proto zebra metric 20 pref medium +unreachable fe80::/64 dev lo proto kernel metric 256 error -101 pref medium +fe80::/64 dev r2-stubnet proto kernel metric 256 pref medium +fe80::/64 dev r2-sw5 proto kernel metric 256 pref medium diff --git a/tests/topotests/ospf6-topo1/r3/ip_6_address.ref b/tests/topotests/ospf6-topo1/r3/ip_6_address.ref new file mode 100644 index 0000000000..ce54ceced9 --- /dev/null +++ b/tests/topotests/ospf6-topo1/r3/ip_6_address.ref @@ -0,0 +1,14 @@ +fc00:1:1:1::/64 via fe80::__(r1-sw5)__ dev r3-sw5 proto zebra metric 20 pref medium +fc00:2:2:2::/64 via fe80::__(r2-sw5)__ dev r3-sw5 proto zebra metric 20 pref medium +fc00:3:3:3::/64 dev r3-stubnet proto kernel metric 256 pref medium +fc00:4:4:4::/64 via fe80::__(r4-sw6)__ dev r3-sw6 proto zebra metric 20 pref medium +fc00:a:a:a::/64 dev r3-sw5 proto kernel metric 256 pref medium +fc00:b:b:b::/64 dev r3-sw6 proto kernel metric 256 pref medium +fc00:1111:1111:1111::/64 via fe80::__(r1-sw5)__ dev r3-sw5 proto zebra metric 20 pref medium +fc00:2222:2222:2222::/64 via fe80::__(r2-sw5)__ dev r3-sw5 proto zebra metric 20 pref medium +fc00:3333:3333:3333::/64 via fc00:3:3:3::1234 dev r3-stubnet proto zebra metric 20 pref medium +fc00:4444:4444:4444::/64 via fe80::__(r4-sw6)__ dev r3-sw6 proto zebra metric 20 pref medium +unreachable fe80::/64 dev lo proto kernel metric 256 error -101 pref medium +fe80::/64 dev r3-stubnet proto kernel metric 256 pref medium +fe80::/64 dev r3-sw5 proto kernel metric 256 pref medium +fe80::/64 dev r3-sw6 proto kernel metric 256 pref medium diff --git a/tests/topotests/ospf6-topo1/r4/ip_6_address.ref b/tests/topotests/ospf6-topo1/r4/ip_6_address.ref new file mode 100644 index 0000000000..e7307f0088 --- /dev/null +++ b/tests/topotests/ospf6-topo1/r4/ip_6_address.ref @@ -0,0 +1,13 @@ +fc00:1:1:1::/64 via fe80::__(r3-sw6)__ dev r4-sw6 proto zebra metric 20 pref medium +fc00:2:2:2::/64 via fe80::__(r3-sw6)__ dev r4-sw6 proto zebra metric 20 pref medium +fc00:3:3:3::/64 via fe80::__(r3-sw6)__ dev r4-sw6 proto zebra metric 20 pref medium +fc00:4:4:4::/64 dev r4-stubnet proto kernel metric 256 pref medium +fc00:a:a:a::/64 via fe80::__(r3-sw6)__ dev r4-sw6 proto zebra metric 20 pref medium +fc00:b:b:b::/64 dev r4-sw6 proto kernel metric 256 pref medium +fc00:1111:1111:1111::/64 via fe80::__(r3-sw6)__ dev r4-sw6 proto zebra metric 20 pref medium +fc00:2222:2222:2222::/64 via fe80::__(r3-sw6)__ dev r4-sw6 proto zebra metric 20 pref medium +fc00:3333:3333:3333::/64 via fe80::__(r3-sw6)__ dev r4-sw6 proto zebra metric 20 pref medium +fc00:4444:4444:4444::/64 via fc00:4:4:4::1234 dev r4-stubnet proto zebra metric 20 pref medium +unreachable fe80::/64 dev lo proto kernel metric 256 error -101 pref medium +fe80::/64 dev r4-stubnet proto kernel metric 256 pref medium +fe80::/64 dev r4-sw6 proto kernel metric 256 pref medium diff --git a/tests/topotests/ospf6-topo1/test_ospf6_topo1.py b/tests/topotests/ospf6-topo1/test_ospf6_topo1.py index 12bcbe332c..09dc538baf 100755 --- a/tests/topotests/ospf6-topo1/test_ospf6_topo1.py +++ b/tests/topotests/ospf6-topo1/test_ospf6_topo1.py @@ -215,6 +215,30 @@ class QuaggaRouter(Node): fatal_error = "%s: Daemon %s not running" % (self.name, daemon) assert False, "%s: Daemon %s not running" % (self.name, daemon) + def get_ipv6_linklocal(self): + "Get LinkLocal Addresses from interfaces" + + linklocal = [] + + ifaces = self.cmd('ip -6 address') + # Fix newlines (make them all the same) + ifaces = ('\n'.join(ifaces.splitlines()) + '\n').splitlines() + interface="" + ll_per_if_count=0 + for line in ifaces: + m = re.search('[0-9]+: ([^:@]+)[@if0-9:]+ <', line) + if m: + interface = m.group(1) + ll_per_if_count = 0 + m = re.search('inet6 (fe80::[0-9a-f]+:[0-9a-f]+:[0-9a-f]+:[0-9a-f]+)[/0-9]* scope link', line) + if m: + local = m.group(1) + ll_per_if_count += 1 + if (ll_per_if_count > 1): + linklocal += [["%s-%s" % (interface, ll_per_if_count), local]] + else: + linklocal += [[interface, local]] + return linklocal class LegacySwitch(OVSSwitch): @@ -337,7 +361,7 @@ def test_ospf6_converged(): pytest.skip(fatal_error) # Wait for OSPF6 to converge (All Neighbors in either Full or TwoWay State) - print("\n\n** Verify for OSPF6 daemons to converge") + print("\n\n** Verify OSPF6 daemons to converge") print("******************************************\n") timeout = 60 while timeout > 0: @@ -370,7 +394,7 @@ def test_ospf6_converged(): print("\nwaiting 15s for routes to populate") sleep(15) -def test_ospf6_routingTable(): +def test_ospfv3_routingTable(): global fatal_error global net @@ -402,16 +426,79 @@ def test_ospf6_routingTable(): actual = ('\n'.join(actual.splitlines()) + '\n').splitlines(1) # Generate Diff - diff = ''.join(difflib.unified_diff(actual, expected)) + diff = ''.join(difflib.context_diff(actual, expected, + fromfile="actual OSPFv3 IPv6 routing table", + tofile="expected OSPFv3 IPv6 routing table")) + # Empty string if it matches, otherwise diff contains unified diff + if diff: + sys.stderr.write('r%s failed OSPFv3 (IPv6) Routing Table Check:\n%s\n' % (i, diff)) + failures += 1 + else: + print("r%s ok" % i) + + assert failures == 0, "OSPFv3 (IPv6) Routing Table verification failed for router r%s:\n%s" % (i, diff) + + # For debugging after starting Quagga daemons, uncomment the next line + # CLI(net) + +def test_linux_ipv6_kernel_routingTable(): + global fatal_error + 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__)) + # Verify Linux Kernel Routing Table + print("\n\n** Verifing Linux IPv6 Kernel Routing Table") + print("******************************************\n") + failures = 0 + + # Get a list of all current link-local addresses first as they change for + # each run and we need to translate them + linklocals = [] + for i in range(1, 5): + linklocals += net['r%s' % i].get_ipv6_linklocal() + + # Now compare the routing tables (after substituting link-local addresses) + for i in range(1, 5): + refTableFile = '%s/r%s/ip_6_address.ref' % (thisDir, i) + if os.path.isfile(refTableFile): + + expected = open(refTableFile).read().rstrip() + # Fix newlines (make them all the same) + expected = ('\n'.join(expected.splitlines())).splitlines(1) + + # Actual output from router + actual = net['r%s' % i].cmd('ip -6 route').rstrip() + # Mask out Link-Local mac addresses + for ll in linklocals: + actual = actual.replace(ll[1], "fe80::__(%s)__" % ll[0]) + + # Fix newlines (make them all the same) + actual = ('\n'.join(actual.splitlines())).splitlines(1) + + # Print Actual table + # print("Router r%s table" % i) + # for line in actual: + # print(line.rstrip()) + + # Generate Diff + diff = ''.join(difflib.context_diff(actual, expected, + fromfile="actual IPv6 kernel routing table", + tofile="expected IPv6 kernel routing table")) + + # Empty string if it matches, otherwise diff contains unified diff if diff: - sys.stderr.write('r%s failed Routing Table Check:\n%s\n' % (i, diff)) + sys.stderr.write('r%s failed Linux IPv6 Kernel Routing Table Check:\n%s\n' % (i, diff)) failures += 1 else: print("r%s ok" % i) - assert failures == 0, "Routing Table verification failed for router r%s:\n%s" % (i, diff) + assert failures == 0, "Linux Kernel IPv6 Routing Table verification failed for router r%s:\n%s" % (i, diff) # For debugging after starting Quagga daemons, uncomment the next line # CLI(net)