]> git.proxmox.com Git - mirror_frr.git/blob - tests/topotests/bgp_as_wide_bgp_identifier/test_bgp_as_wide_bgp_identifier.py
Merge pull request #6532 from wesleycoakley/pbrd-moretopo
[mirror_frr.git] / tests / topotests / bgp_as_wide_bgp_identifier / test_bgp_as_wide_bgp_identifier.py
1 #!/usr/bin/env python
2
3 #
4 # test_bgp_as_wide_bgp_identifier.py
5 # Part of NetDEF Topology Tests
6 #
7 # Copyright (c) 2020 by
8 # Donatas Abraitis <donatas.abraitis@gmail.com>
9 #
10 # Permission to use, copy, modify, and/or distribute this software
11 # for any purpose with or without fee is hereby granted, provided
12 # that the above copyright notice and this permission notice appear
13 # in all copies.
14 #
15 # THE SOFTWARE IS PROVIDED "AS IS" AND NETDEF DISCLAIMS ALL WARRANTIES
16 # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
17 # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NETDEF BE LIABLE FOR
18 # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY
19 # DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
20 # WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
21 # ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
22 # OF THIS SOFTWARE.
23 #
24
25 """
26 rfc6286: Autonomous-System-Wide Unique BGP Identifier for BGP-4
27 Test if 'Bad BGP Identifier' notification is sent only to
28 internal peers (autonomous-system-wide). eBGP peers are not
29 affected and should work.
30 """
31
32 import os
33 import sys
34 import json
35 import time
36 import pytest
37 import functools
38
39 CWD = os.path.dirname(os.path.realpath(__file__))
40 sys.path.append(os.path.join(CWD, "../"))
41
42 # pylint: disable=C0413
43 from lib import topotest
44 from lib.topogen import Topogen, TopoRouter, get_topogen
45 from lib.topolog import logger
46 from mininet.topo import Topo
47
48
49 class TemplateTopo(Topo):
50 def build(self, *_args, **_opts):
51 tgen = get_topogen(self)
52
53 for routern in range(1, 4):
54 tgen.add_router("r{}".format(routern))
55
56 switch = tgen.add_switch("s1")
57 switch.add_link(tgen.gears["r1"])
58 switch.add_link(tgen.gears["r2"])
59 switch.add_link(tgen.gears["r3"])
60
61
62 def setup_module(mod):
63 tgen = Topogen(TemplateTopo, mod.__name__)
64 tgen.start_topology()
65
66 router_list = tgen.routers()
67
68 for i, (rname, router) in enumerate(router_list.iteritems(), 1):
69 router.load_config(
70 TopoRouter.RD_ZEBRA, os.path.join(CWD, "{}/zebra.conf".format(rname))
71 )
72 router.load_config(
73 TopoRouter.RD_BGP, os.path.join(CWD, "{}/bgpd.conf".format(rname))
74 )
75
76 tgen.start_router()
77
78
79 def teardown_module(mod):
80 tgen = get_topogen()
81 tgen.stop_topology()
82
83
84 def test_bgp_as_wide_bgp_identifier():
85 tgen = get_topogen()
86
87 if tgen.routers_have_failure():
88 pytest.skip(tgen.errors)
89
90 def _bgp_converge(router):
91 output = json.loads(router.vtysh_cmd("show ip bgp neighbor 192.168.255.1 json"))
92 expected = {"192.168.255.1": {"bgpState": "Established"}}
93 return topotest.json_cmp(output, expected)
94
95 def _bgp_failed(router):
96 output = json.loads(router.vtysh_cmd("show ip bgp neighbor 192.168.255.1 json"))
97 expected = {
98 "192.168.255.1": {
99 "lastNotificationReason": "OPEN Message Error/Bad BGP Identifier"
100 }
101 }
102 return topotest.json_cmp(output, expected)
103
104 test_func = functools.partial(_bgp_converge, tgen.gears["r1"])
105 success, result = topotest.run_and_expect(test_func, None, count=260, wait=0.5)
106
107 assert result is None, 'Failed to converge: "{}"'.format(tgen.gears["r1"])
108
109 test_func = functools.partial(_bgp_failed, tgen.gears["r3"])
110 success, result = topotest.run_and_expect(test_func, None, count=260, wait=0.5)
111
112 assert result is None, 'Bad BGP Identifier notification not sent: "{}"'.format(
113 tgen.gears["r3"]
114 )
115
116
117 if __name__ == "__main__":
118 args = ["-s"] + sys.argv[1:]
119 sys.exit(pytest.main(args))