]> git.proxmox.com Git - mirror_frr.git/commitdiff
tests: Add another router to the basic pim tests
authorDonald Sharp <sharpd@cumulusnetworks.com>
Sat, 18 Jan 2020 14:16:10 +0000 (09:16 -0500)
committerDonald Sharp <sharpd@cumulusnetworks.com>
Sat, 18 Jan 2020 18:47:29 +0000 (13:47 -0500)
Add an additional router to the basic pim tests.
1) This test will add a link between r1 and a new rp
2) This test will ensure that r1 and rp have the expected
who is the rp.
3) This test will ensure that the rp has received the upstream
data for the multicast stream that is started.

Ostensibly commit
68a02e06e5f103048d947262c08c569056f74d1c is the first bad commit
commit 68a02e06e5f103048d947262c08c569056f74d1c
Author: Mark Stapp <mjs@voltanet.io>
Date:   Wed Nov 13 16:06:06 2019 -0500
    *: revise zapi nexthop encoding
    Use a per-nexthop flag to indicate the presence of labels; add
    some utility zapi encode/decode apis for nexthops; use the zapi
    apis more consistently.
Signed-off-by: Mark Stapp <mjs@voltanet.io>
Sparked this commit in that it broke nexthop reporting to upper
level protocols.  Ensure that this expectation stays working
in the future.

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
tests/topotests/pim-basic/r1/bgpd.conf [new file with mode: 0644]
tests/topotests/pim-basic/r1/pimd.conf
tests/topotests/pim-basic/r1/rp-info.json [new file with mode: 0644]
tests/topotests/pim-basic/r1/zebra.conf
tests/topotests/pim-basic/rp/bgpd.conf [new file with mode: 0644]
tests/topotests/pim-basic/rp/pimd.conf [new file with mode: 0644]
tests/topotests/pim-basic/rp/upstream.json [new file with mode: 0644]
tests/topotests/pim-basic/rp/zebra.conf [new file with mode: 0644]
tests/topotests/pim-basic/test_pim.py

diff --git a/tests/topotests/pim-basic/r1/bgpd.conf b/tests/topotests/pim-basic/r1/bgpd.conf
new file mode 100644 (file)
index 0000000..8acaac9
--- /dev/null
@@ -0,0 +1,3 @@
+router bgp 65001
+  neighbor 10.0.30.3 remote-as external
+  redistribute connected
index 5740c66e24212792d90dbaca3ea2d61f5120cbe8..cec765699d8bc7abeac57dbe09da9978746fbab5 100644 (file)
@@ -2,9 +2,12 @@ hostname r1
 !
 interface r1-eth0
   ip igmp
-  ip pim sm
+  ip pim
+!
+interface r1-eth1
+  ip pim
 !
 interface lo
-  ip pim sm
+  ip pim
 !
-ip pim rp 10.254.0.1
+ip pim rp 10.254.0.3
diff --git a/tests/topotests/pim-basic/r1/rp-info.json b/tests/topotests/pim-basic/r1/rp-info.json
new file mode 100644 (file)
index 0000000..1f713c2
--- /dev/null
@@ -0,0 +1,9 @@
+{
+  "10.254.0.3":[
+    {
+      "outboundInterface":"r1-eth1",
+      "group":"224.0.0.0\/4",
+      "source":"Static"
+    }
+  ]
+}
index 2bf71294d03f6fe2d4ad91321a80fbcccfcf0620..b0a25f12aad4e076d14e3aee337919a3277f1e1d 100644 (file)
@@ -3,6 +3,9 @@ hostname r1
 interface r1-eth0
  ip address 10.0.20.1/24
 !
+interface r1-eth1
+ ip address 10.0.30.1/24
+!
 interface lo
  ip address 10.254.0.1/32
 !
diff --git a/tests/topotests/pim-basic/rp/bgpd.conf b/tests/topotests/pim-basic/rp/bgpd.conf
new file mode 100644 (file)
index 0000000..6b16c06
--- /dev/null
@@ -0,0 +1,3 @@
+router bgp 65003
+   neighbor 10.0.30.1 remote-as external
+   redistribute connected
diff --git a/tests/topotests/pim-basic/rp/pimd.conf b/tests/topotests/pim-basic/rp/pimd.conf
new file mode 100644 (file)
index 0000000..3f1b4d6
--- /dev/null
@@ -0,0 +1,9 @@
+hostname rp
+!
+interface rp-eth0
+  ip pim
+!
+interface lo
+  ip pim
+!
+ip pim rp 10.254.0.3
diff --git a/tests/topotests/pim-basic/rp/upstream.json b/tests/topotests/pim-basic/rp/upstream.json
new file mode 100644 (file)
index 0000000..c33dea4
--- /dev/null
@@ -0,0 +1,17 @@
+{
+  "229.1.1.1":{
+    "10.0.20.2":{
+      "sourceStream":true,
+      "inboundInterface":"rp-eth0",
+      "rpfAddress":"10.0.20.2",
+      "source":"10.0.20.2",
+      "group":"229.1.1.1",
+      "state":"NotJ",
+      "joinState":"NotJoined",
+      "regState":"RegNoInfo",
+      "resetTimer":"--:--:--",
+      "refCount":1,
+      "sptBit":0
+    }
+  }
+}
diff --git a/tests/topotests/pim-basic/rp/zebra.conf b/tests/topotests/pim-basic/rp/zebra.conf
new file mode 100644 (file)
index 0000000..0a1359e
--- /dev/null
@@ -0,0 +1,8 @@
+hostname rp
+!
+interface rp-eth0
+ ip address 10.0.30.3/24
+!
+interface lo
+ ip address 10.254.0.3/32
+!
index 6d54b8f2f022f0120569203fb854fff640c9208f..0e0569e23461fe4ae84a82dadabb501eb65aebea 100644 (file)
@@ -28,6 +28,8 @@ test_pim.py: Test pim
 import os
 import sys
 import pytest
+import json
+from functools import partial
 
 CWD = os.path.dirname(os.path.realpath(__file__))
 sys.path.append(os.path.join(CWD, '../'))
@@ -47,11 +49,27 @@ class PIMTopo(Topo):
         for routern in range(1, 3):
             tgen.add_router('r{}'.format(routern))
 
+        tgen.add_router('rp')
+
+        # r1 -> .1
+        # r2 -> .2
+        # rp -> .3
+        # loopback network is 10.254.0.X/32
+        #
         # r1 <- sw1 -> r2
+        # r1-eth0 <-> r2-eth0
+        # 10.0.20.0/24
         sw = tgen.add_switch('sw1')
         sw.add_link(tgen.gears['r1'])
         sw.add_link(tgen.gears['r2'])
 
+        # r1 <- sw2 -> rp
+        # r1-eth1 <-> rp-eth0
+        # 10.0.30.0/24
+        sw = tgen.add_switch('sw2')
+        sw.add_link(tgen.gears['r1'])
+        sw.add_link(tgen.gears['rp'])
+
 
 def setup_module(mod):
     "Sets up the pytest environment"
@@ -68,9 +86,14 @@ def setup_module(mod):
             TopoRouter.RD_PIM,
             os.path.join(CWD, '{}/pimd.conf'.format(rname))
         )
+        router.load_config(
+            TopoRouter.RD_BGP,
+            os.path.join(CWD, '{}/bgpd.conf'.format(rname))
+            )
 
     # After loading the configurations, this function loads configured daemons.
     tgen.start_router()
+    #tgen.mininet_cli()
 
 
 def teardown_module(mod):
@@ -80,6 +103,22 @@ def teardown_module(mod):
     # This function tears down the whole topology.
     tgen.stop_topology()
 
+def test_pim_rp_setup():
+    "Ensure basic routing has come up and the rp has an outgoing interface"
+    #Ensure rp and r1 establish pim neighbor ship and bgp has come up
+    #Finally ensure that the rp has an outgoing interface on r1
+    tgen = get_topogen()
+
+    r1 = tgen.gears['r1']
+    json_file = '{}/{}/rp-info.json'.format(CWD, r1.name)
+    expected = json.loads(open(json_file).read())
+
+    test_func = partial(topotest.router_json_cmp,
+                        r1, 'show ip pim rp-info json', expected)
+    _, result = topotest.run_and_expect(test_func, None, count=15, wait=5)
+    assertmsg = '"{}" JSON output mismatches'.format(r1.name)
+    assert result is None, assertmsg
+    #tgen.mininet_cli()
 
 def test_pim_send_mcast_stream():
     "Establish a Multicast stream from r2 -> r1 and then ensure S,G is created as appropriate"
@@ -90,6 +129,7 @@ def test_pim_send_mcast_stream():
     if tgen.routers_have_failure():
         pytest.skip(tgen.errors)
 
+    rp = tgen.gears['rp']
     r2 = tgen.gears['r2']
     r1 = tgen.gears['r1']
 
@@ -111,7 +151,21 @@ def test_pim_send_mcast_stream():
     }
 
     assert topotest.json_cmp(out, expected) is None, 'failed to converge pim'
+    #tgen.mininet_cli()
+
+def test_pim_rp_sees_stream():
+    "Ensure that the RP sees the stream and has acted accordingly"
+    tgen = get_topogen()
+
+    rp = tgen.gears['rp']
+    json_file = '{}/{}/upstream.json'.format(CWD, rp.name)
+    expected = json.loads(open(json_file).read())
 
+    test_func = partial(topotest.router_json_cmp,
+                        rp, 'show ip pim upstream json', expected)
+    _, result = topotest.run_and_expect(test_func, None, count=20, wait=.5)
+    assertmsg = '"{}" JSON output mismatches'.format(rp.name)
+    assert result is None, assertmsg
 
 def test_pim_igmp_report():
     "Send a igmp report from r2->r1 and ensure that the *,G state is created on r1"