mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-06-14 16:29:32 +00:00
tests: adding bgp unique router id automation.
Signed-off-by: nguggarigoud <nguggarigoud@vmware.com>
This commit is contained in:
parent
99813705d7
commit
441875ea4f
505
tests/topotests/bgp_unique_rid/bgp_unique_rid.json
Normal file
505
tests/topotests/bgp_unique_rid/bgp_unique_rid.json
Normal file
@ -0,0 +1,505 @@
|
|||||||
|
{
|
||||||
|
"address_types": [
|
||||||
|
"ipv4",
|
||||||
|
"ipv6"
|
||||||
|
],
|
||||||
|
"ipv4base": "10.0.0.0",
|
||||||
|
"ipv4mask": 30,
|
||||||
|
"ipv6base": "fd00::",
|
||||||
|
"ipv6mask": 64,
|
||||||
|
"link_ip_start": {
|
||||||
|
"ipv4": "10.0.0.0",
|
||||||
|
"v4mask": 30,
|
||||||
|
"ipv6": "fd00::",
|
||||||
|
"v6mask": 64
|
||||||
|
},
|
||||||
|
"lo_prefix": {
|
||||||
|
"ipv4": "1.0.",
|
||||||
|
"v4mask": 32,
|
||||||
|
"ipv6": "2001:DB8:F::",
|
||||||
|
"v6mask": 128
|
||||||
|
},
|
||||||
|
"routers": {
|
||||||
|
"r1": {
|
||||||
|
"links": {
|
||||||
|
"lo": {
|
||||||
|
"ipv4": "auto",
|
||||||
|
"ipv6": "auto",
|
||||||
|
"type": "loopback"
|
||||||
|
},
|
||||||
|
"r2": {
|
||||||
|
"ipv4": "auto",
|
||||||
|
"ipv6": "auto"
|
||||||
|
},
|
||||||
|
"r3": {
|
||||||
|
"ipv4": "auto",
|
||||||
|
"ipv6": "auto"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"bgp": {
|
||||||
|
"local_as": "100",
|
||||||
|
"address_family": {
|
||||||
|
"ipv4": {
|
||||||
|
"unicast": {
|
||||||
|
"neighbor": {
|
||||||
|
"r2": {
|
||||||
|
"dest_link": {
|
||||||
|
"r1": {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"r3": {
|
||||||
|
"dest_link": {
|
||||||
|
"r1": {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"redistribute": [
|
||||||
|
{
|
||||||
|
"redist_type": "static"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"redist_type": "connected"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ipv6": {
|
||||||
|
"unicast": {
|
||||||
|
"neighbor": {
|
||||||
|
"r2": {
|
||||||
|
"dest_link": {
|
||||||
|
"r1": {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"r3": {
|
||||||
|
"dest_link": {
|
||||||
|
"r1": {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"redistribute": [
|
||||||
|
{
|
||||||
|
"redist_type": "static"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"redist_type": "connected"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"r2": {
|
||||||
|
"links": {
|
||||||
|
"lo": {
|
||||||
|
"ipv4": "auto",
|
||||||
|
"ipv6": "auto",
|
||||||
|
"type": "loopback"
|
||||||
|
},
|
||||||
|
"r1": {
|
||||||
|
"ipv4": "auto",
|
||||||
|
"ipv6": "auto"
|
||||||
|
},
|
||||||
|
"r3": {
|
||||||
|
"ipv4": "auto",
|
||||||
|
"ipv6": "auto"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"bgp": {
|
||||||
|
"local_as": "100",
|
||||||
|
"address_family": {
|
||||||
|
"ipv4": {
|
||||||
|
"unicast": {
|
||||||
|
"neighbor": {
|
||||||
|
"r1": {
|
||||||
|
"dest_link": {
|
||||||
|
"r2": {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"r3": {
|
||||||
|
"dest_link": {
|
||||||
|
"r2": {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"redistribute": [
|
||||||
|
{
|
||||||
|
"redist_type": "static"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"redist_type": "connected"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ipv6": {
|
||||||
|
"unicast": {
|
||||||
|
"neighbor": {
|
||||||
|
"r1": {
|
||||||
|
"dest_link": {
|
||||||
|
"r2": {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"r3": {
|
||||||
|
"dest_link": {
|
||||||
|
"r2": {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"redistribute": [
|
||||||
|
{
|
||||||
|
"redist_type": "static"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"redist_type": "connected"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"r3": {
|
||||||
|
"links": {
|
||||||
|
"lo": {
|
||||||
|
"ipv4": "auto",
|
||||||
|
"ipv6": "auto",
|
||||||
|
"type": "loopback"
|
||||||
|
},
|
||||||
|
"r1": {
|
||||||
|
"ipv4": "auto",
|
||||||
|
"ipv6": "auto"
|
||||||
|
},
|
||||||
|
"r2": {
|
||||||
|
"ipv4": "auto",
|
||||||
|
"ipv6": "auto"
|
||||||
|
},
|
||||||
|
"r4": {
|
||||||
|
"ipv4": "auto",
|
||||||
|
"ipv6": "auto",
|
||||||
|
"ospf": {
|
||||||
|
"area": "0.0.0.0",
|
||||||
|
"hello_interval": 1,
|
||||||
|
"dead_interval": 4
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"r5": {
|
||||||
|
"ipv4": "auto",
|
||||||
|
"ipv6": "auto",
|
||||||
|
"ospf": {
|
||||||
|
"area": "0.0.0.0",
|
||||||
|
"hello_interval": 1,
|
||||||
|
"dead_interval": 4
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"r4-link1": {
|
||||||
|
"ipv4": "auto",
|
||||||
|
"ipv6": "auto"
|
||||||
|
},
|
||||||
|
"r4-link2": {
|
||||||
|
"ipv4": "auto",
|
||||||
|
"ipv6": "auto"
|
||||||
|
},
|
||||||
|
"r4-link3": {
|
||||||
|
"ipv4": "auto",
|
||||||
|
"ipv6": "auto"
|
||||||
|
},
|
||||||
|
"r4-link4": {
|
||||||
|
"ipv4": "auto",
|
||||||
|
"ipv6": "auto"
|
||||||
|
},
|
||||||
|
"r4-link5": {
|
||||||
|
"ipv4": "auto",
|
||||||
|
"ipv6": "auto"
|
||||||
|
},
|
||||||
|
"r4-link6": {
|
||||||
|
"ipv4": "auto",
|
||||||
|
"ipv6": "auto"
|
||||||
|
},
|
||||||
|
"r4-link7": {
|
||||||
|
"ipv4": "auto",
|
||||||
|
"ipv6": "auto"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"bgp": {
|
||||||
|
"local_as": "100",
|
||||||
|
"address_family": {
|
||||||
|
"ipv4": {
|
||||||
|
"unicast": {
|
||||||
|
"neighbor": {
|
||||||
|
"r1": {
|
||||||
|
"dest_link": {
|
||||||
|
"r3": {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"r2": {
|
||||||
|
"dest_link": {
|
||||||
|
"r3": {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"r4": {
|
||||||
|
"dest_link": {
|
||||||
|
"r3": {},
|
||||||
|
"r3-link1": {},
|
||||||
|
"r3-link2": {},
|
||||||
|
"r3-link3": {},
|
||||||
|
"r3-link4": {},
|
||||||
|
"r3-link5": {},
|
||||||
|
"r3-link6": {},
|
||||||
|
"r3-link7": {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"r5": {
|
||||||
|
"dest_link": {
|
||||||
|
"r3": {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ipv6": {
|
||||||
|
"unicast": {
|
||||||
|
"neighbor": {
|
||||||
|
"r1": {
|
||||||
|
"dest_link": {
|
||||||
|
"r3": {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"r2": {
|
||||||
|
"dest_link": {
|
||||||
|
"r3": {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"r4": {
|
||||||
|
"dest_link": {
|
||||||
|
"r3": {},
|
||||||
|
"r3-link1": {},
|
||||||
|
"r3-link2": {},
|
||||||
|
"r3-link3": {},
|
||||||
|
"r3-link4": {},
|
||||||
|
"r3-link5": {},
|
||||||
|
"r3-link6": {},
|
||||||
|
"r3-link7": {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"r5": {
|
||||||
|
"dest_link": {
|
||||||
|
"r3": {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"redistribute": [
|
||||||
|
{
|
||||||
|
"redist_type": "static"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"redist_type": "connected"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"ospf": {
|
||||||
|
"router_id": "100.1.1.3",
|
||||||
|
"neighbors": {
|
||||||
|
"r4": {},
|
||||||
|
"r5": {}
|
||||||
|
},
|
||||||
|
"redistribute": [
|
||||||
|
{
|
||||||
|
"redist_type": "static"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"redist_type": "connected"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"r4": {
|
||||||
|
"links": {
|
||||||
|
"lo": {
|
||||||
|
"ipv4": "auto",
|
||||||
|
"ipv6": "auto",
|
||||||
|
"type": "loopback"
|
||||||
|
},
|
||||||
|
"r3": {
|
||||||
|
"ipv4": "auto",
|
||||||
|
"ipv6": "auto",
|
||||||
|
"ospf": {
|
||||||
|
"area": "0.0.0.0",
|
||||||
|
"hello_interval": 1,
|
||||||
|
"dead_interval": 4
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"r3-link1": {
|
||||||
|
"ipv4": "auto",
|
||||||
|
"ipv6": "auto"
|
||||||
|
},
|
||||||
|
"r3-link2": {
|
||||||
|
"ipv4": "auto",
|
||||||
|
"ipv6": "auto"
|
||||||
|
},
|
||||||
|
"r3-link3": {
|
||||||
|
"ipv4": "auto",
|
||||||
|
"ipv6": "auto"
|
||||||
|
},
|
||||||
|
"r3-link4": {
|
||||||
|
"ipv4": "auto",
|
||||||
|
"ipv6": "auto"
|
||||||
|
},
|
||||||
|
"r3-link5": {
|
||||||
|
"ipv4": "auto",
|
||||||
|
"ipv6": "auto"
|
||||||
|
},
|
||||||
|
"r3-link6": {
|
||||||
|
"ipv4": "auto",
|
||||||
|
"ipv6": "auto"
|
||||||
|
},
|
||||||
|
"r3-link7": {
|
||||||
|
"ipv4": "auto",
|
||||||
|
"ipv6": "auto"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"bgp": {
|
||||||
|
"local_as": "200",
|
||||||
|
"address_family": {
|
||||||
|
"ipv4": {
|
||||||
|
"unicast": {
|
||||||
|
"neighbor": {
|
||||||
|
"r3": {
|
||||||
|
"dest_link": {
|
||||||
|
"r4": {},
|
||||||
|
"r4-link1": {},
|
||||||
|
"r4-link2": {},
|
||||||
|
"r4-link3": {},
|
||||||
|
"r4-link4": {},
|
||||||
|
"r4-link5": {},
|
||||||
|
"r4-link6": {},
|
||||||
|
"r4-link7": {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"redistribute": [
|
||||||
|
{
|
||||||
|
"redist_type": "static"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"redist_type": "connected"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ipv6": {
|
||||||
|
"unicast": {
|
||||||
|
"neighbor": {
|
||||||
|
"r3": {
|
||||||
|
"dest_link": {
|
||||||
|
"r4": {},
|
||||||
|
"r4-link1": {},
|
||||||
|
"r4-link2": {},
|
||||||
|
"r4-link3": {},
|
||||||
|
"r4-link4": {},
|
||||||
|
"r4-link5": {},
|
||||||
|
"r4-link6": {},
|
||||||
|
"r4-link7": {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"redistribute": [
|
||||||
|
{
|
||||||
|
"redist_type": "static"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"redist_type": "connected"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ospf": {
|
||||||
|
"router_id": "10.10.10.10",
|
||||||
|
"neighbors": {
|
||||||
|
"r3": {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"r5": {
|
||||||
|
"links": {
|
||||||
|
"lo": {
|
||||||
|
"ipv4": "auto",
|
||||||
|
"ipv6": "auto",
|
||||||
|
"type": "loopback"
|
||||||
|
},
|
||||||
|
"r3": {
|
||||||
|
"ipv4": "auto",
|
||||||
|
"ipv6": "auto",
|
||||||
|
"ospf": {
|
||||||
|
"area": "0.0.0.0",
|
||||||
|
"hello_interval": 1,
|
||||||
|
"dead_interval": 4
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"bgp": {
|
||||||
|
"local_as": "300",
|
||||||
|
"address_family": {
|
||||||
|
"ipv4": {
|
||||||
|
"unicast": {
|
||||||
|
"neighbor": {
|
||||||
|
"r3": {
|
||||||
|
"dest_link": {
|
||||||
|
"r5": {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"redistribute": [
|
||||||
|
{
|
||||||
|
"redist_type": "static"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"redist_type": "connected"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ipv6": {
|
||||||
|
"unicast": {
|
||||||
|
"neighbor": {
|
||||||
|
"r3": {
|
||||||
|
"dest_link": {
|
||||||
|
"r5": {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"redistribute": [
|
||||||
|
{
|
||||||
|
"redist_type": "static"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"redist_type": "connected"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ospf": {
|
||||||
|
"router_id": "100.1.1.5",
|
||||||
|
"neighbors": {
|
||||||
|
"r3": {}
|
||||||
|
},
|
||||||
|
"redistribute": [
|
||||||
|
{
|
||||||
|
"redist_type": "static"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"redist_type": "connected"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
529
tests/topotests/bgp_unique_rid/bgp_unique_rid_vrf.json
Normal file
529
tests/topotests/bgp_unique_rid/bgp_unique_rid_vrf.json
Normal file
@ -0,0 +1,529 @@
|
|||||||
|
{
|
||||||
|
"address_types": [
|
||||||
|
"ipv4",
|
||||||
|
"ipv6"
|
||||||
|
],
|
||||||
|
"ipv4base": "10.0.0.0",
|
||||||
|
"ipv4mask": 30,
|
||||||
|
"ipv6base": "fd00::",
|
||||||
|
"ipv6mask": 64,
|
||||||
|
"link_ip_start": {
|
||||||
|
"ipv4": "10.0.0.0",
|
||||||
|
"v4mask": 30,
|
||||||
|
"ipv6": "fd00::",
|
||||||
|
"v6mask": 64
|
||||||
|
},
|
||||||
|
"lo_prefix": {
|
||||||
|
"ipv4": "1.0.",
|
||||||
|
"v4mask": 32,
|
||||||
|
"ipv6": "2001:DB8:F::",
|
||||||
|
"v6mask": 128
|
||||||
|
},
|
||||||
|
"routers": {
|
||||||
|
"r1": {
|
||||||
|
"links": {
|
||||||
|
"lo": {
|
||||||
|
"ipv4": "auto",
|
||||||
|
"ipv6": "auto",
|
||||||
|
"type": "loopback",
|
||||||
|
"vrf": "GREEN"
|
||||||
|
},
|
||||||
|
"r2": {
|
||||||
|
"ipv4": "auto",
|
||||||
|
"ipv6": "auto",
|
||||||
|
"vrf": "GREEN"
|
||||||
|
},
|
||||||
|
"r3": {
|
||||||
|
"ipv4": "auto",
|
||||||
|
"ipv6": "auto",
|
||||||
|
"vrf": "GREEN"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"bgp": [
|
||||||
|
{
|
||||||
|
"local_as": "100",
|
||||||
|
"vrf": "GREEN",
|
||||||
|
"address_family": {
|
||||||
|
"ipv4": {
|
||||||
|
"unicast": {
|
||||||
|
"neighbor": {
|
||||||
|
"r2": {
|
||||||
|
"dest_link": {
|
||||||
|
"r1": {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"r3": {
|
||||||
|
"dest_link": {
|
||||||
|
"r1": {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"redistribute": [
|
||||||
|
{
|
||||||
|
"redist_type": "static"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"redist_type": "connected"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ipv6": {
|
||||||
|
"unicast": {
|
||||||
|
"neighbor": {
|
||||||
|
"r2": {
|
||||||
|
"dest_link": {
|
||||||
|
"r1": {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"r3": {
|
||||||
|
"dest_link": {
|
||||||
|
"r1": {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"redistribute": [
|
||||||
|
{
|
||||||
|
"redist_type": "static"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"redist_type": "connected"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"vrfs": [
|
||||||
|
{
|
||||||
|
"name": "GREEN",
|
||||||
|
"id": "1"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"r2": {
|
||||||
|
"links": {
|
||||||
|
"lo": {
|
||||||
|
"ipv4": "auto",
|
||||||
|
"ipv6": "auto",
|
||||||
|
"type": "loopback",
|
||||||
|
"vrf": "GREEN"
|
||||||
|
},
|
||||||
|
"r1": {
|
||||||
|
"ipv4": "auto",
|
||||||
|
"ipv6": "auto",
|
||||||
|
"vrf": "GREEN"
|
||||||
|
},
|
||||||
|
"r3": {
|
||||||
|
"ipv4": "auto",
|
||||||
|
"ipv6": "auto",
|
||||||
|
"vrf": "GREEN"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"bgp": [
|
||||||
|
{
|
||||||
|
"local_as": "100",
|
||||||
|
"vrf": "GREEN",
|
||||||
|
"address_family": {
|
||||||
|
"ipv4": {
|
||||||
|
"unicast": {
|
||||||
|
"neighbor": {
|
||||||
|
"r1": {
|
||||||
|
"dest_link": {
|
||||||
|
"r2": {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"r3": {
|
||||||
|
"dest_link": {
|
||||||
|
"r2": {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"redistribute": [
|
||||||
|
{
|
||||||
|
"redist_type": "static"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"redist_type": "connected"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ipv6": {
|
||||||
|
"unicast": {
|
||||||
|
"neighbor": {
|
||||||
|
"r1": {
|
||||||
|
"dest_link": {
|
||||||
|
"r2": {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"r3": {
|
||||||
|
"dest_link": {
|
||||||
|
"r2": {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"redistribute": [
|
||||||
|
{
|
||||||
|
"redist_type": "static"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"redist_type": "connected"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"vrfs": [
|
||||||
|
{
|
||||||
|
"name": "GREEN",
|
||||||
|
"id": "1"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"r3": {
|
||||||
|
"links": {
|
||||||
|
"lo": {
|
||||||
|
"ipv4": "auto",
|
||||||
|
"ipv6": "auto",
|
||||||
|
"type": "loopback",
|
||||||
|
"vrf": "GREEN"
|
||||||
|
},
|
||||||
|
"r1": {
|
||||||
|
"ipv4": "auto",
|
||||||
|
"ipv6": "auto",
|
||||||
|
"vrf": "GREEN"
|
||||||
|
},
|
||||||
|
"r2": {
|
||||||
|
"ipv4": "auto",
|
||||||
|
"ipv6": "auto",
|
||||||
|
"vrf": "GREEN"
|
||||||
|
},
|
||||||
|
"r4": {
|
||||||
|
"ipv4": "auto",
|
||||||
|
"ipv6": "auto"
|
||||||
|
},
|
||||||
|
"r5": {
|
||||||
|
"ipv4": "auto",
|
||||||
|
"ipv6": "auto",
|
||||||
|
"vrf": "RED"
|
||||||
|
},
|
||||||
|
"r4-link1": {
|
||||||
|
"ipv4": "auto",
|
||||||
|
"ipv6": "auto"
|
||||||
|
},
|
||||||
|
"r4-link2": {
|
||||||
|
"ipv4": "auto",
|
||||||
|
"ipv6": "auto"
|
||||||
|
},
|
||||||
|
"r4-link3": {
|
||||||
|
"ipv4": "auto",
|
||||||
|
"ipv6": "auto"
|
||||||
|
},
|
||||||
|
"r4-link4": {
|
||||||
|
"ipv4": "auto",
|
||||||
|
"ipv6": "auto"
|
||||||
|
},
|
||||||
|
"r4-link5": {
|
||||||
|
"ipv4": "auto",
|
||||||
|
"ipv6": "auto"
|
||||||
|
},
|
||||||
|
"r4-link6": {
|
||||||
|
"ipv4": "auto",
|
||||||
|
"ipv6": "auto"
|
||||||
|
},
|
||||||
|
"r4-link7": {
|
||||||
|
"ipv4": "auto",
|
||||||
|
"ipv6": "auto"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"bgp": [
|
||||||
|
{
|
||||||
|
"local_as": "100",
|
||||||
|
"address_family": {
|
||||||
|
"ipv4": {
|
||||||
|
"unicast": {
|
||||||
|
"neighbor": {
|
||||||
|
"r4": {
|
||||||
|
"dest_link": {
|
||||||
|
"r3": {},
|
||||||
|
"r3-link1": {},
|
||||||
|
"r3-link2": {},
|
||||||
|
"r3-link3": {},
|
||||||
|
"r3-link4": {},
|
||||||
|
"r3-link5": {},
|
||||||
|
"r3-link6": {},
|
||||||
|
"r3-link7": {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ipv6": {
|
||||||
|
"unicast": {
|
||||||
|
"neighbor": {
|
||||||
|
"r4": {
|
||||||
|
"dest_link": {
|
||||||
|
"r3": {},
|
||||||
|
"r3-link1": {},
|
||||||
|
"r3-link2": {},
|
||||||
|
"r3-link3": {},
|
||||||
|
"r3-link4": {},
|
||||||
|
"r3-link5": {},
|
||||||
|
"r3-link6": {},
|
||||||
|
"r3-link7": {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"local_as": "100",
|
||||||
|
"vrf": "GREEN",
|
||||||
|
"address_family": {
|
||||||
|
"ipv4": {
|
||||||
|
"unicast": {
|
||||||
|
"neighbor": {
|
||||||
|
"r1": {
|
||||||
|
"dest_link": {
|
||||||
|
"r3": {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"r2": {
|
||||||
|
"dest_link": {
|
||||||
|
"r3": {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ipv6": {
|
||||||
|
"unicast": {
|
||||||
|
"neighbor": {
|
||||||
|
"r1": {
|
||||||
|
"dest_link": {
|
||||||
|
"r3": {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"r2": {
|
||||||
|
"dest_link": {
|
||||||
|
"r3": {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"local_as": "100",
|
||||||
|
"vrf": "RED",
|
||||||
|
"address_family": {
|
||||||
|
"ipv4": {
|
||||||
|
"unicast": {
|
||||||
|
"neighbor": {
|
||||||
|
"r5": {
|
||||||
|
"dest_link": {
|
||||||
|
"r3": {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ipv6": {
|
||||||
|
"unicast": {
|
||||||
|
"neighbor": {
|
||||||
|
"r5": {
|
||||||
|
"dest_link": {
|
||||||
|
"r3": {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"vrfs": [
|
||||||
|
{
|
||||||
|
"name": "RED",
|
||||||
|
"id": "1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "GREEN",
|
||||||
|
"id": "2"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"r4": {
|
||||||
|
"links": {
|
||||||
|
"lo": {
|
||||||
|
"ipv4": "auto",
|
||||||
|
"ipv6": "auto",
|
||||||
|
"type": "loopback"
|
||||||
|
},
|
||||||
|
"r3": {
|
||||||
|
"ipv4": "auto",
|
||||||
|
"ipv6": "auto"
|
||||||
|
},
|
||||||
|
"r3-link1": {
|
||||||
|
"ipv4": "auto",
|
||||||
|
"ipv6": "auto"
|
||||||
|
},
|
||||||
|
"r3-link2": {
|
||||||
|
"ipv4": "auto",
|
||||||
|
"ipv6": "auto"
|
||||||
|
},
|
||||||
|
"r3-link3": {
|
||||||
|
"ipv4": "auto",
|
||||||
|
"ipv6": "auto"
|
||||||
|
},
|
||||||
|
"r3-link4": {
|
||||||
|
"ipv4": "auto",
|
||||||
|
"ipv6": "auto"
|
||||||
|
},
|
||||||
|
"r3-link5": {
|
||||||
|
"ipv4": "auto",
|
||||||
|
"ipv6": "auto"
|
||||||
|
},
|
||||||
|
"r3-link6": {
|
||||||
|
"ipv4": "auto",
|
||||||
|
"ipv6": "auto"
|
||||||
|
},
|
||||||
|
"r3-link7": {
|
||||||
|
"ipv4": "auto",
|
||||||
|
"ipv6": "auto"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"bgp": [{
|
||||||
|
"local_as": "200",
|
||||||
|
"address_family": {
|
||||||
|
"ipv4": {
|
||||||
|
"unicast": {
|
||||||
|
"neighbor": {
|
||||||
|
"r3": {
|
||||||
|
"dest_link": {
|
||||||
|
"r4": {},
|
||||||
|
"r4-link1": {},
|
||||||
|
"r4-link2": {},
|
||||||
|
"r4-link3": {},
|
||||||
|
"r4-link4": {},
|
||||||
|
"r4-link5": {},
|
||||||
|
"r4-link6": {},
|
||||||
|
"r4-link7": {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"redistribute": [
|
||||||
|
{
|
||||||
|
"redist_type": "static"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"redist_type": "connected"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ipv6": {
|
||||||
|
"unicast": {
|
||||||
|
"neighbor": {
|
||||||
|
"r3": {
|
||||||
|
"dest_link": {
|
||||||
|
"r4": {},
|
||||||
|
"r4-link1": {},
|
||||||
|
"r4-link2": {},
|
||||||
|
"r4-link3": {},
|
||||||
|
"r4-link4": {},
|
||||||
|
"r4-link5": {},
|
||||||
|
"r4-link6": {},
|
||||||
|
"r4-link7": {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"redistribute": [
|
||||||
|
{
|
||||||
|
"redist_type": "static"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"redist_type": "connected"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}]
|
||||||
|
},
|
||||||
|
"r5": {
|
||||||
|
"links": {
|
||||||
|
"lo": {
|
||||||
|
"ipv4": "auto",
|
||||||
|
"ipv6": "auto",
|
||||||
|
"type": "loopback",
|
||||||
|
"vrf": "RED"
|
||||||
|
},
|
||||||
|
"r3": {
|
||||||
|
"ipv4": "auto",
|
||||||
|
"ipv6": "auto",
|
||||||
|
"vrf": "RED"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"bgp": [
|
||||||
|
{
|
||||||
|
"local_as": "300",
|
||||||
|
"vrf":"RED",
|
||||||
|
"address_family": {
|
||||||
|
"ipv4": {
|
||||||
|
"unicast": {
|
||||||
|
"neighbor": {
|
||||||
|
"r3": {
|
||||||
|
"dest_link": {
|
||||||
|
"r5": {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"redistribute": [
|
||||||
|
{
|
||||||
|
"redist_type": "static"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"redist_type": "connected"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ipv6": {
|
||||||
|
"unicast": {
|
||||||
|
"neighbor": {
|
||||||
|
"r3": {
|
||||||
|
"dest_link": {
|
||||||
|
"r5": {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"redistribute": [
|
||||||
|
{
|
||||||
|
"redist_type": "static"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"redist_type": "connected"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"vrfs": [
|
||||||
|
{
|
||||||
|
"name": "RED",
|
||||||
|
"id": "1"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
906
tests/topotests/bgp_unique_rid/test_bgp_unique_rid.py
Normal file
906
tests/topotests/bgp_unique_rid/test_bgp_unique_rid.py
Normal file
@ -0,0 +1,906 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
|
||||||
|
#
|
||||||
|
# Copyright (c) 2022 by VMware, Inc. ("VMware")
|
||||||
|
# Used Copyright (c) 2018 by Network Device Education Foundation,
|
||||||
|
# Inc. ("NetDEF") in this file.
|
||||||
|
#
|
||||||
|
# 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 VMWARE DISCLAIMS ALL WARRANTIES
|
||||||
|
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL VMWARE 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.
|
||||||
|
#
|
||||||
|
|
||||||
|
import sys
|
||||||
|
import time
|
||||||
|
import pytest
|
||||||
|
import inspect
|
||||||
|
import os
|
||||||
|
from copy import deepcopy
|
||||||
|
|
||||||
|
# Save the Current Working Directory to find configuration files.
|
||||||
|
CWD = os.path.dirname(os.path.realpath(__file__))
|
||||||
|
sys.path.append(os.path.join(CWD, "../"))
|
||||||
|
sys.path.append(os.path.join(CWD, "../lib/"))
|
||||||
|
|
||||||
|
"""Following tests are covered to test bgp unique rid functionality.
|
||||||
|
1. Verify eBGP session when same and different router ID is configured.
|
||||||
|
2. Verify iBGP session when same and different router ID is configured.
|
||||||
|
3. Verify two different eBGP sessions initiated with same router ID.
|
||||||
|
4. Chaos - Verify bgp unique rid functionality in chaos scenarios.
|
||||||
|
5. Chaos - Verify bgp unique rid functionality when router reboots with same loopback id.
|
||||||
|
6. Chaos - Verify bgp unique rid functionality when router reboots without any ip addresses.
|
||||||
|
"""
|
||||||
|
|
||||||
|
#################################
|
||||||
|
# TOPOLOGY
|
||||||
|
#################################
|
||||||
|
"""
|
||||||
|
|
||||||
|
+-------+
|
||||||
|
+--------- | R2 |
|
||||||
|
| +-------+
|
||||||
|
|iBGP |
|
||||||
|
+-------+ |
|
||||||
|
| R1 | |iBGP
|
||||||
|
+-------+ |
|
||||||
|
| |
|
||||||
|
| iBGP +-------+ eBGP +-------+
|
||||||
|
+---------- | R3 |========= | R4 |
|
||||||
|
+-------+ +-------+
|
||||||
|
|
|
||||||
|
|eBGP
|
||||||
|
|
|
||||||
|
+-------+
|
||||||
|
| R5 |
|
||||||
|
+-------+
|
||||||
|
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
# pylint: disable=C0413
|
||||||
|
# Import topogen and topotest helpers
|
||||||
|
from lib.topogen import Topogen, get_topogen
|
||||||
|
from lib.topojson import build_config_from_json
|
||||||
|
from lib.topolog import logger
|
||||||
|
|
||||||
|
pytestmark = [pytest.mark.bgpd, pytest.mark.ospfd, pytest.mark.staticd]
|
||||||
|
|
||||||
|
# Required to instantiate the topology builder class.
|
||||||
|
from lib.common_config import (
|
||||||
|
start_topology,
|
||||||
|
write_test_header,
|
||||||
|
step,
|
||||||
|
write_test_footer,
|
||||||
|
verify_rib,
|
||||||
|
check_address_types,
|
||||||
|
reset_config_on_routers,
|
||||||
|
check_router_status,
|
||||||
|
stop_router,
|
||||||
|
kill_router_daemons,
|
||||||
|
start_router_daemons,
|
||||||
|
start_router,
|
||||||
|
)
|
||||||
|
from lib.topolog import logger
|
||||||
|
from lib.bgp import (
|
||||||
|
verify_bgp_convergence,
|
||||||
|
create_router_bgp,
|
||||||
|
clear_bgp_and_verify,
|
||||||
|
)
|
||||||
|
|
||||||
|
# Global variables
|
||||||
|
topo = None
|
||||||
|
bgp_convergence = False
|
||||||
|
NETWORK = {
|
||||||
|
"ipv4": [
|
||||||
|
"192.168.20.1/32",
|
||||||
|
"192.168.20.2/32",
|
||||||
|
"192.168.21.1/32",
|
||||||
|
"192.168.21.2/32",
|
||||||
|
"192.168.22.1/32",
|
||||||
|
"192.168.22.2/32",
|
||||||
|
],
|
||||||
|
"ipv6": [
|
||||||
|
"fc07:50::1/128",
|
||||||
|
"fc07:50::2/128",
|
||||||
|
"fc07:150::1/128",
|
||||||
|
"fc07:150::2/128",
|
||||||
|
"fc07:1::1/128",
|
||||||
|
"fc07:1::2/128",
|
||||||
|
],
|
||||||
|
}
|
||||||
|
|
||||||
|
bgp_convergence = False
|
||||||
|
ADDR_TYPES = check_address_types()
|
||||||
|
routerid = {"ipv4": "10.10.10.14", "ipv6": "fd00:0:0:3::2"}
|
||||||
|
|
||||||
|
|
||||||
|
def setup_module(mod):
|
||||||
|
"""setup_module.
|
||||||
|
|
||||||
|
Set up the pytest environment
|
||||||
|
* `mod`: module name
|
||||||
|
"""
|
||||||
|
global topo
|
||||||
|
testsuite_run_time = time.asctime(time.localtime(time.time()))
|
||||||
|
logger.info("Testsuite start time: {}".format(testsuite_run_time))
|
||||||
|
logger.info("=" * 40)
|
||||||
|
|
||||||
|
logger.info("Running setup_module to create topology")
|
||||||
|
|
||||||
|
# This function initiates the topology build with Topogen...
|
||||||
|
json_file = "{}/bgp_unique_rid.json".format(CWD)
|
||||||
|
tgen = Topogen(json_file, mod.__name__)
|
||||||
|
global topo
|
||||||
|
topo = tgen.json_topo
|
||||||
|
# ... and here it calls Mininet initialization functions.
|
||||||
|
|
||||||
|
# Starting topology, create tmp files which are loaded to routers
|
||||||
|
# to start daemons and then start routers
|
||||||
|
start_topology(tgen)
|
||||||
|
|
||||||
|
# Creating configuration from JSON
|
||||||
|
build_config_from_json(tgen, topo)
|
||||||
|
|
||||||
|
# Checking BGP convergence
|
||||||
|
global bgp_convergence
|
||||||
|
global ADDR_TYPES
|
||||||
|
|
||||||
|
# Don't run this test if we have any failure.
|
||||||
|
if tgen.routers_have_failure():
|
||||||
|
pytest.skip(tgen.errors)
|
||||||
|
|
||||||
|
# Api call verify whether BGP is converged
|
||||||
|
bgp_convergence = verify_bgp_convergence(tgen, topo)
|
||||||
|
assert bgp_convergence is True, "setup_module :Failed \n Error:" " {}".format(
|
||||||
|
bgp_convergence
|
||||||
|
)
|
||||||
|
logger.info("Running setup_module() done")
|
||||||
|
|
||||||
|
|
||||||
|
def teardown_module():
|
||||||
|
"""Teardown the pytest environment"""
|
||||||
|
|
||||||
|
logger.info("Running teardown_module to delete topology")
|
||||||
|
|
||||||
|
tgen = get_topogen()
|
||||||
|
|
||||||
|
# Stop toplogy and Remove tmp files
|
||||||
|
tgen.stop_topology()
|
||||||
|
|
||||||
|
logger.info(
|
||||||
|
"Testsuite end time: {}".format(time.asctime(time.localtime(time.time())))
|
||||||
|
)
|
||||||
|
logger.info("=" * 40)
|
||||||
|
|
||||||
|
|
||||||
|
#####################################################
|
||||||
|
# Tests starting
|
||||||
|
#####################################################
|
||||||
|
|
||||||
|
|
||||||
|
def test_bgp_unique_rid_ebgp_p0():
|
||||||
|
"""
|
||||||
|
TC: 1
|
||||||
|
Verify eBGP session when same and different router ID is configured.
|
||||||
|
"""
|
||||||
|
tgen = get_topogen()
|
||||||
|
global bgp_convergence
|
||||||
|
|
||||||
|
if bgp_convergence is not True:
|
||||||
|
pytest.skip("skipped because of BGP Convergence failure")
|
||||||
|
|
||||||
|
# test case name
|
||||||
|
tc_name = inspect.stack()[0][3]
|
||||||
|
write_test_header(tc_name)
|
||||||
|
if tgen.routers_have_failure():
|
||||||
|
check_router_status(tgen)
|
||||||
|
|
||||||
|
step("Configure base config as per the topology")
|
||||||
|
reset_config_on_routers(tgen)
|
||||||
|
|
||||||
|
step(
|
||||||
|
"Base config should be up, verify using BGP convergence on all \
|
||||||
|
the routers for IPv4 and IPv6 nbrs"
|
||||||
|
)
|
||||||
|
|
||||||
|
result = verify_bgp_convergence(tgen, topo)
|
||||||
|
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
|
||||||
|
|
||||||
|
step("Configure the same router id between R4 and R3 10.10.10.10")
|
||||||
|
input_dict = {
|
||||||
|
"r3": {"bgp": {"router_id": "10.10.10.10"}},
|
||||||
|
"r4": {"bgp": {"router_id": "10.10.10.10"}},
|
||||||
|
}
|
||||||
|
result = create_router_bgp(tgen, topo, input_dict)
|
||||||
|
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
|
||||||
|
|
||||||
|
step("Verify neighbours are in ESTAB state.")
|
||||||
|
result = verify_bgp_convergence(tgen, topo)
|
||||||
|
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
|
||||||
|
|
||||||
|
step("Configure the same router id between R5 and R3 (10.10.10.10)")
|
||||||
|
input_dict = {
|
||||||
|
"r3": {"bgp": {"router_id": "10.10.10.10"}},
|
||||||
|
"r5": {"bgp": {"router_id": "10.10.10.10"}},
|
||||||
|
}
|
||||||
|
result = create_router_bgp(tgen, topo, input_dict)
|
||||||
|
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
|
||||||
|
|
||||||
|
step("Verify neighbours are in ESTAB state.")
|
||||||
|
result = verify_bgp_convergence(tgen, topo)
|
||||||
|
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
|
||||||
|
|
||||||
|
step("modify the router id on r3 to different router id (11.11.11.11)")
|
||||||
|
input_dict = {"r3": {"bgp": {"router_id": "11.11.11.11"}}}
|
||||||
|
result = create_router_bgp(tgen, topo, input_dict)
|
||||||
|
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
|
||||||
|
|
||||||
|
step("Verify neighbours are in ESTAB state.")
|
||||||
|
result = verify_bgp_convergence(tgen, topo)
|
||||||
|
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
|
||||||
|
|
||||||
|
step("Reset bgp process")
|
||||||
|
step("Verify neighbours are in ESTAB state.")
|
||||||
|
dut = "r3"
|
||||||
|
result = clear_bgp_and_verify(tgen, topo, dut)
|
||||||
|
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
|
||||||
|
|
||||||
|
step("Clear ip bgp process with *")
|
||||||
|
step("Verify neighbours are in ESTAB state.")
|
||||||
|
result = clear_bgp_and_verify(tgen, topo, dut)
|
||||||
|
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
|
||||||
|
|
||||||
|
step("Configure neighbours between R3 and R4 in EVPN address family.")
|
||||||
|
input_dict = {
|
||||||
|
"r3": {
|
||||||
|
"bgp": {
|
||||||
|
"address_family": {
|
||||||
|
"l2vpn": {
|
||||||
|
"evpn": {
|
||||||
|
"advertise": {
|
||||||
|
"ipv4": {"unicast": {}},
|
||||||
|
"ipv6": {"unicast": {}},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"r4": {
|
||||||
|
"bgp": {
|
||||||
|
"address_family": {
|
||||||
|
"l2vpn": {
|
||||||
|
"evpn": {
|
||||||
|
"advertise": {
|
||||||
|
"ipv4": {"unicast": {}},
|
||||||
|
"ipv6": {"unicast": {}},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
result = create_router_bgp(tgen, topo, input_dict)
|
||||||
|
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
|
||||||
|
|
||||||
|
step("Verify neighbours are in ESTAB state.")
|
||||||
|
result = clear_bgp_and_verify(tgen, topo, dut)
|
||||||
|
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
|
||||||
|
|
||||||
|
write_test_footer(tc_name)
|
||||||
|
|
||||||
|
|
||||||
|
def test_bgp_unique_rid_ibgp_p0():
|
||||||
|
"""
|
||||||
|
TC: 2
|
||||||
|
Verify iBGP session when same and different router ID is configured.
|
||||||
|
"""
|
||||||
|
tgen = get_topogen()
|
||||||
|
global bgp_convergence
|
||||||
|
|
||||||
|
if bgp_convergence is not True:
|
||||||
|
pytest.skip("skipped because of BGP Convergence failure")
|
||||||
|
|
||||||
|
# test case name
|
||||||
|
tc_name = inspect.stack()[0][3]
|
||||||
|
write_test_header(tc_name)
|
||||||
|
if tgen.routers_have_failure():
|
||||||
|
check_router_status(tgen)
|
||||||
|
|
||||||
|
step("Configure base config as per the topology")
|
||||||
|
reset_config_on_routers(tgen)
|
||||||
|
|
||||||
|
step(
|
||||||
|
"Base config should be up, verify using BGP convergence on all \
|
||||||
|
the routers for IPv4 and IPv6 nbrs"
|
||||||
|
)
|
||||||
|
|
||||||
|
result = verify_bgp_convergence(tgen, topo)
|
||||||
|
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
|
||||||
|
|
||||||
|
step("Configure the same router id between R1 and R3 (10.10.10.10)")
|
||||||
|
input_dict = {
|
||||||
|
"r3": {"bgp": {"router_id": "10.10.10.10"}},
|
||||||
|
"r1": {"bgp": {"router_id": "10.10.10.10"}},
|
||||||
|
}
|
||||||
|
result = create_router_bgp(tgen, topo, input_dict)
|
||||||
|
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
|
||||||
|
|
||||||
|
step("Verify neighbours are in idle state.")
|
||||||
|
result = verify_bgp_convergence(tgen, topo, expected=False)
|
||||||
|
assert result is not True, "Testcase {} :Failed \n Error: {}".format(
|
||||||
|
tc_name, result
|
||||||
|
)
|
||||||
|
|
||||||
|
step("Configure the same router id between R2 and R3 (10.10.10.10)")
|
||||||
|
input_dict = {
|
||||||
|
"r3": {"bgp": {"router_id": "10.10.10.10"}},
|
||||||
|
"r2": {"bgp": {"router_id": "10.10.10.10"}},
|
||||||
|
}
|
||||||
|
result = create_router_bgp(tgen, topo, input_dict)
|
||||||
|
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
|
||||||
|
|
||||||
|
step("Verify neighbours are in idle state.")
|
||||||
|
result = verify_bgp_convergence(tgen, topo, expected=False)
|
||||||
|
assert result is not True, "Testcase {} :Failed \n Error: {}".format(
|
||||||
|
tc_name, result
|
||||||
|
)
|
||||||
|
|
||||||
|
step("modify the router id on r3 to different router id (11.11.11.11)")
|
||||||
|
input_dict = {"r3": {"bgp": {"router_id": "11.11.11.11"}}}
|
||||||
|
result = create_router_bgp(tgen, topo, input_dict)
|
||||||
|
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
|
||||||
|
|
||||||
|
step("Verify neighbours are in ESTAB state.")
|
||||||
|
result = verify_bgp_convergence(tgen, topo, dut="r3")
|
||||||
|
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
|
||||||
|
|
||||||
|
step("Reset bgp process")
|
||||||
|
step("Verify neighbours are in ESTAB state.")
|
||||||
|
dut = "r3"
|
||||||
|
result = clear_bgp_and_verify(tgen, topo, dut)
|
||||||
|
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
|
||||||
|
|
||||||
|
step("Clear ip bgp process with *")
|
||||||
|
result = clear_bgp_and_verify(tgen, topo, dut)
|
||||||
|
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
|
||||||
|
|
||||||
|
write_test_footer(tc_name)
|
||||||
|
|
||||||
|
|
||||||
|
def test_bgp_unique_rid_multi_bgp_nbrs_p0():
|
||||||
|
"""
|
||||||
|
TC: 3
|
||||||
|
3. Verify two different eBGP sessions initiated with same router ID
|
||||||
|
|
||||||
|
"""
|
||||||
|
tgen = get_topogen()
|
||||||
|
global bgp_convergence, topo
|
||||||
|
|
||||||
|
if bgp_convergence is not True:
|
||||||
|
pytest.skip("skipped because of BGP Convergence failure")
|
||||||
|
|
||||||
|
# test case name
|
||||||
|
tc_name = inspect.stack()[0][3]
|
||||||
|
write_test_header(tc_name)
|
||||||
|
if tgen.routers_have_failure():
|
||||||
|
check_router_status(tgen)
|
||||||
|
|
||||||
|
step("Configure base config as per the topology")
|
||||||
|
reset_config_on_routers(tgen)
|
||||||
|
|
||||||
|
step(
|
||||||
|
"Base config should be up, verify using BGP convergence on all \
|
||||||
|
the routers for IPv4 and IPv6 nbrs"
|
||||||
|
)
|
||||||
|
|
||||||
|
result = verify_bgp_convergence(tgen, topo)
|
||||||
|
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
|
||||||
|
|
||||||
|
step("Configure the same router id between R3, R4 and R5 (10.10.10.10)")
|
||||||
|
input_dict = {
|
||||||
|
"r3": {"bgp": {"router_id": "10.10.10.10"}},
|
||||||
|
"r4": {"bgp": {"router_id": "10.10.10.10"}},
|
||||||
|
"r5": {"bgp": {"router_id": "10.10.10.10"}},
|
||||||
|
}
|
||||||
|
result = create_router_bgp(tgen, topo, input_dict)
|
||||||
|
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
|
||||||
|
|
||||||
|
step("Verify neighbours are in ESTAB state.")
|
||||||
|
result = verify_bgp_convergence(tgen, topo)
|
||||||
|
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
|
||||||
|
|
||||||
|
step(
|
||||||
|
"Configure the same IP address on on R4 and R5 loopback address and \
|
||||||
|
change the neighborship to loopback neighbours between R3 to R4 \
|
||||||
|
and R3 to R5 respectively."
|
||||||
|
)
|
||||||
|
|
||||||
|
topo1 = deepcopy(topo)
|
||||||
|
|
||||||
|
for rtr in ["r4", "r5"]:
|
||||||
|
topo1["routers"][rtr]["links"]["lo"]["ipv4"] = "192.168.1.1/32"
|
||||||
|
|
||||||
|
topo1["routers"]["r3"]["links"]["lo"]["ipv4"] = "192.168.1.3/32"
|
||||||
|
build_config_from_json(tgen, topo1, save_bkup=False)
|
||||||
|
|
||||||
|
step(
|
||||||
|
"change the neighborship to loopback neighbours between R3 to R4 and R3 to R5 respectively."
|
||||||
|
)
|
||||||
|
for rtr in ["r4", "r5"]:
|
||||||
|
configure_bgp_on_rtr = {
|
||||||
|
"r3": {
|
||||||
|
"bgp": {
|
||||||
|
"address_family": {
|
||||||
|
"ipv4": {
|
||||||
|
"unicast": {"neighbor": {rtr: {"dest_link": {"lo": {}}}}}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
result = create_router_bgp(tgen, topo1, configure_bgp_on_rtr)
|
||||||
|
assert result is True, "Testcase {} : Failed \n Error: {}".format(
|
||||||
|
tc_name, result
|
||||||
|
)
|
||||||
|
|
||||||
|
bgp_convergence = verify_bgp_convergence(tgen, topo1, dut="r3")
|
||||||
|
assert bgp_convergence is True, "Testcase {} : Failed \n Error: {}".format(
|
||||||
|
tc_name, bgp_convergence
|
||||||
|
)
|
||||||
|
|
||||||
|
step("Change the IP address on the R4 loopback.")
|
||||||
|
topo1["routers"]["r4"]["links"]["lo"]["ipv4"] = "192.168.1.4/32"
|
||||||
|
build_config_from_json(tgen, topo1, save_bkup=False)
|
||||||
|
|
||||||
|
step("Verify neighbours should be again in ESTAB state. (show ip bgp neighbours)")
|
||||||
|
bgp_convergence = verify_bgp_convergence(tgen, topo1, dut="r3")
|
||||||
|
assert bgp_convergence is True, "Testcase {} : Failed \n Error: {}".format(
|
||||||
|
tc_name, bgp_convergence
|
||||||
|
)
|
||||||
|
|
||||||
|
step("Clear ip bgp process with *")
|
||||||
|
result = clear_bgp_and_verify(tgen, topo, router="r3")
|
||||||
|
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
|
||||||
|
|
||||||
|
write_test_footer(tc_name)
|
||||||
|
|
||||||
|
|
||||||
|
def test_bgp_unique_rid_chaos1_p2():
|
||||||
|
"""
|
||||||
|
TC: 4
|
||||||
|
4. Chaos - Verify bgp unique rid functionality in chaos scenarios.
|
||||||
|
|
||||||
|
"""
|
||||||
|
tgen = get_topogen()
|
||||||
|
global bgp_convergence
|
||||||
|
|
||||||
|
if bgp_convergence is not True:
|
||||||
|
pytest.skip("skipped because of BGP Convergence failure")
|
||||||
|
|
||||||
|
# test case name
|
||||||
|
tc_name = inspect.stack()[0][3]
|
||||||
|
write_test_header(tc_name)
|
||||||
|
if tgen.routers_have_failure():
|
||||||
|
check_router_status(tgen)
|
||||||
|
|
||||||
|
step("Configure base config as per the topology")
|
||||||
|
reset_config_on_routers(tgen)
|
||||||
|
|
||||||
|
step(
|
||||||
|
"Base config should be up, verify using BGP convergence on all \
|
||||||
|
the routers for IPv4 and IPv6 nbrs"
|
||||||
|
)
|
||||||
|
|
||||||
|
result = verify_bgp_convergence(tgen, topo)
|
||||||
|
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
|
||||||
|
|
||||||
|
step("Configure the same router id between R3, R4 and R5 (10.10.10.10)")
|
||||||
|
input_dict = {
|
||||||
|
"r3": {"bgp": {"router_id": "10.10.10.10"}},
|
||||||
|
"r4": {"bgp": {"router_id": "10.10.10.10"}},
|
||||||
|
"r5": {"bgp": {"router_id": "10.10.10.10"}},
|
||||||
|
}
|
||||||
|
result = create_router_bgp(tgen, topo, input_dict)
|
||||||
|
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
|
||||||
|
|
||||||
|
step("Verify neighbours are in ESTAB state.")
|
||||||
|
result = verify_bgp_convergence(tgen, topo)
|
||||||
|
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
|
||||||
|
|
||||||
|
step(
|
||||||
|
"Verify eBGP session when same router ID is configured and bgpd process is restarted"
|
||||||
|
)
|
||||||
|
|
||||||
|
# restart bgpd router and verify
|
||||||
|
kill_router_daemons(tgen, "r3", ["bgpd"])
|
||||||
|
start_router_daemons(tgen, "r3", ["bgpd"])
|
||||||
|
|
||||||
|
step(
|
||||||
|
"The session should be established between R3 & R4. "
|
||||||
|
"Once after restart bgp, neighbor should come back up ."
|
||||||
|
)
|
||||||
|
|
||||||
|
bgp_convergence = verify_bgp_convergence(tgen, topo)
|
||||||
|
assert bgp_convergence is True, "Testcase {} : Failed \n Error: {}".format(
|
||||||
|
tc_name, bgp_convergence
|
||||||
|
)
|
||||||
|
|
||||||
|
step(
|
||||||
|
"Verify eBGP session when same router ID is configured and neighbor shutdown is issued and again no shutdown."
|
||||||
|
)
|
||||||
|
|
||||||
|
input_dict = {
|
||||||
|
"r3": {
|
||||||
|
"bgp": {
|
||||||
|
"local_as": "100",
|
||||||
|
"address_family": {
|
||||||
|
"ipv4": {
|
||||||
|
"unicast": {
|
||||||
|
"neighbor": {
|
||||||
|
"r4": {
|
||||||
|
"dest_link": {
|
||||||
|
"r3-link1": {"shutdown": True},
|
||||||
|
"r3-link2": {"shutdown": True},
|
||||||
|
"r3-link3": {"shutdown": True},
|
||||||
|
"r3-link4": {"shutdown": True},
|
||||||
|
"r3-link5": {"shutdown": True},
|
||||||
|
"r3-link6": {"shutdown": True},
|
||||||
|
"r3-link7": {"shutdown": True},
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"r5": {"dest_link": {"r3": {"shutdown": True}}},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ipv6": {
|
||||||
|
"unicast": {
|
||||||
|
"neighbor": {
|
||||||
|
"r4": {
|
||||||
|
"dest_link": {
|
||||||
|
"r3-link1": {"shutdown": True},
|
||||||
|
"r3-link2": {"shutdown": True},
|
||||||
|
"r3-link3": {"shutdown": True},
|
||||||
|
"r3-link4": {"shutdown": True},
|
||||||
|
"r3-link5": {"shutdown": True},
|
||||||
|
"r3-link6": {"shutdown": True},
|
||||||
|
"r3-link7": {"shutdown": True},
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"r5": {"dest_link": {"r3": {"shutdown": True}}},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
result = create_router_bgp(tgen, topo, input_dict)
|
||||||
|
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
|
||||||
|
|
||||||
|
input_dict = {
|
||||||
|
"r3": {
|
||||||
|
"bgp": {
|
||||||
|
"local_as": "100",
|
||||||
|
"address_family": {
|
||||||
|
"ipv4": {
|
||||||
|
"unicast": {
|
||||||
|
"neighbor": {
|
||||||
|
"r4": {
|
||||||
|
"dest_link": {
|
||||||
|
"r3-link1": {"shutdown": False},
|
||||||
|
"r3-link2": {"shutdown": False},
|
||||||
|
"r3-link3": {"shutdown": False},
|
||||||
|
"r3-link4": {"shutdown": False},
|
||||||
|
"r3-link5": {"shutdown": False},
|
||||||
|
"r3-link6": {"shutdown": False},
|
||||||
|
"r3-link7": {"shutdown": False},
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"r5": {"dest_link": {"r3": {"shutdown": False}}},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ipv6": {
|
||||||
|
"unicast": {
|
||||||
|
"neighbor": {
|
||||||
|
"r4": {
|
||||||
|
"dest_link": {
|
||||||
|
"r3-link1": {"shutdown": False},
|
||||||
|
"r3-link2": {"shutdown": False},
|
||||||
|
"r3-link3": {"shutdown": False},
|
||||||
|
"r3-link4": {"shutdown": False},
|
||||||
|
"r3-link5": {"shutdown": False},
|
||||||
|
"r3-link6": {"shutdown": False},
|
||||||
|
"r3-link7": {"shutdown": False},
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"r5": {"dest_link": {"r3": {"shutdown": False}}},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
result = create_router_bgp(tgen, topo, input_dict)
|
||||||
|
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
|
||||||
|
|
||||||
|
step(
|
||||||
|
"The session should be established between R3 & R4. "
|
||||||
|
"Once after restart bgp, neighbor should come back up ."
|
||||||
|
)
|
||||||
|
|
||||||
|
bgp_convergence = verify_bgp_convergence(tgen, topo)
|
||||||
|
assert bgp_convergence is True, "Testcase {} : Failed \n Error: {}".format(
|
||||||
|
tc_name, bgp_convergence
|
||||||
|
)
|
||||||
|
|
||||||
|
step(
|
||||||
|
"Verify eBGP session when same router ID is configured and neighbor config is deleted & reconfigured."
|
||||||
|
)
|
||||||
|
|
||||||
|
input_dict = {
|
||||||
|
"r3": {
|
||||||
|
"bgp": {
|
||||||
|
"local_as": "100",
|
||||||
|
"address_family": {
|
||||||
|
"ipv4": {
|
||||||
|
"unicast": {
|
||||||
|
"neighbor": {
|
||||||
|
"r4": {
|
||||||
|
"dest_link": {
|
||||||
|
"r3-link1": {},
|
||||||
|
"r3-link2": {},
|
||||||
|
"r3-link3": {},
|
||||||
|
"r3-link4": {},
|
||||||
|
"r3-link5": {},
|
||||||
|
"r3-link6": {},
|
||||||
|
"r3-link7": {},
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"r5": {"dest_link": {"r3": {}}},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ipv6": {
|
||||||
|
"unicast": {
|
||||||
|
"neighbor": {
|
||||||
|
"r4": {
|
||||||
|
"dest_link": {
|
||||||
|
"r3-link1": {},
|
||||||
|
"r3-link2": {},
|
||||||
|
"r3-link3": {},
|
||||||
|
"r3-link4": {},
|
||||||
|
"r3-link5": {},
|
||||||
|
"r3-link6": {},
|
||||||
|
"r3-link7": {},
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"r5": {"dest_link": {"r3": {}}},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
result = create_router_bgp(tgen, topo, input_dict)
|
||||||
|
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
|
||||||
|
|
||||||
|
step(
|
||||||
|
"The session should be established between R3 & R4. "
|
||||||
|
"Once after restart bgp, neighbor should come back up ."
|
||||||
|
)
|
||||||
|
|
||||||
|
bgp_convergence = verify_bgp_convergence(tgen, topo)
|
||||||
|
assert bgp_convergence is True, "Testcase {} : Failed \n Error: {}".format(
|
||||||
|
tc_name, bgp_convergence
|
||||||
|
)
|
||||||
|
|
||||||
|
step(
|
||||||
|
"Verify eBGP session when same router ID is configured and FRR router is restarted."
|
||||||
|
)
|
||||||
|
stop_router(tgen, "r3")
|
||||||
|
start_router(tgen, "r3")
|
||||||
|
|
||||||
|
step(
|
||||||
|
"The session should be established between R3 & R4. "
|
||||||
|
"Once after restart bgp, neighbor should come back up ."
|
||||||
|
)
|
||||||
|
|
||||||
|
bgp_convergence = verify_bgp_convergence(tgen, topo)
|
||||||
|
assert bgp_convergence is True, "Testcase {} : Failed \n Error: {}".format(
|
||||||
|
tc_name, bgp_convergence
|
||||||
|
)
|
||||||
|
|
||||||
|
step(
|
||||||
|
"Verify eBGP session when same router ID is configured and zebra process is restarted"
|
||||||
|
)
|
||||||
|
|
||||||
|
kill_router_daemons(tgen, "r3", ["zebra"])
|
||||||
|
start_router_daemons(tgen, "r3", ["zebra"])
|
||||||
|
|
||||||
|
step(
|
||||||
|
"The session should be established between R3 & R4. "
|
||||||
|
"Once after restart bgp, neighbor should come back up ."
|
||||||
|
)
|
||||||
|
|
||||||
|
bgp_convergence = verify_bgp_convergence(tgen, topo)
|
||||||
|
assert bgp_convergence is True, "Testcase {} : Failed \n Error: {}".format(
|
||||||
|
tc_name, bgp_convergence
|
||||||
|
)
|
||||||
|
|
||||||
|
write_test_footer(tc_name)
|
||||||
|
|
||||||
|
|
||||||
|
def test_bgp_unique_rid_chaos3_p2():
|
||||||
|
"""
|
||||||
|
TC: 4
|
||||||
|
4. Chaos - Verify bgp unique rid functionality when router reboots with same loopback id.
|
||||||
|
|
||||||
|
"""
|
||||||
|
tgen = get_topogen()
|
||||||
|
global bgp_convergence
|
||||||
|
|
||||||
|
if bgp_convergence is not True:
|
||||||
|
pytest.skip("skipped because of BGP Convergence failure")
|
||||||
|
|
||||||
|
# test case name
|
||||||
|
tc_name = inspect.stack()[0][3]
|
||||||
|
write_test_header(tc_name)
|
||||||
|
if tgen.routers_have_failure():
|
||||||
|
check_router_status(tgen)
|
||||||
|
|
||||||
|
step("Configure base config as per the topology")
|
||||||
|
reset_config_on_routers(tgen)
|
||||||
|
|
||||||
|
global topo
|
||||||
|
topo1 = deepcopy(topo)
|
||||||
|
|
||||||
|
for rtr in topo["routers"].keys():
|
||||||
|
topo1["routers"][rtr]["links"]["lo"]["ipv4"] = "192.168.1.1/32"
|
||||||
|
|
||||||
|
topo1["routers"]["r3"]["links"]["lo"]["ipv4"] = "192.168.1.3/32"
|
||||||
|
build_config_from_json(tgen, topo1, save_bkup=False)
|
||||||
|
|
||||||
|
step("verify bgp convergence before starting test case")
|
||||||
|
|
||||||
|
bgp_convergence = verify_bgp_convergence(tgen, topo1)
|
||||||
|
assert bgp_convergence is True, "Testcase {} : Failed \n Error: {}".format(
|
||||||
|
tc_name, bgp_convergence
|
||||||
|
)
|
||||||
|
|
||||||
|
step(
|
||||||
|
"Configure loopback on R1 to R5 with IP address 1.1.1.1 on all the routers. Change neighborship on all the routers using loopback neighborship ids."
|
||||||
|
)
|
||||||
|
for rtr in ["r1", "r2", "r4", "r5"]:
|
||||||
|
configure_bgp_on_rtr = {
|
||||||
|
"r3": {
|
||||||
|
"bgp": {
|
||||||
|
"address_family": {
|
||||||
|
"ipv4": {
|
||||||
|
"unicast": {"neighbor": {rtr: {"dest_link": {"lo": {}}}}}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
result = create_router_bgp(tgen, topo1, configure_bgp_on_rtr)
|
||||||
|
assert result is True, "Testcase {} : Failed \n Error: {}".format(
|
||||||
|
tc_name, result
|
||||||
|
)
|
||||||
|
|
||||||
|
bgp_convergence = verify_bgp_convergence(tgen, topo1, dut="r3")
|
||||||
|
assert bgp_convergence is True, "Testcase {} : Failed \n Error: {}".format(
|
||||||
|
tc_name, bgp_convergence
|
||||||
|
)
|
||||||
|
|
||||||
|
step("Reboot the router (restart frr) or using watch frr.")
|
||||||
|
stop_router(tgen, "r3")
|
||||||
|
start_router(tgen, "r3")
|
||||||
|
|
||||||
|
step("Neighbors between R3, R4 and R3 to R5 should be in ESTB state.")
|
||||||
|
bgp_convergence = verify_bgp_convergence(tgen, topo1, dut="r3")
|
||||||
|
assert bgp_convergence is True, "Testcase {} : Failed \n Error: {}".format(
|
||||||
|
tc_name, bgp_convergence
|
||||||
|
)
|
||||||
|
|
||||||
|
step("Clear bgp process.")
|
||||||
|
clear_bgp_and_verify(tgen, topo, "r3")
|
||||||
|
|
||||||
|
step("Neighbors between R3, R4 and R3 to R5 should be in ESTB state.")
|
||||||
|
bgp_convergence = verify_bgp_convergence(tgen, topo1, dut="r3")
|
||||||
|
assert bgp_convergence is True, "Testcase {} : Failed \n Error: {}".format(
|
||||||
|
tc_name, bgp_convergence
|
||||||
|
)
|
||||||
|
|
||||||
|
write_test_footer(tc_name)
|
||||||
|
|
||||||
|
|
||||||
|
def test_bgp_unique_rid_chaos4_p2():
|
||||||
|
"""
|
||||||
|
TC: 6
|
||||||
|
6. Chaos - Verify bgp unique rid functionality when router reboots without any ip addresses.
|
||||||
|
|
||||||
|
"""
|
||||||
|
tgen = get_topogen()
|
||||||
|
global bgp_convergence
|
||||||
|
|
||||||
|
if bgp_convergence is not True:
|
||||||
|
pytest.skip("skipped because of BGP Convergence failure")
|
||||||
|
|
||||||
|
# test case name
|
||||||
|
tc_name = inspect.stack()[0][3]
|
||||||
|
write_test_header(tc_name)
|
||||||
|
if tgen.routers_have_failure():
|
||||||
|
check_router_status(tgen)
|
||||||
|
|
||||||
|
reset_config_on_routers(tgen)
|
||||||
|
|
||||||
|
global topo
|
||||||
|
topo1 = deepcopy(topo)
|
||||||
|
topo2 = deepcopy(topo)
|
||||||
|
|
||||||
|
step(
|
||||||
|
"Configure base config as per the topology without loopback as well as Ip address on any of the interface."
|
||||||
|
)
|
||||||
|
for rtr in topo["routers"].keys():
|
||||||
|
for intf in topo["routers"][rtr]["links"].keys():
|
||||||
|
topo1["routers"][rtr]["links"][intf].pop("ipv4")
|
||||||
|
topo1["routers"][rtr]["links"][intf].pop("ipv6")
|
||||||
|
if intf is "lo":
|
||||||
|
topo1["routers"][rtr]["links"][intf].pop("ipv4")
|
||||||
|
|
||||||
|
build_config_from_json(tgen, topo1, save_bkup=False)
|
||||||
|
|
||||||
|
bgp_convergence = verify_bgp_convergence(tgen, topo)
|
||||||
|
assert bgp_convergence is True, "Testcase {} : Failed \n Error: {}".format(
|
||||||
|
tc_name, bgp_convergence
|
||||||
|
)
|
||||||
|
|
||||||
|
step("Configure the ip addresses on the physical interfaces")
|
||||||
|
build_config_from_json(tgen, topo2, save_bkup=False)
|
||||||
|
|
||||||
|
step("All the neighbors should be in ESTAB state.")
|
||||||
|
bgp_convergence = verify_bgp_convergence(tgen, topo)
|
||||||
|
assert bgp_convergence is True, "Testcase {} : Failed \n Error: {}".format(
|
||||||
|
tc_name, bgp_convergence
|
||||||
|
)
|
||||||
|
|
||||||
|
step("Configure loopback addresses with higher IP address ")
|
||||||
|
build_config_from_json(tgen, topo, save_bkup=False)
|
||||||
|
|
||||||
|
step("All the neighbors should be in ESTAB state.")
|
||||||
|
bgp_convergence = verify_bgp_convergence(tgen, topo)
|
||||||
|
assert bgp_convergence is True, "Testcase {} : Failed \n Error: {}".format(
|
||||||
|
tc_name, bgp_convergence
|
||||||
|
)
|
||||||
|
|
||||||
|
step("Reboot the router (restart frr) or using watch frr.")
|
||||||
|
stop_router(tgen, "r3")
|
||||||
|
start_router(tgen, "r3")
|
||||||
|
|
||||||
|
step("Neighbors between R3, R4 and R3 to R5 should be in ESTB state.")
|
||||||
|
bgp_convergence = verify_bgp_convergence(tgen, topo, dut="r3")
|
||||||
|
assert bgp_convergence is True, "Testcase {} : Failed \n Error: {}".format(
|
||||||
|
tc_name, bgp_convergence
|
||||||
|
)
|
||||||
|
|
||||||
|
write_test_footer(tc_name)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
args = ["-s"] + sys.argv[1:]
|
||||||
|
sys.exit(pytest.main(args))
|
479
tests/topotests/bgp_unique_rid/test_bgp_unique_rid_vrf.py
Normal file
479
tests/topotests/bgp_unique_rid/test_bgp_unique_rid_vrf.py
Normal file
@ -0,0 +1,479 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
|
||||||
|
#
|
||||||
|
# Copyright (c) 2022 by VMware, Inc. ("VMware")
|
||||||
|
# Used Copyright (c) 2018 by Network Device Education Foundation,
|
||||||
|
# Inc. ("NetDEF") in this file.
|
||||||
|
#
|
||||||
|
# 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 VMWARE DISCLAIMS ALL WARRANTIES
|
||||||
|
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL VMWARE 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.
|
||||||
|
#
|
||||||
|
|
||||||
|
import sys
|
||||||
|
import time
|
||||||
|
import pytest
|
||||||
|
import inspect
|
||||||
|
import os
|
||||||
|
from copy import deepcopy
|
||||||
|
|
||||||
|
# Save the Current Working Directory to find configuration files.
|
||||||
|
CWD = os.path.dirname(os.path.realpath(__file__))
|
||||||
|
sys.path.append(os.path.join(CWD, "../"))
|
||||||
|
sys.path.append(os.path.join(CWD, "../lib/"))
|
||||||
|
|
||||||
|
"""Following tests are covered to test bgp unique rid functionality.
|
||||||
|
1. Verify iBGP session when same and different router ID is configured in user VRF(GREEN).
|
||||||
|
2. Verify eBGP session when same and different router ID is configured in user vrf (VRF RED)
|
||||||
|
3. Verify two different eBGP sessions initiated with same router ID in user VRf (RED and GREEN)
|
||||||
|
"""
|
||||||
|
|
||||||
|
#################################
|
||||||
|
# TOPOLOGY
|
||||||
|
#################################
|
||||||
|
"""
|
||||||
|
|
||||||
|
+-------+
|
||||||
|
+--------- | R2 |
|
||||||
|
| +-------+
|
||||||
|
|iBGP |
|
||||||
|
+-------+ |
|
||||||
|
| R1 | |iBGP
|
||||||
|
+-------+ |
|
||||||
|
| |
|
||||||
|
| iBGP +-------+ eBGP +-------+
|
||||||
|
+---------- | R3 |========= | R4 |
|
||||||
|
+-------+ +-------+
|
||||||
|
|
|
||||||
|
|eBGP
|
||||||
|
|
|
||||||
|
+-------+
|
||||||
|
| R5 |
|
||||||
|
+-------+
|
||||||
|
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
# pylint: disable=C0413
|
||||||
|
# Import topogen and topotest helpers
|
||||||
|
from lib.topogen import Topogen, get_topogen
|
||||||
|
from lib.topojson import build_config_from_json
|
||||||
|
from lib.topolog import logger
|
||||||
|
|
||||||
|
pytestmark = [pytest.mark.bgpd, pytest.mark.staticd]
|
||||||
|
|
||||||
|
# Required to instantiate the topology builder class.
|
||||||
|
from lib.common_config import (
|
||||||
|
start_topology,
|
||||||
|
write_test_header,
|
||||||
|
step,
|
||||||
|
write_test_footer,
|
||||||
|
check_address_types,
|
||||||
|
reset_config_on_routers,
|
||||||
|
check_router_status,
|
||||||
|
)
|
||||||
|
from lib.topolog import logger
|
||||||
|
from lib.bgp import (
|
||||||
|
verify_bgp_convergence,
|
||||||
|
create_router_bgp,
|
||||||
|
clear_bgp_and_verify,
|
||||||
|
)
|
||||||
|
|
||||||
|
# Global variables
|
||||||
|
topo = None
|
||||||
|
bgp_convergence = False
|
||||||
|
NETWORK = {
|
||||||
|
"ipv4": [
|
||||||
|
"192.168.20.1/32",
|
||||||
|
"192.168.20.2/32",
|
||||||
|
"192.168.21.1/32",
|
||||||
|
"192.168.21.2/32",
|
||||||
|
"192.168.22.1/32",
|
||||||
|
"192.168.22.2/32",
|
||||||
|
],
|
||||||
|
"ipv6": [
|
||||||
|
"fc07:50::1/128",
|
||||||
|
"fc07:50::2/128",
|
||||||
|
"fc07:150::1/128",
|
||||||
|
"fc07:150::2/128",
|
||||||
|
"fc07:1::1/128",
|
||||||
|
"fc07:1::2/128",
|
||||||
|
],
|
||||||
|
}
|
||||||
|
|
||||||
|
bgp_convergence = False
|
||||||
|
ADDR_TYPES = check_address_types()
|
||||||
|
|
||||||
|
|
||||||
|
def setup_module(mod):
|
||||||
|
"""setup_module.
|
||||||
|
|
||||||
|
Set up the pytest environment
|
||||||
|
* `mod`: module name
|
||||||
|
"""
|
||||||
|
global topo
|
||||||
|
testsuite_run_time = time.asctime(time.localtime(time.time()))
|
||||||
|
logger.info("Testsuite start time: {}".format(testsuite_run_time))
|
||||||
|
logger.info("=" * 40)
|
||||||
|
|
||||||
|
logger.info("Running setup_module to create topology")
|
||||||
|
|
||||||
|
# This function initiates the topology build with Topogen...
|
||||||
|
json_file = "{}/bgp_unique_rid_vrf.json".format(CWD)
|
||||||
|
tgen = Topogen(json_file, mod.__name__)
|
||||||
|
global topo
|
||||||
|
topo = tgen.json_topo
|
||||||
|
# ... and here it calls Mininet initialization functions.
|
||||||
|
|
||||||
|
# Starting topology, create tmp files which are loaded to routers
|
||||||
|
# to start daemons and then start routers
|
||||||
|
start_topology(tgen)
|
||||||
|
|
||||||
|
# Creating configuration from JSON
|
||||||
|
build_config_from_json(tgen, topo)
|
||||||
|
|
||||||
|
# Checking BGP convergence
|
||||||
|
global bgp_convergence
|
||||||
|
global ADDR_TYPES
|
||||||
|
|
||||||
|
# Don't run this test if we have any failure.
|
||||||
|
if tgen.routers_have_failure():
|
||||||
|
pytest.skip(tgen.errors)
|
||||||
|
|
||||||
|
# Api call verify whether BGP is converged
|
||||||
|
bgp_convergence = verify_bgp_convergence(tgen, topo)
|
||||||
|
assert bgp_convergence is True, "setup_module :Failed \n Error:" " {}".format(
|
||||||
|
bgp_convergence
|
||||||
|
)
|
||||||
|
logger.info("Running setup_module() done")
|
||||||
|
|
||||||
|
|
||||||
|
def teardown_module():
|
||||||
|
"""Teardown the pytest environment"""
|
||||||
|
|
||||||
|
logger.info("Running teardown_module to delete topology")
|
||||||
|
|
||||||
|
tgen = get_topogen()
|
||||||
|
|
||||||
|
# Stop toplogy and Remove tmp files
|
||||||
|
tgen.stop_topology()
|
||||||
|
|
||||||
|
logger.info(
|
||||||
|
"Testsuite end time: {}".format(time.asctime(time.localtime(time.time())))
|
||||||
|
)
|
||||||
|
logger.info("=" * 40)
|
||||||
|
|
||||||
|
|
||||||
|
#####################################################
|
||||||
|
# Tests starting
|
||||||
|
#####################################################
|
||||||
|
|
||||||
|
|
||||||
|
def test_bgp_unique_rid_ebgp_vrf_p0():
|
||||||
|
"""
|
||||||
|
TC: 1
|
||||||
|
Verify iBGP session when same and different router ID is configured in user VRF(GREEN).
|
||||||
|
"""
|
||||||
|
tgen = get_topogen()
|
||||||
|
global bgp_convergence
|
||||||
|
|
||||||
|
if bgp_convergence is not True:
|
||||||
|
pytest.skip("skipped because of BGP Convergence failure")
|
||||||
|
|
||||||
|
# test case name
|
||||||
|
tc_name = inspect.stack()[0][3]
|
||||||
|
write_test_header(tc_name)
|
||||||
|
if tgen.routers_have_failure():
|
||||||
|
check_router_status(tgen)
|
||||||
|
|
||||||
|
step("Configure base config as per the topology")
|
||||||
|
reset_config_on_routers(tgen)
|
||||||
|
|
||||||
|
step(
|
||||||
|
"Base config should be up, verify using BGP convergence on all \
|
||||||
|
the routers for IPv4 and IPv6 nbrs"
|
||||||
|
)
|
||||||
|
|
||||||
|
result = verify_bgp_convergence(tgen, topo)
|
||||||
|
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
|
||||||
|
|
||||||
|
step("Configure the same router id between R4 and R3 10.10.10.10")
|
||||||
|
input_dict = {
|
||||||
|
"r3": {"bgp": {"router_id": "10.10.10.10", "local_as": 100, "vrf": "RED"}},
|
||||||
|
"r4": {"bgp": {"router_id": "10.10.10.10", "local_as": 200, "vrf": "RED"}},
|
||||||
|
}
|
||||||
|
result = create_router_bgp(tgen, topo, input_dict)
|
||||||
|
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
|
||||||
|
|
||||||
|
step("Verify neighbours are in ESTAB state.")
|
||||||
|
result = verify_bgp_convergence(tgen, topo)
|
||||||
|
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
|
||||||
|
|
||||||
|
step("Configure the same router id between R5 and R3 (10.10.10.10)")
|
||||||
|
input_dict = {
|
||||||
|
"r3": {"bgp": {"router_id": "10.10.10.10", "local_as": 100, "vrf": "RED"}},
|
||||||
|
"r5": {"bgp": {"router_id": "10.10.10.10", "local_as": 300, "vrf": "RED"}},
|
||||||
|
}
|
||||||
|
result = create_router_bgp(tgen, topo, input_dict)
|
||||||
|
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
|
||||||
|
|
||||||
|
step("Verify neighbours are in ESTAB state.")
|
||||||
|
result = verify_bgp_convergence(tgen, topo)
|
||||||
|
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
|
||||||
|
|
||||||
|
step("modify the router id on r3 to different router id (11.11.11.11)")
|
||||||
|
input_dict = {
|
||||||
|
"r3": {"bgp": {"router_id": "11.11.11.11", "local_as": 100, "vrf": "RED"}}
|
||||||
|
}
|
||||||
|
result = create_router_bgp(tgen, topo, input_dict)
|
||||||
|
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
|
||||||
|
|
||||||
|
step("Verify neighbours are in ESTAB state.")
|
||||||
|
result = verify_bgp_convergence(tgen, topo)
|
||||||
|
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
|
||||||
|
|
||||||
|
step("Reset bgp process")
|
||||||
|
step("Verify neighbours are in ESTAB state.")
|
||||||
|
dut = "r3"
|
||||||
|
result = clear_bgp_and_verify(tgen, topo, router="r3")
|
||||||
|
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
|
||||||
|
|
||||||
|
step("Clear ip bgp process with *")
|
||||||
|
step("Verify neighbours are in ESTAB state.")
|
||||||
|
result = clear_bgp_and_verify(tgen, topo, dut)
|
||||||
|
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
|
||||||
|
|
||||||
|
step("Configure neighbours between R3 and R4 in EVPN address family.")
|
||||||
|
input_dict = {
|
||||||
|
"r3": {
|
||||||
|
"bgp": {
|
||||||
|
"local_as": 100,
|
||||||
|
"vrf": "RED",
|
||||||
|
"address_family": {
|
||||||
|
"l2vpn": {
|
||||||
|
"evpn": {
|
||||||
|
"advertise": {
|
||||||
|
"ipv4": {"unicast": {}},
|
||||||
|
"ipv6": {"unicast": {}},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"r4": {
|
||||||
|
"bgp": {
|
||||||
|
"local_as": 200,
|
||||||
|
"vrf": "RED",
|
||||||
|
"address_family": {
|
||||||
|
"l2vpn": {
|
||||||
|
"evpn": {
|
||||||
|
"advertise": {
|
||||||
|
"ipv4": {"unicast": {}},
|
||||||
|
"ipv6": {"unicast": {}},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
result = create_router_bgp(tgen, topo, input_dict)
|
||||||
|
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
|
||||||
|
|
||||||
|
step("Verify neighbours are in ESTAB state.")
|
||||||
|
result = clear_bgp_and_verify(tgen, topo, dut)
|
||||||
|
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
|
||||||
|
|
||||||
|
write_test_footer(tc_name)
|
||||||
|
|
||||||
|
|
||||||
|
def test_bgp_unique_rid_ibgp_vrf_p0():
|
||||||
|
"""
|
||||||
|
TC: 2
|
||||||
|
Verify eBGP session when same and different router ID is configured in user vrf (VRF RED)
|
||||||
|
"""
|
||||||
|
tgen = get_topogen()
|
||||||
|
global bgp_convergence
|
||||||
|
|
||||||
|
if bgp_convergence is not True:
|
||||||
|
pytest.skip("skipped because of BGP Convergence failure")
|
||||||
|
|
||||||
|
# test case name
|
||||||
|
tc_name = inspect.stack()[0][3]
|
||||||
|
write_test_header(tc_name)
|
||||||
|
if tgen.routers_have_failure():
|
||||||
|
check_router_status(tgen)
|
||||||
|
|
||||||
|
step("Configure base config as per the topology")
|
||||||
|
reset_config_on_routers(tgen)
|
||||||
|
|
||||||
|
step(
|
||||||
|
"Base config should be up, verify using BGP convergence on all \
|
||||||
|
the routers for IPv4 and IPv6 nbrs"
|
||||||
|
)
|
||||||
|
|
||||||
|
result = verify_bgp_convergence(tgen, topo)
|
||||||
|
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
|
||||||
|
|
||||||
|
step("Configure the same router id between R1 and R3 (10.10.10.10)")
|
||||||
|
input_dict = {
|
||||||
|
"r3": {"bgp": {"router_id": "10.10.10.10", "local_as": 100, "vrf": "RED"}},
|
||||||
|
"r1": {"bgp": {"router_id": "10.10.10.10", "local_as": 100, "vrf": "RED"}},
|
||||||
|
}
|
||||||
|
result = create_router_bgp(tgen, topo, input_dict)
|
||||||
|
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
|
||||||
|
|
||||||
|
step("Verify neighbours are in ESTAB state.")
|
||||||
|
result = verify_bgp_convergence(tgen, topo)
|
||||||
|
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
|
||||||
|
|
||||||
|
step("Configure the same router id between R2 and R3 (10.10.10.10)")
|
||||||
|
input_dict = {
|
||||||
|
"r3": {"bgp": {"router_id": "10.10.10.10", "local_as": 100, "vrf": "RED"}},
|
||||||
|
"r2": {"bgp": {"router_id": "10.10.10.10", "local_as": 100, "vrf": "RED"}},
|
||||||
|
}
|
||||||
|
result = create_router_bgp(tgen, topo, input_dict)
|
||||||
|
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
|
||||||
|
|
||||||
|
step("Verify neighbours are in ESTAB state.")
|
||||||
|
result = verify_bgp_convergence(tgen, topo)
|
||||||
|
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
|
||||||
|
|
||||||
|
step("modify the router id on r3 to different router id (11.11.11.11)")
|
||||||
|
input_dict = {
|
||||||
|
"r3": {"bgp": {"router_id": "11.11.11.11", "local_as": 100, "vrf": "RED"}}
|
||||||
|
}
|
||||||
|
result = create_router_bgp(tgen, topo, input_dict)
|
||||||
|
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
|
||||||
|
|
||||||
|
step("Verify neighbours are in ESTAB state.")
|
||||||
|
result = verify_bgp_convergence(tgen, topo, dut="r3")
|
||||||
|
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
|
||||||
|
|
||||||
|
step("Reset bgp process")
|
||||||
|
step("Verify neighbours are in ESTAB state.")
|
||||||
|
dut = "r3"
|
||||||
|
result = clear_bgp_and_verify(tgen, topo, dut)
|
||||||
|
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
|
||||||
|
|
||||||
|
step("Clear ip bgp process with *")
|
||||||
|
result = clear_bgp_and_verify(tgen, topo, dut)
|
||||||
|
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
|
||||||
|
|
||||||
|
write_test_footer(tc_name)
|
||||||
|
|
||||||
|
|
||||||
|
def test_bgp_unique_rid_multi_bgp_nbrs_vrf_p0():
|
||||||
|
"""
|
||||||
|
TC: 3
|
||||||
|
Verify two different eBGP sessions initiated with same router ID in user VRf (RED and GREEN)
|
||||||
|
|
||||||
|
"""
|
||||||
|
tgen = get_topogen()
|
||||||
|
global bgp_convergence, topo
|
||||||
|
|
||||||
|
if bgp_convergence is not True:
|
||||||
|
pytest.skip("skipped because of BGP Convergence failure")
|
||||||
|
|
||||||
|
# test case name
|
||||||
|
tc_name = inspect.stack()[0][3]
|
||||||
|
write_test_header(tc_name)
|
||||||
|
if tgen.routers_have_failure():
|
||||||
|
check_router_status(tgen)
|
||||||
|
|
||||||
|
step("Configure base config as per the topology")
|
||||||
|
reset_config_on_routers(tgen)
|
||||||
|
|
||||||
|
step(
|
||||||
|
"Base config should be up, verify using BGP convergence on all \
|
||||||
|
the routers for IPv4 and IPv6 nbrs"
|
||||||
|
)
|
||||||
|
|
||||||
|
result = verify_bgp_convergence(tgen, topo)
|
||||||
|
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
|
||||||
|
|
||||||
|
step("Configure the same router id between R3, R4 and R5 (10.10.10.10)")
|
||||||
|
input_dict = {
|
||||||
|
"r3": {"bgp": {"router_id": "10.10.10.10", "local_as": 100, "vrf": "RED"}},
|
||||||
|
"r4": {"bgp": {"router_id": "10.10.10.10", "local_as": 200, "vrf": "RED"}},
|
||||||
|
"r5": {"bgp": {"router_id": "10.10.10.10", "local_as": 300, "vrf": "RED"}},
|
||||||
|
}
|
||||||
|
result = create_router_bgp(tgen, topo, input_dict)
|
||||||
|
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
|
||||||
|
|
||||||
|
step("Verify neighbours are in ESTAB state.")
|
||||||
|
result = verify_bgp_convergence(tgen, topo)
|
||||||
|
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
|
||||||
|
|
||||||
|
step(
|
||||||
|
"Configure the same IP address on on R4 and R5 loopback address and \
|
||||||
|
change the neighborship to loopback neighbours between R3 to R4 \
|
||||||
|
and R3 to R5 respectively."
|
||||||
|
)
|
||||||
|
|
||||||
|
topo1 = deepcopy(topo)
|
||||||
|
|
||||||
|
for rtr in ["r4", "r5"]:
|
||||||
|
topo1["routers"][rtr]["links"]["lo"]["ipv4"] = "192.168.1.1/32"
|
||||||
|
|
||||||
|
topo1["routers"]["r3"]["links"]["lo"]["ipv4"] = "192.168.1.3/32"
|
||||||
|
build_config_from_json(tgen, topo1, save_bkup=False)
|
||||||
|
|
||||||
|
step(
|
||||||
|
"change the neighborship to loopback neighbours between R3 to R4 and R3 to R5 respectively."
|
||||||
|
)
|
||||||
|
for rtr in ["r4", "r5"]:
|
||||||
|
configure_bgp_on_rtr = {
|
||||||
|
"r3": {
|
||||||
|
"bgp": {
|
||||||
|
"local_as": 100,
|
||||||
|
"vrf": "RED",
|
||||||
|
"address_family": {
|
||||||
|
"ipv4": {
|
||||||
|
"unicast": {"neighbor": {rtr: {"dest_link": {"lo": {}}}}}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
result = create_router_bgp(tgen, topo1, configure_bgp_on_rtr)
|
||||||
|
assert result is True, "Testcase {} : Failed \n Error: {}".format(
|
||||||
|
tc_name, result
|
||||||
|
)
|
||||||
|
|
||||||
|
bgp_convergence = verify_bgp_convergence(tgen, topo1, dut="r3")
|
||||||
|
assert bgp_convergence is True, "Testcase {} : Failed \n Error: {}".format(
|
||||||
|
tc_name, bgp_convergence
|
||||||
|
)
|
||||||
|
|
||||||
|
step("Change the IP address on the R4 loopback.")
|
||||||
|
topo1["routers"]["r4"]["links"]["lo"]["ipv4"] = "192.168.1.4/32"
|
||||||
|
build_config_from_json(tgen, topo1, save_bkup=False)
|
||||||
|
|
||||||
|
step("Verify neighbours should be again in ESTAB state. (show ip bgp neighbours)")
|
||||||
|
bgp_convergence = verify_bgp_convergence(tgen, topo1, dut="r3")
|
||||||
|
assert bgp_convergence is True, "Testcase {} : Failed \n Error: {}".format(
|
||||||
|
tc_name, bgp_convergence
|
||||||
|
)
|
||||||
|
|
||||||
|
step("Clear ip bgp process with *")
|
||||||
|
result = clear_bgp_and_verify(tgen, topo, router="r3")
|
||||||
|
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
|
||||||
|
|
||||||
|
write_test_footer(tc_name)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
args = ["-s"] + sys.argv[1:]
|
||||||
|
sys.exit(pytest.main(args))
|
@ -1909,7 +1909,7 @@ def clear_bgp(tgen, addr_type, router, vrf=None, neighbor=None):
|
|||||||
logger.debug("Exiting lib API: {}".format(sys._getframe().f_code.co_name))
|
logger.debug("Exiting lib API: {}".format(sys._getframe().f_code.co_name))
|
||||||
|
|
||||||
|
|
||||||
def clear_bgp_and_verify(tgen, topo, router):
|
def clear_bgp_and_verify(tgen, topo, router, rid=None):
|
||||||
"""
|
"""
|
||||||
This API is to clear bgp neighborship and verify bgp neighborship
|
This API is to clear bgp neighborship and verify bgp neighborship
|
||||||
is coming up(BGP is converged) usinf "show bgp summary json" command
|
is coming up(BGP is converged) usinf "show bgp summary json" command
|
||||||
@ -1959,7 +1959,11 @@ def clear_bgp_and_verify(tgen, topo, router):
|
|||||||
return errormsg
|
return errormsg
|
||||||
|
|
||||||
# To find neighbor ip type
|
# To find neighbor ip type
|
||||||
|
try:
|
||||||
bgp_addr_type = topo["routers"][router]["bgp"]["address_family"]
|
bgp_addr_type = topo["routers"][router]["bgp"]["address_family"]
|
||||||
|
except TypeError:
|
||||||
|
bgp_addr_type = topo["routers"][router]["bgp"][0]["address_family"]
|
||||||
|
|
||||||
total_peer = 0
|
total_peer = 0
|
||||||
for addr_type in bgp_addr_type.keys():
|
for addr_type in bgp_addr_type.keys():
|
||||||
|
|
||||||
@ -2019,10 +2023,15 @@ def clear_bgp_and_verify(tgen, topo, router):
|
|||||||
logger.info("Clearing BGP neighborship for router %s..", router)
|
logger.info("Clearing BGP neighborship for router %s..", router)
|
||||||
for addr_type in bgp_addr_type.keys():
|
for addr_type in bgp_addr_type.keys():
|
||||||
if addr_type == "ipv4":
|
if addr_type == "ipv4":
|
||||||
run_frr_cmd(rnode, "clear ip bgp *")
|
if rid:
|
||||||
|
run_frr_cmd(rnode, "clear bgp ipv4 {}".format(rid))
|
||||||
|
else:
|
||||||
|
run_frr_cmd(rnode, "clear bgp ipv4 *")
|
||||||
elif addr_type == "ipv6":
|
elif addr_type == "ipv6":
|
||||||
|
if rid:
|
||||||
|
run_frr_cmd(rnode, "clear bgp ipv6 {}".format(rid))
|
||||||
|
else:
|
||||||
run_frr_cmd(rnode, "clear bgp ipv6 *")
|
run_frr_cmd(rnode, "clear bgp ipv6 *")
|
||||||
|
|
||||||
peer_uptime_after_clear_bgp = {}
|
peer_uptime_after_clear_bgp = {}
|
||||||
# Verifying BGP convergence after bgp clear command
|
# Verifying BGP convergence after bgp clear command
|
||||||
for retry in range(50):
|
for retry in range(50):
|
||||||
@ -2042,7 +2051,11 @@ def clear_bgp_and_verify(tgen, topo, router):
|
|||||||
return errormsg
|
return errormsg
|
||||||
|
|
||||||
# To find neighbor ip type
|
# To find neighbor ip type
|
||||||
|
try:
|
||||||
bgp_addr_type = topo["routers"][router]["bgp"]["address_family"]
|
bgp_addr_type = topo["routers"][router]["bgp"]["address_family"]
|
||||||
|
except TypeError:
|
||||||
|
bgp_addr_type = topo["routers"][router]["bgp"][0]["address_family"]
|
||||||
|
|
||||||
total_peer = 0
|
total_peer = 0
|
||||||
for addr_type in bgp_addr_type.keys():
|
for addr_type in bgp_addr_type.keys():
|
||||||
if not check_address_types(addr_type):
|
if not check_address_types(addr_type):
|
||||||
@ -2797,7 +2810,11 @@ def verify_best_path_as_per_admin_distance(
|
|||||||
if route in rib_routes_json:
|
if route in rib_routes_json:
|
||||||
st_found = True
|
st_found = True
|
||||||
# Verify next_hop in rib_routes_json
|
# Verify next_hop in rib_routes_json
|
||||||
if [nh for nh in rib_routes_json[route][0]["nexthops"] if nh['ip'] == _next_hop]:
|
if [
|
||||||
|
nh
|
||||||
|
for nh in rib_routes_json[route][0]["nexthops"]
|
||||||
|
if nh["ip"] == _next_hop
|
||||||
|
]:
|
||||||
nh_found = True
|
nh_found = True
|
||||||
else:
|
else:
|
||||||
errormsg = (
|
errormsg = (
|
||||||
|
Loading…
Reference in New Issue
Block a user