#!/usr/bin/env python # SPDX-License-Identifier: ISC # # test_babel_topo1.py # # Copyright (c) 2017 by # Cumulus Networks, Inc. # Donald Sharp # """ test_babel_topo1.py: Testing BABEL """ import os import sys import pytest import json from functools import partial pytestmark = [pytest.mark.babeld] # Save the Current Working Directory to find configuration files. CWD = os.path.dirname(os.path.realpath(__file__)) sys.path.append(os.path.join(CWD, "../")) # pylint: disable=C0413 # Import topogen and topotest helpers from lib import topotest from lib.topogen import Topogen, TopoRouter, get_topogen from lib.topolog import logger # Required to instantiate the topology builder class. ##################################################### ## ## Network Topology Definition ## ##################################################### def build_topo(tgen): for routern in range(1, 4): tgen.add_router("r{}".format(routern)) # On main router # First switch is for a dummy interface (for local network) switch = tgen.add_switch("sw1") switch.add_link(tgen.gears["r1"]) # Switches for BABEL # switch 2 switch is for connection to BABEL router switch = tgen.add_switch("sw2") switch.add_link(tgen.gears["r1"]) switch.add_link(tgen.gears["r2"]) # switch 4 is stub on remote BABEL router switch = tgen.add_switch("sw4") switch.add_link(tgen.gears["r3"]) # switch 3 is between BABEL routers switch = tgen.add_switch("sw3") switch.add_link(tgen.gears["r2"]) switch.add_link(tgen.gears["r3"]) ##################################################### ## ## Tests starting ## ##################################################### def setup_module(module): "Setup topology" tgen = Topogen(build_topo, module.__name__) tgen.start_topology() # This is a sample of configuration loading. router_list = tgen.routers() for rname, router in router_list.items(): router.load_config( TopoRouter.RD_ZEBRA, os.path.join(CWD, "{}/zebra.conf".format(rname)) ) router.load_config( TopoRouter.RD_BABEL, os.path.join(CWD, "{}/babeld.conf".format(rname)) ) tgen.start_router() def teardown_module(_mod): "Teardown the pytest environment" tgen = get_topogen() # This function tears down the whole topology. tgen.stop_topology() def test_converge_protocols(): "Wait for protocol convergence" tgen = get_topogen() # Don't run this test if we have any failure. if tgen.routers_have_failure(): pytest.skip(tgen.errors) topotest.sleep(10, "Waiting for BABEL convergence") def runit(router, assertmsg, cmd, expfile): logger.info(expfile) # Read expected result from file expected = json.loads(open(expfile).read()) test_func = partial(topotest.router_json_cmp, router, cmd, expected) _, result = topotest.run_and_expect(test_func, None, count=30, wait=1) assert result is None, assertmsg def test_zebra_ipv4_routingTable(): "Test 'show ip route'" tgen = get_topogen() # Don't run this test if we have any failure. if tgen.routers_have_failure(): pytest.skip(tgen.errors) router_list = tgen.routers().values() for router in router_list: assertmsg = "Zebra IPv4 Routing Table verification failed for router {}".format( router.name ) refTableFile = "{}/{}/show_ip_route.json_ref".format(CWD, router.name) runit(router, assertmsg, "show ip route json", refTableFile) def test_shutdown_check_stderr(): if os.environ.get("TOPOTESTS_CHECK_STDERR") is None: pytest.skip("Skipping test for Stderr output and memory leaks") tgen = get_topogen() # Don't run this test if we have any failure. if tgen.routers_have_failure(): pytest.skip(tgen.errors) logger.info("Verifying unexpected STDERR output from daemons") router_list = tgen.routers().values() for router in router_list: router.stop() log = tgen.net[router.name].getStdErr("babeld") if log: logger.error("BABELd StdErr Log:" + log) log = tgen.net[router.name].getStdErr("zebra") if log: logger.error("Zebra StdErr Log:" + log) if __name__ == "__main__": args = ["-s"] + sys.argv[1:] sys.exit(pytest.main(args))