1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
|
#!/usr/bin/env python
# SPDX-License-Identifier: ISC
#
# test_ospf_instance_redistribute.py
#
# Copyright (c) 2022 by
# Nvidia, Inc.
# Donald Sharp
#
"""
test_ospf_instance_redistribute
"""
import os
import sys
import pytest
import json
pytestmark = [pytest.mark.ospfd, pytest.mark.sharpd]
# 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
from functools import partial
# Required to instantiate the topology builder class.
#####################################################
##
## Network Topology Definition
##
#####################################################
def build_topo(tgen):
tgen.add_router("r1")
# Connect r1 and r2 through the eth0 interface
switch = tgen.add_switch("sw1")
switch.add_link(tgen.gears["r1"])
#####################################################
##
## Tests starting
##
#####################################################
def setup_module(module):
"Setup topology"
tgen = Topogen(build_topo, module.__name__)
tgen.start_topology()
# This is a sample of configuration loading.
r1 = tgen.gears["r1"]
r1.load_frr_config(os.path.join(CWD, "r1/frr.conf"))
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_install_sharp_instance_routes():
tgen = get_topogen()
if tgen.routers_have_failure():
pytest.skip(tgen.errors)
r1 = tgen.gears["r1"]
logger.info("Ensure that connected routes are actually installed")
expected = {
"192.168.100.0/24": [
{
"prefix": "192.168.100.0/24",
"prefixLen": 24,
"protocol": "connected",
"vrfName": "default",
"selected": True,
"destSelected": True,
"installed": True,
"nexthops": [
{
"fib": True,
"directlyConnected": True,
"interfaceName": "lo",
"active": True,
"weight": 1,
}
],
}
]
}
test_func = partial(
topotest.router_json_cmp, r1, "show ip route connected json", expected
)
_, result = topotest.run_and_expect(test_func, None, count=30, wait=1)
logger.info("Installing sharp routes")
r1 = tgen.gears["r1"]
r1.vtysh_cmd("sharp install route 4.5.6.7 nexthop 192.168.100.2 1")
r1.vtysh_cmd("sharp install route 4.5.6.8 nexthop 192.168.100.2 1 instance 3")
r1.vtysh_cmd("sharp install route 4.5.6.9 nexthop 192.168.100.3 1 instance 4")
r1.vtysh_cmd("conf\nrouter ospf 3\nredistribute sharp")
json_file = "{}/r1/sharp_installed.json".format(CWD)
expected = json.loads(open(json_file).read())
test_func = partial(
topotest.router_json_cmp, r1, "show ip route summ json", expected
)
logger.info("Ensuring that they exist in the rib/fib")
_, result = topotest.run_and_expect(test_func, None, count=10, wait=1)
assertmsg = '"r1" sharp routes are not installed'
assert result is None, assertmsg
def test_ospf_instance_redistribute():
tgen = get_topogen()
if tgen.routers_have_failure():
pytest.skip(tgen.errors)
logger.info("Testing that ospf instance 3 has the redistributed sharp route")
r1 = tgen.gears["r1"]
r1.vtysh_cmd("conf\nrouter ospf 3\nredistribute sharp")
json_file = "{}/r1/ospf_instance_lsa.json".format(CWD)
expected = json.loads(open(json_file).read())
test_func = partial(
topotest.router_json_cmp, r1, "show ip ospf 3 data json", expected
)
_, result = topotest.run_and_expect(test_func, None, count=10, wait=1)
assertmsg = '"r1" ospf instance 3 does not have the proper redistributed routes'
assert result is None, assertmsg
r1.vtysh_cmd("sharp install route 4.5.6.10 nexthop 192.168.100.2 1")
r1.vtysh_cmd("sharp install route 4.5.6.11 nexthop 192.168.100.2 1 instance 3")
r1.vtysh_cmd("sharp install route 4.5.6.12 nexthop 192.168.100.2 1 instance 4")
logger.info("Added new sharp routes let's see if we pick up only the .10")
json_file = "{}/r1/ospf_instance_lsa2.json".format(CWD)
expected = json.loads(open(json_file).read())
test_func = partial(
topotest.router_json_cmp, r1, "show ip ospf 3 data json", expected
)
_, result = topotest.run_and_expect(test_func, None, count=10, wait=1)
assertmsg = '"r1" ospf instance 3 does not have the proper redistributed routes'
assert result is None, assertmsg
def test_ospf_instance_default_information():
tgen = get_topogen()
if tgen.routers_have_failure():
pytest.skip(tgen.errors)
logger.info("Testing the using default information originate")
r1 = tgen.gears["r1"]
r1.vtysh_cmd("conf\nrouter ospf 3\ndefault-information originate")
r1.vtysh_cmd("conf\nip route 0.0.0.0/0 192.168.100.2")
json_file = "{}/r1/ospf_default_information.json".format(CWD)
expected = json.loads(open(json_file).read())
test_func = partial(
topotest.router_json_cmp, r1, "show ip ospf 3 data json", expected
)
_, result = topotest.run_and_expect(test_func, None, count=10, wait=1)
assertmsg = '"r1" ospf instance 3 does not properly redistribute the default route'
assert result is None, assertmsg
if __name__ == "__main__":
args = ["-s"] + sys.argv[1:]
sys.exit(pytest.main(args))
|