]>
Commit | Line | Data |
---|---|---|
d844d516 | 1 | #!/usr/bin/env python |
acddc0ed | 2 | # SPDX-License-Identifier: ISC |
d844d516 DS |
3 | |
4 | # | |
5 | # test_babel_topo1.py | |
6 | # | |
7 | # Copyright (c) 2017 by | |
8 | # Cumulus Networks, Inc. | |
9 | # Donald Sharp | |
10 | # | |
d844d516 DS |
11 | |
12 | """ | |
13 | test_babel_topo1.py: Testing BABEL | |
14 | ||
15 | """ | |
16 | ||
17 | import os | |
18 | import re | |
19 | import sys | |
20 | import pytest | |
21 | import json | |
22 | ||
23 | pytestmark = [pytest.mark.babeld] | |
24 | ||
25 | # Save the Current Working Directory to find configuration files. | |
26 | CWD = os.path.dirname(os.path.realpath(__file__)) | |
27 | sys.path.append(os.path.join(CWD, "../")) | |
28 | ||
29 | # pylint: disable=C0413 | |
30 | # Import topogen and topotest helpers | |
31 | from lib import topotest | |
32 | from lib.topogen import Topogen, TopoRouter, get_topogen | |
33 | from lib.topolog import logger | |
34 | ||
35 | # Required to instantiate the topology builder class. | |
36 | ||
37 | ##################################################### | |
38 | ## | |
39 | ## Network Topology Definition | |
40 | ## | |
41 | ##################################################### | |
42 | ||
43 | ||
44 | def build_topo(tgen): | |
45 | for routern in range(1, 4): | |
46 | tgen.add_router("r{}".format(routern)) | |
47 | ||
48 | # On main router | |
49 | # First switch is for a dummy interface (for local network) | |
50 | switch = tgen.add_switch("sw1") | |
51 | switch.add_link(tgen.gears["r1"]) | |
52 | ||
53 | # Switches for BABEL | |
54 | # switch 2 switch is for connection to BABEL router | |
55 | switch = tgen.add_switch("sw2") | |
56 | switch.add_link(tgen.gears["r1"]) | |
57 | switch.add_link(tgen.gears["r2"]) | |
58 | ||
59 | # switch 4 is stub on remote BABEL router | |
60 | switch = tgen.add_switch("sw4") | |
61 | switch.add_link(tgen.gears["r3"]) | |
62 | ||
63 | # switch 3 is between BABEL routers | |
64 | switch = tgen.add_switch("sw3") | |
65 | switch.add_link(tgen.gears["r2"]) | |
66 | switch.add_link(tgen.gears["r3"]) | |
67 | ||
68 | ||
69 | ##################################################### | |
70 | ## | |
71 | ## Tests starting | |
72 | ## | |
73 | ##################################################### | |
74 | ||
75 | ||
76 | def setup_module(module): | |
77 | "Setup topology" | |
78 | tgen = Topogen(build_topo, module.__name__) | |
79 | tgen.start_topology() | |
80 | ||
81 | # This is a sample of configuration loading. | |
82 | router_list = tgen.routers() | |
83 | for rname, router in router_list.items(): | |
84 | router.load_config( | |
85 | TopoRouter.RD_ZEBRA, os.path.join(CWD, "{}/zebra.conf".format(rname)) | |
86 | ) | |
87 | router.load_config( | |
88 | TopoRouter.RD_BABEL, os.path.join(CWD, "{}/babeld.conf".format(rname)) | |
89 | ) | |
90 | ||
91 | tgen.start_router() | |
92 | ||
93 | ||
94 | def teardown_module(_mod): | |
95 | "Teardown the pytest environment" | |
96 | tgen = get_topogen() | |
97 | ||
98 | # This function tears down the whole topology. | |
99 | tgen.stop_topology() | |
100 | ||
101 | ||
102 | def test_converge_protocols(): | |
103 | "Wait for protocol convergence" | |
104 | ||
105 | tgen = get_topogen() | |
106 | # Don't run this test if we have any failure. | |
107 | if tgen.routers_have_failure(): | |
108 | pytest.skip(tgen.errors) | |
109 | ||
110 | topotest.sleep(10, "Waiting for BABEL convergence") | |
111 | ||
112 | ||
113 | def test_zebra_ipv4_routingTable(): | |
114 | "Test 'show ip route'" | |
115 | ||
116 | tgen = get_topogen() | |
117 | # Don't run this test if we have any failure. | |
118 | if tgen.routers_have_failure(): | |
119 | pytest.skip(tgen.errors) | |
120 | ||
121 | failures = 0 | |
122 | router_list = tgen.routers().values() | |
123 | for router in router_list: | |
124 | output = router.vtysh_cmd("show ip route json", isjson=True) | |
125 | refTableFile = "{}/{}/show_ip_route.json_ref".format(CWD, router.name) | |
126 | expected = json.loads(open(refTableFile).read()) | |
127 | ||
128 | assertmsg = "Zebra IPv4 Routing Table verification failed for router {}".format( | |
129 | router.name | |
130 | ) | |
131 | assert topotest.json_cmp(output, expected) is None, assertmsg | |
132 | ||
133 | def test_shutdown_check_stderr(): | |
134 | if os.environ.get("TOPOTESTS_CHECK_STDERR") is None: | |
135 | pytest.skip("Skipping test for Stderr output and memory leaks") | |
136 | ||
137 | tgen = get_topogen() | |
138 | # Don't run this test if we have any failure. | |
139 | if tgen.routers_have_failure(): | |
140 | pytest.skip(tgen.errors) | |
141 | ||
142 | logger.info("Verifying unexpected STDERR output from daemons") | |
143 | ||
144 | router_list = tgen.routers().values() | |
145 | for router in router_list: | |
146 | router.stop() | |
147 | ||
148 | log = tgen.net[router.name].getStdErr("babeld") | |
149 | if log: | |
150 | logger.error("BABELd StdErr Log:" + log) | |
151 | log = tgen.net[router.name].getStdErr("zebra") | |
152 | if log: | |
153 | logger.error("Zebra StdErr Log:" + log) | |
154 | ||
155 | ||
156 | if __name__ == "__main__": | |
157 | args = ["-s"] + sys.argv[1:] | |
158 | sys.exit(pytest.main(args)) |