]> git.puffer.fish Git - mirror/frr.git/commitdiff
tests: Add some test cases for snmp
authorDonald Sharp <sharpd@nvidia.com>
Tue, 24 Sep 2024 14:46:11 +0000 (10:46 -0400)
committerDonald Sharp <sharpd@nvidia.com>
Mon, 25 Nov 2024 18:12:10 +0000 (13:12 -0500)
Noticed that we were not really attempting to even test
large swaths of our snmp infrastructure.  Let's load
up some very simple configs for those daemons that
FRR supports and ensure that SNMP is working to
some extent.

Signed-off-by: Donald Sharp <sharpd@nvidia.com>
tests/topotests/lib/snmptest.py
tests/topotests/simple_snmp_test/r1/isisd.conf
tests/topotests/simple_snmp_test/r1/ospf6d.conf [new file with mode: 0644]
tests/topotests/simple_snmp_test/r1/ospfd.conf [new file with mode: 0644]
tests/topotests/simple_snmp_test/r1/ripd.conf [new file with mode: 0644]
tests/topotests/simple_snmp_test/r1/zebra.conf
tests/topotests/simple_snmp_test/test_simple_snmp.py

index 8e2e76d154b4e5e30b6882ab6cbfbe9a509f7515..6d586cee507429086ea714b21a299bf5a8ff1230 100644 (file)
@@ -104,12 +104,16 @@ class SnmpTester(object):
             return None
         return self._get_snmp_value(result)
 
-    def walk(self, oid):
+    def walk(self, oid, raw=False):
         cmd = "snmpwalk {0} {1} 2>&1 | grep -v SNMPv2-PDU".format(
             self._snmp_config(), oid
         )
 
         result = self.router.cmd(cmd)
+
+        if raw:
+            return result
+
         return self._parse_multiline(result)
 
     def parse_notif_ipv4(self, notif):
index 435abde330dfa82f200bb0cf21c41ca95c354d87..c53d2509e2d50488251ddf3444dffbd5cef1c621 100644 (file)
@@ -3,6 +3,8 @@ log stdout debugging
 ! debug isis route-events
 ! debug isis events
 !
+agentx
+!
 interface r1-eth0
   ip router isis ISIS1
   ipv6 router isis ISIS1
diff --git a/tests/topotests/simple_snmp_test/r1/ospf6d.conf b/tests/topotests/simple_snmp_test/r1/ospf6d.conf
new file mode 100644 (file)
index 0000000..e811517
--- /dev/null
@@ -0,0 +1,12 @@
+agentx
+
+int r1-eth0
+  ipv6 ospf6 area 0.0.0.0
+
+int r1-eth1
+  ipv6 ospf6 area 0.0.0.0
+int r1-eth2
+  ipv6 ospf6 area 0.0.0.0
+
+router ospf6
+  redistribute local
\ No newline at end of file
diff --git a/tests/topotests/simple_snmp_test/r1/ospfd.conf b/tests/topotests/simple_snmp_test/r1/ospfd.conf
new file mode 100644 (file)
index 0000000..cc0d9e5
--- /dev/null
@@ -0,0 +1,11 @@
+agentx
+
+int r1-eth0
+  ip ospf area 0.0.0.0
+int r1-eth1
+  ip ospf area 0.0.0.0
+int r1-eth2
+  ip ospf area 0.0.0.0
+
+router ospf
+  redistribute local
\ No newline at end of file
diff --git a/tests/topotests/simple_snmp_test/r1/ripd.conf b/tests/topotests/simple_snmp_test/r1/ripd.conf
new file mode 100644 (file)
index 0000000..71cdb05
--- /dev/null
@@ -0,0 +1,8 @@
+!
+!
+router rip
+  network 0.0.0.0/0
+  redistribute local
+!
+agentx
+!
\ No newline at end of file
index 5281d0055d9b37f901e313092ad324aa83ebb815..6483a661ceeaa7f6562e95208730bb9db45aa703 100644 (file)
@@ -1,5 +1,7 @@
 log file zebra.log
 !
+agentx
+!
 interface r1-eth0
  ip address 192.168.12.12/24
  ipv6 address 2000:1:1:12::12/64 
@@ -18,5 +20,4 @@ interface lo
  ipv6 address 2000:1:1:1::1/128
 !
 !
-!
 line vty
index 0387e29274054fd38889f232c1afa6739de1f73a..c74ffcc2db5c4dfbd26f1ed3de86d0a4f0b46edb 100755 (executable)
@@ -24,7 +24,8 @@ sys.path.append(os.path.join(CWD, "../"))
 # Import topogen and topotest helpers
 from lib.topogen import Topogen, TopoRouter, get_topogen
 from lib.snmptest import SnmpTester
-
+from time import sleep
+from lib.topolog import logger
 
 pytestmark = [pytest.mark.bgpd, pytest.mark.isisd, pytest.mark.snmp]
 
@@ -59,16 +60,35 @@ def setup_module(mod):
     # For all registered routers, load the zebra configuration file
     for rname, router in router_list.items():
         router.load_config(
-            TopoRouter.RD_ZEBRA, os.path.join(CWD, "{}/zebra.conf".format(rname))
+            TopoRouter.RD_ZEBRA,
+            os.path.join(CWD, "{}/zebra.conf".format(rname)),
+            "-M snmp",
         )
         router.load_config(
-            TopoRouter.RD_ISIS, os.path.join(CWD, "{}/isisd.conf".format(rname))
+            TopoRouter.RD_ISIS,
+            os.path.join(CWD, "{}/isisd.conf".format(rname)),
+            "-M snmp",
         )
         router.load_config(
             TopoRouter.RD_BGP,
             os.path.join(CWD, "{}/bgpd.conf".format(rname)),
             "-M snmp",
         )
+        router.load_config(
+            TopoRouter.RD_RIP,
+            os.path.join(CWD, "{}/ripd.conf".format(rname)),
+            "-M snmp",
+        )
+        router.load_config(
+            TopoRouter.RD_OSPF,
+            os.path.join(CWD, "{}/ospfd.conf".format(rname)),
+            "-M snmp",
+        )
+        router.load_config(
+            TopoRouter.RD_OSPF6,
+            os.path.join(CWD, "{}/ospf6d.conf".format(rname)),
+            "-M snmp",
+        )
         router.load_config(
             TopoRouter.RD_SNMP,
             os.path.join(CWD, "{}/snmpd.conf".format(rname)),
@@ -77,6 +97,16 @@ def setup_module(mod):
 
     # After loading the configurations, this function loads configured daemons.
     tgen.start_router()
+    # Why this sleep?  If you are using zebra w/ snmp we have a chicken
+    # and egg problem with the snmpd.  snmpd is being started up with
+    # ip addresses, and as such snmpd may not be ready to listen yet
+    # (see startup stuff in topotest.py ) with the 2 second delay
+    # on starting snmpd after zebra.  As such if we want to test
+    # anything in zebra we need to sleep a bit to allow the connection
+    # to happen.  I have no good way to test to see if zebra is up
+    # and running with snmp at this point in time.  So this will have
+    # to do.
+    sleep(17)
 
 
 def teardown_module():
@@ -103,6 +133,22 @@ def test_r1_bgp_version():
     assert r1_snmp.test_oid_walk("bgpVersion", ["10"])
     assert r1_snmp.test_oid_walk("bgpVersion", ["10"], ["0"])
 
+    assert r1_snmp.test_oid(
+        "IP-FORWARD-MIB::ipForwardDest.192.168.12.0", "192.168.12.0"
+    )
+
+    assert r1_snmp.test_oid("ISIS-MIB::isisSysVersion", "one(1)")
+    # rip is not auto-loading agentx from mgmtd
+    # assert r1_snmp.test_oid("RIPv2-MIB::rip2GlobalQueries", "0")
+
+    assert r1_snmp.test_oid("OSPF-MIB::ospfVersionNumber", "version2(2)")
+    assert r1_snmp.test_oid("OSPFV3-MIB::ospfv3VersionNumber", "version3(3)")
+
+    # Let's just dump everything and make sure we get some additional test
+    # coverage
+    logger.info("Let's walk everything")
+    logger.info(r1_snmp.walk(".1", raw=True))
+
 
 def test_memory_leak():
     "Run the memory leak test and report results."