mirror of
				https://git.proxmox.com/git/mirror_frr
				synced 2025-10-31 05:08:27 +00:00 
			
		
		
		
	tests: Add more tests for BGP default-originate command
Signed-off-by: Donatas Abraitis <donatas.abraitis@gmail.com>
This commit is contained in:
		
							parent
							
								
									ea8cd94b45
								
							
						
					
					
						commit
						a54d79af41
					
				
							
								
								
									
										8
									
								
								tests/topotests/bgp_default-route/r1/bgpd.conf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								tests/topotests/bgp_default-route/r1/bgpd.conf
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,8 @@ | ||||
| router bgp 65000 | ||||
|   no bgp ebgp-requires-policy | ||||
|   neighbor 192.168.255.2 remote-as 65001 | ||||
|   neighbor 192.168.255.2 timers 3 10 | ||||
|   address-family ipv4 unicast | ||||
|     neighbor 192.168.255.2 default-originate | ||||
|   exit-address-family | ||||
| ! | ||||
							
								
								
									
										114
									
								
								tests/topotests/bgp_default-route/test_bgp_default-originate.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										114
									
								
								tests/topotests/bgp_default-route/test_bgp_default-originate.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,114 @@ | ||||
| #!/usr/bin/env python | ||||
| 
 | ||||
| # Copyright (c) 2019-2020 by | ||||
| # Donatas Abraitis <donatas.abraitis@gmail.com> | ||||
| # | ||||
| # Permission to use, copy, modify, and/or distribute this software | ||||
| # for any purpose with or without fee is hereby granted, provided | ||||
| # that the above copyright notice and this permission notice appear | ||||
| # in all copies. | ||||
| # | ||||
| # THE SOFTWARE IS PROVIDED "AS IS" AND NETDEF DISCLAIMS ALL WARRANTIES | ||||
| # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||||
| # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NETDEF BE LIABLE FOR | ||||
| # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY | ||||
| # DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, | ||||
| # WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS | ||||
| # ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE | ||||
| # OF THIS SOFTWARE. | ||||
| # | ||||
| 
 | ||||
| """ | ||||
| Test if default-originate works without route-map. | ||||
| """ | ||||
| 
 | ||||
| import os | ||||
| import sys | ||||
| import json | ||||
| import time | ||||
| import pytest | ||||
| import functools | ||||
| 
 | ||||
| CWD = os.path.dirname(os.path.realpath(__file__)) | ||||
| sys.path.append(os.path.join(CWD, "../")) | ||||
| 
 | ||||
| # pylint: disable=C0413 | ||||
| from lib import topotest | ||||
| from lib.topogen import Topogen, TopoRouter, get_topogen | ||||
| from lib.topolog import logger | ||||
| from mininet.topo import Topo | ||||
| 
 | ||||
| 
 | ||||
| class TemplateTopo(Topo): | ||||
|     def build(self, *_args, **_opts): | ||||
|         tgen = get_topogen(self) | ||||
| 
 | ||||
|         for routern in range(1, 3): | ||||
|             tgen.add_router("r{}".format(routern)) | ||||
| 
 | ||||
|         switch = tgen.add_switch("s1") | ||||
|         switch.add_link(tgen.gears["r1"]) | ||||
|         switch.add_link(tgen.gears["r2"]) | ||||
| 
 | ||||
| 
 | ||||
| def setup_module(mod): | ||||
|     tgen = Topogen(TemplateTopo, mod.__name__) | ||||
|     tgen.start_topology() | ||||
| 
 | ||||
|     router_list = tgen.routers() | ||||
| 
 | ||||
|     for i, (rname, router) in enumerate(router_list.items(), 1): | ||||
|         router.load_config( | ||||
|             TopoRouter.RD_ZEBRA, os.path.join(CWD, "{}/zebra.conf".format(rname)) | ||||
|         ) | ||||
|         router.load_config( | ||||
|             TopoRouter.RD_BGP, os.path.join(CWD, "{}/bgpd.conf".format(rname)) | ||||
|         ) | ||||
| 
 | ||||
|     tgen.start_router() | ||||
| 
 | ||||
| 
 | ||||
| def teardown_module(mod): | ||||
|     tgen = get_topogen() | ||||
|     tgen.stop_topology() | ||||
| 
 | ||||
| 
 | ||||
| def test_bgp_default_originate_route_map(): | ||||
|     tgen = get_topogen() | ||||
| 
 | ||||
|     if tgen.routers_have_failure(): | ||||
|         pytest.skip(tgen.errors) | ||||
| 
 | ||||
|     router = tgen.gears["r2"] | ||||
| 
 | ||||
|     def _bgp_converge(router): | ||||
|         output = json.loads(router.vtysh_cmd("show ip bgp neighbor 192.168.255.1 json")) | ||||
|         expected = { | ||||
|             "192.168.255.1": { | ||||
|                 "bgpState": "Established", | ||||
|                 "addressFamilyInfo": {"ipv4Unicast": {"acceptedPrefixCounter": 1}}, | ||||
|             } | ||||
|         } | ||||
|         return topotest.json_cmp(output, expected) | ||||
| 
 | ||||
|     def _bgp_default_route_is_valid(router): | ||||
|         output = json.loads(router.vtysh_cmd("show ip bgp 0.0.0.0/0 json")) | ||||
|         expected = {"paths": [{"valid": True}]} | ||||
|         return topotest.json_cmp(output, expected) | ||||
| 
 | ||||
|     test_func = functools.partial(_bgp_converge, router) | ||||
|     success, result = topotest.run_and_expect(test_func, None, count=30, wait=0.5) | ||||
| 
 | ||||
|     assert result is None, 'Failed to see bgp convergence in "{}"'.format(router) | ||||
| 
 | ||||
|     test_func = functools.partial(_bgp_default_route_is_valid, router) | ||||
|     success, result = topotest.run_and_expect(test_func, None, count=30, wait=0.5) | ||||
| 
 | ||||
|     assert ( | ||||
|         result is None | ||||
|     ), 'Failed to see applied metric for default route in "{}"'.format(router) | ||||
| 
 | ||||
| 
 | ||||
| if __name__ == "__main__": | ||||
|     args = ["-s"] + sys.argv[1:] | ||||
|     sys.exit(pytest.main(args)) | ||||
| @ -0,0 +1,17 @@ | ||||
| router bgp 65000 | ||||
|   no bgp ebgp-requires-policy | ||||
|   neighbor 192.168.255.2 remote-as 65001 | ||||
|   neighbor 192.168.255.2 timers 3 10 | ||||
|   address-family ipv4 unicast | ||||
|     network 192.168.13.0/24 route-map internal | ||||
|     neighbor 192.168.255.2 default-originate route-map default | ||||
|   exit-address-family | ||||
| ! | ||||
| bgp community-list standard default seq 5 permit 65000:1 | ||||
| ! | ||||
| route-map default permit 10 | ||||
|   match community default | ||||
| ! | ||||
| route-map internal permit 10 | ||||
|   set community 65000:1 | ||||
| ! | ||||
| @ -0,0 +1,11 @@ | ||||
| ! | ||||
| interface lo | ||||
|  ip address 172.16.255.254/32 | ||||
| ! | ||||
| interface r1-eth0 | ||||
|  ip address 192.168.255.1/24 | ||||
| ! | ||||
| ip route 192.168.13.0./24 Null0 | ||||
| ! | ||||
| ip forwarding | ||||
| ! | ||||
| @ -0,0 +1,8 @@ | ||||
| router bgp 65001 | ||||
|   no bgp ebgp-requires-policy | ||||
|   neighbor 192.168.255.1 remote-as 65000 | ||||
|   neighbor 192.168.255.1 timers 3 10 | ||||
|   address-family ipv4 unicast | ||||
|     redistribute connected | ||||
|   exit-address-family | ||||
| ! | ||||
| @ -0,0 +1,6 @@ | ||||
| ! | ||||
| interface r2-eth0 | ||||
|  ip address 192.168.255.2/24 | ||||
| ! | ||||
| ip forwarding | ||||
| ! | ||||
| @ -0,0 +1,114 @@ | ||||
| #!/usr/bin/env python | ||||
| 
 | ||||
| # Copyright (c) 2019-2020 by | ||||
| # Donatas Abraitis <donatas.abraitis@gmail.com> | ||||
| # | ||||
| # Permission to use, copy, modify, and/or distribute this software | ||||
| # for any purpose with or without fee is hereby granted, provided | ||||
| # that the above copyright notice and this permission notice appear | ||||
| # in all copies. | ||||
| # | ||||
| # THE SOFTWARE IS PROVIDED "AS IS" AND NETDEF DISCLAIMS ALL WARRANTIES | ||||
| # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||||
| # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NETDEF BE LIABLE FOR | ||||
| # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY | ||||
| # DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, | ||||
| # WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS | ||||
| # ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE | ||||
| # OF THIS SOFTWARE. | ||||
| # | ||||
| 
 | ||||
| """ | ||||
| Test if default-originate works with ONLY match operations. | ||||
| """ | ||||
| 
 | ||||
| import os | ||||
| import sys | ||||
| import json | ||||
| import time | ||||
| import pytest | ||||
| import functools | ||||
| 
 | ||||
| CWD = os.path.dirname(os.path.realpath(__file__)) | ||||
| sys.path.append(os.path.join(CWD, "../")) | ||||
| 
 | ||||
| # pylint: disable=C0413 | ||||
| from lib import topotest | ||||
| from lib.topogen import Topogen, TopoRouter, get_topogen | ||||
| from lib.topolog import logger | ||||
| from mininet.topo import Topo | ||||
| 
 | ||||
| 
 | ||||
| class TemplateTopo(Topo): | ||||
|     def build(self, *_args, **_opts): | ||||
|         tgen = get_topogen(self) | ||||
| 
 | ||||
|         for routern in range(1, 3): | ||||
|             tgen.add_router("r{}".format(routern)) | ||||
| 
 | ||||
|         switch = tgen.add_switch("s1") | ||||
|         switch.add_link(tgen.gears["r1"]) | ||||
|         switch.add_link(tgen.gears["r2"]) | ||||
| 
 | ||||
| 
 | ||||
| def setup_module(mod): | ||||
|     tgen = Topogen(TemplateTopo, mod.__name__) | ||||
|     tgen.start_topology() | ||||
| 
 | ||||
|     router_list = tgen.routers() | ||||
| 
 | ||||
|     for i, (rname, router) in enumerate(router_list.items(), 1): | ||||
|         router.load_config( | ||||
|             TopoRouter.RD_ZEBRA, os.path.join(CWD, "{}/zebra.conf".format(rname)) | ||||
|         ) | ||||
|         router.load_config( | ||||
|             TopoRouter.RD_BGP, os.path.join(CWD, "{}/bgpd.conf".format(rname)) | ||||
|         ) | ||||
| 
 | ||||
|     tgen.start_router() | ||||
| 
 | ||||
| 
 | ||||
| def teardown_module(mod): | ||||
|     tgen = get_topogen() | ||||
|     tgen.stop_topology() | ||||
| 
 | ||||
| 
 | ||||
| def test_bgp_default_originate_route_map(): | ||||
|     tgen = get_topogen() | ||||
| 
 | ||||
|     if tgen.routers_have_failure(): | ||||
|         pytest.skip(tgen.errors) | ||||
| 
 | ||||
|     router = tgen.gears["r2"] | ||||
| 
 | ||||
|     def _bgp_converge(router): | ||||
|         output = json.loads(router.vtysh_cmd("show ip bgp neighbor 192.168.255.1 json")) | ||||
|         expected = { | ||||
|             "192.168.255.1": { | ||||
|                 "bgpState": "Established", | ||||
|                 "addressFamilyInfo": {"ipv4Unicast": {"acceptedPrefixCounter": 1}}, | ||||
|             } | ||||
|         } | ||||
|         return topotest.json_cmp(output, expected) | ||||
| 
 | ||||
|     def _bgp_default_route_is_valid(router): | ||||
|         output = json.loads(router.vtysh_cmd("show ip bgp 0.0.0.0/0 json")) | ||||
|         expected = {"paths": [{"valid": True}]} | ||||
|         return topotest.json_cmp(output, expected) | ||||
| 
 | ||||
|     test_func = functools.partial(_bgp_converge, router) | ||||
|     success, result = topotest.run_and_expect(test_func, None, count=30, wait=0.5) | ||||
| 
 | ||||
|     assert result is None, 'Failed to see bgp convergence in "{}"'.format(router) | ||||
| 
 | ||||
|     test_func = functools.partial(_bgp_default_route_is_valid, router) | ||||
|     success, result = topotest.run_and_expect(test_func, None, count=30, wait=0.5) | ||||
| 
 | ||||
|     assert ( | ||||
|         result is None | ||||
|     ), 'Failed to see applied metric for default route in "{}"'.format(router) | ||||
| 
 | ||||
| 
 | ||||
| if __name__ == "__main__": | ||||
|     args = ["-s"] + sys.argv[1:] | ||||
|     sys.exit(pytest.main(args)) | ||||
| @ -0,0 +1,18 @@ | ||||
| router bgp 65000 | ||||
|   no bgp ebgp-requires-policy | ||||
|   neighbor 192.168.255.2 remote-as 65001 | ||||
|   neighbor 192.168.255.2 timers 3 10 | ||||
|   address-family ipv4 unicast | ||||
|     network 192.168.13.0/24 route-map internal | ||||
|     neighbor 192.168.255.2 default-originate route-map default | ||||
|   exit-address-family | ||||
| ! | ||||
| bgp community-list standard default seq 5 permit 65000:1 | ||||
| ! | ||||
| route-map default permit 10 | ||||
|   match community default | ||||
|   set metric 123 | ||||
| ! | ||||
| route-map internal permit 10 | ||||
|   set community 65000:1 | ||||
| ! | ||||
| @ -0,0 +1,11 @@ | ||||
| ! | ||||
| interface lo | ||||
|  ip address 172.16.255.254/32 | ||||
| ! | ||||
| interface r1-eth0 | ||||
|  ip address 192.168.255.1/24 | ||||
| ! | ||||
| ip route 192.168.13.0./24 Null0 | ||||
| ! | ||||
| ip forwarding | ||||
| ! | ||||
| @ -0,0 +1,8 @@ | ||||
| router bgp 65001 | ||||
|   no bgp ebgp-requires-policy | ||||
|   neighbor 192.168.255.1 remote-as 65000 | ||||
|   neighbor 192.168.255.1 timers 3 10 | ||||
|   address-family ipv4 unicast | ||||
|     redistribute connected | ||||
|   exit-address-family | ||||
| ! | ||||
| @ -0,0 +1,6 @@ | ||||
| ! | ||||
| interface r2-eth0 | ||||
|  ip address 192.168.255.2/24 | ||||
| ! | ||||
| ip forwarding | ||||
| ! | ||||
| @ -1,10 +1,6 @@ | ||||
| #!/usr/bin/env python | ||||
| 
 | ||||
| # | ||||
| # bgp_default-originate_route-map.py | ||||
| # Part of NetDEF Topology Tests | ||||
| # | ||||
| # Copyright (c) 2019 by | ||||
| # Copyright (c) 2020 by | ||||
| # Donatas Abraitis <donatas.abraitis@gmail.com> | ||||
| # | ||||
| # Permission to use, copy, modify, and/or distribute this software | ||||
| @ -23,15 +19,8 @@ | ||||
| # | ||||
| 
 | ||||
| """ | ||||
| bgp_default-originate_route-map.py: | ||||
| 
 | ||||
| Test if works the following commands: | ||||
| router bgp 65031 | ||||
|   address-family ipv4 unicast | ||||
|     neighbor 192.168.255.2 default-originate route-map default | ||||
| 
 | ||||
| route-map default permit 10 | ||||
|   set metric 123 | ||||
| Test if default-originate works with match operations. | ||||
| And verify if set operations work as well. | ||||
| """ | ||||
| 
 | ||||
| import os | ||||
| @ -109,12 +98,12 @@ def test_bgp_default_originate_route_map(): | ||||
|         return topotest.json_cmp(output, expected) | ||||
| 
 | ||||
|     test_func = functools.partial(_bgp_converge, router) | ||||
|     success, result = topotest.run_and_expect(test_func, None, count=60, wait=0.5) | ||||
|     success, result = topotest.run_and_expect(test_func, None, count=30, wait=0.5) | ||||
| 
 | ||||
|     assert result is None, 'Failed to see bgp convergence in "{}"'.format(router) | ||||
| 
 | ||||
|     test_func = functools.partial(_bgp_default_route_has_metric, router) | ||||
|     success, result = topotest.run_and_expect(test_func, None, count=60, wait=0.5) | ||||
|     success, result = topotest.run_and_expect(test_func, None, count=30, wait=0.5) | ||||
| 
 | ||||
|     assert ( | ||||
|         result is None | ||||
| @ -0,0 +1,9 @@ | ||||
| ! | ||||
| interface lo | ||||
|  ip address 172.16.255.254/32 | ||||
| ! | ||||
| interface r1-eth0 | ||||
|  ip address 192.168.255.1/24 | ||||
| ! | ||||
| ip forwarding | ||||
| ! | ||||
| @ -0,0 +1,8 @@ | ||||
| router bgp 65001 | ||||
|   no bgp ebgp-requires-policy | ||||
|   neighbor 192.168.255.1 remote-as 65000 | ||||
|   neighbor 192.168.255.1 timers 3 10 | ||||
|   address-family ipv4 unicast | ||||
|     redistribute connected | ||||
|   exit-address-family | ||||
| ! | ||||
| @ -0,0 +1,6 @@ | ||||
| ! | ||||
| interface r2-eth0 | ||||
|  ip address 192.168.255.2/24 | ||||
| ! | ||||
| ip forwarding | ||||
| ! | ||||
| @ -0,0 +1,114 @@ | ||||
| #!/usr/bin/env python | ||||
| 
 | ||||
| # Copyright (c) 2019-2020 by | ||||
| # Donatas Abraitis <donatas.abraitis@gmail.com> | ||||
| # | ||||
| # Permission to use, copy, modify, and/or distribute this software | ||||
| # for any purpose with or without fee is hereby granted, provided | ||||
| # that the above copyright notice and this permission notice appear | ||||
| # in all copies. | ||||
| # | ||||
| # THE SOFTWARE IS PROVIDED "AS IS" AND NETDEF DISCLAIMS ALL WARRANTIES | ||||
| # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||||
| # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NETDEF BE LIABLE FOR | ||||
| # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY | ||||
| # DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, | ||||
| # WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS | ||||
| # ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE | ||||
| # OF THIS SOFTWARE. | ||||
| # | ||||
| 
 | ||||
| """ | ||||
| Test if default-originate works with ONLY set operations. | ||||
| """ | ||||
| 
 | ||||
| import os | ||||
| import sys | ||||
| import json | ||||
| import time | ||||
| import pytest | ||||
| import functools | ||||
| 
 | ||||
| CWD = os.path.dirname(os.path.realpath(__file__)) | ||||
| sys.path.append(os.path.join(CWD, "../")) | ||||
| 
 | ||||
| # pylint: disable=C0413 | ||||
| from lib import topotest | ||||
| from lib.topogen import Topogen, TopoRouter, get_topogen | ||||
| from lib.topolog import logger | ||||
| from mininet.topo import Topo | ||||
| 
 | ||||
| 
 | ||||
| class TemplateTopo(Topo): | ||||
|     def build(self, *_args, **_opts): | ||||
|         tgen = get_topogen(self) | ||||
| 
 | ||||
|         for routern in range(1, 3): | ||||
|             tgen.add_router("r{}".format(routern)) | ||||
| 
 | ||||
|         switch = tgen.add_switch("s1") | ||||
|         switch.add_link(tgen.gears["r1"]) | ||||
|         switch.add_link(tgen.gears["r2"]) | ||||
| 
 | ||||
| 
 | ||||
| def setup_module(mod): | ||||
|     tgen = Topogen(TemplateTopo, mod.__name__) | ||||
|     tgen.start_topology() | ||||
| 
 | ||||
|     router_list = tgen.routers() | ||||
| 
 | ||||
|     for i, (rname, router) in enumerate(router_list.items(), 1): | ||||
|         router.load_config( | ||||
|             TopoRouter.RD_ZEBRA, os.path.join(CWD, "{}/zebra.conf".format(rname)) | ||||
|         ) | ||||
|         router.load_config( | ||||
|             TopoRouter.RD_BGP, os.path.join(CWD, "{}/bgpd.conf".format(rname)) | ||||
|         ) | ||||
| 
 | ||||
|     tgen.start_router() | ||||
| 
 | ||||
| 
 | ||||
| def teardown_module(mod): | ||||
|     tgen = get_topogen() | ||||
|     tgen.stop_topology() | ||||
| 
 | ||||
| 
 | ||||
| def test_bgp_default_originate_route_map(): | ||||
|     tgen = get_topogen() | ||||
| 
 | ||||
|     if tgen.routers_have_failure(): | ||||
|         pytest.skip(tgen.errors) | ||||
| 
 | ||||
|     router = tgen.gears["r2"] | ||||
| 
 | ||||
|     def _bgp_converge(router): | ||||
|         output = json.loads(router.vtysh_cmd("show ip bgp neighbor 192.168.255.1 json")) | ||||
|         expected = { | ||||
|             "192.168.255.1": { | ||||
|                 "bgpState": "Established", | ||||
|                 "addressFamilyInfo": {"ipv4Unicast": {"acceptedPrefixCounter": 1}}, | ||||
|             } | ||||
|         } | ||||
|         return topotest.json_cmp(output, expected) | ||||
| 
 | ||||
|     def _bgp_default_route_has_metric(router): | ||||
|         output = json.loads(router.vtysh_cmd("show ip bgp 0.0.0.0/0 json")) | ||||
|         expected = {"paths": [{"metric": 123}]} | ||||
|         return topotest.json_cmp(output, expected) | ||||
| 
 | ||||
|     test_func = functools.partial(_bgp_converge, router) | ||||
|     success, result = topotest.run_and_expect(test_func, None, count=30, wait=0.5) | ||||
| 
 | ||||
|     assert result is None, 'Failed to see bgp convergence in "{}"'.format(router) | ||||
| 
 | ||||
|     test_func = functools.partial(_bgp_default_route_has_metric, router) | ||||
|     success, result = topotest.run_and_expect(test_func, None, count=30, wait=0.5) | ||||
| 
 | ||||
|     assert ( | ||||
|         result is None | ||||
|     ), 'Failed to see applied metric for default route in "{}"'.format(router) | ||||
| 
 | ||||
| 
 | ||||
| if __name__ == "__main__": | ||||
|     args = ["-s"] + sys.argv[1:] | ||||
|     sys.exit(pytest.main(args)) | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Donatas Abraitis
						Donatas Abraitis