]> git.puffer.fish Git - mirror/frr.git/commitdiff
ospf6-topo1: Add check for Linux Kernel Routing Table as well and change to better...
authorMartin Winter <mwinter@netdef.org>
Sun, 27 Nov 2016 01:30:22 +0000 (17:30 -0800)
committerDonald Sharp <sharpd@cumulusnetworks.com>
Wed, 28 Nov 2018 01:22:11 +0000 (20:22 -0500)
tests/topotests/ospf6-topo1/r1/ip_6_address.ref [new file with mode: 0644]
tests/topotests/ospf6-topo1/r2/ip_6_address.ref [new file with mode: 0644]
tests/topotests/ospf6-topo1/r3/ip_6_address.ref [new file with mode: 0644]
tests/topotests/ospf6-topo1/r4/ip_6_address.ref [new file with mode: 0644]
tests/topotests/ospf6-topo1/test_ospf6_topo1.py

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 (file)
index 0000000..2f7e246
--- /dev/null
@@ -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 (file)
index 0000000..5dd539f
--- /dev/null
@@ -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 (file)
index 0000000..ce54cec
--- /dev/null
@@ -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 (file)
index 0000000..e7307f0
--- /dev/null
@@ -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
index 12bcbe332c8fedab7fa63e4aa913e09e2b359463..09dc538bafc86a2d554e500cb9add081ab7678b8 100755 (executable)
@@ -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)