Merge pull request #9262 from gpnaveen/ospfv3_basic_tests

tests: adding ospfv3 base cases.
This commit is contained in:
Jafar Al-Gharaibeh 2022-03-16 11:06:19 -05:00 committed by GitHub
commit 51012eb636
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
17 changed files with 4921 additions and 152 deletions

View File

@ -2536,6 +2536,7 @@ def create_route_maps(tgen, input_dict, build=False):
ipv6_data = set_data.setdefault("ipv6", {})
local_preference = set_data.setdefault("locPrf", None)
metric = set_data.setdefault("metric", None)
metric_type = set_data.setdefault("metric-type", None)
as_path = set_data.setdefault("path", {})
weight = set_data.setdefault("weight", None)
community = set_data.setdefault("community", {})
@ -2559,7 +2560,11 @@ def create_route_maps(tgen, input_dict, build=False):
# Metric
if metric:
rmap_data.append("set metric {} \n".format(metric))
del_comm = set_data.setdefault("delete", None)
if del_comm:
rmap_data.append("no set metric {}".format(metric))
else:
rmap_data.append("set metric {}".format(metric))
# Origin
if origin:

View File

@ -1668,7 +1668,7 @@ def verify_ospf6_rib(
logger.info("Checking router %s RIB:", router)
# Verifying RIB routes
command = "show ipv6 ospf route"
command = "show ipv6 ospf route detail"
found_routes = []
missing_routes = []
@ -1710,6 +1710,8 @@ def verify_ospf6_rib(
# Generating IPs for verification
ip_list = generate_ips(network, no_of_ip)
if len(ip_list) == 1:
ip_list = [network]
st_found = False
nh_found = False
for st_rt in ip_list:
@ -1846,7 +1848,7 @@ def verify_ospf6_rib(
return errormsg
if metric is not None:
if "type2cost" not in ospf_rib_json[st_rt]:
if "metricCostE2" not in ospf_rib_json[st_rt]:
errormsg = (
"[DUT: {}]: metric is"
" not present for"
@ -1854,7 +1856,7 @@ def verify_ospf6_rib(
)
return errormsg
if metric != ospf_rib_json[st_rt]["type2cost"]:
if metric != ospf_rib_json[st_rt]["metricCostE2"]:
errormsg = (
"[DUT: {}]: metric value "
"{} is not matched for "

View File

@ -737,6 +737,7 @@ def proto_name_to_number(protocol):
"sharp": "194",
"pbr": "195",
"static": "196",
"ospf6": "197",
}.get(
protocol, protocol
) # default return same as input

View File

@ -0,0 +1,202 @@
{
"address_types": [
"ipv6"
],
"ipv6base": "fd00::",
"ipv6mask": 64,
"link_ip_start": {
"ipv6": "fd00::",
"v6mask": 64
},
"lo_prefix": {
"ipv6": "2001:db8:f::",
"v6mask": 128
},
"routers": {
"r0": {
"links": {
"lo": {
"ipv6": "auto",
"type": "loopback"
},
"r1": {
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.2",
"hello_interval": 1,
"dead_interval": 4
}
},
"r2": {
"ipv6": "auto"
},
"r3": {
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.0",
"hello_interval": 1,
"dead_interval": 4,
"network": "point-to-point"
}
}
},
"ospf6": {
"router_id": "100.1.1.0",
"area": [
{
"id": "0.0.0.2",
"type": "nssa"
}
],
"neighbors": {
"r1": {},
"r3": {}
}
}
},
"r1": {
"links": {
"lo": {
"ipv6": "auto",
"type": "loopback"
},
"r0": {
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.2",
"hello_interval": 1,
"dead_interval": 4
}
},
"r2": {
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.2",
"hello_interval": 1,
"dead_interval": 4
}
},
"r3": {
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.2",
"hello_interval": 1,
"dead_interval": 4
}
},
"r3-link0": {
"ipv6": "auto",
"description": "DummyIntftoR3"
}
},
"ospf6": {
"router_id": "100.1.1.1",
"area": [
{
"id": "0.0.0.2",
"type": "nssa"
}
],
"neighbors": {
"r0": {},
"r2": {},
"r3": {}
}
}
},
"r2": {
"links": {
"lo": {
"ipv6": "auto",
"type": "loopback"
},
"r0": {
"ipv6": "auto"
},
"r1": {
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.2",
"hello_interval": 1,
"dead_interval": 4
}
},
"r3": {
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.2",
"hello_interval": 1,
"dead_interval": 4
}
}
},
"ospf6": {
"router_id": "100.1.1.2",
"area": [
{
"id": "0.0.0.2",
"type": "nssa"
}
],
"neighbors": {
"r1": {},
"r3": {}
}
}
},
"r3": {
"links": {
"lo": {
"ipv6": "auto",
"type": "loopback"
},
"r0": {
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.0",
"hello_interval": 1,
"dead_interval": 4,
"network": "point-to-point"
}
},
"r1": {
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.2",
"hello_interval": 1,
"dead_interval": 4
}
},
"r2": {
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.2",
"hello_interval": 1,
"dead_interval": 4
}
},
"r1-link0": {
"ipv6": "auto",
"description": "DummyIntftoR1",
"ospf6": {
"area": "0.0.0.3"
}
}
},
"ospf6": {
"router_id": "100.1.1.3",
"area": [
{
"id": "0.0.0.2",
"type": "nssa"
}
],
"neighbors": {
"r0": {},
"r1": {},
"r2": {}
}
}
}
}
}

View File

@ -0,0 +1,312 @@
{
"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": {
"r0": {
"links": {
"lo": {
"ipv4": "auto",
"ipv6": "auto",
"type": "loopback"
},
"r1": {
"ipv4": "auto",
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.0",
"hello_interval": 1,
"dead_interval": 4
},
"ospf": {
"area": "0.0.0.0",
"hello_interval": 1,
"dead_interval": 4
}
},
"r2": {
"ipv4": "auto",
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.0",
"hello_interval": 1,
"dead_interval": 4
},
"ospf": {
"area": "0.0.0.0",
"hello_interval": 1,
"dead_interval": 4
}
},
"r3": {
"ipv4": "auto",
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.0",
"hello_interval": 1,
"dead_interval": 4,
"network": "point-to-point"
},
"ospf": {
"area": "0.0.0.0",
"hello_interval": 1,
"dead_interval": 4,
"network": "point-to-point"
}
}
},
"ospf6": {
"router_id": "100.1.1.0",
"neighbors": {
"r1": {},
"r2": {},
"r3": {}
}
},
"ospf": {
"router_id": "100.1.1.0",
"neighbors": {
"r1": {},
"r2": {},
"r3": {}
}
}
},
"r1": {
"links": {
"lo": {
"ipv4": "auto",
"ipv6": "auto",
"type": "loopback"
},
"r0": {
"ipv4": "auto",
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.0",
"hello_interval": 1,
"dead_interval": 4
},
"ospf": {
"area": "0.0.0.0",
"hello_interval": 1,
"dead_interval": 4
}
},
"r2": {
"ipv4": "auto",
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.0",
"hello_interval": 1,
"dead_interval": 4
},
"ospf": {
"area": "0.0.0.0",
"hello_interval": 1,
"dead_interval": 4
}
},
"r3": {
"ipv4": "auto",
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.0",
"hello_interval": 1,
"dead_interval": 4
},
"ospf": {
"area": "0.0.0.0",
"hello_interval": 1,
"dead_interval": 4
}
},
"r3-link0": {
"ipv4": "auto",
"ipv6": "auto",
"description": "DummyIntftoR3"
}
},
"ospf6": {
"router_id": "100.1.1.1",
"neighbors": {
"r0": {},
"r2": {},
"r3": {}
}
},
"ospf": {
"router_id": "100.1.1.1",
"neighbors": {
"r0": {},
"r2": {},
"r3": {}
}
}
},
"r2": {
"links": {
"lo": {
"ipv4": "auto",
"ipv6": "auto",
"type": "loopback"
},
"r0": {
"ipv4": "auto",
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.0",
"hello_interval": 1,
"dead_interval": 4
},
"ospf": {
"area": "0.0.0.0",
"hello_interval": 1,
"dead_interval": 4
}
},
"r1": {
"ipv4": "auto",
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.0",
"hello_interval": 1,
"dead_interval": 4
},
"ospf": {
"area": "0.0.0.0",
"hello_interval": 1,
"dead_interval": 4
}
},
"r3": {
"ipv4": "auto",
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.0",
"hello_interval": 1,
"dead_interval": 4
},
"ospf": {
"area": "0.0.0.0",
"hello_interval": 1,
"dead_interval": 4
}
}
},
"ospf6": {
"router_id": "100.1.1.2",
"neighbors": {
"r1": {},
"r0": {},
"r3": {}
}
},
"ospf": {
"router_id": "100.1.1.2",
"neighbors": {
"r1": {},
"r0": {},
"r3": {}
}
}
},
"r3": {
"links": {
"lo": {
"ipv4": "auto",
"ipv6": "auto",
"type": "loopback"
},
"r0": {
"ipv4": "auto",
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.0",
"hello_interval": 1,
"dead_interval": 4,
"network": "point-to-point"
},
"ospf": {
"area": "0.0.0.0",
"hello_interval": 1,
"dead_interval": 4,
"network": "point-to-point"
}
},
"r1": {
"ipv4": "auto",
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.0",
"hello_interval": 1,
"dead_interval": 4
},
"ospf": {
"area": "0.0.0.0",
"hello_interval": 1,
"dead_interval": 4
}
},
"r2": {
"ipv4": "auto",
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.0",
"hello_interval": 1,
"dead_interval": 4
},
"ospf": {
"area": "0.0.0.0",
"hello_interval": 1,
"dead_interval": 4
}
},
"r1-link0": {
"ipv4": "auto",
"ipv6": "auto",
"description": "DummyIntftoR1",
"ospf6": {
"area": "0.0.0.0"
},
"ospf": {
"area": "0.0.0.0"
}
}
},
"ospf6": {
"router_id": "1.0.4.17",
"neighbors": {
"r0": {},
"r1": {},
"r2": {}
}
},
"ospf": {
"router_id": "100.1.1.3",
"neighbors": {
"r0": {},
"r1": {},
"r2": {}
}
}
}
}
}

View File

@ -2,6 +2,7 @@
"address_types": [
"ipv6"
],
"ipv6base": "fd00::",
"ipv6mask": 64,
"link_ip_start": {
@ -9,6 +10,7 @@
"v6mask": 64
},
"lo_prefix": {
"ipv6": "2001:db8:f::",
"v6mask": 128
},
@ -21,6 +23,7 @@
},
"r1": {
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.0",
"hello_interval": 1,
@ -29,6 +32,7 @@
},
"r1-link1": {
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.0",
"hello_interval": 1,
@ -37,6 +41,7 @@
},
"r1-link2": {
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.0",
"hello_interval": 1,
@ -45,6 +50,7 @@
},
"r1-link3": {
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.0",
"hello_interval": 1,
@ -53,6 +59,7 @@
},
"r1-link4": {
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.0",
"hello_interval": 1,
@ -61,6 +68,7 @@
},
"r1-link5": {
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.0",
"hello_interval": 1,
@ -69,6 +77,7 @@
},
"r1-link6": {
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.0",
"hello_interval": 1,
@ -77,6 +86,7 @@
},
"r1-link7": {
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.0",
"hello_interval": 1,
@ -85,6 +95,7 @@
},
"r2": {
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.0",
"hello_interval": 1,
@ -93,6 +104,7 @@
},
"r3": {
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.0",
"hello_interval": 1,
@ -101,6 +113,7 @@
}
}
},
"ospf6": {
"router_id": "100.1.1.0",
"neighbors": {
@ -139,6 +152,7 @@
},
"r0": {
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.0",
"hello_interval": 1,
@ -147,6 +161,7 @@
},
"r0-link1": {
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.0",
"hello_interval": 1,
@ -155,6 +170,7 @@
},
"r0-link2": {
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.0",
"hello_interval": 1,
@ -163,6 +179,7 @@
},
"r0-link3": {
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.0",
"hello_interval": 1,
@ -171,6 +188,7 @@
},
"r0-link4": {
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.0",
"hello_interval": 1,
@ -179,6 +197,7 @@
},
"r0-link5": {
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.0",
"hello_interval": 1,
@ -187,6 +206,7 @@
},
"r0-link6": {
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.0",
"hello_interval": 1,
@ -195,6 +215,7 @@
},
"r0-link7": {
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.0",
"hello_interval": 1,
@ -203,6 +224,7 @@
},
"r2": {
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.0",
"hello_interval": 1,
@ -211,6 +233,7 @@
},
"r3": {
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.0",
"hello_interval": 1,
@ -222,6 +245,7 @@
"description": "DummyIntftoR3"
}
},
"ospf6": {
"router_id": "100.1.1.1",
"neighbors": {
@ -260,6 +284,7 @@
},
"r0": {
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.0",
"hello_interval": 1,
@ -268,6 +293,7 @@
},
"r1": {
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.0",
"hello_interval": 1,
@ -276,6 +302,7 @@
},
"r3": {
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.0",
"hello_interval": 1,
@ -283,6 +310,7 @@
}
}
},
"ospf6": {
"router_id": "100.1.1.2",
"neighbors": {
@ -300,6 +328,7 @@
},
"r0": {
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.0",
"hello_interval": 1,
@ -309,6 +338,7 @@
},
"r1": {
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.0",
"hello_interval": 1,
@ -317,6 +347,7 @@
},
"r2": {
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.0",
"hello_interval": 1,
@ -326,14 +357,13 @@
"r1-link0": {
"ipv6": "auto",
"description": "DummyIntftoR1",
"ospf": {
"area": "0.0.0.0"
},
"ospf6": {
"area": "0.0.0.0"
}
}
},
"ospf6": {
"router_id": "100.1.1.3",
"neighbors": {

View File

@ -0,0 +1,264 @@
{
"address_types": [
"ipv6"
],
"ipv6base": "fd00::",
"ipv6mask": 64,
"link_ip_start": {
"ipv6": "fd00::",
"v6mask": 64
},
"lo_prefix": {
"ipv6": "2001:db8:f::",
"v6mask": 128
},
"switches": {
"s1": {
"links": {
"r0": {
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.3",
"hello_interval": 1,
"dead_interval": 4,
"priority": 98
}
},
"r1": {
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.3",
"hello_interval": 1,
"dead_interval": 4,
"priority": 99
}
},
"r2": {
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.3",
"hello_interval": 1,
"dead_interval": 4,
"priority": 0
}
},
"r3": {
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.3",
"hello_interval": 1,
"dead_interval": 4,
"priority": 0
}
},
"r4": {
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.3",
"hello_interval": 1,
"dead_interval": 4,
"priority": 0
}
},
"r5": {
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.3",
"hello_interval": 1,
"dead_interval": 4,
"priority": 0
}
},
"r6": {
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.3",
"hello_interval": 1,
"dead_interval": 4,
"priority": 0
}
},
"r7": {
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.3",
"hello_interval": 1,
"dead_interval": 4,
"priority": 0
}
}
}
}
},
"routers": {
"r0": {
"links": {
"lo": {
"ipv6": "auto",
"type": "loopback"
}
},
"ospf6": {
"router_id": "100.1.1.0",
"neighbors": {
"r1": {},
"r2": {},
"r3": {},
"r4": {},
"r5": {},
"r6": {},
"r7": {}
}
}
},
"r1": {
"links": {
"lo": {
"ipv6": "auto",
"type": "loopback"
},
"r3-link0": {
"ipv6": "auto",
"description": "DummyIntftoR3"
}
},
"ospf6": {
"router_id": "100.1.1.1",
"neighbors": {
"r0": {},
"r2": {},
"r3": {},
"r4": {},
"r5": {},
"r6": {},
"r7": {}
}
}
},
"r2": {
"links": {
"lo": {
"ipv6": "auto",
"type": "loopback"
}
},
"ospf6": {
"router_id": "100.1.1.2",
"neighbors": {
"r1": {},
"r0": {}
}
}
},
"r3": {
"links": {
"lo": {
"ipv6": "auto",
"type": "loopback"
},
"r1-link0": {
"ipv6": "auto",
"description": "DummyIntftoR1"
}
},
"ospf6": {
"router_id": "100.1.1.3",
"neighbors": {
"r0": {},
"r1": {}
}
}
},
"r4": {
"links": {
"lo": {
"ipv6": "auto",
"type": "loopback"
}
},
"ospf6": {
"router_id": "100.1.1.4",
"neighbors": {
"r0": {},
"r1": {}
}
}
},
"r5": {
"links": {
"lo": {
"ipv6": "auto",
"type": "loopback"
}
},
"ospf6": {
"router_id": "100.1.1.5",
"neighbors": {
"r0": {},
"r1": {}
}
}
},
"r6": {
"links": {
"lo": {
"ipv6": "auto",
"type": "loopback"
}
},
"ospf6": {
"router_id": "100.1.1.6",
"neighbors": {
"r0": {},
"r1": {}
}
}
},
"r7": {
"links": {
"lo": {
"ipv6": "auto",
"type": "loopback"
}
},
"ospf6": {
"router_id": "100.1.1.7",
"neighbors": {
"r0": {},
"r1": {}
}
}
}
}
}

View File

@ -0,0 +1,140 @@
{
"address_types": [
"ipv6"
],
"ipv6base": "fd00::",
"ipv6mask": 64,
"link_ip_start": {
"ipv6": "fd00::",
"v6mask": 64
},
"lo_prefix": {
"ipv6": "2001:db8:f::",
"v6mask": 128
},
"switches": {
"s1": {
"links": {
"r0": {
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.3",
"hello_interval": 1,
"dead_interval": 4,
"priority": 98
}
},
"r1": {
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.3",
"hello_interval": 1,
"dead_interval": 4,
"priority": 99
}
},
"r2": {
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.3",
"hello_interval": 1,
"dead_interval": 4,
"priority": 0
}
},
"r3": {
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.3",
"hello_interval": 1,
"dead_interval": 4,
"priority": 0
}
}
}
}
},
"routers": {
"r0": {
"links": {
"lo": {
"ipv6": "auto",
"type": "loopback"
}
},
"ospf6": {
"router_id": "100.1.1.0",
"neighbors": {
"r1": {},
"r2": {},
"r3": {}
}
}
},
"r1": {
"links": {
"lo": {
"ipv6": "auto",
"type": "loopback"
},
"r3-link0": {
"ipv6": "auto",
"description": "DummyIntftoR3"
}
},
"ospf6": {
"router_id": "100.1.1.1",
"neighbors": {
"r0": {},
"r2": {},
"r3": {}
}
}
},
"r2": {
"links": {
"lo": {
"ipv6": "auto",
"type": "loopback"
}
},
"ospf6": {
"router_id": "100.1.1.2",
"neighbors": {
"r1": {},
"r0": {}
}
}
},
"r3": {
"links": {
"lo": {
"ipv6": "auto",
"type": "loopback"
},
"r1-link0": {
"ipv6": "auto",
"description": "DummyIntftoR1"
}
},
"ospf6": {
"router_id": "100.1.1.3",
"neighbors": {
"r0": {},
"r1": {}
}
}
}
}
}

View File

@ -0,0 +1,197 @@
{
"address_types": [
"ipv6"
],
"ipv6base": "fd00::",
"ipv6mask": 64,
"link_ip_start": {
"ipv6": "fd00::",
"v6mask": 64
},
"lo_prefix": {
"ipv6": "2001:db8:f::",
"v6mask": 128
},
"routers": {
"r0": {
"links": {
"lo": {
"ipv6": "auto",
"type": "loopback"
},
"r1": {
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.0",
"hello_interval": 1,
"dead_interval": 4
}
},
"r2": {
"ipv6": "auto"
},
"r3": {
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.0",
"hello_interval": 1,
"dead_interval": 4,
"network": "point-to-point"
}
}
},
"ospf6": {
"router_id": "100.1.1.0",
"neighbors": {
"r1": {},
"r3": {}
}
}
},
"r1": {
"links": {
"lo": {
"ipv6": "auto",
"type": "loopback"
},
"r0": {
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.0",
"hello_interval": 1,
"dead_interval": 4
}
},
"r2": {
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.2",
"hello_interval": 1,
"dead_interval": 4
}
},
"r3": {
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.2",
"hello_interval": 1,
"dead_interval": 4
}
},
"r3-link0": {
"ipv6": "auto",
"description": "DummyIntftoR3"
}
},
"ospf6": {
"router_id": "100.1.1.1",
"area": [
{
"id": "0.0.0.2",
"type": "nssa"
}
],
"neighbors": {
"r0": {},
"r2": {},
"r3": {}
}
}
},
"r2": {
"links": {
"lo": {
"ipv6": "auto",
"type": "loopback"
},
"r0": {
"ipv6": "auto"
},
"r1": {
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.2",
"hello_interval": 1,
"dead_interval": 4
}
},
"r3": {
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.2",
"hello_interval": 1,
"dead_interval": 4
}
}
},
"ospf6": {
"router_id": "100.1.1.2",
"area": [
{
"id": "0.0.0.2",
"type": "nssa"
}
],
"neighbors": {
"r1": {},
"r3": {}
}
}
},
"r3": {
"links": {
"lo": {
"ipv6": "auto",
"type": "loopback"
},
"r0": {
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.0",
"hello_interval": 1,
"dead_interval": 4,
"network": "point-to-point"
}
},
"r1": {
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.2",
"hello_interval": 1,
"dead_interval": 4
}
},
"r2": {
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.2",
"hello_interval": 1,
"dead_interval": 4
}
},
"r1-link0": {
"ipv6": "auto",
"description": "DummyIntftoR1",
"ospf6": {
"area": "0.0.0.3"
}
}
},
"ospf6": {
"router_id": "100.1.1.3",
"area": [
{
"id": "0.0.0.2",
"type": "nssa"
}
],
"neighbors": {
"r0": {},
"r1": {},
"r2": {}
}
}
}
}
}

View File

@ -1,14 +1,26 @@
{
"address_types": ["ipv6"],
"address_types": [
"ipv6"
],
"ipv6base": "fd00::",
"ipv6mask": 64,
"link_ip_start": {"ipv6": "fd00::", "v6mask": 64},
"lo_prefix": {"ipv6": "2001:db8:f::", "v6mask": 128},
"link_ip_start": {
"ipv6": "fd00::",
"v6mask": 64
},
"lo_prefix": {
"ipv6": "2001:db8:f::",
"v6mask": 128
},
"routers": {
"r0": {
"links": {
"r1": {
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.0",
"hello_interval": 1,
@ -17,6 +29,7 @@
},
"r2": {
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.0",
"hello_interval": 1,
@ -25,6 +38,7 @@
},
"r3": {
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.0",
"hello_interval": 1,
@ -32,15 +46,21 @@
}
}
},
"ospf6": {
"router_id": "100.1.1.0",
"neighbors": {"r1": {}, "r2": {}, "r3": {}}
"neighbors": {
"r1": {},
"r2": {},
"r3": {}
}
}
},
"r1": {
"links": {
"r0": {
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.0",
"hello_interval": 1,
@ -49,6 +69,7 @@
},
"r2": {
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.0",
"hello_interval": 1,
@ -57,6 +78,7 @@
},
"r3": {
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.0",
"hello_interval": 1,
@ -64,15 +86,21 @@
}
}
},
"ospf6": {
"router_id": "100.1.1.1",
"neighbors": {"r0": {}, "r2": {}, "r3": {}}
"neighbors": {
"r0": {},
"r2": {},
"r3": {}
}
}
},
"r2": {
"links": {
"r0": {
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.0",
"hello_interval": 1,
@ -81,6 +109,7 @@
},
"r1": {
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.0",
"hello_interval": 1,
@ -89,6 +118,7 @@
},
"r3": {
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.0",
"hello_interval": 1,
@ -96,15 +126,21 @@
}
}
},
"ospf6": {
"router_id": "100.1.1.2",
"neighbors": {"r1": {}, "r0": {}, "r3": {}}
"neighbors": {
"r1": {},
"r0": {},
"r3": {}
}
}
},
"r3": {
"links": {
"r0": {
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.0",
"hello_interval": 1,
@ -113,6 +149,7 @@
},
"r1": {
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.0",
"hello_interval": 1,
@ -121,6 +158,7 @@
},
"r2": {
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.0",
"hello_interval": 1,
@ -128,10 +166,15 @@
}
}
},
"ospf6": {
"router_id": "100.1.1.3",
"neighbors": {"r0": {}, "r1": {}, "r2": {}}
"neighbors": {
"r0": {},
"r1": {},
"r2": {}
}
}
}
}
}
}

View File

@ -5,13 +5,16 @@
"address_types": [
"ipv6"
],
"ipv6base": "fd00::",
"ipv6mask": 64,
"link_ip_start": {
"ipv6": "fd00::",
"v6mask": 64
},
"lo_prefix": {
"ipv6": "2001:db8:f::",
"v6mask": 128
},
@ -24,6 +27,7 @@
},
"r1": {
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.0",
"hello_interval": 1,
@ -32,6 +36,7 @@
},
"r2": {
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.0",
"hello_interval": 1,
@ -40,6 +45,7 @@
},
"r3": {
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.0",
"hello_interval": 1,
@ -47,6 +53,7 @@
}
}
},
"ospf6": {
"router_id": "100.1.1.0",
"neighbors": {
@ -63,6 +70,7 @@
},
"r0": {
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.0",
"hello_interval": 1,
@ -71,6 +79,7 @@
},
"r2": {
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.0",
"hello_interval": 1,
@ -79,6 +88,7 @@
},
"r3": {
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.0",
"hello_interval": 1,
@ -86,6 +96,7 @@
}
}
},
"ospf6": {
"router_id": "100.1.1.1",
"neighbors": {
@ -103,6 +114,7 @@
},
"r0": {
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.0",
"hello_interval": 1,
@ -111,6 +123,7 @@
},
"r1": {
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.0",
"hello_interval": 1,
@ -119,6 +132,7 @@
},
"r3": {
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.0",
"hello_interval": 1,
@ -126,6 +140,7 @@
}
}
},
"ospf6": {
"router_id": "100.1.1.2",
"neighbors": {
@ -146,6 +161,7 @@
},
"r1": {
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.0",
"hello_interval": 1,
@ -154,6 +170,7 @@
},
"r2": {
"ipv6": "auto",
"ospf6": {
"area": "0.0.0.0",
"hello_interval": 1,

View File

@ -0,0 +1,400 @@
#!/usr/bin/python
#
# Copyright (c) 2021 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.
#
"""OSPF Basic Functionality Automation."""
import os
import sys
import time
import pytest
import json
from copy import deepcopy
from ipaddress import IPv4Address
from lib.topotest import frr_unicode
import ipaddress
# 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/"))
# pylint: disable=C0413
# Import topogen and topotest helpers
from lib.topogen import Topogen, get_topogen
# Import topoJson from lib, to create topology and initial configuration
from lib.common_config import (
start_topology,
write_test_header,
write_test_footer,
reset_config_on_routers,
verify_rib,
create_static_routes,
step,
create_route_maps,
shutdown_bringup_interface,
create_interfaces_cfg,
topo_daemons,
get_frr_ipv6_linklocal,
)
from lib.topolog import logger
from lib.topojson import build_config_from_json
from lib.ospf import (
verify_ospf6_neighbor,
config_ospf_interface,
clear_ospf,
verify_ospf6_rib,
create_router_ospf,
verify_ospf6_interface,
verify_ospf6_database,
config_ospf6_interface,
)
from ipaddress import IPv6Address
pytestmark = [pytest.mark.ospfd, pytest.mark.staticd]
# Global variables
topo = None
NETWORK = {
"ipv4": [
"11.0.20.1/32",
"11.0.20.2/32",
"11.0.20.3/32",
"11.0.20.4/32",
"11.0.20.5/32",
],
"ipv6": ["2::1/128", "2::2/128", "2::3/128", "2::4/128", "2::5/128"],
}
MASK = {"ipv6": "32", "ipv6": "128"}
"""
TOPOOLOGY =
Please view in a fixed-width font such as Courier.
Topo : Broadcast Networks
+---+ +---+ +---+ +---+
|R0 + +R1 + +R2 + +R3 |
+-+-+ +-+-+ +-+-+ +-+-+
| | | |
| | | |
--+-----------+--------------+---------------+-----
Ethernet Segment
TESTCASES =
1. Verify OSPF ECMP with max path configured as 8
(Edge having 1 uplink port as broadcast network,
connect to 8 TORs - LAN case)
"""
def setup_module(mod):
"""
Sets up the pytest environment
* `mod`: module name
"""
global topo, switch_name
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 = "{}/ospfv3_ecmp_lan.json".format(CWD)
tgen = Topogen(json_file, mod.__name__)
global topo
topo = tgen.json_topo
# ... and here it calls Mininet initialization functions.
# get list of daemons needs to be started for this suite.
daemons = topo_daemons(tgen, topo)
# Starting topology, create tmp files which are loaded to routers
# to start deamons and then start routers
start_topology(tgen, daemons)
# Creating configuration from JSON
build_config_from_json(tgen, topo)
# Don't run this test if we have any failure.
if tgen.routers_have_failure():
pytest.skip(tgen.errors)
# Api call verify whether OSPF is converged
ospf_covergence = verify_ospf6_neighbor(tgen, topo, lan=True)
assert ospf_covergence is True, "setup_module :Failed \n Error:" " {}".format(
ospf_covergence
)
switch_name = [k for k in topo["switches"].keys()][0]
logger.info("Running setup_module() done")
def teardown_module(mod):
"""
Teardown the pytest environment.
* `mod`: module name
"""
logger.info("Running teardown_module to delete topology")
tgen = get_topogen()
# Stop toplogy and Remove tmp files
try:
# Stop toplogy and Remove tmp files
tgen.stop_topology()
except OSError:
# OSError exception is raised when mininet tries to stop switch
# though switch is stopped once but mininet tries to stop same
# switch again, where it ended up with exception
pass
logger.info(
"Testsuite end time: {}".format(time.asctime(time.localtime(time.time())))
)
logger.info("=" * 40)
def red_static(dut, config=True):
"""Local def for Redstribute static routes inside ospf."""
global topo
tgen = get_topogen()
if config:
ospf_red = {dut: {"ospf6": {"redistribute": [{"redist_type": "static"}]}}}
else:
ospf_red = {
dut: {
"ospf6": {"redistribute": [{"redist_type": "static", "delete": True}]}
}
}
result = create_router_ospf(tgen, topo, ospf_red)
assert result is True, "Testcase : Failed \n Error: {}".format(result)
def red_connected(dut, config=True):
"""Local def for Redstribute connected routes inside ospf."""
global topo
tgen = get_topogen()
if config:
ospf_red = {dut: {"ospf6": {"redistribute": [{"redist_type": "connected"}]}}}
else:
ospf_red = {
dut: {
"ospf6": {
"redistribute": [{"redist_type": "connected", "del_action": True}]
}
}
}
result = create_router_ospf(tgen, topo, ospf_red)
assert result is True, "Testcase: Failed \n Error: {}".format(result)
def get_llip(onrouter, intf):
"""
API to get the link local ipv6 address of a perticular interface
Parameters
----------
* `fromnode`: Source node
* `tonode` : interface for which link local ip needs to be returned.
Usage
-----
result = get_llip('r1', 'r2-link0')
Returns
-------
1) link local ipv6 address from the interface.
2) errormsg - when link local ip not found.
"""
tgen = get_topogen()
intf = topo["routers"][onrouter]["links"][intf]["interface"]
llip = get_frr_ipv6_linklocal(tgen, onrouter, intf)
if llip:
logger.info("llip ipv6 address to be set as NH is %s", llip)
return llip
return None
def get_glipv6(onrouter, intf):
"""
API to get the global ipv6 address of a perticular interface
Parameters
----------
* `onrouter`: Source node
* `intf` : interface for which link local ip needs to be returned.
Usage
-----
result = get_glipv6('r1', 'r2-link0')
Returns
-------
1) global ipv6 address from the interface.
2) errormsg - when link local ip not found.
"""
glipv6 = (topo["routers"][onrouter]["links"][intf]["ipv6"]).split("/")[0]
if glipv6:
logger.info("Global ipv6 address to be set as NH is %s", glipv6)
return glipv6
return None
# ##################################
# Test cases start here.
# ##################################
def test_ospfv3_lan_ecmp_tc18_p0(request):
"""
OSPF ECMP.
Verify OSPF ECMP with max path configured as 8
(Edge having 1 uplink port as broadcast network,
connect to 8 TORs - LAN case)
"""
tc_name = request.node.name
write_test_header(tc_name)
tgen = get_topogen()
# Don't run this test if we have any failure.
if tgen.routers_have_failure():
pytest.skip(tgen.errors)
global topo
step("Bring up the base config as per the topology")
step(". Configure ospf in all the routers on LAN interface.")
reset_config_on_routers(tgen)
step("Verify that OSPF is up with 8 neighborship sessions.")
ospf_covergence = verify_ospf6_neighbor(tgen, topo, lan=True)
assert ospf_covergence is True, "setup_module :Failed \n Error:" " {}".format(
ospf_covergence
)
step(
"Configure a static route in all the routes and "
"redistribute static/connected in OSPF."
)
for rtr in topo["routers"]:
input_dict = {
rtr: {
"static_routes": [
{"network": NETWORK["ipv6"][0], "no_of_ip": 5, "next_hop": "Null0"}
]
}
}
result = create_static_routes(tgen, input_dict)
assert result is True, "Testcase {} : Failed \n Error: {}".format(
tc_name, result
)
dut = rtr
red_static(dut)
step(
"Verify that route in R0 in stalled with 8 hops. "
"Verify ospf route table and ip route table."
)
nh = []
for rtr in topo["routers"]:
llip = get_llip(rtr, switch_name)
assert llip is not None, "Testcase {} : Failed \n Error: {}".format(
tc_name, result
)
nh.append(llip)
llip = get_llip("r1", switch_name)
assert llip is not None, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
nh.remove(llip)
dut = "r1"
result = verify_ospf6_rib(tgen, dut, input_dict)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
protocol = "ospf6"
result = verify_rib(tgen, "ipv6", dut, input_dict, protocol=protocol)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
step(" clear ip ospf interface on DUT(r0)")
clear_ospf(tgen, "r0", ospf="ospf6")
step(
"Verify that after clearing the ospf interface all the "
"neighbours are up and routes are installed with 8 next hop "
"in ospf and ip route tables on R0"
)
dut = "r0"
ospf_covergence = verify_ospf6_neighbor(tgen, topo, dut=dut, lan=True)
assert ospf_covergence is True, "setup_module :Failed \n Error:" " {}".format(
ospf_covergence
)
step(" clear ip ospf interface on R2")
clear_ospf(tgen, "r2")
dut = "r2"
ospf_covergence = verify_ospf6_neighbor(tgen, topo, dut=dut, lan=True)
assert ospf_covergence is True, "setup_module :Failed \n Error:" " {}".format(
ospf_covergence
)
step("Delete static/connected cmd in ospf in all the routes one by one.")
for rtr in topo["routers"]:
input_dict = {
rtr: {
"static_routes": [
{
"network": NETWORK["ipv6"][0],
"no_of_ip": 5,
"next_hop": "Null0",
"delete": True,
}
]
}
}
result = create_static_routes(tgen, input_dict)
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))

View File

@ -0,0 +1,482 @@
#!/usr/bin/python
#
# Copyright (c) 2021 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.
#
"""OSPF Basic Functionality Automation."""
import os
import sys
import time
import pytest
from copy import deepcopy
import ipaddress
from lib.ospf import (
verify_ospf6_neighbor,
config_ospf6_interface,
clear_ospf,
verify_ospf6_rib,
verify_ospf6_interface,
verify_ospf6_database,
create_router_ospf,
)
# pylint: disable=C0413
# Import topogen and topotest helpers
from lib.topogen import Topogen, get_topogen
from lib.bgp import (
verify_bgp_convergence,
create_router_bgp,
clear_bgp_and_verify,
verify_bgp_rib,
)
from lib.topolog import logger
from lib.common_config import (
start_topology,
write_test_header,
write_test_footer,
reset_config_on_routers,
verify_rib,
create_static_routes,
step,
topo_daemons,
create_route_maps,
shutdown_bringup_interface,
create_interfaces_cfg,
check_router_status,
)
from ipaddress import IPv4Address
from lib.topolog import logger
from lib.topojson import build_config_from_json
# Save the Current Working Directory to find configuration files.
CWD = os.path.dirname(os.path.realpath(__file__))
sys.path.append(os.path.join(CWD, "../"))
pytestmark = [pytest.mark.ospfd, pytest.mark.staticd]
# Global variables
topo = None
NETWORK = {
"ipv4": [
"11.0.20.1/32",
"11.0.20.2/32",
"11.0.20.3/32",
"11.0.20.4/32",
"11.0.20.5/32",
],
"ipv6": [
"2011:0:20::1/128",
"2011:0:20::2/128",
"2011:0:20::3/128",
"2011:0:20::4/128",
"2011:0:20::5/128",
],
}
"""
TOPOOLOGY =
Please view in a fixed-width font such as Courier.
+---+ A1 +---+
+R1 +------------+R2 |
+-+-+- +--++
| -- -- |
| -- A0 -- |
A0| ---- |
| ---- | A2
| -- -- |
| -- -- |
+-+-+- +-+-+
+R0 +-------------+R3 |
+---+ A3 +---+
TESTCASES =
1. OSPF Learning - Verify OSPF can learn different types of LSA and
processes them.[Edge learning different types of LSAs]
2. Verify that ospf non back bone area can be configured as NSSA area
3. Verify that ospf NSSA area DUT is capable receiving & processing
Type7 N2 route.
"""
def setup_module(mod):
"""
Sets 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 = "{}/ospfv3_nssa2.json".format(CWD)
tgen = Topogen(json_file, mod.__name__)
global topo
topo = tgen.json_topo
# ... and here it calls Mininet initialization functions.
# get list of daemons needs to be started for this suite.
daemons = topo_daemons(tgen, topo)
# Starting topology, create tmp files which are loaded to routers
# to start deamons and then start routers
start_topology(tgen, daemons)
# Creating configuration from JSON
build_config_from_json(tgen, topo)
# Don't run this test if we have any failure.
if tgen.routers_have_failure():
pytest.skip(tgen.errors)
# Api call verify whether OSPF is converged
ospf_covergence = verify_ospf6_neighbor(tgen, topo)
assert ospf_covergence is True, "setup_module :Failed \n Error:" " {}".format(
ospf_covergence
)
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()
def red_static(dut, config=True):
"""Local def for Redstribute static routes inside ospf."""
global topo
tgen = get_topogen()
if config:
ospf_red = {dut: {"ospf6": {"redistribute": [{"redist_type": "static"}]}}}
else:
ospf_red = {
dut: {
"ospf6": {"redistribute": [{"redist_type": "static", "delete": True}]}
}
}
result = create_router_ospf(tgen, topo, ospf_red)
assert result is True, "Testcase : Failed \n Error: {}".format(result)
def red_connected(dut, config=True):
"""Local def for Redstribute connected routes inside ospf."""
global topo
tgen = get_topogen()
if config:
ospf_red = {dut: {"ospf6": {"redistribute": [{"redist_type": "connected"}]}}}
else:
ospf_red = {
dut: {
"ospf6": {
"redistribute": [{"redist_type": "connected", "del_action": True}]
}
}
}
result = create_router_ospf(tgen, topo, ospf_red)
assert result is True, "Testcase: Failed \n Error: {}".format(result)
# ##################################
# Test cases start here.
# ##################################
def test_ospfv3_nssa_tc26_p0(request):
"""Verify that ospf non back bone area can be configured as NSSA area"""
tc_name = request.node.name
write_test_header(tc_name)
tgen = get_topogen()
# Don't run this test if we have any failure.
if tgen.routers_have_failure():
check_router_status(tgen)
global topo
step("Bring up the base config as per the topology")
step("Configure ospf area 2 on r0 , r1 & r4, make the area 2 as NSSA area")
reset_config_on_routers(tgen)
input_dict = {
"r2": {
"static_routes": [
{"network": NETWORK["ipv6"][0], "no_of_ip": 5, "next_hop": "Null0"}
]
}
}
result = create_static_routes(tgen, input_dict)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
step("Redistribute static route in R2 ospf.")
dut = "r2"
red_static(dut)
step("Verify that Type 5 LSA is originated by R2.")
dut = "r0"
protocol = "ospf6"
result = verify_rib(tgen, "ipv6", dut, input_dict, protocol=protocol)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
step("Un configure redistribute command in R4")
dut = "r2"
red_static(dut, config=False)
input_dict = {
"r1": {
"static_routes": [
{"network": NETWORK["ipv6"][0], "no_of_ip": 1, "routeType": "Network"}
]
}
}
step("Configure area 0 on interface of r2 connecting to r1")
input_dict = {
"r2": {
"links": {
"r1": {
"interface": topo["routers"]["r2"]["links"]["r1"]["interface"],
"ospf6": {"area": "0.0.0.2"},
"delete": True,
}
}
}
}
result = create_interfaces_cfg(tgen, input_dict)
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
input_dict = {
"r2": {
"links": {
"r1": {
"interface": topo["routers"]["r2"]["links"]["r1"]["interface"],
"ospf6": {"area": "0.0.0.0"},
}
}
}
}
result = create_interfaces_cfg(tgen, input_dict)
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
step("verify that ospf neighbor goes down between r2 and r1.")
result = verify_ospf6_neighbor(tgen, topo, dut="r2", expected=False)
assert (
result is not True
), "Testcase {} : Failed \n Nbrs are not down" "Error: {}".format(tc_name, result)
step("Now configure area 0 on interface of r1 connecting to r2.")
input_dict = {
"r1": {
"links": {
"r2": {
"interface": topo["routers"]["r1"]["links"]["r2"]["interface"],
"ospf6": {"area": "0.0.0.2"},
"delete": True,
}
}
}
}
result = create_interfaces_cfg(tgen, input_dict)
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
input_dict = {
"r1": {
"links": {
"r2": {
"interface": topo["routers"]["r1"]["links"]["r2"]["interface"],
"ospf6": {"area": "0.0.0.0"},
}
}
}
}
result = create_interfaces_cfg(tgen, input_dict)
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
step("Verify that ospf neighbour comes up between r2 and r1.")
result = verify_ospf6_neighbor(tgen, topo, dut="r2")
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
step("Configure area 2 on interface of r2 connecting to r1.")
input_dict = {
"r2": {
"links": {
"r1": {
"interface": topo["routers"]["r2"]["links"]["r1"]["interface"],
"ospf6": {"area": "0.0.0.0"},
"delete": True,
}
}
}
}
result = create_interfaces_cfg(tgen, input_dict)
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
input_dict = {
"r2": {
"links": {
"r1": {
"interface": topo["routers"]["r2"]["links"]["r1"]["interface"],
"ospf6": {"area": "0.0.0.2"},
}
}
}
}
result = create_interfaces_cfg(tgen, input_dict)
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
step("verify that ospf neighbor goes down between r2 and r1.")
result = verify_ospf6_neighbor(tgen, topo, dut="r2", expected=False)
assert (
result is not True
), "Testcase {} : Failed \n Nbrs are not down" "Error: {}".format(tc_name, result)
step("Now configure area 2 on interface of r1 connecting to r2.")
input_dict = {
"r1": {
"links": {
"r2": {
"interface": topo["routers"]["r1"]["links"]["r2"]["interface"],
"ospf6": {"area": "0.0.0.0"},
"delete": True,
}
}
}
}
result = create_interfaces_cfg(tgen, input_dict)
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
input_dict = {
"r1": {
"links": {
"r2": {
"interface": topo["routers"]["r1"]["links"]["r2"]["interface"],
"ospf6": {"area": "0.0.0.2"},
}
}
}
}
result = create_interfaces_cfg(tgen, input_dict)
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
step("Verify that ospf neighbour comes up between r2 and r1.")
result = verify_ospf6_neighbor(tgen, topo, dut="r2")
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
write_test_footer(tc_name)
# As per internal discussion, this script has to be removed as translator
# function is not supported, for more details kindly check this PR 2565570
def ospfv3_nssa_tc27_p0(request):
"""
OSPF NSSA.
Verify that ospf NSSA area DUT is capable receiving & processing
Type7 N2 route.
"""
tc_name = request.node.name
write_test_header(tc_name)
tgen = get_topogen()
# Don't run this test if we have any failure.
if tgen.routers_have_failure():
check_router_status(tgen)
global topo
step("Bring up the base config as per the topology")
step("Configure ospf area 2 on r0 , r1 & r4, make the area 2 as NSSA area")
reset_config_on_routers(tgen)
input_dict = {
"r2": {
"static_routes": [
{"network": NETWORK["ipv6"][0], "no_of_ip": 5, "next_hop": "Null0"}
]
}
}
result = create_static_routes(tgen, input_dict)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
step("Redistribute static route in R2 ospf.")
dut = "r2"
red_static(dut)
step("Verify that Type 5 LSA is originated by R2.")
dut = "r0"
protocol = "ospf6"
result = verify_rib(tgen, "ipv6", dut, input_dict, protocol=protocol)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
step("Un configure redistribute command in R4")
dut = "r2"
red_static(dut, config=False)
input_dict = {
"r1": {
"static_routes": [
{"network": NETWORK["ipv6"][0], "no_of_ip": 1, "routeType": "Network"}
]
}
}
dut = "r0"
result = verify_ospf6_rib(tgen, dut, input_dict, expected=False)
assert result is not True, "Testcase {} : Failed \n Error: {}".format(
tc_name, result
)
result = verify_rib(
tgen, "ipv6", dut, input_dict, protocol=protocol, expected=False
)
assert result is not 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))

View File

@ -178,6 +178,312 @@ def teardown_module(mod):
# ##################################
def test_ospfv3_routemaps_functionality_tc19_p0(request):
"""
OSPF Route map - Verify OSPF route map support functionality.
"""
tc_name = request.node.name
write_test_header(tc_name)
tgen = get_topogen()
global topo
step("Bring up the base config as per the topology")
reset_config_on_routers(tgen)
step("Create static routes(10.0.20.1/32 and 10.0.20.2/32) in R0")
# Create Static routes
input_dict = {
"r0": {
"static_routes": [
{
"network": NETWORK["ipv6"][0],
"no_of_ip": 5,
"next_hop": "Null0",
}
]
}
}
result = create_static_routes(tgen, input_dict)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
ospf_red_r1 = {"r0": {"ospf6": {"redistribute": [{"redist_type": "static"}]}}}
result = create_router_ospf(tgen, topo, ospf_red_r1)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
dut = "r1"
lsid = NETWORK["ipv6"][0].split("/")[0]
rid = routerids[0]
protocol = "ospf"
result = verify_ospf6_rib(tgen, dut, input_dict)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
result = verify_rib(tgen, "ipv6", dut, input_dict, protocol=protocol)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
ospf_red_r1 = {
"r0": {
"ospf6": {"redistribute": [{"redist_type": "static", "del_action": True}]}
}
}
result = create_router_ospf(tgen, topo, ospf_red_r1)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
step(
"Create prefix-list in R0 to permit 10.0.20.1/32 prefix &" " deny 10.0.20.2/32"
)
# Create ip prefix list
pfx_list = {
"r0": {
"prefix_lists": {
"ipv6": {
"pf_list_1_ipv6": [
{
"seqid": 10,
"network": NETWORK["ipv6"][0],
"action": "permit",
},
{"seqid": 11, "network": "any", "action": "deny"},
]
}
}
}
}
result = create_prefix_lists(tgen, pfx_list)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
step("verify that prefix-list is created in R0.")
result = verify_prefix_lists(tgen, pfx_list)
assert (
result is not True
), "Testcase {} : Failed \n, prefix list creation failed. Error: {}".format(
tc_name, result
)
# Create route map
routemaps = {
"r0": {
"route_maps": {
"rmap_ipv6": [
{
"action": "permit",
"match": {"ipv6": {"prefix_lists": "pf_list_1_ipv6"}},
}
]
}
}
}
result = create_route_maps(tgen, routemaps)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
step(
"Configure route map rmap1 and redistribute static routes to"
" ospf using route map rmap1"
)
ospf_red_r1 = {
"r0": {
"ospf6": {
"redistribute": [{"redist_type": "static", "route_map": "rmap_ipv6"}]
}
}
}
result = create_router_ospf(tgen, topo, ospf_red_r1)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
step("Verify that route map is activated in OSPF.")
step("Verify that route 10.0.20.1 is allowed and 10.0.20.2 is denied.")
dut = "r1"
input_dict = {
"r0": {
"static_routes": [
{"network": NETWORK["ipv6"][0], "no_of_ip": 1, "next_hop": "Null0"}
]
}
}
result = verify_ospf6_rib(tgen, dut, input_dict)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
result = verify_rib(tgen, "ipv6", dut, input_dict, protocol=protocol)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
dut = "r1"
lsid = NETWORK["ipv6"][1].split("/")[0]
rid = routerids[0]
step("Change prefix rules to permit 10.0.20.2 and deny 10.0.20.1")
# Create ip prefix list
pfx_list = {
"r0": {
"prefix_lists": {
"ipv6": {
"pf_list_1_ipv6": [
{
"seqid": 10,
"network": NETWORK["ipv6"][1],
"action": "permit",
},
{"seqid": 11, "network": "any", "action": "deny"},
]
}
}
}
}
result = create_prefix_lists(tgen, pfx_list)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
step("Verify that route 10.0.20.2 is allowed and 10.0.20.1 is denied.")
dut = "r1"
input_dict = {
"r0": {
"static_routes": [
{"network": NETWORK["ipv6"][1], "no_of_ip": 1, "next_hop": "Null0"}
]
}
}
result = verify_ospf6_rib(tgen, dut, input_dict)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
result = verify_rib(tgen, "ipv6", dut, input_dict, protocol=protocol)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
input_dict = {
"r0": {
"static_routes": [
{"network": NETWORK["ipv6"][0], "no_of_ip": 1, "next_hop": "Null0"}
]
}
}
result = verify_ospf6_rib(tgen, dut, input_dict, expected=False)
assert (
result is not True
), "Testcase {} : Failed \n Route found in the RIB, Error: {}".format(
tc_name, result
)
result = verify_rib(
tgen, "ipv6", dut, input_dict, protocol=protocol, expected=False
)
assert (
result is not True
), "Testcase {} : Failed \n Route found in the RIB, Error: {}".format(
tc_name, result
)
step("Delete and reconfigure prefix list.")
# Create ip prefix list
pfx_list = {
"r0": {
"prefix_lists": {
"ipv6": {
"pf_list_1_ipv6": [
{
"seqid": 10,
"network": NETWORK["ipv6"][1],
"action": "permit",
"delete": True,
},
{
"seqid": 11,
"network": "any",
"action": "deny",
"delete": True,
},
]
}
}
}
}
result = create_prefix_lists(tgen, pfx_list)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
result = verify_prefix_lists(tgen, pfx_list)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
input_dict = {
"r0": {
"static_routes": [
{"network": NETWORK["ipv6"][0], "no_of_ip": 5, "next_hop": "Null0"}
]
}
}
result = verify_ospf6_rib(tgen, dut, input_dict, expected=False)
assert (
result is not True
), "Testcase {} : Failed \n Route found in the RIB, Error: {}".format(
tc_name, result
)
result = verify_rib(
tgen, "ipv6", dut, input_dict, protocol=protocol, expected=False
)
assert (
result is not True
), "Testcase {} : Failed \n Route found in the RIB, Error: {}".format(
tc_name, result
)
pfx_list = {
"r0": {
"prefix_lists": {
"ipv6": {
"pf_list_1_ipv6": [
{
"seqid": 10,
"network": NETWORK["ipv6"][1],
"action": "permit",
},
{"seqid": 11, "network": "any", "action": "deny"},
]
}
}
}
}
result = create_prefix_lists(tgen, pfx_list)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
step("Verify that route 10.0.20.2 is allowed and 10.0.20.1 is denied.")
dut = "r1"
input_dict = {
"r0": {
"static_routes": [
{"network": NETWORK["ipv6"][1], "no_of_ip": 1, "next_hop": "Null0"}
]
}
}
result = verify_ospf6_rib(tgen, dut, input_dict)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
result = verify_rib(tgen, "ipv6", dut, input_dict, protocol=protocol)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
input_dict = {
"r0": {
"static_routes": [
{"network": NETWORK["ipv6"][0], "no_of_ip": 1, "next_hop": "Null0"}
]
}
}
result = verify_ospf6_rib(tgen, dut, input_dict, expected=False)
assert (
result is not True
), "Testcase {} : Failed \n Route found in the RIB, Error: {}".format(
tc_name, result
)
result = verify_rib(
tgen, "ipv6", dut, input_dict, protocol=protocol, expected=False
)
assert (
result is not True
), "Testcase {} : Failed \n Route found in the RIB, Error: {}".format(
tc_name, result
)
write_test_footer(tc_name)
def test_ospfv3_routemaps_functionality_tc20_p0(request):
"""
OSPF route map support functionality.
@ -461,7 +767,7 @@ def test_ospfv3_routemaps_functionality_tc22_p0(request):
{
"action": "permit",
"seq_id": "20",
"match": {"ipv6": {"prefix_lists": "pf_list_2_ipv4"}},
"match": {"ipv6": {"prefix_lists": "pf_list_2_ipv6"}},
},
]
}
@ -474,7 +780,7 @@ def test_ospfv3_routemaps_functionality_tc22_p0(request):
input_dict_2 = {
"r0": {
"prefix_lists": {
"ipv4": {
"ipv6": {
"pf_list_1_ipv6": [
{"seqid": 10, "network": NETWORK["ipv6"][0], "action": "permit"}
]
@ -489,8 +795,8 @@ def test_ospfv3_routemaps_functionality_tc22_p0(request):
input_dict_2 = {
"r0": {
"prefix_lists": {
"ipv4": {
"pf_list_2_ipv4": [
"ipv6": {
"pf_list_2_ipv6": [
{"seqid": 10, "network": NETWORK["ipv6"][1], "action": "permit"}
]
}
@ -567,7 +873,7 @@ def test_ospfv3_routemaps_functionality_tc22_p0(request):
{
"action": "deny",
"seq_id": "20",
"match": {"ipv6": {"prefix_lists": "pf_list_2_ipv4"}},
"match": {"ipv6": {"prefix_lists": "pf_list_2_ipv6"}},
}
]
}
@ -624,6 +930,106 @@ def test_ospfv3_routemaps_functionality_tc22_p0(request):
write_test_footer(tc_name)
def test_ospfv3_routemaps_functionality_tc23_p0(request):
"""
OSPF Route map - Multiple set clauses.
Verify OSPF route map support functionality when we add/remove route-maps
with multiple set clauses and without any match statement.(Set only)
"""
tc_name = request.node.name
write_test_header(tc_name)
tgen = get_topogen()
global topo
step("Bring up the base config as per the topology")
reset_config_on_routers(tgen)
step(
" Create static routes(10.0.20.1/32) in R1 and "
"redistribute to OSPF using route map."
)
# Create Static routes
input_dict = {
"r0": {
"static_routes": [
{
"network": NETWORK["ipv6"][0],
"no_of_ip": 5,
"next_hop": "Null0",
}
]
}
}
result = create_static_routes(tgen, input_dict)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
ospf_red_r0 = {
"r0": {
"ospf6": {
"redistribute": [{"redist_type": "static", "route_map": "rmap_ipv6"}]
}
}
}
result = create_router_ospf(tgen, topo, ospf_red_r0)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
step("Configure route map with set clause (set metric)")
# Create route map
routemaps = {
"r0": {
"route_maps": {
"rmap_ipv6": [
{"action": "permit", "seq_id": 10, "set": {"metric": 123}}
]
}
}
}
result = create_route_maps(tgen, routemaps)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
step("Verify that configured metric is applied to ospf routes.")
dut = "r1"
protocol = "ospf"
result = verify_ospf6_rib(tgen, dut, input_dict, metric=123)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
result = verify_rib(tgen, "ipv6", dut, input_dict, protocol=protocol, metric=123)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
step("un configure the set clause")
# Create route map
routemaps = {
"r0": {
"route_maps": {
"rmap_ipv6": [
{
"action": "permit",
"seq_id": 10,
"set": {"metric": 123, "delete": True},
}
]
}
}
}
result = create_route_maps(tgen, routemaps)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
step("Verify that metric falls back to original metric for ospf routes.")
dut = "r1"
protocol = "ospf"
result = verify_ospf6_rib(tgen, dut, input_dict, metric=20)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
result = verify_rib(tgen, "ipv6", dut, input_dict, protocol=protocol, metric=20)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
write_test_footer(tc_name)
def test_ospfv3_routemaps_functionality_tc24_p0(request):
"""
OSPF Route map - Multiple set clauses.

View File

@ -48,17 +48,21 @@ from lib.common_config import (
create_interfaces_cfg,
topo_daemons,
get_frr_ipv6_linklocal,
check_router_status,
create_static_routes,
)
from lib.topolog import logger
from lib.topojson import build_config_from_json
from lib.bgp import create_router_bgp, verify_bgp_convergence
from lib.ospf import (
verify_ospf6_neighbor,
clear_ospf,
verify_ospf6_rib,
verify_ospf_database,
create_router_ospf,
verify_ospf6_interface,
config_ospf6_interface,
verify_ospf6_interface,
)
@ -251,6 +255,8 @@ def red_connected(dut, config=True):
# ##################################
# Test cases start here.
# ##################################
def test_ospfv3_redistribution_tc5_p0(request):
"""Test OSPF intra area route calculations."""
tc_name = request.node.name
@ -259,7 +265,7 @@ def test_ospfv3_redistribution_tc5_p0(request):
# Don't run this test if we have any failure.
if tgen.routers_have_failure():
pytest.skip(tgen.errors)
check_router_status(tgen)
global topo
step("Bring up the base config.")
@ -280,7 +286,11 @@ def test_ospfv3_redistribution_tc5_p0(request):
nh = llip
input_dict = {
"r1": {"static_routes": [{"network": ip_net, "no_of_ip": 1, "routeType": "N"}]}
"r1": {
"static_routes": [
{"network": ip_net, "no_of_ip": 1, "routeType": "Network"}
]
}
}
dut = "r1"
@ -372,7 +382,7 @@ def test_ospfv3_redistribution_tc6_p0(request):
# Don't run this test if we have any failure.
if tgen.routers_have_failure():
pytest.skip(tgen.errors)
check_router_status(tgen)
global topo
step("Bring up the base config.")
@ -380,8 +390,8 @@ def test_ospfv3_redistribution_tc6_p0(request):
step("Verify that OSPF neighbors are FULL.")
ospf_covergence = verify_ospf6_neighbor(tgen, topo)
assert ospf_covergence is True, "setup_module :Failed \n Error:" " {}".format(
ospf_covergence
assert ospf_covergence is True, "Testcase {} : Failed \n Error: {}".format(
tc_name, ospf_covergence
)
step("verify intra area route is calculated for r0-r3 interface ip in R1")
@ -391,7 +401,11 @@ def test_ospfv3_redistribution_tc6_p0(request):
assert llip is not None, "Testcase {} : Failed \n Error: {}".format(tc_name, llip)
nh = llip
input_dict = {
"r1": {"static_routes": [{"network": ip_net, "no_of_ip": 1, "routeType": "N"}]}
"r1": {
"static_routes": [
{"network": ip_net, "no_of_ip": 1, "routeType": "Network"}
]
}
}
dut = "r1"
@ -460,9 +474,6 @@ def test_ospfv3_redistribution_tc6_p0(request):
intf = topo["routers"]["r0"]["links"]["r3"]["interface"]
shutdown_bringup_interface(tgen, dut, intf, False)
step("Verify that intraroute calculated for R1 intf on R0 is deleted.")
dut = "r1"
step("un shut the OSPF interface on R0")
dut = "r0"
shutdown_bringup_interface(tgen, dut, intf, True)
@ -478,6 +489,168 @@ def test_ospfv3_redistribution_tc6_p0(request):
write_test_footer(tc_name)
def test_ospfv3_redistribution_tc8_p1(request):
"""
Test OSPF redistribution of connected routes.
Verify OSPF redistribution of connected routes when bgp multi hop
neighbor is configured using ospf routes
"""
tc_name = request.node.name
write_test_header(tc_name)
tgen = get_topogen()
global topo
step("Bring up the base config.")
step(
"Configure loopback interface on all routers, and redistribut"
"e connected routes into ospf"
)
if tgen.routers_have_failure():
check_router_status(tgen)
reset_config_on_routers(tgen)
step(
"verify that connected routes -loopback is found in all routers"
"advertised/exchaged via ospf"
)
for rtr in topo["routers"]:
red_static(rtr)
red_connected(rtr)
for node in topo["routers"]:
input_dict = {
"r0": {
"static_routes": [
{
"network": topo["routers"][node]["links"]["lo"]["ipv6"],
"no_of_ip": 1,
}
]
}
}
for rtr in topo["routers"]:
result = verify_rib(tgen, "ipv6", rtr, input_dict)
assert result is True, "Testcase {} : Failed \n Error: {}".format(
tc_name, result
)
step("Configure E BGP multi hop using the loopback addresses.")
as_num = 100
for node in topo["routers"]:
as_num += 1
topo["routers"][node].update(
{
"bgp": {
"local_as": as_num,
"address_family": {"ipv6": {"unicast": {"neighbor": {}}}},
}
}
)
for node in topo["routers"]:
for rtr in topo["routers"]:
if node is not rtr:
topo["routers"][node]["bgp"]["address_family"]["ipv6"]["unicast"][
"neighbor"
].update(
{
rtr: {
"dest_link": {
"lo": {"source_link": "lo", "ebgp_multihop": 2}
}
}
}
)
result = create_router_bgp(tgen, topo, topo["routers"])
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
# Modify router id
input_dict = {
"r0": {"bgp": {"router_id": "11.11.11.11"}},
"r1": {"bgp": {"router_id": "22.22.22.22"}},
"r2": {"bgp": {"router_id": "33.33.33.33"}},
"r3": {"bgp": {"router_id": "44.44.44.44"}},
}
result = create_router_bgp(tgen, topo, input_dict)
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
step("Verify that BGP neighbor is ESTABLISHED")
result = verify_bgp_convergence(tgen, topo)
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
step(
"Configure couple of static routes in R0 and "
"Redistribute static routes in R1 bgp."
)
for rtr in topo["routers"]:
ospf_red = {
rtr: {
"ospf6": {"redistribute": [{"redist_type": "static", "delete": True}]}
}
}
result = create_router_ospf(tgen, topo, ospf_red)
assert result is True, "Testcase {} : Failed \n Error: {}".format(
tc_name, result
)
input_dict = {
"r0": {
"static_routes": [
{
"network": NETWORK["ipv6"][0],
"no_of_ip": 5,
"next_hop": "Null0",
}
]
}
}
result = create_static_routes(tgen, input_dict)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
configure_bgp_on_r0 = {
"r0": {
"bgp": {
"address_family": {
"ipv6": {"unicast": {"redistribute": [{"redist_type": "static"}]}}
}
}
}
}
result = create_router_bgp(tgen, topo, configure_bgp_on_r0)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
protocol = "bgp"
for rtr in ["r1", "r2", "r3"]:
result = verify_rib(tgen, "ipv6", rtr, input_dict, protocol=protocol)
assert result is True, "Testcase {} : Failed \n Error: {}".format(
tc_name, result
)
step("Clear ospf neighbours in R0")
for rtr in topo["routers"]:
clear_ospf(tgen, rtr)
step("Verify that OSPF neighbours are reset and forms new adjacencies.")
# Api call verify whether OSPF is converged
ospf_covergence = verify_ospf6_neighbor(tgen, topo)
assert ospf_covergence is True, "setup_module :Failed \n Error:" " {}".format(
ospf_covergence
)
step("Verify that BGP neighbours are reset and forms new adjacencies.")
result = verify_bgp_convergence(tgen, topo)
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
protocol = "bgp"
for rtr in ["r1", "r2", "r3"]:
result = verify_rib(tgen, "ipv6", rtr, input_dict, protocol=protocol)
assert result is True, "Testcase {} : Failed \n Error: {}".format(
tc_name, result
)
write_test_footer(tc_name)
def test_ospfv3_cost_tc52_p0(request):
"""OSPF Cost - verifying ospf interface cost functionality"""
tc_name = request.node.name
@ -485,6 +658,8 @@ def test_ospfv3_cost_tc52_p0(request):
tgen = get_topogen()
global topo
step("Bring up the base config.")
if tgen.routers_have_failure():
check_router_status(tgen)
reset_config_on_routers(tgen)
step(
@ -565,6 +740,184 @@ def test_ospfv3_cost_tc52_p0(request):
write_test_footer(tc_name)
def test_ospfv3_def_rte_tc9_p0(request):
"""OSPF default route - Verify OSPF default route origination."""
tc_name = request.node.name
write_test_header(tc_name)
tgen = get_topogen()
global topo
step("Bring up the base config.")
step("Configure OSPF on all the routers of the topology.")
if tgen.routers_have_failure():
check_router_status(tgen)
reset_config_on_routers(tgen)
step(" Configure default-information originate always on R0.")
input_dict = {"r0": {"ospf6": {"default-information": {"originate": True}}}}
result = create_router_ospf(tgen, topo, input_dict)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
dut = "r0"
step(" Configure default-information originate always on R0.")
input_dict = {
"r0": {
"ospf6": {
"default-information": {
"originate": True,
"always": True,
}
}
}
}
result = create_router_ospf(tgen, topo, input_dict)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
step("Verify that default route is originated in area always.")
dut = "r1"
step(" Configure default-information originate metric type 1 on R0.")
input_dict = {
"r0": {
"ospf6": {
"default-information": {
"originate": True,
"always": True,
"metric-type": 1,
}
}
}
}
step(
"Verify that default route is originated in area when external "
"routes are present in R0 with metric type as 1."
)
dut = "r0"
step(
"Verify that on R1 default route with type 1 is installed"
" (R1 is DUT in this case)"
)
dut = "r1"
step("Configure default-information originate metric type 2 on R0.")
input_dict = {
"r0": {
"ospf6": {
"default-information": {
"originate": True,
"always": True,
"metric-type": 2,
}
}
}
}
result = create_router_ospf(tgen, topo, input_dict)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
step(
"Verify that default route is originated in area when external"
" routes are present in R0 with metric type as 2."
)
dut = "r1"
step(" Configure default-information originate metric 100 on R0")
input_dict = {
"r0": {
"ospf6": {
"default-information": {
"originate": True,
"always": True,
"metric-type": 2,
"metric": 100,
}
}
}
}
result = create_router_ospf(tgen, topo, input_dict)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
step("Verify that default route is originated with cost as 100 on R0.")
dut = "r1"
step("Delete the default-information command")
input_dict = {
"r0": {
"ospf6": {
"default-information": {
"originate": True,
"always": True,
"delete": True,
}
}
}
}
result = create_router_ospf(tgen, topo, input_dict)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
dut = "r0"
step("Configure default-information originate always on R0.")
input_dict = {
"r0": {
"ospf6": {
"default-information": {
"originate": True,
"always": True,
}
}
}
}
result = create_router_ospf(tgen, topo, input_dict)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
step("Configure default route originate with active def route in zebra")
input_dict = {
"r0": {
"static_routes": [
{
"network": "0::0/0",
"no_of_ip": 1,
"next_hop": "Null0",
}
]
}
}
result = create_static_routes(tgen, input_dict)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
input_dict = {
"r0": {
"ospf6": {
"default-information": {
"originate": True,
}
}
}
}
result = create_router_ospf(tgen, topo, input_dict)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
step("Verify that default route is originated by R0.")
dut = "r1"
step("Delete static route")
input_dict = {
"r0": {
"static_routes": [
{
"network": "0::0/0",
"no_of_ip": 1,
"next_hop": "Null0",
"delete": True,
}
]
}
}
result = create_static_routes(tgen, input_dict)
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))

View File

@ -26,6 +26,8 @@ import os
import sys
import time
import pytest
import ipaddress
from copy import deepcopy
from lib.topotest import frr_unicode
@ -47,6 +49,8 @@ from lib.common_config import (
step,
create_interfaces_cfg,
topo_daemons,
create_debug_log_config,
apply_raw_config,
)
from lib.topolog import logger
from lib.topojson import build_config_from_json
@ -55,6 +59,9 @@ from lib.ospf import (
verify_ospf6_neighbor,
clear_ospf,
verify_ospf6_interface,
create_router_ospf,
config_ospf6_interface,
verify_ospf6_rib,
)
from ipaddress import IPv6Address
@ -381,6 +388,956 @@ def test_ospfv3_p2p_tc3_p0(request):
write_test_footer(tc_name)
def test_ospfv3_hello_tc10_p0(request):
"""
OSPF timers.
Verify OSPF interface timer hello interval functionality
"""
tc_name = request.node.name
write_test_header(tc_name)
tgen = get_topogen()
# Don't run this test if we have any failure.
if tgen.routers_have_failure():
pytest.skip(tgen.errors)
global topo
step("Bring up the base config as per the topology")
reset_config_on_routers(tgen)
step("modify hello timer from default value to some other value on r1")
topo1 = {
"r1": {
"links": {
"r0": {
"interface": topo["routers"]["r1"]["links"]["r0"]["interface"],
"ospf6": {"hello_interval": 11, "dead_interval": 12},
}
}
}
}
result = create_interfaces_cfg(tgen, topo1)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
step(
"verify that new timer value is configured and applied using "
"the show ip ospf interface command."
)
dut = "r1"
input_dict = {
"r1": {
"links": {
"r0": {
"ospf6": {
"timerIntervalsConfigHello": 11,
"timerIntervalsConfigDead": 12,
}
}
}
}
}
result = verify_ospf6_interface(tgen, topo, dut=dut, input_dict=input_dict)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
step("modify hello timer from default value to r1 hello timer on r2")
topo1 = {
"r0": {
"links": {
"r1": {
"interface": topo["routers"]["r0"]["links"]["r1"]["interface"],
"ospf6": {"hello_interval": 11, "dead_interval": 12},
}
}
}
}
result = create_interfaces_cfg(tgen, topo1)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
step("verify that new timer value is configured.")
input_dict = {
"r0": {
"links": {
"r1": {
"ospf6": {
"timerIntervalsConfigHello": 11,
"timerIntervalsConfigDead": 12,
}
}
}
}
}
dut = "r0"
result = verify_ospf6_interface(tgen, topo, dut=dut, input_dict=input_dict)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
step("verify that ospf neighbours are full")
ospf_covergence = verify_ospf6_neighbor(tgen, topo, dut=dut)
assert ospf_covergence is True, "setup_module :Failed \n Error:" " {}".format(
ospf_covergence
)
step("reconfigure the default hello timer value to default on r1 and r2")
topo1 = {
"r0": {
"links": {
"r1": {
"interface": topo["routers"]["r0"]["links"]["r1"]["interface"],
"ospf6": {"hello_interval": 10, "dead_interval": 40},
}
}
}
}
result = create_interfaces_cfg(tgen, topo1)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
topo1 = {
"r1": {
"links": {
"r0": {
"interface": topo["routers"]["r1"]["links"]["r0"]["interface"],
"ospf6": {"hello_interval": 10, "dead_interval": 40},
}
}
}
}
result = create_interfaces_cfg(tgen, topo1)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
step("verify that new timer value is configured.")
input_dict = {
"r0": {
"links": {
"r1": {
"ospf6": {
"timerIntervalsConfigHello": 10,
"timerIntervalsConfigDead": 40,
}
}
}
}
}
dut = "r0"
result = verify_ospf6_interface(tgen, topo, dut=dut, input_dict=input_dict)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
step("verify that ospf neighbours are full")
ospf_covergence = verify_ospf6_neighbor(tgen, topo, dut=dut)
assert ospf_covergence is True, "setup_module :Failed \n Error:" " {}".format(
ospf_covergence
)
step("reconfigure the default hello timer value to default on r1 and r2")
topo1 = {
"r0": {
"links": {
"r1": {
"interface": topo["routers"]["r0"]["links"]["r1"]["interface"],
"ospf6": {"hello_interval": 10, "dead_interval": 40},
}
}
}
}
result = create_interfaces_cfg(tgen, topo1)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
topo1 = {
"r1": {
"links": {
"r0": {
"interface": topo["routers"]["r1"]["links"]["r0"]["interface"],
"ospf6": {"hello_interval": 10, "dead_interval": 40},
}
}
}
}
result = create_interfaces_cfg(tgen, topo1)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
step("verify that new timer value is configured.")
input_dict = {
"r0": {
"links": {
"r1": {
"ospf6": {
"timerIntervalsConfigHello": 10,
"timerIntervalsConfigDead": 40,
}
}
}
}
}
dut = "r0"
result = verify_ospf6_interface(tgen, topo, dut=dut, input_dict=input_dict)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
step("verify that ospf neighbours are full")
ospf_covergence = verify_ospf6_neighbor(tgen, topo, dut=dut)
assert ospf_covergence is True, "setup_module :Failed \n Error:" " {}".format(
ospf_covergence
)
step("configure hello timer = 1 on r1 and r2")
topo1 = {
"r0": {
"links": {
"r1": {
"interface": topo["routers"]["r0"]["links"]["r1"]["interface"],
"ospf6": {"hello_interval": 1, "dead_interval": 4},
}
}
}
}
result = create_interfaces_cfg(tgen, topo1)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
topo1 = {
"r1": {
"links": {
"r0": {
"interface": topo["routers"]["r1"]["links"]["r0"]["interface"],
"ospf6": {"hello_interval": 1, "dead_interval": 4},
}
}
}
}
result = create_interfaces_cfg(tgen, topo1)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
step("verify that new timer value is configured.")
input_dict = {
"r0": {
"links": {
"r1": {
"ospf6": {
"timerIntervalsConfigHello": 1,
"timerIntervalsConfigDead": 4,
}
}
}
}
}
dut = "r0"
result = verify_ospf6_interface(tgen, topo, dut=dut, input_dict=input_dict)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
step("verify that ospf neighbours are full")
ospf_covergence = verify_ospf6_neighbor(tgen, topo, dut=dut)
assert ospf_covergence is True, "setup_module :Failed \n Error:" " {}".format(
ospf_covergence
)
step(" Configure hello timer = 65535")
topo1 = {
"r0": {
"links": {
"r1": {
"interface": topo["routers"]["r0"]["links"]["r1"]["interface"],
"ospf6": {"hello_interval": 65535, "dead_interval": 4},
}
}
}
}
result = create_interfaces_cfg(tgen, topo1)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
topo1 = {
"r1": {
"links": {
"r0": {
"interface": topo["routers"]["r1"]["links"]["r0"]["interface"],
"ospf6": {"hello_interval": 65535, "dead_interval": 4},
}
}
}
}
result = create_interfaces_cfg(tgen, topo1)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
step("verify that new timer value is configured.")
input_dict = {
"r0": {
"links": {
"r1": {
"ospf6": {
"timerIntervalsConfigHello": 65535,
"timerIntervalsConfigDead": 4,
}
}
}
}
}
dut = "r0"
result = verify_ospf6_interface(tgen, topo, dut=dut, input_dict=input_dict)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
step("verify that ospf neighbours are full")
ospf_covergence = verify_ospf6_neighbor(tgen, topo, dut=dut)
assert ospf_covergence is True, "Testcase {} : Failed \n Error: {}".format(
tc_name, ospf_covergence
)
step(" Try configuring timer values outside range for example 65536")
topo1 = {
"r0": {
"links": {
"r1": {
"interface": topo["routers"]["r0"]["links"]["r1"]["interface"],
"ospf6": {"hello_interval": 65536, "dead_interval": 4},
}
}
}
}
result = create_interfaces_cfg(tgen, topo1)
assert (
result is not True
), "Testcase {} : Failed \n Create interface failed. Error: {}".format(
tc_name, result
)
step("Unconfigure the hello timer from the interface from r1 and r2.")
topo1 = {
"r1": {
"links": {
"r0": {
"interface": topo["routers"]["r1"]["links"]["r0"]["interface"],
"ospf6": {"hello_interval": 65535},
"delete": True,
}
}
}
}
result = create_interfaces_cfg(tgen, topo1)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
step(
"Verify that timer value is deleted from intf & " "set to default value 40 sec."
)
input_dict = {"r1": {"links": {"r0": {"ospf6": {"timerIntervalsConfigHello": 10}}}}}
dut = "r1"
result = verify_ospf6_interface(tgen, topo, dut=dut, input_dict=input_dict)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
write_test_footer(tc_name)
def test_ospfv3_dead_tc11_p0(request):
"""
OSPF timers.
Verify OSPF interface timer dead interval functionality
"""
tc_name = request.node.name
write_test_header(tc_name)
tgen = get_topogen()
# Don't run this test if we have any failure.
if tgen.routers_have_failure():
pytest.skip(tgen.errors)
global topo
step("Bring up the base config as per the topology")
reset_config_on_routers(tgen)
step("modify dead interval from default value to some other value on r1")
topo1 = {
"r1": {
"links": {
"r0": {
"interface": topo["routers"]["r1"]["links"]["r0"]["interface"],
"ospf6": {"hello_interval": 12, "dead_interval": 48},
}
}
}
}
result = create_interfaces_cfg(tgen, topo1)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
step(
"verify that new timer value is configured and applied using "
"the show ip ospf interface command."
)
dut = "r1"
input_dict = {"r1": {"links": {"r0": {"ospf6": {"timerIntervalsConfigDead": 48}}}}}
result = verify_ospf6_interface(tgen, topo, dut=dut, input_dict=input_dict)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
step("modify dead interval from default value to r1" "dead interval timer on r2")
topo1 = {
"r0": {
"links": {
"r1": {
"interface": topo["routers"]["r0"]["links"]["r1"]["interface"],
"ospf6": {"dead_interval": 48, "hello_interval": 12},
}
}
}
}
result = create_interfaces_cfg(tgen, topo1)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
step("verify that new timer value is configured.")
input_dict = {"r0": {"links": {"r1": {"ospf6": {"timerIntervalsConfigDead": 48}}}}}
dut = "r0"
result = verify_ospf6_interface(tgen, topo, dut=dut, input_dict=input_dict)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
step("verify that ospf neighbours are full")
ospf_covergence = verify_ospf6_neighbor(tgen, topo, dut=dut)
assert ospf_covergence is True, "Testcase {} : Failed \n Error: {}".format(
tc_name, ospf_covergence
)
step("remove ospf on R0")
ospf_del = {"r0": {"ospf6": {"delete": True}}}
result = create_router_ospf(tgen, topo, ospf_del)
assert result is True, "Testcase : Failed \n Error: {}".format(result)
# reconfiguring deleted ospf process by resetting the configs.
reset_config_on_routers(tgen)
step("reconfigure the default dead interval timer value to " "default on r1 and r2")
topo1 = {
"r0": {
"links": {
"r1": {
"interface": topo["routers"]["r0"]["links"]["r1"]["interface"],
"ospf6": {"dead_interval": 40},
}
}
}
}
result = create_interfaces_cfg(tgen, topo1)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
topo1 = {
"r1": {
"links": {
"r0": {
"interface": topo["routers"]["r1"]["links"]["r0"]["interface"],
"ospf6": {"dead_interval": 40},
}
}
}
}
result = create_interfaces_cfg(tgen, topo1)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
step("verify that new timer value is configured.")
input_dict = {"r0": {"links": {"r1": {"ospf6": {"timerIntervalsConfigDead": 40}}}}}
dut = "r0"
result = verify_ospf6_interface(tgen, topo, dut=dut, input_dict=input_dict)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
step("verify that ospf neighbours are full")
ospf_covergence = verify_ospf6_neighbor(tgen, topo, dut=dut)
assert ospf_covergence is True, "Testcase {} : Failed \n Error: {}".format(
tc_name, ospf_covergence
)
step(" Configure dead timer = 65535 on r1 and r2")
topo1 = {
"r0": {
"links": {
"r1": {
"interface": topo["routers"]["r0"]["links"]["r1"]["interface"],
"ospf6": {"dead_interval": 65535},
}
}
}
}
result = create_interfaces_cfg(tgen, topo1)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
topo1 = {
"r1": {
"links": {
"r0": {
"interface": topo["routers"]["r1"]["links"]["r0"]["interface"],
"ospf6": {"dead_interval": 65535},
}
}
}
}
result = create_interfaces_cfg(tgen, topo1)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
step("verify that new timer value is configured.")
input_dict = {
"r0": {"links": {"r1": {"ospf6": {"timerIntervalsConfigDead": 65535}}}}
}
dut = "r0"
result = verify_ospf6_interface(tgen, topo, dut=dut, input_dict=input_dict)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
step("verify that ospf neighbours are full")
ospf_covergence = verify_ospf6_neighbor(tgen, topo, dut=dut)
assert ospf_covergence is True, "Testcase {} : Failed \n Error: {}".format(
tc_name, ospf_covergence
)
step(" Try configuring timer values outside range for example 65536")
topo1 = {
"r0": {
"links": {
"r1": {
"interface": topo["routers"]["r0"]["links"]["r1"]["interface"],
"ospf6": {"dead_interval": 65536},
}
}
}
}
result = create_interfaces_cfg(tgen, topo1)
assert (
result is not True
), "Testcase {} : Failed \n Create interface config failed. Error: {}".format(
tc_name, result
)
step("Unconfigure the dead timer from the interface from r1 and r2.")
topo1 = {
"r1": {
"links": {
"r0": {
"interface": topo["routers"]["r1"]["links"]["r0"]["interface"],
"ospf6": {"dead_interval": 65535},
"delete": True,
}
}
}
}
result = create_interfaces_cfg(tgen, topo1)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
step(
"Verify that timer value is deleted from intf & " "set to default value 40 sec."
)
input_dict = {"r1": {"links": {"r0": {"ospf6": {"timerIntervalsConfigDead": 40}}}}}
dut = "r1"
result = verify_ospf6_interface(tgen, topo, dut=dut, input_dict=input_dict)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
write_test_footer(tc_name)
def test_ospfv3_tc4_mtu_ignore_p0(request):
"""
OSPF NFSM - MTU change
Verify NFSM events when ospf nbr changes with different MTU values
"""
tc_name = request.node.name
write_test_header(tc_name)
tgen = get_topogen()
# Don't run this test if we have any failure.
if tgen.routers_have_failure():
pytest.skip(tgen.errors)
global topo
step(" Bring up the base config as per the topology")
step("Configure OSPF on all the routers of the topology.")
step("Verify that OSPF neighbors are FULL.")
reset_config_on_routers(tgen)
step(
"Modify the MTU to non default Value on R0 to R1 interface. "
"Reset ospf neighbors on R0."
)
rtr0 = tgen.routers()["r0"]
rtr1 = tgen.routers()["r1"]
r0_r1_intf = topo["routers"]["r0"]["links"]["r1"]["interface"]
r1_r0_intf = topo["routers"]["r1"]["links"]["r0"]["interface"]
rtr0.run("ifconfig {} mtu 1400".format(r0_r1_intf))
clear_ospf(tgen, "r0", ospf="ospf6")
clear_ospf(tgen, "r1", ospf="ospf6")
step(
"Verify that OSPF neighborship between R0 and R1 is stuck in Exstart" " State."
)
result = verify_ospf6_neighbor(tgen, topo, expected=False)
assert result is not True, (
"Testcase {} : Failed \n OSPF nbrs are Full "
"instead of Exstart. Error: {}".format(tc_name, result)
)
step(
"Verify that configured MTU value is updated in the show ip " "ospf interface."
)
dut = "r0"
input_dict = {"r0": {"links": {"r1": {"ospf6": {"interfaceMtu": 1400}}}}}
result = verify_ospf6_interface(tgen, topo, dut=dut, input_dict=input_dict)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
step(
"Modify the MTU to non default Value on R0 to R1 interface. "
"Reset ospf neighbors on R0."
)
rtr0.run("ifconfig {} mtu 1500".format(r0_r1_intf))
clear_ospf(tgen, "r0", ospf="ospf6")
step("Verify that OSPF neighborship between R0 and R1 becomes full.")
result = verify_ospf6_neighbor(tgen, topo)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
step(
"Configure mtu ignore and change the value of the mtu to non default"
" on R0 to R1 interface. Reset ospf neighbors on R0."
)
r0_ospf_mtu = {"r0": {"links": {"r1": {"ospf6": {"mtu_ignore": True}}}}}
result = config_ospf6_interface(tgen, topo, r0_ospf_mtu)
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
dut = "r0"
input_dict = {"r0": {"links": {"r1": {"ospf6": {"mtuMismatchDetection": True}}}}}
result = verify_ospf6_interface(tgen, topo, dut=dut, input_dict=input_dict)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
r1_ospf_mtu = {"r1": {"links": {"r0": {"ospf6": {"mtu_ignore": True}}}}}
result = config_ospf6_interface(tgen, topo, r1_ospf_mtu)
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
rtr0.run("ifconfig {} mtu 1400".format(r0_r1_intf))
clear_ospf(tgen, "r0", ospf="ospf6")
step("Verify that OSPF neighborship between R0 and R1 becomes full.")
result = verify_ospf6_neighbor(tgen, topo)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
step(
"Unconfigure mtu-ignore command from the interface. "
"Reset ospf neighbors on R0."
)
r1_ospf_mtu = {
"r1": {"links": {"r0": {"ospf6": {"mtu_ignore": True, "delete": True}}}}
}
result = config_ospf6_interface(tgen, topo, r1_ospf_mtu)
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
clear_ospf(tgen, "r0", ospf="ospf6")
step(
"Verify that OSPF neighborship between R0 and R1 is stuck in Exstart" " State."
)
result = verify_ospf6_neighbor(tgen, topo, expected=False)
assert result is not True, (
"Testcase {} : Failed \n OSPF nbrs are Full "
"instead of Exstart. Error: {}".format(tc_name, result)
)
step("Modify the MTU to again default valaue on R0 to R1 interface.")
rtr0.run("ifconfig {} mtu 1500".format(r0_r1_intf))
clear_ospf(tgen, "r0", ospf="ospf6")
step("Verify that OSPF neighborship between R0 and R1 becomes full.")
result = verify_ospf6_neighbor(tgen, topo)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
step(
"Configure ospf interface with jumbo MTU (9216)." "Reset ospf neighbors on R0."
)
rtr0.run("ifconfig {} mtu 9216".format(r0_r1_intf))
rtr1.run("ifconfig {} mtu 9216".format(r1_r0_intf))
clear_ospf(tgen, "r0", ospf="ospf6")
clear_ospf(tgen, "r1", ospf="ospf6")
step("Verify that OSPF neighborship between R0 and R1 becomes full.")
result = verify_ospf6_neighbor(tgen, topo)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
step("Verify that jumbo MTU is updated in the show ip ospf interface.")
dut = "r0"
input_dict = {"r0": {"links": {"r1": {"ospf6": {"interfaceMtu": 9216}}}}}
result = verify_ospf6_interface(tgen, topo, dut=dut, input_dict=input_dict)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
write_test_footer(tc_name)
def test_ospfv3_show_p1(request):
"""Verify ospf show commands with json output."""
tc_name = request.node.name
write_test_header(tc_name)
tgen = get_topogen()
# Don't run this test if we have any failure.
if tgen.routers_have_failure():
pytest.skip(tgen.errors)
input_dict = {"r2": {"debug": {"log_file": "debug.log", "enable": ["ospf6"]}}}
result = create_debug_log_config(tgen, input_dict)
# Code coverage steps #Do Not upstream
input_dict_config = {
"r1": {
"raw_config": [
"end",
"debug ospf6 event",
"debug ospf6 gr helper",
"debug ospf6 ism events",
"debug ospf6 ism status",
"debug ospf6 ism timers",
"debug ospf6 nsm events",
"debug ospf6 nsm status",
"debug ospf6 nsm timers ",
"debug ospf6 nssa",
"debug ospf6 lsa aggregate",
"debug ospf6 lsa flooding ",
"debug ospf6 lsa generate",
"debug ospf6 lsa install ",
"debug ospf6 lsa refresh",
"debug ospf6 packet all detail",
"debug ospf6 packet all recv",
"debug ospf6 packet all send",
"debug ospf6 packet dd detail",
"debug ospf6 packet dd recv",
"debug ospf6 packet dd send ",
"debug ospf6 packet hello detail",
"debug ospf6 packet hello recv",
"debug ospf6 packet hello send",
"debug ospf6 packet ls-ack detail",
"debug ospf6 packet ls-ack recv",
"debug ospf6 packet ls-ack send",
"debug ospf6 packet ls-request detail",
"debug ospf6 packet ls-request recv",
"debug ospf6 packet ls-request send",
"debug ospf6 packet ls-update detail",
"debug ospf6 packet ls-update recv",
"debug ospf6 packet ls-update send",
"debug ospf6 sr",
"debug ospf6 te ",
"debug ospf6 zebra interface",
"debug ospf6 zebra redistribute",
]
}
}
apply_raw_config(tgen, input_dict_config)
for rtr in topo["routers"]:
clear_ospf(tgen, rtr, ospf="ospf6")
step(" Bring up the base config as per the topology")
reset_config_on_routers(tgen)
for rtr in topo["routers"]:
clear_ospf(tgen, rtr, ospf="ospf6")
dut = "r1"
input_dict = {
"r1": {
"links": {
"r0": {
"ospf6": {
"status": "up",
"type": "BROADCAST",
"ospf6Enabled": True,
"attachedToArea": True,
"instanceId": 0,
"interfaceMtu": 1500,
"autoDetect": 1500,
"mtuMismatchDetection": "enabled",
"areaId": "0.0.0.0",
"cost": 10,
"transmitDelaySec": 1,
"priority": 1,
"timerIntervalsConfigHello": 1,
"timerIntervalsConfigDead": 4,
"timerIntervalsConfigRetransmit": 5,
"dr": "0.0.0.0",
"bdr": "0.0.0.0",
"numberOfInterfaceScopedLsa": 2,
"pendingLsaLsUpdateCount": 0,
"lsUpdateSendThread": "off",
"pendingLsaLsAckCount": 0,
"lsAckSendThread": "off",
}
}
}
}
}
result = verify_ospf6_interface(tgen, topo, dut=dut, input_dict=input_dict)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
ip = topo["routers"]["r0"]["links"]["r3"]["ipv6"]
ip_net = str(ipaddress.ip_interface(u"{}".format(ip)).network)
nh = topo["routers"]["r0"]["links"]["r1"]["ipv6"].split("/")[0]
input_dict = {
"r1": {
"static_routes": [
{"network": ip_net, "no_of_ip": 1, "routeType": "Network"}
]
}
}
dut = "r1"
result = verify_ospf6_rib(tgen, dut, input_dict)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
write_test_footer(tc_name)
def ospfv3_router_id_tc14_p2(request):
"""OSPF Router ID - Verify OSPF router id changes."""
tc_name = request.node.name
write_test_header(tc_name)
tgen = get_topogen()
# Don't run this test if we have any failure.
if tgen.routers_have_failure():
pytest.skip(tgen.errors)
global topo
step(" Bring up the base config as per the topology")
reset_config_on_routers(tgen)
step("Configure system router id as 1.1.1.1 on R1 , clear ospf router")
ospf_rid = {"r0": {"ospf6": {"router_id": "1.1.1.1"}}}
result = create_router_ospf(tgen, topo, ospf_rid)
assert result is True, "Testcase : Failed \n Error: {}".format(result)
step("configure ospf router id as 1.1.1.2 on R1, clear ospf router")
ospf_rid = {"r1": {"ospf6": {"router_id": "1.1.1.2"}}}
result = create_router_ospf(tgen, topo, ospf_rid)
assert result is True, "Testcase : Failed \n Error: {}".format(result)
topo1 = deepcopy(topo)
step("Verify that OSPF takes system router ID as ospf router id.")
topo1["routers"]["r0"]["ospf6"]["router_id"] = "1.1.1.1"
topo1["routers"]["r1"]["ospf6"]["router_id"] = "1.1.1.2"
for rtr in topo["routers"]:
clear_ospf(tgen, rtr, ospf="ospf6")
ospf_covergence = verify_ospf6_neighbor(tgen, topo1)
assert ospf_covergence is True, "OSPF NBRs not up.Failed \n Error:" " {}".format(
ospf_covergence
)
step(" delete ospf router id and clear ospf process.")
ospf_rid = {"r0": {"ospf6": {"del_router_id": "1.1.1.1"}}}
result = create_router_ospf(tgen, topo, ospf_rid)
assert result is True, "Testcase : Failed \n Error: {}".format(result)
ospf_rid = {"r1": {"ospf6": {"del_router_id": "1.1.1.2"}}}
result = create_router_ospf(tgen, topo, ospf_rid)
assert result is True, "Testcase : Failed \n Error: {}".format(result)
reset_config_on_routers(tgen)
step(" Configure R0 R1 R2 with same router ids")
ospf_rid = {"r0": {"ospf6": {"router_id": "1.1.1.1"}}}
result = create_router_ospf(tgen, topo, ospf_rid)
assert result is True, "Testcase : Failed \n Error: {}".format(result)
step("configure ospf router id as 1.1.1.2 on R1, reboot router")
ospf_rid = {"r1": {"ospf6": {"router_id": "1.1.1.1"}}}
result = create_router_ospf(tgen, topo, ospf_rid)
assert result is True, "Testcase : Failed \n Error: {}".format(result)
ospf_covergence = verify_ospf6_neighbor(tgen, topo, expected=False)
assert (
ospf_covergence is not True
), "OSPF NBRs are up.Failed \n Error:" " {}".format(ospf_covergence)
topo1 = {}
topo1 = deepcopy(topo)
for rtr in ["r1", "r2", "r3", "r0"]:
topo1["routers"][rtr]["ospf6"].pop("router_id")
build_config_from_json(tgen, topo1, save_bkup=False)
ospf_covergence = verify_ospf6_neighbor(tgen, topo)
assert ospf_covergence is not True, (
"Testcase {} :Failed \n Neighborship "
"should not up as no router id is configured. Error: {}".format(tc_name, result)
)
step("Clear ospf process and check nbrs should not be up.")
for rtr in topo["routers"]:
clear_ospf(tgen, rtr, ospf="ospf6")
ospf_covergence = verify_ospf6_neighbor(tgen, topo)
assert ospf_covergence is not True, (
"Testcase {} :Failed \n Neighborship "
"should not up as no router id is configured. Error: {}".format(tc_name, result)
)
topo1 = deepcopy(topo)
step("Configure system router id on routers , clear ospf router")
ospf_rid = {
"r0": {"ospf6": {"router_id": "1.1.1.1"}},
"r1": {"ospf6": {"router_id": "1.1.1.2"}},
"r2": {"ospf6": {"router_id": "1.1.1.3"}},
"r3": {"ospf6": {"router_id": "1.1.1.4"}},
}
result = create_router_ospf(tgen, topo1, ospf_rid)
assert result is True, "Testcase : Failed \n Error: {}".format(result)
topo1["routers"]["r0"]["ospf6"]["router_id"] = "1.1.1.1"
topo1["routers"]["r1"]["ospf6"]["router_id"] = "1.1.1.2"
topo1["routers"]["r2"]["ospf6"]["router_id"] = "1.1.1.3"
topo1["routers"]["r3"]["ospf6"]["router_id"] = "1.1.1.4"
ospf_covergence = verify_ospf6_neighbor(tgen, topo1)
assert ospf_covergence is True, "OSPF NBRs not up.Failed \n Error:" " {}".format(
ospf_covergence
)
step(" Bring up the base config as per the topology")
reset_config_on_routers(tgen)
ospf_covergence = verify_ospf6_neighbor(tgen, topo)
assert ospf_covergence is True, "OSPF NBRs not up.Failed \n Error:" " {}".format(
ospf_covergence
)
write_test_footer(tc_name)
if __name__ == "__main__":
args = ["-s"] + sys.argv[1:]
sys.exit(pytest.main(args))