]>
Commit | Line | Data |
---|---|---|
3db8aa87 | 1 | #!/usr/bin/env python |
acddc0ed | 2 | # SPDX-License-Identifier: ISC |
3db8aa87 RS |
3 | |
4 | # | |
5 | # Part of NetDEF Topology Tests | |
6 | # | |
7 | # Copyright (c) 2018, LabN Consulting, L.L.C. | |
8 | # Authored by Lou Berger <lberger@labn.net> | |
9 | # | |
3db8aa87 RS |
10 | |
11 | import os | |
12 | import re | |
13 | import sys | |
14 | import json | |
15 | import functools | |
16 | import pytest | |
17 | ||
18 | CWD = os.path.dirname(os.path.realpath(__file__)) | |
19 | sys.path.append(os.path.join(CWD, "../")) | |
20 | ||
21 | # pylint: disable=C0413 | |
22 | # Import topogen and topotest helpers | |
23 | from lib import topotest | |
24 | from lib.topogen import Topogen, TopoRouter, get_topogen | |
25 | from lib.topolog import logger | |
26 | from lib.common_config import required_linux_kernel_version | |
27 | ||
28 | pytestmark = [pytest.mark.bgpd] | |
29 | ||
30 | ||
31 | def build_topo(tgen): | |
32 | tgen.add_router("r1") | |
33 | tgen.add_router("r2") | |
03cc2022 | 34 | tgen.add_router("r3") |
3db8aa87 RS |
35 | |
36 | tgen.add_router("c11") | |
37 | tgen.add_router("c12") | |
38 | tgen.add_router("c21") | |
39 | tgen.add_router("c22") | |
03cc2022 RS |
40 | tgen.add_router("c31") |
41 | tgen.add_router("c32") | |
3db8aa87 RS |
42 | |
43 | tgen.add_link(tgen.gears["r1"], tgen.gears["r2"], "eth0", "eth0") | |
03cc2022 RS |
44 | tgen.add_link(tgen.gears["r1"], tgen.gears["r3"], "eth1", "eth0") |
45 | tgen.add_link(tgen.gears["r1"], tgen.gears["c11"], "eth2", "eth0") | |
46 | tgen.add_link(tgen.gears["r1"], tgen.gears["c12"], "eth3", "eth0") | |
3db8aa87 RS |
47 | tgen.add_link(tgen.gears["r2"], tgen.gears["c21"], "eth1", "eth0") |
48 | tgen.add_link(tgen.gears["r2"], tgen.gears["c22"], "eth2", "eth0") | |
03cc2022 RS |
49 | tgen.add_link(tgen.gears["r3"], tgen.gears["c31"], "eth1", "eth0") |
50 | tgen.add_link(tgen.gears["r3"], tgen.gears["c32"], "eth2", "eth0") | |
3db8aa87 RS |
51 | |
52 | ||
53 | def setup_module(mod): | |
54 | result = required_linux_kernel_version("5.15") | |
55 | if result is not True: | |
56 | pytest.skip("Kernel requirements are not met") | |
57 | ||
58 | tgen = Topogen(build_topo, mod.__name__) | |
59 | tgen.start_topology() | |
60 | ||
61 | for rname, router in tgen.routers().items(): | |
03cc2022 RS |
62 | router.load_config( |
63 | TopoRouter.RD_ZEBRA, os.path.join(CWD, "{}/zebra.conf".format(rname)) | |
64 | ) | |
65 | router.load_config( | |
66 | TopoRouter.RD_STATIC, os.path.join(CWD, "{}/staticd.conf".format(rname)) | |
67 | ) | |
68 | router.load_config( | |
69 | TopoRouter.RD_BGP, os.path.join(CWD, "{}/bgpd.conf".format(rname)) | |
70 | ) | |
3db8aa87 RS |
71 | |
72 | tgen.gears["r1"].run("sysctl net.vrf.strict_mode=1") | |
73 | tgen.gears["r1"].run("ip link add vrf10 type vrf table 10") | |
74 | tgen.gears["r1"].run("ip link set vrf10 up") | |
75 | tgen.gears["r1"].run("ip link add vrf20 type vrf table 20") | |
76 | tgen.gears["r1"].run("ip link set vrf20 up") | |
03cc2022 RS |
77 | tgen.gears["r1"].run("ip link set eth2 master vrf10") |
78 | tgen.gears["r1"].run("ip link set eth3 master vrf20") | |
3db8aa87 RS |
79 | |
80 | tgen.gears["r2"].run("sysctl net.vrf.strict_mode=1") | |
81 | tgen.gears["r2"].run("ip link add vrf10 type vrf table 10") | |
82 | tgen.gears["r2"].run("ip link set vrf10 up") | |
83 | tgen.gears["r2"].run("ip link add vrf20 type vrf table 20") | |
84 | tgen.gears["r2"].run("ip link set vrf20 up") | |
85 | tgen.gears["r2"].run("ip link set eth1 master vrf10") | |
86 | tgen.gears["r2"].run("ip link set eth2 master vrf20") | |
87 | ||
03cc2022 RS |
88 | tgen.gears["r3"].run("sysctl net.vrf.strict_mode=1") |
89 | tgen.gears["r3"].run("ip link add vrf10 type vrf table 10") | |
90 | tgen.gears["r3"].run("ip link set vrf10 up") | |
91 | tgen.gears["r3"].run("ip link add vrf20 type vrf table 20") | |
92 | tgen.gears["r3"].run("ip link set vrf20 up") | |
93 | tgen.gears["r3"].run("ip link set eth1 master vrf10") | |
94 | tgen.gears["r3"].run("ip link set eth2 master vrf20") | |
95 | ||
3db8aa87 RS |
96 | tgen.start_router() |
97 | ||
98 | ||
99 | def teardown_module(mod): | |
100 | tgen = get_topogen() | |
101 | tgen.stop_topology() | |
102 | ||
103 | ||
104 | def check_ping4(name, dest_addr, expected): | |
105 | def _check(name, dest_addr, match): | |
106 | tgen = get_topogen() | |
107 | output = tgen.gears[name].run("ping {} -c 1 -w 1".format(dest_addr)) | |
108 | logger.info(output) | |
109 | if match not in output: | |
110 | return "ping fail" | |
111 | ||
112 | match = ", {} packet loss".format("0%" if expected else "100%") | |
113 | logger.info("[+] check {} {} {}".format(name, dest_addr, match)) | |
114 | tgen = get_topogen() | |
115 | func = functools.partial(_check, name, dest_addr, match) | |
116 | success, result = topotest.run_and_expect(func, None, count=10, wait=1) | |
117 | assert result is None, "Failed" | |
118 | ||
119 | ||
120 | def test_ping(): | |
121 | tgen = get_topogen() | |
03cc2022 | 122 | |
3db8aa87 | 123 | check_ping4("c11", "192.168.2.1", True) |
03cc2022 | 124 | check_ping4("c11", "192.168.3.1", True) |
3db8aa87 | 125 | check_ping4("c12", "192.168.2.1", True) |
03cc2022 RS |
126 | check_ping4("c12", "192.168.3.1", True) |
127 | check_ping4("c21", "192.168.3.1", True) | |
128 | check_ping4("c22", "192.168.3.1", True) | |
3db8aa87 RS |
129 | |
130 | ||
131 | if __name__ == "__main__": | |
132 | args = ["-s"] + sys.argv[1:] | |
133 | sys.exit(pytest.main(args)) |