Skip to content

Commit

Permalink
tests: Add some test cases for snmp
Browse files Browse the repository at this point in the history
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 <[email protected]>
  • Loading branch information
donaldsharp committed Sep 26, 2024
1 parent 5e4d060 commit da854d8
Show file tree
Hide file tree
Showing 7 changed files with 89 additions and 5 deletions.
6 changes: 5 additions & 1 deletion tests/topotests/lib/snmptest.py
Original file line number Diff line number Diff line change
Expand Up @@ -104,12 +104,16 @@ def get_next(self, oid):
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):
Expand Down
2 changes: 2 additions & 0 deletions tests/topotests/simple_snmp_test/r1/isisd.conf
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
12 changes: 12 additions & 0 deletions tests/topotests/simple_snmp_test/r1/ospf6d.conf
Original file line number Diff line number Diff line change
@@ -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
11 changes: 11 additions & 0 deletions tests/topotests/simple_snmp_test/r1/ospfd.conf
Original file line number Diff line number Diff line change
@@ -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
8 changes: 8 additions & 0 deletions tests/topotests/simple_snmp_test/r1/ripd.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
!
!
router rip
network 0.0.0.0/0
redistribute local
!
agentx
!
3 changes: 2 additions & 1 deletion tests/topotests/simple_snmp_test/r1/zebra.conf
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -18,5 +20,4 @@ interface lo
ipv6 address 2000:1:1:1::1/128
!
!
!
line vty
52 changes: 49 additions & 3 deletions tests/topotests/simple_snmp_test/test_simple_snmp.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,8 @@
# 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]

Expand Down Expand Up @@ -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)),
Expand All @@ -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():
Expand All @@ -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."
Expand Down

0 comments on commit da854d8

Please sign in to comment.