]> git.puffer.fish Git - matthieu/frr.git/commitdiff
tests: Adding ospfv2 summarisation test cases.
authornguggarigoud <nguggarigoud@vmware.com>
Wed, 23 Jun 2021 12:44:42 +0000 (05:44 -0700)
committernguggarigoud <nguggarigoud@vmware.com>
Wed, 23 Jun 2021 20:57:12 +0000 (13:57 -0700)
Total cases 6.

Signed-off-by: nguggarigoud <nguggarigoud@vmware.com>
tests/topotests/ospf_basic_functionality/ospf_asbr_summary_type7_lsa.json [new file with mode: 0644]
tests/topotests/ospf_basic_functionality/test_ospf_asbr_summary_topo1.py
tests/topotests/ospf_basic_functionality/test_ospf_asbr_summary_type7_lsa.py [new file with mode: 0644]

diff --git a/tests/topotests/ospf_basic_functionality/ospf_asbr_summary_type7_lsa.json b/tests/topotests/ospf_basic_functionality/ospf_asbr_summary_type7_lsa.json
new file mode 100644 (file)
index 0000000..28e890d
--- /dev/null
@@ -0,0 +1,199 @@
+{
+    "ipv4base": "10.0.0.0",
+    "ipv4mask": 24,
+    "link_ip_start": {
+        "ipv4": "10.0.0.0",
+        "v4mask": 24
+    },
+    "lo_prefix": {
+        "ipv4": "1.0.",
+        "v4mask": 32
+    },
+    "routers": {
+        "r0": {
+            "links": {
+                "lo": {
+                    "ipv4": "auto",
+                    "type": "loopback"
+                },
+                "r1": {
+                    "ipv4": "auto",
+                    "ospf": {
+                        "area": "0.0.0.2",
+                        "hello_interval": 1,
+                        "dead_interval": 4
+                    }
+                },
+                "r2": {
+                    "ipv4": "auto"
+                },
+                "r3": {
+                    "ipv4": "auto",
+                    "ospf": {
+                        "area": "0.0.0.0",
+                        "hello_interval": 1,
+                        "dead_interval": 4,
+                        "network": "point-to-point"
+                    }
+                }
+            },
+            "ospf": {
+                "router_id": "100.1.1.0",
+                "area": [
+                    {
+                        "id": "0.0.0.2",
+                        "type": "nssa"
+                    }
+                ],
+                "neighbors": {
+                    "r1": {},
+                    "r3": {}
+                }
+            }
+        },
+        "r1": {
+            "links": {
+                "lo": {
+                    "ipv4": "auto",
+                    "type": "loopback"
+                },
+                "r0": {
+                    "ipv4": "auto",
+                    "ospf": {
+                        "area": "0.0.0.2",
+                        "hello_interval": 1,
+                        "dead_interval": 4
+                    }
+                },
+                "r2": {
+                    "ipv4": "auto",
+                    "ospf": {
+                        "area": "0.0.0.2",
+                        "hello_interval": 1,
+                        "dead_interval": 4
+                    }
+                },
+                "r3": {
+                    "ipv4": "auto",
+                    "ospf": {
+                        "area": "0.0.0.2",
+                        "hello_interval": 1,
+                        "dead_interval": 4
+                    }
+                },
+                "r3-link0": {
+                    "ipv4": "auto",
+                    "description": "DummyIntftoR3"
+                }
+            },
+            "ospf": {
+                "router_id": "100.1.1.1",
+                "area": [
+                    {
+                        "id": "0.0.0.2",
+                        "type": "nssa"
+                    }
+                ],
+                "neighbors": {
+                    "r0": {},
+                    "r2": {},
+                    "r3": {}
+                }
+            }
+        },
+        "r2": {
+            "links": {
+                "lo": {
+                    "ipv4": "auto",
+                    "type": "loopback"
+                },
+                "r0": {
+                    "ipv4": "auto"
+                },
+                "r1": {
+                    "ipv4": "auto",
+                    "ospf": {
+                        "area": "0.0.0.2",
+                        "hello_interval": 1,
+                        "dead_interval": 4
+                    }
+                },
+                "r3": {
+                    "ipv4": "auto",
+                    "ospf": {
+                        "area": "0.0.0.2",
+                        "hello_interval": 1,
+                        "dead_interval": 4
+                    }
+                }
+            },
+            "ospf": {
+                "router_id": "100.1.1.2",
+                "area": [
+                    {
+                        "id": "0.0.0.2",
+                        "type": "nssa"
+                    }
+                ],
+                "neighbors": {
+                    "r1": {},
+                    "r3": {}
+                }
+            }
+        },
+        "r3": {
+            "links": {
+                "lo": {
+                    "ipv4": "auto",
+                    "type": "loopback"
+                },
+                "r0": {
+                    "ipv4": "auto",
+                    "ospf": {
+                        "area": "0.0.0.0",
+                        "hello_interval": 1,
+                        "dead_interval": 4,
+                        "network": "point-to-point"
+                    }
+                },
+                "r1": {
+                    "ipv4": "auto",
+                    "ospf": {
+                        "area": "0.0.0.2",
+                        "hello_interval": 1,
+                        "dead_interval": 4
+                    }
+                },
+                "r2": {
+                    "ipv4": "auto",
+                    "ospf": {
+                        "area": "0.0.0.2",
+                        "hello_interval": 1,
+                        "dead_interval": 4
+                    }
+                },
+                "r1-link0": {
+                    "ipv4": "auto",
+                    "description": "DummyIntftoR1",
+                    "ospf": {
+                        "area": "0.0.0.3"
+                    }
+                }
+            },
+            "ospf": {
+                "router_id": "100.1.1.3",
+                "area": [
+                    {
+                        "id": "0.0.0.2",
+                        "type": "nssa"
+                    }
+                ],
+                "neighbors": {
+                    "r0": {},
+                    "r1": {},
+                    "r2": {}
+                }
+            }
+        }
+    }
+}
\ No newline at end of file
index 88b549732c9b0535319fcd8203857d2b93462d9b..41960ac79f7e8ce9d64461f801f8fb2e3ca88fd7 100644 (file)
@@ -774,6 +774,2642 @@ def test_ospf_type5_summary_tc48_p0(request):
     write_test_footer(tc_name)
 
 
+def test_ospf_type5_summary_tc42_p0(request):
+    """OSPF summarisation 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)
+
+    protocol = "ospf"
+
+    step(
+        "Configure 5 static routes from the same network on R0"
+        "5 static routes from different networks and redistribute in R0"
+    )
+    input_dict_static_rtes = {
+        "r0": {
+            "static_routes": [
+                {"network": NETWORK["ipv4"], "next_hop": "blackhole"},
+                {"network": NETWORK2["ipv4"], "next_hop": "blackhole"},
+            ]
+        }
+    }
+    result = create_static_routes(tgen, input_dict_static_rtes)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    dut = "r0"
+    red_static(dut)
+
+    step("Verify that routes are learnt on R1.")
+    dut = "r1"
+
+    result = verify_ospf_rib(tgen, dut, input_dict_static_rtes)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+    result = verify_rib(tgen, "ipv4", dut, input_dict_static_rtes, protocol=protocol)
+    assert (
+        result is True
+    ), "Testcase {} : Failed" "Error: Routes is missing in RIB".format(tc_name)
+
+    step(
+        "Configure External Route summary in R0 to summarise 5"
+        " routes to one route. with aggregate timer as 6 sec"
+    )
+
+    ospf_summ_r1 = {
+        "r0": {
+            "ospf": {
+                "summary-address": [
+                    {"prefix": SUMMARY["ipv4"][0].split("/")[0], "mask": "8"}
+                ],
+                "aggr_timer": 6,
+            }
+        }
+    }
+    result = create_router_ospf(tgen, topo, ospf_summ_r1)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    step(
+        "Verify that external routes are summarised to configured summary "
+        "address on R0 after 5 secs of delay timer expiry and only one "
+        "route is sent to R1."
+    )
+    input_dict_summary = {"r0": {"static_routes": [{"network": SUMMARY["ipv4"][0]}]}}
+    dut = "r1"
+
+    result = verify_ospf_rib(tgen, dut, input_dict_summary)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    result = verify_rib(tgen, "ipv4", dut, input_dict_summary, protocol=protocol)
+    assert (
+        result is True
+    ), "Testcase {} : Failed" "Error: Routes is missing in RIB".format(tc_name)
+
+    step("Verify that show ip ospf summary should show the summaries.")
+    input_dict = {
+        SUMMARY["ipv4"][0]: {
+            "Summary address": SUMMARY["ipv4"][0],
+            "Metric-type": "E2",
+            "Metric": 20,
+            "Tag": 0,
+            "External route count": 5,
+        }
+    }
+    dut = "r0"
+    result = verify_ospf_summary(tgen, topo, dut, input_dict)
+    assert (
+        result is True
+    ), "Testcase {} : Failed" "Error: Summary missing in OSPF DB".format(tc_name)
+
+    step("Verify that originally advertised routes are withdraw from there" " peer.")
+    input_dict = {
+        "r0": {"static_routes": [{"network": NETWORK["ipv4"], "next_hop": "blackhole"}]}
+    }
+    dut = "r1"
+    result = verify_ospf_rib(tgen, dut, input_dict, expected=False)
+    assert (
+        result is not True
+    ), "Testcase {} : Failed \n Error: " "Routes still present in OSPF RIB {}".format(
+        tc_name, result
+    )
+
+    result = verify_rib(
+        tgen, "ipv4", dut, input_dict, protocol=protocol, expected=False
+    )
+    assert (
+        result is not True
+    ), "Testcase {} : Failed" "Error: Routes still present in RIB".format(tc_name)
+
+    step("Delete the configured summary")
+    ospf_summ_r1 = {
+        "r0": {
+            "ospf": {
+                "summary-address": [
+                    {
+                        "prefix": SUMMARY["ipv4"][0].split("/")[0],
+                        "mask": "8",
+                        "del_aggr_timer": True,
+                        "delete": True,
+                    }
+                ]
+            }
+        }
+    }
+    result = create_router_ospf(tgen, topo, ospf_summ_r1)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    step("Verify that summary lsa is withdrawn from R1 and deleted from R0.")
+    dut = "r1"
+    result = verify_ospf_rib(tgen, dut, input_dict, expected=False)
+    assert (
+        result is not True
+    ), "Testcase {} : Failed \n Error: " "Routes still present in OSPF RIB {}".format(
+        tc_name, result
+    )
+
+    result = verify_rib(
+        tgen, "ipv4", dut, input_dict_summary, protocol=protocol, expected=False
+    )
+    assert (
+        result is not True
+    ), "Testcase {} : Failed" "Error: Summary Route still present in RIB".format(
+        tc_name
+    )
+
+    step("show ip ospf summary should not have any summary address.")
+    input_dict = {
+        SUMMARY["ipv4"][0]: {
+            "Summary address": SUMMARY["ipv4"][0],
+            "Metric-type": "E2",
+            "Metric": 20,
+            "Tag": 0,
+            "External route count": 5,
+        }
+    }
+    dut = "r0"
+    result = verify_ospf_summary(tgen, topo, dut, input_dict, expected=False)
+    assert (
+        result is not True
+    ), "Testcase {} : Failed" "Error: Summary still present in DB".format(tc_name)
+
+    dut = "r1"
+    step("All 5 routes are advertised after deletion of configured summary.")
+
+    result = verify_ospf_rib(tgen, dut, input_dict_static_rtes)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    result = verify_rib(tgen, "ipv4", dut, input_dict_static_rtes, protocol=protocol)
+    assert (
+        result is True
+    ), "Testcase {} : Failed" "Error: Routes is missing in RIB".format(tc_name)
+
+    step("configure the summary again and delete static routes .")
+    ospf_summ_r1 = {
+        "r0": {
+            "ospf": {
+                "summary-address": [
+                    {"prefix": SUMMARY["ipv4"][0].split("/")[0], "mask": "8"}
+                ]
+            }
+        }
+    }
+    result = create_router_ospf(tgen, topo, ospf_summ_r1)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    input_dict = {
+        SUMMARY["ipv4"][0]: {
+            "Summary address": SUMMARY["ipv4"][0],
+            "Metric-type": "E2",
+            "Metric": 20,
+            "Tag": 0,
+            "External route count": 5,
+        }
+    }
+    dut = "r0"
+    result = verify_ospf_summary(tgen, topo, dut, input_dict)
+    assert (
+        result is True
+    ), "Testcase {} : Failed" "Error: Summary missing in OSPF DB".format(tc_name)
+
+    input_dict = {
+        "r0": {
+            "static_routes": [
+                {"network": NETWORK["ipv4"], "next_hop": "blackhole", "delete": True}
+            ]
+        }
+    }
+    result = create_static_routes(tgen, input_dict)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    input_dict_summary = {"r0": {"static_routes": [{"network": SUMMARY["ipv4"][0]}]}}
+    step("Verify that summary route is withdrawn from R1.")
+
+    dut = "r1"
+    result = verify_ospf_rib(tgen, dut, input_dict_summary, expected=False)
+    assert (
+        result is not True
+    ), "Testcase {} : Failed \n Error: " "Routes still present in OSPF RIB {}".format(
+        tc_name, result
+    )
+
+    result = verify_rib(
+        tgen, "ipv4", dut, input_dict_summary, protocol=protocol, expected=False
+    )
+    assert (
+        result is not True
+    ), "Testcase {} : Failed" "Error: Routes still present in RIB".format(tc_name)
+
+    step("Add back static routes.")
+    input_dict_static_rtes = {
+        "r0": {"static_routes": [{"network": NETWORK["ipv4"], "next_hop": "blackhole"}]}
+    }
+    result = create_static_routes(tgen, input_dict_static_rtes)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    step(
+        "Verify that external routes are summarised to configured summary"
+        " address on R0 and only one route is sent to R1."
+    )
+    dut = "r1"
+
+    result = verify_ospf_rib(tgen, dut, input_dict_static_rtes, expected=False)
+    assert (
+        result is not True
+    ), "Testcase {} : Failed \n Error: " "Routes still present in OSPF RIB {}".format(
+        tc_name, result
+    )
+
+    result = verify_rib(
+        tgen, "ipv4", dut, input_dict_static_rtes, protocol=protocol, expected=False
+    )
+    assert (
+        result is not True
+    ), "Testcase {} : Failed" "Error: Routes still present in RIB".format(tc_name)
+
+    input_dict_summary = {"r0": {"static_routes": [{"network": SUMMARY["ipv4"][0]}]}}
+    dut = "r1"
+
+    result = verify_ospf_rib(tgen, dut, input_dict_summary)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    result = verify_rib(tgen, "ipv4", dut, input_dict_summary, protocol=protocol)
+    assert (
+        result is True
+    ), "Testcase {} : Failed" "Error: Routes is missing in RIB".format(tc_name)
+
+    step("Verify that show ip ospf summary should show configure summaries.")
+
+    input_dict = {
+        SUMMARY["ipv4"][0]: {
+            "Summary address": SUMMARY["ipv4"][0],
+            "Metric-type": "E2",
+            "Metric": 20,
+            "Tag": 0,
+            "External route count": 5,
+        }
+    }
+    dut = "r0"
+    result = verify_ospf_summary(tgen, topo, dut, input_dict)
+    assert (
+        result is True
+    ), "Testcase {} : Failed" "Error: Summary missing in OSPF DB".format(tc_name)
+
+    step("Configure new static route which is matching configured summary.")
+    input_dict_static_rtes = {
+        "r0": {
+            "static_routes": [{"network": NETWORK_11["ipv4"], "next_hop": "blackhole"}]
+        }
+    }
+    result = create_static_routes(tgen, input_dict_static_rtes)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    # step("verify that summary lsa is not refreshed.")
+    # show ip ospf database command is not working, waiting for DEV fix.
+
+    step("Delete one of the static route.")
+    input_dict_static_rtes = {
+        "r0": {
+            "static_routes": [
+                {"network": NETWORK_11["ipv4"], "next_hop": "blackhole", "delete": True}
+            ]
+        }
+    }
+    result = create_static_routes(tgen, input_dict_static_rtes)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    # step("verify that summary lsa is not refreshed.")
+    # show ip ospf database command is not working, waiting for DEV fix.
+
+    # step("Verify that deleted static route is removed from ospf LSDB.")
+    # show ip ospf database command is not working, waiting for DEV fix.
+
+    step(
+        "Configure redistribute connected and configure ospf external"
+        " summary address to summarise the connected routes."
+    )
+
+    dut = "r0"
+    red_connected(dut)
+    clear_ospf(tgen, dut)
+
+    ip = topo["routers"]["r0"]["links"]["r3"]["ipv4"]
+
+    ip_net = str(ipaddress.ip_interface(u"{}".format(ip)).network)
+    ospf_summ_r1 = {
+        "r0": {
+            "ospf": {"summary-address": [{"prefix": ip_net.split("/")[0], "mask": "8"}]}
+        }
+    }
+    result = create_router_ospf(tgen, topo, ospf_summ_r1)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    step(
+        "Verify that external routes are summarised to configured "
+        "summary address on R0 and only one route is sent to R1."
+    )
+
+    input_dict_summary = {"r0": {"static_routes": [{"network": "10.0.0.0/8"}]}}
+    dut = "r1"
+    result = verify_ospf_rib(tgen, dut, input_dict_summary)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    result = verify_rib(tgen, "ipv4", dut, input_dict_summary, protocol=protocol)
+    assert (
+        result is True
+    ), "Testcase {} : Failed" "Error: Routes is missing in RIB".format(tc_name)
+
+    step("Shut one of the interface")
+    intf = topo["routers"]["r0"]["links"]["r3-link0"]["interface"]
+    shutdown_bringup_interface(tgen, dut, intf, False)
+
+    # step("verify that summary lsa is not refreshed.")
+    # show ip ospf database command is not working, waiting for DEV fix.
+
+    # step("Verify that deleted connected route is removed from ospf LSDB.")
+    # show ip ospf database command is not working, waiting for DEV fix.
+
+    step("Un do shut the interface")
+    shutdown_bringup_interface(tgen, dut, intf, True)
+
+    # step("verify that summary lsa is not refreshed.")
+    # show ip ospf database command is not working, waiting for DEV fix.
+
+    # step("Verify that deleted connected route is removed from ospf LSDB.")
+    # show ip ospf database command is not working, waiting for DEV fix.
+
+    step("Delete OSPF process.")
+    ospf_del = {"r0": {"ospf": {"delete": True}}}
+    result = create_router_ospf(tgen, topo, ospf_del)
+    assert result is True, "Testcase : Failed \n Error: {}".format(result)
+
+    step("Reconfigure ospf process with summary")
+    reset_config_on_routers(tgen)
+
+    input_dict_static_rtes = {
+        "r0": {
+            "static_routes": [
+                {"network": NETWORK["ipv4"], "next_hop": "blackhole"},
+                {"network": NETWORK2["ipv4"], "next_hop": "blackhole"},
+            ]
+        }
+    }
+    result = create_static_routes(tgen, input_dict_static_rtes)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    dut = "r0"
+    red_static(dut)
+    red_connected(dut)
+    ospf_summ_r1 = {
+        "r0": {
+            "ospf": {
+                "summary-address": [
+                    {"prefix": SUMMARY["ipv4"][0].split("/")[0], "mask": "8"}
+                ]
+            }
+        }
+    }
+    result = create_router_ospf(tgen, topo, ospf_summ_r1)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+    step(
+        "Verify that external routes are summarised to configured summary "
+        "address on R0 and only one route is sent to R1."
+    )
+
+    input_dict = {
+        SUMMARY["ipv4"][0]: {
+            "Summary address": SUMMARY["ipv4"][0],
+            "Metric-type": "E2",
+            "Metric": 20,
+            "Tag": 0,
+            "External route count": 5,
+        }
+    }
+    dut = "r0"
+    result = verify_ospf_summary(tgen, topo, dut, input_dict)
+    assert (
+        result is True
+    ), "Testcase {} : Failed" "Error: Summary missing in OSPF DB".format(tc_name)
+
+    input_dict_summary = {"r0": {"static_routes": [{"network": SUMMARY["ipv4"][0]}]}}
+
+    dut = "r1"
+    result = verify_ospf_rib(tgen, dut, input_dict_summary)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    result = verify_rib(tgen, "ipv4", dut, input_dict_summary, protocol=protocol)
+    assert (
+        result is True
+    ), "Testcase {} : Failed" "Error: Routes is missing in RIB".format(tc_name)
+
+    ospf_summ_r1 = {
+        "r0": {
+            "ospf": {
+                "summary-address": [
+                    {"prefix": SUMMARY["ipv4"][0].split("/")[0], "mask": "8"}
+                ]
+            }
+        }
+    }
+    result = create_router_ospf(tgen, topo, ospf_summ_r1)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    # step("verify that summary lsa is not refreshed.")
+    # show ip ospf database command is not working, waiting for DEV fix.
+
+    step("Delete the redistribute command in ospf.")
+    dut = "r0"
+    red_connected(dut, config=False)
+    red_static(dut, config=False)
+
+    step("Verify that summary route is withdrawn from the peer.")
+
+    dut = "r1"
+    result = verify_ospf_rib(tgen, dut, input_dict_summary, expected=False)
+    assert (
+        result is not True
+    ), "Testcase {} : Failed \n Error: " "Routes still present in OSPF RIB {}".format(
+        tc_name, result
+    )
+
+    result = verify_rib(
+        tgen, "ipv4", dut, input_dict_summary, protocol=protocol, expected=False
+    )
+    assert (
+        result is not True
+    ), "Testcase {} : Failed" "Error: Routes still present in RIB".format(tc_name)
+
+    ospf_summ_r1 = {
+        "r0": {
+            "ospf": {
+                "summary-address": [
+                    {
+                        "prefix": SUMMARY["ipv4"][0].split("/")[0],
+                        "mask": "8",
+                        "metric": "1234",
+                    }
+                ]
+            }
+        }
+    }
+    result = create_router_ospf(tgen, topo, ospf_summ_r1)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    write_test_footer(tc_name)
+
+
+def test_ospf_type5_summary_tc45_p0(request):
+    """OSPF summarisation with Tag option"""
+    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.")
+    reset_config_on_routers(tgen)
+
+    protocol = "ospf"
+
+    step(
+        "Configure 5 static routes from the same network on R0"
+        "5 static routes from different networks and redistribute in R0"
+    )
+    input_dict_static_rtes = {
+        "r0": {
+            "static_routes": [
+                {"network": NETWORK["ipv4"], "next_hop": "blackhole"},
+                {"network": NETWORK2["ipv4"], "next_hop": "blackhole"},
+            ]
+        }
+    }
+    result = create_static_routes(tgen, input_dict_static_rtes)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    dut = "r0"
+    red_static(dut)
+
+    step("Verify that routes are learnt on R1.")
+    dut = "r1"
+
+    result = verify_ospf_rib(tgen, dut, input_dict_static_rtes)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+    result = verify_rib(tgen, "ipv4", dut, input_dict_static_rtes, protocol=protocol)
+    assert (
+        result is True
+    ), "Testcase {} : Failed" "Error: Routes is missing in RIB".format(tc_name)
+
+    step(
+        "Configure External Route summary in R0 to summarise 5" " routes to one route."
+    )
+    ospf_summ_r1 = {
+        "r0": {
+            "ospf": {
+                "summary-address": [
+                    {
+                        "prefix": SUMMARY["ipv4"][0].split("/")[0],
+                        "mask": "8",
+                        "tag": "1234",
+                    }
+                ]
+            }
+        }
+    }
+    result = create_router_ospf(tgen, topo, ospf_summ_r1)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    step(
+        "Verify that external routes are summarised to configured summary"
+        " address on R0 and only one route is sent to R1 with configured tag."
+    )
+    input_dict_summary = {
+        "r0": {"static_routes": [{"network": SUMMARY["ipv4"][0], "tag": "1234"}]}
+    }
+    dut = "r1"
+
+    result = verify_ospf_rib(tgen, dut, input_dict_summary)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    result = verify_rib(tgen, "ipv4", dut, input_dict_summary, protocol=protocol)
+    assert (
+        result is True
+    ), "Testcase {} : Failed" "Error: Routes is missing in RIB".format(tc_name)
+
+    step("Verify that show ip ospf summary should show the summaries with tag.")
+    input_dict = {
+        SUMMARY["ipv4"][0]: {
+            "Summary address": SUMMARY["ipv4"][0],
+            "Metric-type": "E2",
+            "Metric": 20,
+            "Tag": 1234,
+            "External route count": 5,
+        }
+    }
+    dut = "r0"
+    result = verify_ospf_summary(tgen, topo, dut, input_dict)
+    assert (
+        result is True
+    ), "Testcase {} : Failed" "Error: Summary missing in OSPF DB".format(tc_name)
+
+    step("Delete the configured summary")
+    ospf_summ_r1 = {
+        "r0": {
+            "ospf": {
+                "summary-address": [
+                    {
+                        "prefix": SUMMARY["ipv4"][0].split("/")[0],
+                        "mask": "8",
+                        "tag": "1234",
+                        "delete": True,
+                    }
+                ]
+            }
+        }
+    }
+    result = create_router_ospf(tgen, topo, ospf_summ_r1)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    step("Verify that summary lsa is withdrawn from R1 and deleted from R0.")
+    dut = "r1"
+    result = verify_ospf_rib(tgen, dut, input_dict, expected=False)
+    assert (
+        result is not True
+    ), "Testcase {} : Failed \n Error: " "Routes still present in OSPF RIB {}".format(
+        tc_name, result
+    )
+
+    result = verify_rib(
+        tgen, "ipv4", dut, input_dict_summary, protocol=protocol, expected=False
+    )
+    assert (
+        result is not True
+    ), "Testcase {} : Failed" "Error: Summary Route still present in RIB".format(
+        tc_name
+    )
+
+    step("show ip ospf summary should not have any summary address.")
+    input_dict = {
+        SUMMARY["ipv4"][0]: {
+            "Summary address": SUMMARY["ipv4"][0],
+            "Metric-type": "E2",
+            "Metric": 20,
+            "Tag": 1234,
+            "External route count": 5,
+        }
+    }
+    dut = "r0"
+    result = verify_ospf_summary(tgen, topo, dut, input_dict, expected=False)
+    assert (
+        result is not True
+    ), "Testcase {} : Failed" "Error: Summary still present in DB".format(tc_name)
+
+    step("Configure Min tag value")
+    ospf_summ_r1 = {
+        "r0": {
+            "ospf": {
+                "summary-address": [
+                    {"prefix": SUMMARY["ipv4"][0].split("/")[0], "mask": "8", "tag": 1}
+                ]
+            }
+        }
+    }
+    result = create_router_ospf(tgen, topo, ospf_summ_r1)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+    input_dict_summary = {
+        "r0": {"static_routes": [{"network": SUMMARY["ipv4"][0], "tag": "1"}]}
+    }
+    dut = "r1"
+
+    result = verify_ospf_rib(tgen, dut, input_dict_summary)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    result = verify_rib(tgen, "ipv4", dut, input_dict_summary, protocol=protocol)
+    assert (
+        result is True
+    ), "Testcase {} : Failed" "Error: Routes is missing in RIB".format(tc_name)
+
+    step("Verify that show ip ospf summary should show the summaries with tag.")
+    input_dict = {
+        SUMMARY["ipv4"][0]: {
+            "Summary address": SUMMARY["ipv4"][0],
+            "Metric-type": "E2",
+            "Metric": 20,
+            "Tag": 1,
+            "External route count": 5,
+        }
+    }
+    dut = "r0"
+    result = verify_ospf_summary(tgen, topo, dut, input_dict)
+    assert (
+        result is True
+    ), "Testcase {} : Failed" "Error: Summary missing in OSPF DB".format(tc_name)
+
+    step("Configure Max Tag Value")
+    ospf_summ_r1 = {
+        "r0": {
+            "ospf": {
+                "summary-address": [
+                    {
+                        "prefix": SUMMARY["ipv4"][0].split("/")[0],
+                        "mask": "8",
+                        "tag": 4294967295,
+                    }
+                ]
+            }
+        }
+    }
+    result = create_router_ospf(tgen, topo, ospf_summ_r1)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    input_dict_summary = {
+        "r0": {"static_routes": [{"network": SUMMARY["ipv4"][0], "tag": "4294967295"}]}
+    }
+    dut = "r1"
+
+    result = verify_ospf_rib(tgen, dut, input_dict_summary)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    result = verify_rib(tgen, "ipv4", dut, input_dict_summary, protocol=protocol)
+    assert (
+        result is True
+    ), "Testcase {} : Failed" "Error: Routes is missing in RIB".format(tc_name)
+
+    step(
+        "Verify that boundary values tags are used for summary route"
+        " using show ip ospf route command."
+    )
+    input_dict = {
+        SUMMARY["ipv4"][0]: {
+            "Summary address": SUMMARY["ipv4"][0],
+            "Metric-type": "E2",
+            "Metric": 20,
+            "Tag": 4294967295,
+            "External route count": 5,
+        }
+    }
+    dut = "r0"
+    result = verify_ospf_summary(tgen, topo, dut, input_dict)
+    assert (
+        result is True
+    ), "Testcase {} : Failed" "Error: Summary missing in OSPF DB".format(tc_name)
+
+    step("configure new static route with different tag.")
+    input_dict_static_rtes_11 = {
+        "r0": {
+            "static_routes": [
+                {"network": NETWORK_11["ipv4"], "next_hop": "blackhole", "tag": "88888"}
+            ]
+        }
+    }
+    result = create_static_routes(tgen, input_dict_static_rtes_11)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    step("New tag has not been used by summary address.")
+
+    input_dict_summary = {
+        "r0": {"static_routes": [{"network": SUMMARY["ipv4"][0], "tag": "88888"}]}
+    }
+    dut = "r1"
+
+    result = verify_ospf_rib(tgen, dut, input_dict_summary, tag="88888", expected=False)
+    assert (
+        result is not True
+    ), "Testcase {} : Failed \n Error: " "Routes still present in OSPF RIB {}".format(
+        tc_name, result
+    )
+
+    result = verify_rib(
+        tgen,
+        "ipv4",
+        dut,
+        input_dict_summary,
+        protocol=protocol,
+        tag="88888",
+        expected=False,
+    )
+    assert (
+        result is not True
+    ), "Testcase {} : Failed" "Error: Routes still present in RIB".format(tc_name)
+
+    step(
+        "Verify that boundary values tags are used for summary route"
+        " using show ip ospf route command."
+    )
+    input_dict = {
+        SUMMARY["ipv4"][0]: {
+            "Summary address": SUMMARY["ipv4"][0],
+            "Metric-type": "E2",
+            "Metric": 20,
+            "Tag": 88888,
+            "External route count": 5,
+        }
+    }
+    dut = "r0"
+    result = verify_ospf_summary(tgen, topo, dut, input_dict, expected=False)
+    assert (
+        result is not True
+    ), "Testcase {} : Failed" "Error: Summary missing in OSPF DB".format(tc_name)
+
+    step("Delete the configured summary address")
+    ospf_summ_r1 = {
+        "r0": {
+            "ospf": {
+                "summary-address": [
+                    {
+                        "prefix": SUMMARY["ipv4"][0].split("/")[0],
+                        "mask": "8",
+                        "tag": 4294967295,
+                        "delete": True,
+                    }
+                ]
+            }
+        }
+    }
+    result = create_router_ospf(tgen, topo, ospf_summ_r1)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    step(
+        "Verify that 6 routes are advertised to neighbour with 5 routes"
+        " without any tag, 1 route with tag."
+    )
+
+    dut = "r1"
+    result = verify_ospf_rib(tgen, dut, input_dict_static_rtes)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+    result = verify_rib(tgen, "ipv4", dut, input_dict_static_rtes, protocol=protocol)
+    assert (
+        result is True
+    ), "Testcase {} : Failed" "Error: Routes is missing in RIB".format(tc_name)
+
+    step("Verify that summary address is flushed from neighbor.")
+
+    dut = "r1"
+    result = verify_ospf_rib(tgen, dut, input_dict_summary, expected=False)
+    assert (
+        result is not True
+    ), "Testcase {} : Failed \n Error: " "Routes still present in OSPF RIB {}".format(
+        tc_name, result
+    )
+
+    result = verify_rib(
+        tgen, "ipv4", dut, input_dict_summary, protocol=protocol, expected=False
+    )
+    assert (
+        result is not True
+    ), "Testcase {} : Failed" "Error: Routes still present in RIB".format(tc_name)
+
+    step("Configure summary first & then configure matching static route.")
+
+    input_dict_static_rtes = {
+        "r0": {
+            "static_routes": [
+                {"network": NETWORK["ipv4"], "next_hop": "blackhole", "delete": True},
+                {"network": NETWORK2["ipv4"], "next_hop": "blackhole", "delete": True},
+            ]
+        }
+    }
+    result = create_static_routes(tgen, input_dict_static_rtes)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    ospf_summ_r1 = {
+        "r0": {
+            "ospf": {
+                "summary-address": [
+                    {"prefix": SUMMARY["ipv4"][0].split("/")[0], "mask": "8"}
+                ]
+            }
+        }
+    }
+    result = create_router_ospf(tgen, topo, ospf_summ_r1)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    input_dict_static_rtes = {
+        "r0": {
+            "static_routes": [
+                {"network": NETWORK["ipv4"], "next_hop": "blackhole"},
+                {"network": NETWORK2["ipv4"], "next_hop": "blackhole"},
+            ]
+        }
+    }
+    result = create_static_routes(tgen, input_dict_static_rtes)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    step("Repeat steps 1 to 10 of summarisation in non Back bone area.")
+    reset_config_on_routers(tgen)
+
+    step("Change the area id on the interface on R0")
+    input_dict = {
+        "r0": {
+            "links": {
+                "r1": {
+                    "interface": topo["routers"]["r0"]["links"]["r1"]["interface"],
+                    "ospf": {"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 = {
+        "r0": {
+            "links": {
+                "r1": {
+                    "interface": topo["routers"]["r0"]["links"]["r1"]["interface"],
+                    "ospf": {"area": "0.0.0.1"},
+                }
+            }
+        }
+    }
+
+    result = create_interfaces_cfg(tgen, input_dict)
+    assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
+
+    step("Change the area id on the interface  ")
+    input_dict = {
+        "r1": {
+            "links": {
+                "r0": {
+                    "interface": topo["routers"]["r1"]["links"]["r0"]["interface"],
+                    "ospf": {"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": {
+                "r0": {
+                    "interface": topo["routers"]["r1"]["links"]["r0"]["interface"],
+                    "ospf": {"area": "0.0.0.1"},
+                }
+            }
+        }
+    }
+
+    result = create_interfaces_cfg(tgen, input_dict)
+    assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
+
+    ospf_covergence = verify_ospf_neighbor(tgen, topo)
+    assert ospf_covergence is True, "setup_module :Failed \n Error:" " {}".format(
+        ospf_covergence
+    )
+
+    step(
+        "Configure 5 static routes from the same network on R0"
+        "5 static routes from different networks and redistribute in R0"
+    )
+    input_dict_static_rtes = {
+        "r0": {
+            "static_routes": [
+                {"network": NETWORK["ipv4"], "next_hop": "blackhole"},
+                {"network": NETWORK2["ipv4"], "next_hop": "blackhole"},
+            ]
+        }
+    }
+    result = create_static_routes(tgen, input_dict_static_rtes)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    dut = "r0"
+    red_static(dut)
+
+    step("Verify that routes are learnt on R1.")
+    dut = "r1"
+
+    result = verify_ospf_rib(tgen, dut, input_dict_static_rtes)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+    result = verify_rib(tgen, "ipv4", dut, input_dict_static_rtes, protocol=protocol)
+    assert (
+        result is True
+    ), "Testcase {} : Failed" "Error: Routes is missing in RIB".format(tc_name)
+
+    step(
+        "Configure External Route summary in R0 to summarise 5" " routes to one route."
+    )
+    ospf_summ_r1 = {
+        "r0": {
+            "ospf": {
+                "summary-address": [
+                    {
+                        "prefix": SUMMARY["ipv4"][0].split("/")[0],
+                        "mask": "8",
+                        "tag": "1234",
+                    }
+                ]
+            }
+        }
+    }
+    result = create_router_ospf(tgen, topo, ospf_summ_r1)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    step(
+        "Verify that external routes are summarised to configured summary"
+        " address on R0 and only one route is sent to R1 with configured tag."
+    )
+    input_dict_summary = {
+        "r0": {"static_routes": [{"network": SUMMARY["ipv4"][0], "tag": "1234"}]}
+    }
+    dut = "r1"
+
+    result = verify_ospf_rib(tgen, dut, input_dict_summary)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    result = verify_rib(tgen, "ipv4", dut, input_dict_summary, protocol=protocol)
+    assert (
+        result is True
+    ), "Testcase {} : Failed" "Error: Routes is missing in RIB".format(tc_name)
+
+    step("Verify that show ip ospf summary should show the summaries with tag.")
+    input_dict = {
+        SUMMARY["ipv4"][0]: {
+            "Summary address": SUMMARY["ipv4"][0],
+            "Metric-type": "E2",
+            "Metric": 20,
+            "Tag": 1234,
+            "External route count": 5,
+        }
+    }
+    dut = "r0"
+    result = verify_ospf_summary(tgen, topo, dut, input_dict)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    step("Delete the configured summary")
+    ospf_summ_r1 = {
+        "r0": {
+            "ospf": {
+                "summary-address": [
+                    {
+                        "prefix": SUMMARY["ipv4"][0].split("/")[0],
+                        "mask": "8",
+                        "delete": True,
+                    }
+                ]
+            }
+        }
+    }
+    result = create_router_ospf(tgen, topo, ospf_summ_r1)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    step("Verify that summary lsa is withdrawn from R1 and deleted from R0.")
+    dut = "r1"
+    result = verify_ospf_rib(tgen, dut, input_dict, expected=False)
+    assert (
+        result is not True
+    ), "Testcase {} : Failed \n Error: " "Routes still present in OSPF RIB {}".format(
+        tc_name, result
+    )
+
+    result = verify_rib(
+        tgen, "ipv4", dut, input_dict_summary, protocol=protocol, expected=False
+    )
+    assert (
+        result is not True
+    ), "Testcase {} : Failed" "Error: Summary Route still present in RIB".format(
+        tc_name
+    )
+
+    step("show ip ospf summary should not have any summary address.")
+    input_dict = {
+        SUMMARY["ipv4"][0]: {
+            "Summary address": SUMMARY["ipv4"][0],
+            "Metric-type": "E2",
+            "Metric": 20,
+            "Tag": 1234,
+            "External route count": 5,
+        }
+    }
+    dut = "r0"
+    result = verify_ospf_summary(tgen, topo, dut, input_dict, expected=False)
+    assert (
+        result is not True
+    ), "Testcase {} : Failed" "Error: Summary still present in DB".format(tc_name)
+
+    step("Configure Min tag value")
+    ospf_summ_r1 = {
+        "r0": {
+            "ospf": {
+                "summary-address": [
+                    {"prefix": SUMMARY["ipv4"][0].split("/")[0], "mask": "8", "tag": 1}
+                ]
+            }
+        }
+    }
+    result = create_router_ospf(tgen, topo, ospf_summ_r1)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+    input_dict_summary = {
+        "r0": {"static_routes": [{"network": SUMMARY["ipv4"][0], "tag": "1"}]}
+    }
+    dut = "r1"
+
+    result = verify_ospf_rib(tgen, dut, input_dict_summary)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    result = verify_rib(tgen, "ipv4", dut, input_dict_summary, protocol=protocol)
+    assert (
+        result is True
+    ), "Testcase {} : Failed" "Error: Routes is missing in RIB".format(tc_name)
+
+    step("Verify that show ip ospf summary should show the summaries with tag.")
+    input_dict = {
+        SUMMARY["ipv4"][0]: {
+            "Summary address": SUMMARY["ipv4"][0],
+            "Metric-type": "E2",
+            "Metric": 20,
+            "Tag": 1,
+            "External route count": 5,
+        }
+    }
+    dut = "r0"
+    result = verify_ospf_summary(tgen, topo, dut, input_dict)
+    assert (
+        result is True
+    ), "Testcase {} : Failed" "Error: Summary missing in OSPF DB".format(tc_name)
+
+    step("Configure Max Tag Value")
+    ospf_summ_r1 = {
+        "r0": {
+            "ospf": {
+                "summary-address": [
+                    {
+                        "prefix": SUMMARY["ipv4"][0].split("/")[0],
+                        "mask": "8",
+                        "tag": 4294967295,
+                    }
+                ]
+            }
+        }
+    }
+    result = create_router_ospf(tgen, topo, ospf_summ_r1)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    input_dict_summary = {
+        "r0": {"static_routes": [{"network": SUMMARY["ipv4"][0], "tag": "4294967295"}]}
+    }
+    dut = "r1"
+
+    result = verify_ospf_rib(tgen, dut, input_dict_summary)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    result = verify_rib(tgen, "ipv4", dut, input_dict_summary, protocol=protocol)
+    assert (
+        result is True
+    ), "Testcase {} : Failed" "Error: Routes is missing in RIB".format(tc_name)
+
+    step(
+        "Verify that boundary values tags are used for summary route"
+        " using show ip ospf route command."
+    )
+    input_dict = {
+        SUMMARY["ipv4"][0]: {
+            "Summary address": SUMMARY["ipv4"][0],
+            "Metric-type": "E2",
+            "Metric": 20,
+            "Tag": 4294967295,
+            "External route count": 5,
+        }
+    }
+    dut = "r0"
+    result = verify_ospf_summary(tgen, topo, dut, input_dict)
+    assert (
+        result is True
+    ), "Testcase {} : Failed" "Error: Summary missing in OSPF DB".format(tc_name)
+
+    step("configure new static route with different tag.")
+    input_dict_static_rtes_11 = {
+        "r0": {
+            "static_routes": [
+                {"network": NETWORK_11["ipv4"], "next_hop": "blackhole", "tag": "88888"}
+            ]
+        }
+    }
+    result = create_static_routes(tgen, input_dict_static_rtes_11)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    step("New tag has not been used by summary address.")
+
+    input_dict_summary = {
+        "r0": {"static_routes": [{"network": SUMMARY["ipv4"][0], "tag": "88888"}]}
+    }
+    dut = "r1"
+
+    result = verify_ospf_rib(tgen, dut, input_dict_summary, tag="88888", expected=False)
+    assert (
+        result is not True
+    ), "Testcase {} : Failed \n Error: " "Routes still present in OSPF RIB {}".format(
+        tc_name, result
+    )
+
+    result = verify_rib(
+        tgen,
+        "ipv4",
+        dut,
+        input_dict_summary,
+        protocol=protocol,
+        tag="88888",
+        expected=False,
+    )
+    assert (
+        result is not True
+    ), "Testcase {} : Failed" "Error: Routes still present in RIB".format(tc_name)
+
+    step(
+        "Verify that boundary values tags are used for summary route"
+        " using show ip ospf route command."
+    )
+    input_dict = {
+        SUMMARY["ipv4"][0]: {
+            "Summary address": SUMMARY["ipv4"][0],
+            "Metric-type": "E2",
+            "Metric": 20,
+            "Tag": 88888,
+            "External route count": 5,
+        }
+    }
+    dut = "r0"
+    result = verify_ospf_summary(tgen, topo, dut, input_dict, expected=False)
+    assert (
+        result is not True
+    ), "Testcase {} : Failed" "Error: Summary missing in OSPF DB".format(tc_name)
+
+    step("Delete the configured summary address")
+    ospf_summ_r1 = {
+        "r0": {
+            "ospf": {
+                "summary-address": [
+                    {
+                        "prefix": SUMMARY["ipv4"][0].split("/")[0],
+                        "mask": "8",
+                        "tag": 4294967295,
+                        "delete": True,
+                    }
+                ]
+            }
+        }
+    }
+    result = create_router_ospf(tgen, topo, ospf_summ_r1)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    step(
+        "Verify that 6 routes are advertised to neighbour with 5 routes"
+        " without any tag, 1 route with tag."
+    )
+
+    dut = "r1"
+    result = verify_ospf_rib(tgen, dut, input_dict_static_rtes)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+    result = verify_rib(tgen, "ipv4", dut, input_dict_static_rtes, protocol=protocol)
+    assert (
+        result is True
+    ), "Testcase {} : Failed" "Error: Routes is missing in RIB".format(tc_name)
+
+    step("Verify that summary address is flushed from neighbor.")
+
+    dut = "r1"
+    result = verify_ospf_rib(tgen, dut, input_dict_summary, expected=False)
+    assert (
+        result is not True
+    ), "Testcase {} : Failed \n Error: " "Routes still present in OSPF RIB {}".format(
+        tc_name, result
+    )
+
+    result = verify_rib(
+        tgen, "ipv4", dut, input_dict_summary, protocol=protocol, expected=False
+    )
+    assert (
+        result is not True
+    ), "Testcase {} : Failed" "Error: Routes still present in RIB".format(tc_name)
+
+    step("Configure summary first & then configure matching static route.")
+
+    input_dict_static_rtes = {
+        "r0": {
+            "static_routes": [
+                {"network": NETWORK["ipv4"], "next_hop": "blackhole", "delete": True},
+                {"network": NETWORK2["ipv4"], "next_hop": "blackhole", "delete": True},
+            ]
+        }
+    }
+    result = create_static_routes(tgen, input_dict_static_rtes)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    ospf_summ_r1 = {
+        "r0": {
+            "ospf": {
+                "summary-address": [
+                    {"prefix": SUMMARY["ipv4"][0].split("/")[0], "mask": "8"}
+                ]
+            }
+        }
+    }
+    result = create_router_ospf(tgen, topo, ospf_summ_r1)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    input_dict_static_rtes = {
+        "r0": {
+            "static_routes": [
+                {"network": NETWORK["ipv4"], "next_hop": "blackhole"},
+                {"network": NETWORK2["ipv4"], "next_hop": "blackhole"},
+            ]
+        }
+    }
+    result = create_static_routes(tgen, input_dict_static_rtes)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    write_test_footer(tc_name)
+
+
+def test_ospf_type5_summary_tc46_p0(request):
+    """OSPF summarisation with advertise and no advertise option"""
+    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.")
+    reset_config_on_routers(tgen)
+
+    protocol = "ospf"
+
+    step(
+        "Configure 5 static routes from the same network on R0"
+        "5 static routes from different networks and redistribute in R0"
+    )
+    input_dict_static_rtes = {
+        "r0": {
+            "static_routes": [
+                {"network": NETWORK["ipv4"], "next_hop": "blackhole"},
+                {"network": NETWORK2["ipv4"], "next_hop": "blackhole"},
+            ]
+        }
+    }
+    result = create_static_routes(tgen, input_dict_static_rtes)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    dut = "r0"
+    red_static(dut)
+
+    step("Verify that routes are learnt on R1.")
+    dut = "r1"
+
+    result = verify_ospf_rib(tgen, dut, input_dict_static_rtes)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+    result = verify_rib(tgen, "ipv4", dut, input_dict_static_rtes, protocol=protocol)
+    assert (
+        result is True
+    ), "Testcase {} : Failed" "Error: Routes is missing in RIB".format(tc_name)
+
+    step(
+        "Configure External Route summary in R0 to summarise 5"
+        " routes to one route with no advertise option."
+    )
+    ospf_summ_r1 = {
+        "r0": {
+            "ospf": {
+                "summary-address": [
+                    {
+                        "prefix": SUMMARY["ipv4"][0].split("/")[0],
+                        "mask": "8",
+                        "advertise": False,
+                    }
+                ]
+            }
+        }
+    }
+    result = create_router_ospf(tgen, topo, ospf_summ_r1)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    step(
+        "Verify that external routes are summarised to configured summary"
+        " address on R0 and  summary route is not advertised to neighbor as"
+        " no advertise is configured.."
+    )
+
+    input_dict_summary = {"r0": {"static_routes": [{"network": SUMMARY["ipv4"][0]}]}}
+    dut = "r1"
+
+    result = verify_ospf_rib(tgen, dut, input_dict_summary, expected=False)
+    assert (
+        result is not True
+    ), "Testcase {} : Failed \n Error: " "Routes still present in OSPF RIB {}".format(
+        tc_name, result
+    )
+
+    result = verify_rib(
+        tgen, "ipv4", dut, input_dict_summary, protocol=protocol, expected=False
+    )
+    assert (
+        result is not True
+    ), "Testcase {} : Failed" "Error: Routes still present in RIB".format(tc_name)
+
+    step("Verify that show ip ospf summary should show the " "configured summaries.")
+    input_dict = {
+        SUMMARY["ipv4"][0]: {
+            "Summary address": SUMMARY["ipv4"][0],
+            "External route count": 5,
+        }
+    }
+    dut = "r0"
+    result = verify_ospf_summary(tgen, topo, dut, input_dict)
+    assert (
+        result is True
+    ), "Testcase {} : Failed" "Error: Summary missing in OSPF DB".format(tc_name)
+
+    step("Delete the configured summary")
+    ospf_summ_r1 = {
+        "r0": {
+            "ospf": {
+                "summary-address": [
+                    {
+                        "prefix": SUMMARY["ipv4"][0].split("/")[0],
+                        "mask": "8",
+                        "delete": True,
+                    }
+                ]
+            }
+        }
+    }
+    result = create_router_ospf(tgen, topo, ospf_summ_r1)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    step("Summary has 5 sec delay timer, sleep 5 secs...")
+    sleep(5)
+
+    step("Verify that summary lsa is withdrawn from R1 and deleted from R0.")
+    dut = "r1"
+    result = verify_ospf_rib(tgen, dut, input_dict, expected=False)
+    assert (
+        result is not True
+    ), "Testcase {} : Failed \n Error: " "Routes still present in OSPF RIB {}".format(
+        tc_name, result
+    )
+
+    result = verify_rib(
+        tgen, "ipv4", dut, input_dict_summary, protocol=protocol, expected=False
+    )
+    assert (
+        result is not True
+    ), "Testcase {} : Failed" "Error: Summary Route still present in RIB".format(
+        tc_name
+    )
+
+    step("show ip ospf summary should not have any summary address.")
+    input_dict = {
+        SUMMARY["ipv4"][0]: {
+            "Summary address": SUMMARY["ipv4"][0],
+            "Metric-type": "E2",
+            "Metric": 20,
+            "Tag": 1234,
+            "External route count": 5,
+        }
+    }
+    dut = "r0"
+    result = verify_ospf_summary(tgen, topo, dut, input_dict, expected=False)
+    assert (
+        result is not True
+    ), "Testcase {} : Failed" "Error: Summary still present in DB".format(tc_name)
+
+    step("Reconfigure summary with no advertise.")
+    ospf_summ_r1 = {
+        "r0": {
+            "ospf": {
+                "summary-address": [
+                    {
+                        "prefix": SUMMARY["ipv4"][0].split("/")[0],
+                        "mask": "8",
+                        "advertise": False,
+                    }
+                ]
+            }
+        }
+    }
+    result = create_router_ospf(tgen, topo, ospf_summ_r1)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    step(
+        "Verify that external routes are summarised to configured summary"
+        " address on R0 and  summary route is not advertised to neighbor as"
+        " no advertise is configured.."
+    )
+
+    input_dict_summary = {"r0": {"static_routes": [{"network": SUMMARY["ipv4"][0]}]}}
+    dut = "r1"
+
+    result = verify_ospf_rib(tgen, dut, input_dict_summary, expected=False)
+    assert (
+        result is not True
+    ), "Testcase {} : Failed \n Error: " "Routes still present in OSPF RIB {}".format(
+        tc_name, result
+    )
+
+    result = verify_rib(
+        tgen, "ipv4", dut, input_dict_summary, protocol=protocol, expected=False
+    )
+    assert (
+        result is not True
+    ), "Testcase {} : Failed" "Error: Routes still present in RIB".format(tc_name)
+
+    step("Verify that show ip ospf summary should show the " "configured summaries.")
+    input_dict = {
+        SUMMARY["ipv4"][0]: {
+            "Summary address": SUMMARY["ipv4"][0],
+            "External route count": 5,
+        }
+    }
+    dut = "r0"
+    result = verify_ospf_summary(tgen, topo, dut, input_dict)
+    assert (
+        result is True
+    ), "Testcase {} : Failed" "Error: Summary missing in OSPF DB".format(tc_name)
+
+    step(
+        "Change summary address from no advertise to advertise "
+        "(summary-address 10.0.0.0 255.255.0.0)"
+    )
+
+    ospf_summ_r1 = {
+        "r0": {
+            "ospf": {
+                "summary-address": [
+                    {
+                        "prefix": SUMMARY["ipv4"][0].split("/")[0],
+                        "mask": "8",
+                        "advertise": False,
+                    }
+                ]
+            }
+        }
+    }
+    result = create_router_ospf(tgen, topo, ospf_summ_r1)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    ospf_summ_r1 = {
+        "r0": {
+            "ospf": {
+                "summary-address": [
+                    {"prefix": SUMMARY["ipv4"][0].split("/")[0], "mask": "8"}
+                ]
+            }
+        }
+    }
+    result = create_router_ospf(tgen, topo, ospf_summ_r1)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    step(
+        "Verify that external routes are summarised to configured summary "
+        "address on R0 after 5 secs of delay timer expiry and only one "
+        "route is sent to R1."
+    )
+    input_dict_summary = {"r0": {"static_routes": [{"network": SUMMARY["ipv4"][0]}]}}
+    dut = "r1"
+
+    result = verify_ospf_rib(tgen, dut, input_dict_summary)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    result = verify_rib(tgen, "ipv4", dut, input_dict_summary, protocol=protocol)
+    assert (
+        result is True
+    ), "Testcase {} : Failed" "Error: Routes is missing in RIB".format(tc_name)
+
+    step("Verify that show ip ospf summary should show the summaries.")
+    input_dict = {
+        SUMMARY["ipv4"][0]: {
+            "Summary address": SUMMARY["ipv4"][0],
+            "Metric-type": "E2",
+            "Metric": 20,
+            "Tag": 0,
+            "External route count": 5,
+        }
+    }
+    dut = "r0"
+    result = verify_ospf_summary(tgen, topo, dut, input_dict)
+    assert (
+        result is True
+    ), "Testcase {} : Failed" "Error: Summary missing in OSPF DB".format(tc_name)
+
+    step("Verify that originally advertised routes are withdraw from there" " peer.")
+    input_dict = {
+        "r0": {"static_routes": [{"network": NETWORK["ipv4"], "next_hop": "blackhole"}]}
+    }
+    dut = "r1"
+    result = verify_ospf_rib(tgen, dut, input_dict, expected=False)
+    assert (
+        result is not True
+    ), "Testcase {} : Failed \n Error: " "Routes still present in OSPF RIB {}".format(
+        tc_name, result
+    )
+
+    result = verify_rib(
+        tgen, "ipv4", dut, input_dict, protocol=protocol, expected=False
+    )
+    assert (
+        result is not True
+    ), "Testcase {} : Failed" "Error: Routes is present in RIB".format(tc_name)
+
+    write_test_footer(tc_name)
+
+
+def test_ospf_type5_summary_tc47_p0(request):
+    """OSPF summarisation with route map filtering."""
+    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)
+
+    protocol = "ospf"
+
+    step(
+        "Configure 5 static routes from the same network on R0"
+        "5 static routes from different networks and redistribute in R0"
+    )
+    input_dict_static_rtes = {
+        "r0": {
+            "static_routes": [
+                {"network": NETWORK["ipv4"], "next_hop": "blackhole"},
+                {"network": NETWORK2["ipv4"], "next_hop": "blackhole"},
+            ]
+        }
+    }
+    result = create_static_routes(tgen, input_dict_static_rtes)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    dut = "r0"
+    red_static(dut)
+
+    step("Verify that routes are learnt on R1.")
+    dut = "r1"
+
+    result = verify_ospf_rib(tgen, dut, input_dict_static_rtes)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+    result = verify_rib(tgen, "ipv4", dut, input_dict_static_rtes, protocol=protocol)
+    assert (
+        result is True
+    ), "Testcase {} : Failed" "Error: Routes is missing in RIB".format(tc_name)
+
+    step(
+        "Configure External Route summary in R0 to summarise 5" " routes to one route."
+    )
+
+    ospf_summ_r1 = {
+        "r0": {
+            "ospf": {
+                "summary-address": [
+                    {"prefix": SUMMARY["ipv4"][0].split("/")[0], "mask": "8"}
+                ]
+            }
+        }
+    }
+    result = create_router_ospf(tgen, topo, ospf_summ_r1)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    step(
+        "Verify that external routes are summarised to configured summary "
+        "address on R0 after 5 secs of delay timer expiry and only one "
+        "route is sent to R1."
+    )
+    input_dict_summary = {"r0": {"static_routes": [{"network": SUMMARY["ipv4"][0]}]}}
+    dut = "r1"
+
+    result = verify_ospf_rib(tgen, dut, input_dict_summary)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    result = verify_rib(tgen, "ipv4", dut, input_dict_summary, protocol=protocol)
+    assert (
+        result is True
+    ), "Testcase {} : Failed" "Error: Routes is missing in RIB".format(tc_name)
+
+    step("Verify that show ip ospf summary should show the summaries.")
+    input_dict = {
+        SUMMARY["ipv4"][0]: {
+            "Summary address": SUMMARY["ipv4"][0],
+            "Metric-type": "E2",
+            "Metric": 20,
+            "Tag": 0,
+            "External route count": 5,
+        }
+    }
+    dut = "r0"
+    result = verify_ospf_summary(tgen, topo, dut, input_dict)
+    assert (
+        result is True
+    ), "Testcase {} : Failed" "Error: Summary missing in OSPF DB".format(tc_name)
+
+    step("Verify that originally advertised routes are withdraw from there" " peer.")
+    input_dict = {
+        "r0": {"static_routes": [{"network": NETWORK["ipv4"], "next_hop": "blackhole"}]}
+    }
+    dut = "r1"
+    result = verify_ospf_rib(tgen, dut, input_dict, expected=False)
+    assert (
+        result is not True
+    ), "Testcase {} : Failed \n Error: " "Routes still present in OSPF RIB {}".format(
+        tc_name, result
+    )
+
+    result = verify_rib(
+        tgen, "ipv4", dut, input_dict, protocol=protocol, expected=False
+    )
+    assert (
+        result is not True
+    ), "Testcase {} : Failed" "Error: Routes still present in RIB".format(tc_name)
+
+    step(
+        "configure route map and add rule to permit configured static "
+        "routes, redistribute static & connected routes with the route map."
+    )
+
+    # Create ip prefix list
+    pfx_list = {
+        "r0": {
+            "prefix_lists": {
+                "ipv4": {
+                    "pf_list_1_ipv4": [
+                        {"seqid": 10, "network": "any", "action": "permit"}
+                    ]
+                }
+            }
+        }
+    }
+    result = create_prefix_lists(tgen, pfx_list)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    routemaps = {
+        "r0": {
+            "route_maps": {
+                "rmap_ipv4": [
+                    {
+                        "action": "permit",
+                        "match": {"ipv4": {"prefix_lists": "pf_list_1_ipv4"}},
+                        "seq_id": 10,
+                    }
+                ]
+            }
+        }
+    }
+    result = create_route_maps(tgen, routemaps)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    ospf_red_r1 = {
+        "r0": {
+            "ospf": {
+                "redistribute": [{"redist_type": "static", "route_map": "rmap_ipv4"}]
+            }
+        }
+    }
+    result = create_router_ospf(tgen, topo, ospf_red_r1)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    step(
+        "Verify that external routes are summarised to configured"
+        "summary address on R0 and only one route is sent to R1. Verify that "
+        "show ip ospf summary should show the configure summaries."
+    )
+
+    input_dict_summary = {"r0": {"static_routes": [{"network": SUMMARY["ipv4"][0]}]}}
+    dut = "r1"
+
+    result = verify_ospf_rib(tgen, dut, input_dict_summary)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    result = verify_rib(tgen, "ipv4", dut, input_dict_summary, protocol=protocol)
+    assert (
+        result is True
+    ), "Testcase {} : Failed" "Error: Routes is missing in RIB".format(tc_name)
+
+    input_dict = {
+        SUMMARY["ipv4"][0]: {
+            "Summary address": SUMMARY["ipv4"][0],
+            "Metric-type": "E2",
+            "Metric": 20,
+            "Tag": 0,
+            "External route count": 5,
+        }
+    }
+    dut = "r0"
+    result = verify_ospf_summary(tgen, topo, dut, input_dict)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    step("Change the rule from permit to deny in configured route map.")
+
+    routemaps = {
+        "r0": {
+            "route_maps": {
+                "rmap_ipv4": [
+                    {
+                        "action": "deny",
+                        "match": {"ipv4": {"prefix_lists": "pf_list_1_ipv4"}},
+                        "seq_id": 10,
+                    }
+                ]
+            }
+        }
+    }
+    result = create_route_maps(tgen, routemaps)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    step("summary route has 5 secs dealy, sleep 5 secs")
+    sleep(5)
+    step("Verify that advertised summary route is flushed from neighbor.")
+    dut = "r1"
+    result = verify_ospf_rib(tgen, dut, input_dict_summary, expected=False)
+    assert (
+        result is not True
+    ), "Testcase {} : Failed \n Error: " "Routes still present in OSPF RIB {}".format(
+        tc_name, result
+    )
+
+    result = verify_rib(
+        tgen, "ipv4", dut, input_dict_summary, protocol=protocol, expected=False
+    )
+    assert (
+        result is not True
+    ), "Testcase {} : Failed" "Error: Routes still present in RIB".format(tc_name)
+
+    step("Delete the configured route map.")
+
+    routemaps = {
+        "r0": {
+            "route_maps": {
+                "rmap_ipv4": [
+                    {
+                        "action": "permit",
+                        "match": {"ipv4": {"prefix_lists": "pf_list_1_ipv4"}},
+                        "delete": True,
+                    }
+                ]
+            }
+        }
+    }
+    result = create_route_maps(tgen, routemaps)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    ospf_red_r1 = {"r0": {"ospf": {"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)
+
+    step(
+        "Verify that external routes are summarised to configured"
+        "summary address on R0 and only one route is sent to R1. Verify that "
+        "show ip ospf summary should show the configure summaries."
+    )
+
+    input_dict_summary = {"r0": {"static_routes": [{"network": SUMMARY["ipv4"][0]}]}}
+    dut = "r1"
+
+    result = verify_ospf_rib(tgen, dut, input_dict_summary)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    result = verify_rib(tgen, "ipv4", dut, input_dict_summary, protocol=protocol)
+    assert (
+        result is True
+    ), "Testcase {} : Failed" "Error: Routes is missing in RIB".format(tc_name)
+
+    input_dict = {
+        SUMMARY["ipv4"][0]: {
+            "Summary address": SUMMARY["ipv4"][0],
+            "Metric-type": "E2",
+            "Metric": 20,
+            "Tag": 0,
+            "External route count": 5,
+        }
+    }
+    dut = "r0"
+    result = verify_ospf_summary(tgen, topo, dut, input_dict)
+    assert (
+        result is True
+    ), "Testcase {} : Failed" "Error: Summary missing in OSPF DB".format(tc_name)
+
+    step("Reconfigure the route map with denying configure summary address.")
+
+    routemaps = {
+        "r0": {
+            "route_maps": {
+                "rmap_ipv4": [
+                    {
+                        "action": "permit",
+                        "match": {"ipv4": {"prefix_lists": "pf_list_1_ipv4"}},
+                        "seq_id": 10,
+                    }
+                ]
+            }
+        }
+    }
+    result = create_route_maps(tgen, routemaps)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    # Create ip prefix list
+    pfx_list = {
+        "r0": {
+            "prefix_lists": {
+                "ipv4": {
+                    "pf_list_1_ipv4": [
+                        {"seqid": 10, "network": SUMMARY["ipv4"][0], "action": "deny"}
+                    ]
+                }
+            }
+        }
+    }
+    result = create_prefix_lists(tgen, pfx_list)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    step("Verify that advertised summary route is not flushed from neighbor.")
+    dut = "r1"
+
+    result = verify_ospf_rib(tgen, dut, input_dict_summary)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    result = verify_rib(tgen, "ipv4", dut, input_dict_summary, protocol=protocol)
+    assert (
+        result is True
+    ), "Testcase {} : Failed" "Error: Routes is missing in RIB".format(tc_name)
+
+    step("Redistribute static/connected routes without route map.")
+
+    routemaps = {
+        "r0": {
+            "route_maps": {
+                "rmap_ipv4": [
+                    {
+                        "action": "permit",
+                        "match": {"ipv4": {"prefix_lists": "pf_list_1_ipv4"}},
+                        "seq_id": 10,
+                        "delete": True,
+                    }
+                ]
+            }
+        }
+    }
+    result = create_route_maps(tgen, routemaps)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    step(
+        "Verify that external routes are summarised to configured"
+        "summary address on R0 and only one route is sent to R1. Verify that "
+        "show ip ospf summary should show the configure summaries."
+    )
+
+    input_dict_summary = {"r0": {"static_routes": [{"network": SUMMARY["ipv4"][0]}]}}
+    dut = "r1"
+
+    result = verify_ospf_rib(tgen, dut, input_dict_summary)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    result = verify_rib(tgen, "ipv4", dut, input_dict_summary, protocol=protocol)
+    assert (
+        result is True
+    ), "Testcase {} : Failed" "Error: Routes is missing in RIB".format(tc_name)
+
+    input_dict = {
+        SUMMARY["ipv4"][0]: {
+            "Summary address": SUMMARY["ipv4"][0],
+            "Metric-type": "E2",
+            "Metric": 20,
+            "Tag": 0,
+            "External route count": 5,
+        }
+    }
+    dut = "r0"
+    result = verify_ospf_summary(tgen, topo, dut, input_dict)
+    assert (
+        result is True
+    ), "Testcase {} : Failed" "Error: Summary missing in OSPF DB".format(tc_name)
+
+    step(
+        "Configure rule to deny all the routes in route map and configure"
+        " redistribute command in ospf using route map."
+    )
+
+    # Create ip prefix list
+    pfx_list = {
+        "r0": {
+            "prefix_lists": {
+                "ipv4": {
+                    "pf_list_1_ipv4": [
+                        {"seqid": 10, "network": "any", "action": "deny"}
+                    ]
+                }
+            }
+        }
+    }
+    result = create_prefix_lists(tgen, pfx_list)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    routemaps = {
+        "r0": {
+            "route_maps": {
+                "rmap_ipv4": [
+                    {
+                        "action": "permit",
+                        "match": {"ipv4": {"prefix_lists": "pf_list_1_ipv4"}},
+                        "seq_id": 10,
+                    }
+                ]
+            }
+        }
+    }
+    result = create_route_maps(tgen, routemaps)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    ospf_red_r1 = {
+        "r0": {
+            "ospf": {
+                "redistribute": [{"redist_type": "static", "route_map": "rmap_ipv4"}]
+            }
+        }
+    }
+    result = create_router_ospf(tgen, topo, ospf_red_r1)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    step("Verify that no summary route is originated.")
+    dut = "r1"
+    result = verify_ospf_rib(tgen, dut, input_dict_summary, expected=False)
+    assert (
+        result is not True
+    ), "Testcase {} : Failed \n Error: " "Routes still present in OSPF RIB {}".format(
+        tc_name, result
+    )
+
+    result = verify_rib(
+        tgen, "ipv4", dut, input_dict_summary, protocol=protocol, expected=False
+    )
+    assert (
+        result is not True
+    ), "Testcase {} : Failed" "Error: Routes still present in RIB".format(tc_name)
+
+    routemaps = {
+        "r0": {
+            "route_maps": {
+                "rmap_ipv4": [
+                    {
+                        "action": "permit",
+                        "match": {"ipv4": {"prefix_lists": "pf_list_1_ipv4"}},
+                        "seq_id": 10,
+                        "delete": True,
+                    }
+                ]
+            }
+        }
+    }
+    result = create_route_maps(tgen, routemaps)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    step(
+        "Configure cli in this order - 2 static routes, a route map to "
+        "permit those routes, summary address in ospf to match the "
+        "configured static route network, redistribute the static "
+        "routes with route map"
+    )
+
+    input_dict_static_rtes = {
+        "r0": {
+            "static_routes": [{"network": NETWORK2["ipv4"], "next_hop": "blackhole"}]
+        }
+    }
+    result = create_static_routes(tgen, input_dict_static_rtes)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    routemaps = {
+        "r0": {
+            "route_maps": {
+                "rmap_ipv4": [
+                    {
+                        "action": "permit",
+                        "match": {"ipv4": {"prefix_lists": "pf_list_1_ipv4"}},
+                    }
+                ]
+            }
+        }
+    }
+    result = create_route_maps(tgen, routemaps)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    ospf_summ_r1 = {
+        "r0": {
+            "ospf": {
+                "summary-address": [
+                    {"prefix": SUMMARY["ipv4"][1].split("/")[0], "mask": "8"}
+                ]
+            }
+        }
+    }
+    result = create_router_ospf(tgen, topo, ospf_summ_r1)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    # Create ip prefix list
+    pfx_list = {
+        "r0": {
+            "prefix_lists": {
+                "ipv4": {
+                    "pf_list_1_ipv4": [
+                        {"seqid": 10, "network": "any", "action": "permit"}
+                    ]
+                }
+            }
+        }
+    }
+    result = create_prefix_lists(tgen, pfx_list)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    step(
+        "Verify that external routes are summarised to configured summary "
+        "address on R0 after 5 secs of delay timer expiry and only one "
+        "route is sent to R1."
+    )
+    input_dict_summary = {"r0": {"static_routes": [{"network": "12.0.0.0/8"}]}}
+    dut = "r1"
+
+    result = verify_ospf_rib(tgen, dut, input_dict_summary)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    result = verify_rib(tgen, "ipv4", dut, input_dict_summary, protocol=protocol)
+    assert (
+        result is True
+    ), "Testcase {} : Failed" "Error: Routes is missing in RIB".format(tc_name)
+
+    step("Verify that show ip ospf summary should show the summaries.")
+    input_dict = {
+        "12.0.0.0/8": {
+            "Summary address": "12.0.0.0/8",
+            "Metric-type": "E2",
+            "Metric": 20,
+            "Tag": 0,
+            "External route count": 5,
+        }
+    }
+    dut = "r0"
+    result = verify_ospf_summary(tgen, topo, dut, input_dict)
+    assert (
+        result is True
+    ), "Testcase {} : Failed" "Error: Summary missing in OSPF DB".format(tc_name)
+
+    step("Change route map rule for 1 of the routes to deny.")
+    # Create ip prefix list
+    pfx_list = {
+        "r0": {
+            "prefix_lists": {
+                "ipv4": {
+                    "pf_list_1_ipv4": [
+                        {"seqid": 10, "network": NETWORK2["ipv4"][0], "action": "deny"},
+                        {"seqid": 20, "network": "any", "action": "permit"},
+                    ]
+                }
+            }
+        }
+    }
+    result = create_prefix_lists(tgen, pfx_list)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    step(
+        "Verify that originated type 5 summary lsa is not refreshed because"
+        "of the route map events."
+    )
+
+    input_dict_summary = {"r0": {"static_routes": [{"network": "12.0.0.0/8"}]}}
+    dut = "r1"
+
+    result = verify_ospf_rib(tgen, dut, input_dict_summary)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    result = verify_rib(tgen, "ipv4", dut, input_dict_summary, protocol=protocol)
+    assert (
+        result is True
+    ), "Testcase {} : Failed" "Error: Routes is missing in RIB".format(tc_name)
+
+    step("add rule in route map to deny configured summary address.")
+    # Create ip prefix list
+    pfx_list = {
+        "r0": {
+            "prefix_lists": {
+                "ipv4": {
+                    "pf_list_1_ipv4": [
+                        {"seqid": 10, "network": "12.0.0.0/8", "action": "deny"},
+                        {"seqid": 20, "network": "any", "action": "permit"},
+                    ]
+                }
+            }
+        }
+    }
+    result = create_prefix_lists(tgen, pfx_list)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    step(
+        "Verify that summary route is not denied, summary route should be"
+        " originated if matching prefixes are present."
+    )
+
+    input_dict_summary = {"r0": {"static_routes": [{"network": "12.0.0.0/8"}]}}
+    dut = "r1"
+
+    result = verify_ospf_rib(tgen, dut, input_dict_summary)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    result = verify_rib(tgen, "ipv4", dut, input_dict_summary, protocol=protocol)
+    assert (
+        result is True
+    ), "Testcase {} : Failed" "Error: Routes is missing in RIB".format(tc_name)
+
+    write_test_footer(tc_name)
+
+
+def test_ospf_type5_summary_tc51_p2(request):
+    """OSPF CLI Show.
+
+    verify ospf ASBR summary config and show commands behaviours.
+    """
+    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 all the supported OSPF ASBR summary commands on DUT.")
+    ospf_summ_r1 = {
+        "r0": {
+            "ospf": {
+                "summary-address": [
+                    {
+                        "prefix": SUMMARY["ipv4"][0].split("/")[0],
+                        "mask": "8",
+                        "tag": 4294967295,
+                    },
+                    {
+                        "prefix": SUMMARY["ipv4"][0].split("/")[0],
+                        "mask": "16",
+                        "advertise": True,
+                    },
+                    {
+                        "prefix": SUMMARY["ipv4"][0].split("/")[0],
+                        "mask": "24",
+                        "advertise": False,
+                    },
+                    {
+                        "prefix": SUMMARY["ipv4"][0].split("/")[0],
+                        "mask": "24",
+                        "advertise": False,
+                    },
+                ]
+            }
+        }
+    }
+    result = create_router_ospf(tgen, topo, ospf_summ_r1)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    step("Configure and re configure all the commands 10 times in a loop.")
+
+    for itrate in range(0, 10):
+        ospf_summ_r1 = {
+            "r0": {
+                "ospf": {
+                    "summary-address": [
+                        {
+                            "prefix": SUMMARY["ipv4"][0].split("/")[0],
+                            "mask": "8",
+                            "tag": 4294967295,
+                        },
+                        {
+                            "prefix": SUMMARY["ipv4"][0].split("/")[0],
+                            "mask": "16",
+                            "advertise": True,
+                        },
+                        {
+                            "prefix": SUMMARY["ipv4"][0].split("/")[0],
+                            "mask": "24",
+                            "advertise": False,
+                        },
+                        {
+                            "prefix": SUMMARY["ipv4"][0].split("/")[0],
+                            "mask": "24",
+                            "advertise": False,
+                        },
+                    ]
+                }
+            }
+        }
+        result = create_router_ospf(tgen, topo, ospf_summ_r1)
+        assert result is True, "Testcase {} : Failed \n Error: {}".format(
+            tc_name, result
+        )
+
+        ospf_summ_r1 = {
+            "r0": {
+                "ospf": {
+                    "summary-address": [
+                        {
+                            "prefix": SUMMARY["ipv4"][0].split("/")[0],
+                            "mask": "8",
+                            "tag": 4294967295,
+                            "delete": True,
+                        },
+                        {
+                            "prefix": SUMMARY["ipv4"][0].split("/")[0],
+                            "mask": "16",
+                            "advertise": True,
+                            "delete": True,
+                        },
+                        {
+                            "prefix": SUMMARY["ipv4"][0].split("/")[0],
+                            "mask": "24",
+                            "advertise": False,
+                            "delete": True,
+                        },
+                        {
+                            "prefix": SUMMARY["ipv4"][0].split("/")[0],
+                            "mask": "24",
+                            "advertise": False,
+                            "delete": True,
+                        },
+                    ]
+                }
+            }
+        }
+    result = create_router_ospf(tgen, topo, ospf_summ_r1)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    step("Verify the show commands")
+
+    input_dict = {
+        SUMMARY["ipv4"][2]: {
+            "Summary address": SUMMARY["ipv4"][2],
+            "Metric-type": "E2",
+            "Metric": 20,
+            "Tag": 0,
+            "External route count": 0,
+        }
+    }
+    dut = "r0"
+    result = verify_ospf_summary(tgen, topo, dut, input_dict)
+    assert (
+        result is True
+    ), "Testcase {} : Failed" "Error: Summary missing in OSPF DB".format(tc_name)
+
+    write_test_footer(tc_name)
+
+
+def test_ospf_type5_summary_tc49_p2(request):
+    """OSPF summarisation Chaos."""
+    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)
+
+    protocol = "ospf"
+
+    step(
+        "Configure 5 static routes from the same network on R0"
+        "5 static routes from different networks and redistribute in R0"
+    )
+    input_dict_static_rtes = {
+        "r0": {
+            "static_routes": [
+                {"network": NETWORK["ipv4"], "next_hop": "blackhole"},
+                {"network": NETWORK2["ipv4"], "next_hop": "blackhole"},
+            ]
+        }
+    }
+    result = create_static_routes(tgen, input_dict_static_rtes)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    dut = "r0"
+    red_static(dut)
+
+    step("Verify that routes are learnt on R1.")
+    dut = "r1"
+
+    result = verify_ospf_rib(tgen, dut, input_dict_static_rtes)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+    result = verify_rib(tgen, "ipv4", dut, input_dict_static_rtes, protocol=protocol)
+    assert (
+        result is True
+    ), "Testcase {} : Failed" "Error: Routes is missing in RIB".format(tc_name)
+
+    step(
+        "Configure External Route summary in R0 to summarise 5" " routes to one route."
+    )
+
+    ospf_summ_r1 = {
+        "r0": {
+            "ospf": {
+                "summary-address": [
+                    {"prefix": SUMMARY["ipv4"][0].split("/")[0], "mask": "8"}
+                ]
+            }
+        }
+    }
+    result = create_router_ospf(tgen, topo, ospf_summ_r1)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    step(
+        "Verify that external routes are summarised to configured summary "
+        "address on R0 after 5 secs of delay timer expiry and only one "
+        "route is sent to R1."
+    )
+    input_dict_summary = {"r0": {"static_routes": [{"network": SUMMARY["ipv4"][0]}]}}
+    dut = "r1"
+
+    result = verify_ospf_rib(tgen, dut, input_dict_summary)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    result = verify_rib(tgen, "ipv4", dut, input_dict_summary, protocol=protocol)
+    assert (
+        result is True
+    ), "Testcase {} : Failed" "Error: Routes is missing in RIB".format(tc_name)
+
+    step("Verify that show ip ospf summary should show the summaries.")
+    input_dict = {
+        SUMMARY["ipv4"][0]: {
+            "Summary address": SUMMARY["ipv4"][0],
+            "Metric-type": "E2",
+            "Metric": 20,
+            "Tag": 0,
+            "External route count": 5,
+        }
+    }
+    dut = "r0"
+    result = verify_ospf_summary(tgen, topo, dut, input_dict)
+    assert (
+        result is True
+    ), "Testcase {} : Failed" "Error: Summary missing in OSPF DB".format(tc_name)
+
+    step("Verify that originally advertised routes are withdraw from there" " peer.")
+    input_dict = {
+        "r0": {"static_routes": [{"network": NETWORK["ipv4"], "next_hop": "blackhole"}]}
+    }
+    dut = "r1"
+    result = verify_ospf_rib(tgen, dut, input_dict, expected=False)
+    assert (
+        result is not True
+    ), "Testcase {} : Failed \n Error: " "Routes still present in OSPF RIB {}".format(
+        tc_name, result
+    )
+
+    result = verify_rib(
+        tgen, "ipv4", dut, input_dict, protocol=protocol, expected=False
+    )
+    assert (
+        result is not True
+    ), "Testcase {} : Failed" "Error: Routes still present in RIB".format(tc_name)
+
+    step("Reload the FRR router")
+    # stop/start -> restart FRR router and verify
+    stop_router(tgen, "r0")
+    start_router(tgen, "r0")
+
+    step(
+        "Verify that external routes are summarised to configured summary "
+        "address on R0 after 5 secs of delay timer expiry and only one "
+        "route is sent to R1."
+    )
+    input_dict_summary = {"r0": {"static_routes": [{"network": SUMMARY["ipv4"][0]}]}}
+    dut = "r1"
+
+    result = verify_ospf_rib(tgen, dut, input_dict_summary)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    result = verify_rib(tgen, "ipv4", dut, input_dict_summary, protocol=protocol)
+    assert (
+        result is True
+    ), "Testcase {} : Failed" "Error: Routes is missing in RIB".format(tc_name)
+
+    step("Verify that show ip ospf summary should show the summaries.")
+    input_dict = {
+        SUMMARY["ipv4"][0]: {
+            "Summary address": SUMMARY["ipv4"][0],
+            "Metric-type": "E2",
+            "Metric": 20,
+            "Tag": 0,
+            "External route count": 5,
+        }
+    }
+    dut = "r0"
+    result = verify_ospf_summary(tgen, topo, dut, input_dict)
+    assert (
+        result is True
+    ), "Testcase {} : Failed" "Error: Summary missing in OSPF DB".format(tc_name)
+
+    step("Verify that originally advertised routes are withdraw from there" " peer.")
+    input_dict = {
+        "r0": {"static_routes": [{"network": NETWORK["ipv4"], "next_hop": "blackhole"}]}
+    }
+    dut = "r1"
+    result = verify_ospf_rib(tgen, dut, input_dict, expected=False)
+    assert (
+        result is not True
+    ), "Testcase {} : Failed \n Error: " "Routes still present in OSPF RIB {}".format(
+        tc_name, result
+    )
+
+    result = verify_rib(
+        tgen, "ipv4", dut, input_dict, protocol=protocol, expected=False
+    )
+    assert (
+        result is not True
+    ), "Testcase {} : Failed" "Error: Routes still present in RIB".format(tc_name)
+
+    step("Kill OSPFd daemon on R0.")
+    kill_router_daemons(tgen, "r0", ["ospfd"])
+
+    step("Bring up OSPFd daemon on R0.")
+    start_router_daemons(tgen, "r0", ["ospfd"])
+
+    step("Verify OSPF neighbors are up after bringing back ospfd in R0")
+    # Api call verify whether OSPF is converged
+    ospf_covergence = verify_ospf_neighbor(tgen, topo)
+    assert ospf_covergence is True, "setup_module :Failed \n Error:" " {}".format(
+        ospf_covergence
+    )
+
+    step(
+        "Verify that external routes are summarised to configured summary "
+        "address on R0 after 5 secs of delay timer expiry and only one "
+        "route is sent to R1."
+    )
+    input_dict_summary = {"r0": {"static_routes": [{"network": SUMMARY["ipv4"][0]}]}}
+    dut = "r1"
+
+    result = verify_ospf_rib(tgen, dut, input_dict_summary)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    result = verify_rib(tgen, "ipv4", dut, input_dict_summary, protocol=protocol)
+    assert (
+        result is True
+    ), "Testcase {} : Failed" "Error: Routes is missing in RIB".format(tc_name)
+
+    step("Verify that show ip ospf summary should show the summaries.")
+    input_dict = {
+        SUMMARY["ipv4"][0]: {
+            "Summary address": SUMMARY["ipv4"][0],
+            "Metric-type": "E2",
+            "Metric": 20,
+            "Tag": 0,
+            "External route count": 5,
+        }
+    }
+    dut = "r0"
+    result = verify_ospf_summary(tgen, topo, dut, input_dict)
+    assert (
+        result is True
+    ), "Testcase {} : Failed" "Error: Summary missing in OSPF DB".format(tc_name)
+
+    step("Verify that originally advertised routes are withdraw from there" " peer.")
+    input_dict = {
+        "r0": {"static_routes": [{"network": NETWORK["ipv4"], "next_hop": "blackhole"}]}
+    }
+    dut = "r1"
+    result = verify_ospf_rib(tgen, dut, input_dict, expected=False)
+    assert (
+        result is not True
+    ), "Testcase {} : Failed \n Error: " "Routes still present in OSPF RIB {}".format(
+        tc_name, result
+    )
+
+    result = verify_rib(
+        tgen, "ipv4", dut, input_dict, protocol=protocol, expected=False
+    )
+    assert (
+        result is not True
+    ), "Testcase {} : Failed" "Error: Routes still present in RIB".format(tc_name)
+
+    step("restart zebrad")
+    kill_router_daemons(tgen, "r0", ["zebra"])
+
+    step("Bring up zebra daemon on R0.")
+    start_router_daemons(tgen, "r0", ["zebra"])
+
+    step(
+        "Verify that external routes are summarised to configured summary "
+        "address on R0 after 5 secs of delay timer expiry and only one "
+        "route is sent to R1."
+    )
+    input_dict_summary = {"r0": {"static_routes": [{"network": SUMMARY["ipv4"][0]}]}}
+    dut = "r1"
+
+    result = verify_ospf_rib(tgen, dut, input_dict_summary)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    result = verify_rib(tgen, "ipv4", dut, input_dict_summary, protocol=protocol)
+    assert (
+        result is True
+    ), "Testcase {} : Failed" "Error: Routes is missing in RIB".format(tc_name)
+
+    step("Verify that show ip ospf summary should show the summaries.")
+    input_dict = {
+        SUMMARY["ipv4"][0]: {
+            "Summary address": SUMMARY["ipv4"][0],
+            "Metric-type": "E2",
+            "Metric": 20,
+            "Tag": 0,
+            "External route count": 5,
+        }
+    }
+    dut = "r0"
+    result = verify_ospf_summary(tgen, topo, dut, input_dict)
+    assert (
+        result is True
+    ), "Testcase {} : Failed" "Error: Summary missing in OSPF DB".format(tc_name)
+
+    step("Verify that originally advertised routes are withdraw from there" " peer.")
+    input_dict = {
+        "r0": {"static_routes": [{"network": NETWORK["ipv4"], "next_hop": "blackhole"}]}
+    }
+    dut = "r1"
+    result = verify_ospf_rib(tgen, dut, input_dict, expected=False)
+    assert (
+        result is not True
+    ), "Testcase {} : Failed \n Error: " "Routes still present in OSPF RIB {}".format(
+        tc_name, result
+    )
+
+    result = verify_rib(
+        tgen, "ipv4", dut, input_dict, protocol=protocol, expected=False
+    )
+    assert (
+        result is not True
+    ), "Testcase {} : Failed" "Error: Routes still present in RIB".format(tc_name)
+
+    write_test_footer(tc_name)
+
+
 if __name__ == "__main__":
     args = ["-s"] + sys.argv[1:]
     sys.exit(pytest.main(args))
diff --git a/tests/topotests/ospf_basic_functionality/test_ospf_asbr_summary_type7_lsa.py b/tests/topotests/ospf_basic_functionality/test_ospf_asbr_summary_type7_lsa.py
new file mode 100644 (file)
index 0000000..393eb19
--- /dev/null
@@ -0,0 +1,439 @@
+#!/usr/bin/python
+
+#
+# Copyright (c) 2020 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 Summarisation Functionality Automation."""
+import os
+import sys
+import time
+import pytest
+import 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, "../"))
+sys.path.append(os.path.join(CWD, "../lib/"))
+
+# pylint: disable=C0413
+# Import topogen and topotest helpers
+from mininet.topo import Topo
+from lib.topogen import Topogen, get_topogen
+import ipaddress
+from time import sleep
+
+# Import topoJson from lib, to create topology and initial configuration
+from lib.common_config import (
+    start_topology,
+    write_test_header,
+    kill_router_daemons,
+    write_test_footer,
+    reset_config_on_routers,
+    stop_router,
+    start_router,
+    verify_rib,
+    create_static_routes,
+    step,
+    start_router_daemons,
+    create_route_maps,
+    shutdown_bringup_interface,
+    topo_daemons,
+    create_prefix_lists,
+    create_route_maps,
+    create_interfaces_cfg,
+)
+from lib.topolog import logger
+from lib.topojson import build_topo_from_json, build_config_from_json
+from lib.ospf import (
+    verify_ospf_neighbor,
+    clear_ospf,
+    verify_ospf_rib,
+    create_router_ospf,
+    verify_ospf_summary,
+)
+
+# Global variables
+topo = None
+# Reading the data from JSON File for topology creation
+jsonFile = "{}/ospf_asbr_summary_type7_lsa.json".format(CWD)
+try:
+    with open(jsonFile, "r") as topoJson:
+        topo = json.load(topoJson)
+except IOError:
+    assert False, "Could not read file {}".format(jsonFile)
+
+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",
+    ]
+}
+NETWORK2 = {
+    "ipv4": [
+        "12.0.20.1/32",
+        "12.0.20.2/32",
+        "12.0.20.3/32",
+        "12.0.20.4/32",
+        "12.0.20.5/32",
+    ]
+}
+NETWORK3 = {
+    "ipv4": [
+        "13.0.20.1/32",
+        "13.0.20.2/32",
+        "13.0.20.3/32",
+        "13.0.20.4/32",
+        "13.0.20.5/32",
+    ]
+}
+SUMMARY = {"ipv4": ["11.0.20.1/8", "12.0.0.0/8", "13.0.0.0/8", "11.0.0.0/8"]}
+"""
+TOPOOLOGY =
+      Please view in a fixed-width font such as Courier.
+      +---+  A1       +---+
+      +R1 +------------+R2 |
+      +-+-+-           +--++
+        |  --        --  |
+        |    -- A0 --    |
+      A0|      ----      |
+        |      ----      | A2
+        |    --    --    |
+        |  --        --  |
+      +-+-+-            +-+-+
+      +R0 +-------------+R3 |
+      +---+     A3     +---+
+
+
+
+TESTCASES =
+1. OSPF summarisation with type7 LSAs.
+
+"""
+
+
+class CreateTopo(Topo):
+    """
+    Test topology builder.
+
+    * `Topo`: Topology object
+    """
+
+    def build(self, *_args, **_opts):
+        """Build function."""
+        tgen = get_topogen(self)
+
+        # Building topology from json file
+        build_topo_from_json(tgen, topo)
+
+
+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...
+    tgen = Topogen(CreateTopo, mod.__name__)
+    # ... 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_ospf_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(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
+    tgen.stop_topology()
+
+    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: {"ospf": {"redistribute": [{"redist_type": "static"}]}}}
+    else:
+        ospf_red = {
+            dut: {"ospf": {"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: {"ospf": {"redistribute": [{"redist_type": "connected"}]}}}
+    else:
+        ospf_red = {
+            dut: {
+                "ospf": {
+                    "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_ospf_type5_summary_tc44_p0(request):
+    """OSPF summarisation with type7 LSAs"""
+
+    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)
+
+    step("Bring up the base config as per the topology")
+    step("Configure area 1 as NSSA Area")
+
+    reset_config_on_routers(tgen)
+
+    dut = "r0"
+    protocol = "ospf"
+
+    red_static(dut)
+    input_dict_static_rtes = {
+        "r0": {
+            "static_routes": [
+                {"network": NETWORK["ipv4"], "next_hop": "blackhole"},
+                {"network": NETWORK2["ipv4"], "next_hop": "blackhole"},
+            ]
+        }
+    }
+    result = create_static_routes(tgen, input_dict_static_rtes)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    step("Verify that routes are learnt on R1.")
+    dut = "r1"
+
+    result = verify_ospf_rib(tgen, dut, input_dict_static_rtes)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+    result = verify_rib(tgen, "ipv4", dut, input_dict_static_rtes, protocol=protocol)
+    assert (
+        result is True
+    ), "Testcase {} : Failed" "Error: Routes is missing in RIB".format(tc_name)
+
+    step(
+        "Configure External Route summary in R0 to summarise 5" " routes to one route."
+    )
+
+    ospf_summ_r0 = {
+        "r0": {
+            "ospf": {
+                "summary-address": [
+                    {"prefix": SUMMARY["ipv4"][0].split("/")[0], "mask": "8"}
+                ]
+            }
+        }
+    }
+    result = create_router_ospf(tgen, topo, ospf_summ_r0)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    step(
+        "Verify that external routes are summarised to configured summary "
+        "address on R0 after 5 secs of delay timer expiry and only one "
+        "route is sent to R1."
+    )
+
+    step(
+        "Configure summary & redistribute static/connected route with " "metric type 2"
+    )
+
+    input_dict_summary = {"r0": {"static_routes": [{"network": SUMMARY["ipv4"][3]}]}}
+    dut = "r1"
+
+    result = verify_ospf_rib(tgen, dut, input_dict_summary)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    result = verify_rib(tgen, "ipv4", dut, input_dict_summary, protocol=protocol)
+    assert (
+        result is True
+    ), "Testcase {} : Failed" "Error: Routes is missing in RIB".format(tc_name)
+
+    step("Verify that show ip ospf summary should show the summaries.")
+    input_dict = {
+        SUMMARY["ipv4"][3]: {
+            "Summary address": SUMMARY["ipv4"][3],
+            "Metric-type": "E2",
+            "Metric": 20,
+            "Tag": 0,
+            "External route count": 5,
+        }
+    }
+    dut = "r0"
+    result = verify_ospf_summary(tgen, topo, dut, input_dict)
+    assert (
+        result is True
+    ), "Testcase {} : Failed" "Error: Summary missing in OSPF DB".format(tc_name)
+
+    step("Learn type 7 lsa from neighbours")
+
+    dut = "r1"
+    protocol = "ospf"
+
+    red_static(dut)
+    input_dict_static_rtes = {
+        "r1": {
+            "static_routes": [{"network": NETWORK3["ipv4"], "next_hop": "blackhole"}]
+        }
+    }
+    result = create_static_routes(tgen, input_dict_static_rtes)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    step("Verify that routes are learnt on R0.")
+    dut = "r0"
+
+    result = verify_ospf_rib(tgen, dut, input_dict_static_rtes)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+    result = verify_rib(tgen, "ipv4", dut, input_dict_static_rtes, protocol=protocol)
+    assert (
+        result is True
+    ), "Testcase {} : Failed" "Error: Routes is missing in RIB".format(tc_name)
+
+    ospf_summ_r0 = {
+        "r0": {
+            "ospf": {
+                "summary-address": [
+                    {"prefix": SUMMARY["ipv4"][2].split("/")[0], "mask": "8"}
+                ]
+            }
+        }
+    }
+    result = create_router_ospf(tgen, topo, ospf_summ_r0)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    step("Verify that type7 LSAs received from neighbor are not summarised.")
+    input_dict = {
+        "13.0.0.0/8": {
+            "Summary address": "13.0.0.0/8",
+            "Metric-type": "E2",
+            "Metric": 20,
+            "Tag": 0,
+            "External route count": 0,
+        }
+    }
+    dut = "r0"
+    result = verify_ospf_summary(tgen, topo, dut, input_dict)
+    assert (
+        result is True
+    ), "Testcase {} : Failed" "Error: Summary missing in OSPF DB".format(tc_name)
+
+    step("Verify that already originated summary is intact.")
+    input_dict = {
+        SUMMARY["ipv4"][3]: {
+            "Summary address": SUMMARY["ipv4"][3],
+            "Metric-type": "E2",
+            "Metric": 20,
+            "Tag": 0,
+            "External route count": 5,
+        }
+    }
+    dut = "r0"
+    result = verify_ospf_summary(tgen, topo, dut, input_dict)
+    assert (
+        result is True
+    ), "Testcase {} : Failed" "Error: Summary missing in OSPF DB".format(tc_name)
+
+    dut = "r1"
+    aggr_timer = {"r1": {"ospf": {"aggr_timer": 6}}}
+    result = create_router_ospf(tgen, topo, aggr_timer)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+    ospf_summ_r0 = {
+        "r0": {
+            "ospf": {
+                "summary-address": [
+                    {"prefix": SUMMARY["ipv4"][2].split("/")[0], "mask": "8"}
+                ]
+            }
+        }
+    }
+    result = create_router_ospf(tgen, topo, ospf_summ_r0)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    step(
+        "wait for 6+1 seconds as ospf aggregation start after 6 secs as "
+        "per the above aggr_timer command"
+    )
+    sleep(7)
+    dut = "r1"
+    aggr_timer = {"r1": {"ospf": {"del_aggr_timer": 6}}}
+    result = create_router_ospf(tgen, topo, aggr_timer)
+    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))