]>
Commit | Line | Data |
---|---|---|
9a84cb61 | 1 | #!/usr/bin/env python |
acddc0ed | 2 | # SPDX-License-Identifier: ISC |
9a84cb61 DA |
3 | |
4 | # | |
5 | # Copyright (c) 2022 by | |
6 | # Donatas Abraitis <donatas@opensourcerouting.org> | |
7 | # | |
9a84cb61 DA |
8 | |
9 | """ | |
10 | Check if we can override VPN underlay next-hop from PE1 to PE2. | |
11 | """ | |
12 | ||
13 | import os | |
14 | import sys | |
15 | import json | |
16 | import pytest | |
17 | import functools | |
18 | ||
19 | CWD = os.path.dirname(os.path.realpath(__file__)) | |
20 | sys.path.append(os.path.join(CWD, "../")) | |
21 | ||
22 | # pylint: disable=C0413 | |
23 | from lib import topotest | |
24 | from lib.topogen import Topogen, TopoRouter, get_topogen | |
25 | from lib.common_config import step | |
26 | ||
27 | pytestmark = [pytest.mark.bgpd] | |
28 | ||
29 | ||
30 | def build_topo(tgen): | |
31 | tgen.add_router("cpe1") | |
32 | tgen.add_router("cpe2") | |
33 | tgen.add_router("pe1") | |
34 | tgen.add_router("pe2") | |
35 | ||
36 | switch = tgen.add_switch("s1") | |
37 | switch.add_link(tgen.gears["cpe1"]) | |
38 | switch.add_link(tgen.gears["pe1"]) | |
39 | ||
40 | switch = tgen.add_switch("s2") | |
41 | switch.add_link(tgen.gears["pe1"]) | |
42 | switch.add_link(tgen.gears["pe2"]) | |
43 | ||
44 | switch = tgen.add_switch("s3") | |
45 | switch.add_link(tgen.gears["pe2"]) | |
46 | switch.add_link(tgen.gears["cpe2"]) | |
47 | ||
48 | ||
49 | def setup_module(mod): | |
50 | tgen = Topogen(build_topo, mod.__name__) | |
51 | tgen.start_topology() | |
52 | ||
53 | pe1 = tgen.gears["pe1"] | |
54 | pe2 = tgen.gears["pe2"] | |
55 | ||
56 | pe1.run("ip link add RED type vrf table 1001") | |
57 | pe1.run("ip link set up dev RED") | |
58 | pe2.run("ip link add RED type vrf table 1001") | |
59 | pe2.run("ip link set up dev RED") | |
60 | pe1.run("ip link set pe1-eth0 master RED") | |
61 | pe2.run("ip link set pe2-eth1 master RED") | |
62 | ||
63 | pe1.run("sysctl -w net.ipv4.ip_forward=1") | |
64 | pe2.run("sysctl -w net.ipv4.ip_forward=1") | |
65 | pe1.run("sysctl -w net.mpls.conf.pe1-eth0.input=1") | |
66 | pe2.run("sysctl -w net.mpls.conf.pe2-eth1.input=1") | |
67 | ||
68 | router_list = tgen.routers() | |
69 | ||
70 | for i, (rname, router) in enumerate(router_list.items(), 1): | |
71 | router.load_config( | |
72 | TopoRouter.RD_ZEBRA, os.path.join(CWD, "{}/zebra.conf".format(rname)) | |
73 | ) | |
74 | router.load_config( | |
75 | TopoRouter.RD_BGP, os.path.join(CWD, "{}/bgpd.conf".format(rname)) | |
76 | ) | |
77 | router.load_config( | |
78 | TopoRouter.RD_OSPF6, os.path.join(CWD, "{}/ospf6d.conf".format(rname)) | |
79 | ) | |
80 | router.load_config( | |
81 | TopoRouter.RD_LDP, os.path.join(CWD, "{}/ldpd.conf".format(rname)) | |
82 | ) | |
83 | ||
84 | tgen.start_router() | |
85 | ||
86 | ||
87 | def teardown_module(mod): | |
88 | tgen = get_topogen() | |
89 | tgen.stop_topology() | |
90 | ||
91 | ||
92 | def test_bgp_vpn_5549(): | |
93 | tgen = get_topogen() | |
94 | ||
95 | pe2 = tgen.gears["pe2"] | |
96 | ||
97 | if tgen.routers_have_failure(): | |
98 | pytest.skip(tgen.errors) | |
99 | ||
100 | def _bgp_vpn_nexthop_changed(): | |
101 | output = json.loads(pe2.vtysh_cmd("show bgp ipv4 vpn json")) | |
102 | expected = { | |
103 | "routes": { | |
104 | "routeDistinguishers": { | |
105 | "192.168.1.2:2": { | |
106 | "172.16.255.1/32": [ | |
107 | {"valid": True, "nexthops": [{"ip": "2001:db8::1"}]} | |
108 | ], | |
109 | "192.168.1.0/24": [ | |
110 | {"valid": True, "nexthops": [{"ip": "2001:db8:1::1"}]} | |
111 | ], | |
112 | } | |
113 | } | |
114 | } | |
115 | } | |
116 | return topotest.json_cmp(output, expected) | |
117 | ||
118 | test_func = functools.partial(_bgp_vpn_nexthop_changed) | |
119 | _, result = topotest.run_and_expect(test_func, None, count=60, wait=0.5) | |
120 | assert result is None, "Failed overriding IPv6 next-hop for VPN underlay" | |
121 | ||
122 | ||
123 | if __name__ == "__main__": | |
124 | args = ["-s"] + sys.argv[1:] | |
125 | sys.exit(pytest.main(args)) |