]> git.puffer.fish Git - mirror/frr.git/commitdiff
tests: adding ospf basic 2 testcases. 8133/head
authornguggarigoud <nguggarigoud@vmware.com>
Tue, 23 Feb 2021 05:04:28 +0000 (10:34 +0530)
committernguggarigoud <nguggarigoud@vmware.com>
Tue, 18 May 2021 02:23:15 +0000 (19:23 -0700)
Test cases included are 1 ospf cost, 1 ospf mtu.

Signed-off-by: nguggarigoud <nguggarigoud@vmware.com>
tests/topotests/lib/common_config.py
tests/topotests/lib/ospf.py
tests/topotests/ospf_basic_functionality/test_ospf_rte_calc.py
tests/topotests/ospf_basic_functionality/test_ospf_single_area.py

index ba6004861eeb23c7b74b56baeeef5d9e2cf091de..5a904423c270932950535bc3df79a5b1f296ba8f 100644 (file)
@@ -1788,6 +1788,7 @@ def create_interfaces_cfg(tgen, topo, build=False):
                     "network",
                     "priority",
                     "cost",
+                    "mtu_ignore"
                 ]
                 if "ospf" in data:
                     interface_data += _create_interfaces_ospf_cfg(
index 04a12d0eecf9c98dc891ed85e12dcb91a93bca43..7ad64de4a1ec32a1c3f6e66791f37b80167d56f6 100644 (file)
@@ -352,6 +352,7 @@ def config_ospf_interface(tgen, topo, input_dict=None, build=False, load_config=
             data_ospf_auth = ospf_data.setdefault("authentication", None)
             data_ospf_dr_priority = ospf_data.setdefault("priority", None)
             data_ospf_cost = ospf_data.setdefault("cost", None)
+            data_ospf_mtu = ospf_data.setdefault("mtu_ignore", None)
 
             try:
                 intf = topo["routers"][router]["links"][lnk]["interface"]
@@ -400,19 +401,26 @@ def config_ospf_interface(tgen, topo, input_dict=None, build=False, load_config=
                     config_data.append(cmd)
 
             # interface ospf dr priority
-            if data_ospf_dr_priority in ospf_data:
+            if data_ospf_dr_priority:
                 cmd = "ip ospf priority {}".format(ospf_data["priority"])
                 if "del_action" in ospf_data:
                     cmd = "no {}".format(cmd)
                 config_data.append(cmd)
 
             # interface ospf cost
-            if data_ospf_cost in ospf_data:
+            if data_ospf_cost:
                 cmd = "ip ospf cost {}".format(ospf_data["cost"])
                 if "del_action" in ospf_data:
                     cmd = "no {}".format(cmd)
                 config_data.append(cmd)
 
+            # interface ospf mtu
+            if data_ospf_mtu:
+                cmd = "ip ospf mtu-ignore"
+                if 'del_action' in ospf_data:
+                    cmd = "no {}".format(cmd)
+                config_data.append(cmd)
+
             if build:
                 return config_data
             else:
index 1432a82b129a58425d575ac3ec595d8fedda0213..9dfde325f6795cf4b4788178818f267da5f0e19a 100644 (file)
@@ -62,6 +62,8 @@ from lib.ospf import (
     verify_ospf_rib,
     create_router_ospf,
     redistribute_ospf,
+    config_ospf_interface,
+    verify_ospf_interface,
 )
 
 # Global variables
@@ -576,6 +578,89 @@ def test_ospf_redistribution_tc8_p1(request):
     write_test_footer(tc_name)
 
 
+def test_ospf_cost_tc52_p0(request):
+    """OSPF Cost - verifying ospf interface cost functionality"""
+    tc_name = request.node.name
+    write_test_header(tc_name)
+    tgen = get_topogen()
+    global topo
+    step("Bring up the base config.")
+    reset_config_on_routers(tgen)
+
+    step(
+        "Configure ospf cost as 20 on interface between R0 and R1. "
+        "Configure ospf cost as 30 between interface between R0 and R2."
+    )
+
+    r0_ospf_cost = {
+        "r0": {"links": {"r1": {"ospf": {"cost": 20}}, "r2": {"ospf": {"cost": 30}}}}
+    }
+    result = config_ospf_interface(tgen, topo, r0_ospf_cost)
+    assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
+
+    step(
+        "Verify that cost is updated in the ospf interface between"
+        " r0 and r1 as 30 and r0 and r2 as 20"
+    )
+    dut = "r0"
+    result = verify_ospf_interface(tgen, topo, dut=dut, input_dict=r0_ospf_cost)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    step(
+        "Swap the costs between interfaces on r0, between r0 and r1 to 30"
+        ", r0 and r2 to 20"
+    )
+
+    r0_ospf_cost = {
+        "r0": {"links": {"r1": {"ospf": {"cost": 30}}, "r2": {"ospf": {"cost": 20}}}}
+    }
+    result = config_ospf_interface(tgen, topo, r0_ospf_cost)
+    assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
+
+    step(
+        "Verify that cost is updated in the ospf interface between r0 "
+        "and r1 as 30 and r0 and r2 as 20."
+    )
+    result = verify_ospf_interface(tgen, topo, dut=dut, input_dict=r0_ospf_cost)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    step(" Un configure cost from the interface r0 - r1.")
+
+    r0_ospf_cost = {"r0": {"links": {"r1": {"ospf": {"cost": 30, "del_action": True}}}}}
+    result = config_ospf_interface(tgen, topo, r0_ospf_cost)
+    assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
+
+    input_dict = {
+        "r0": {"links": {"r1": {"ospf": {"cost": 10}}, "r2": {"ospf": {"cost": 20}}}}
+    }
+    step(
+        "Verify that cost is updated in the ospf interface between r0"
+        " and r1 as 10 and r0 and r2 as 20."
+    )
+
+    result = verify_ospf_interface(tgen, topo, dut=dut, input_dict=input_dict)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    step(" Un configure cost from the interface r0 - r2.")
+
+    r0_ospf_cost = {"r0": {"links": {"r2": {"ospf": {"cost": 20, "del_action": True}}}}}
+    result = config_ospf_interface(tgen, topo, r0_ospf_cost)
+    assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
+
+    step(
+        "Verify that cost is updated in the ospf interface between r0"
+        "and r1 as 10 and r0 and r2 as 10"
+    )
+
+    input_dict = {
+        "r0": {"links": {"r1": {"ospf": {"cost": 10}}, "r2": {"ospf": {"cost": 10}}}}
+    }
+    result = verify_ospf_interface(tgen, topo, dut=dut, input_dict=input_dict)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    write_test_footer(tc_name)
+
+
 if __name__ == "__main__":
     args = ["-s"] + sys.argv[1:]
     sys.exit(pytest.main(args))
index 6f6b119abcbabdf2b95d8a06b8ca58e941992b5e..e94680d974219c56bcd1741caf9118aaf51e74af 100644 (file)
@@ -101,6 +101,7 @@ TESTCASES =
 2. OSPF Timers - Verify OSPF interface timer hello interval functionality
 3. OSPF Timers - Verify OSPF interface timer dead interval functionality
 4. Verify ospf show commands with json output.
+5. Verify NFSM events when ospf nbr changes with different MTU values.
  """
 
 
@@ -976,6 +977,153 @@ def test_ospf_dead_tc11_p0(request):
     write_test_footer(tc_name)
 
 
+def test_ospf_tc4_mtu_ignore_p0(request):
+    """
+    OSPF NFSM - MTU change
+
+    Verify NFSM events when ospf nbr changes with different MTU values
+    """
+    tc_name = request.node.name
+    write_test_header(tc_name)
+    tgen = get_topogen()
+
+    # Don't run this test if we have any failure.
+    if tgen.routers_have_failure():
+        pytest.skip(tgen.errors)
+
+    global topo
+    step(" Bring up the base config as per the topology")
+    step("Configure OSPF on all the routers of the topology.")
+    step("Verify that OSPF neighbors are FULL.")
+    reset_config_on_routers(tgen)
+    result = verify_ospf_neighbor(tgen, topo)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    step(
+        "Modify the MTU to non default Value on R0 to R1 interface. "
+        "Reset ospf neighbors on R0."
+    )
+
+    rtr0 = tgen.routers()["r0"]
+    rtr1 = tgen.routers()["r1"]
+
+    r0_r1_intf = topo["routers"]["r0"]["links"]["r1"]["interface"]
+    r1_r0_intf = topo["routers"]["r1"]["links"]["r0"]["interface"]
+
+    rtr0.run("ifconfig {} mtu 1200".format(r0_r1_intf))
+
+    clear_ospf(tgen, "r0")
+
+    step(
+        "Verify that OSPF neighborship between R0 and R1 is stuck in Exstart" " State."
+    )
+    result = verify_ospf_neighbor(tgen, topo, expected=False)
+    assert result is not True, (
+        "Testcase {} : Failed \n OSPF nbrs are Full "
+        "instead of Exstart. Error: {}".format(tc_name, result)
+    )
+
+    step(
+        "Verify that configured MTU value is updated in the show ip " "ospf interface."
+    )
+
+    dut = "r0"
+    input_dict = {"r0": {"links": {"r1": {"ospf": {"mtuBytes": 1200}}}}}
+    result = verify_ospf_interface(tgen, topo, dut=dut, input_dict=input_dict)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    step(
+        "Modify the MTU to non default Value on R0 to R1 interface. "
+        "Reset ospf neighbors on R0."
+    )
+    rtr0.run("ifconfig {} mtu 1500".format(r0_r1_intf))
+
+    clear_ospf(tgen, "r0")
+
+    step("Verify that OSPF neighborship between R0 and R1 becomes full.")
+    result = verify_ospf_neighbor(tgen, topo)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    step(
+        "Configure mtu ignore and change the value of the mtu to non default"
+        " on R0 to R1 interface. Reset ospf neighbors on R0."
+    )
+    r0_ospf_mtu = {"r0": {"links": {"r1": {"ospf": {"mtu_ignore": True}}}}}
+    result = config_ospf_interface(tgen, topo, r0_ospf_mtu)
+    assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
+
+    dut = "r0"
+    input_dict = {"r0": {"links": {"r1": {"ospf": {"mtuMismatchDetect": True}}}}}
+    result = verify_ospf_interface(tgen, topo, dut=dut, input_dict=input_dict)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    r1_ospf_mtu = {"r1": {"links": {"r0": {"ospf": {"mtu_ignore": True}}}}}
+    result = config_ospf_interface(tgen, topo, r1_ospf_mtu)
+    assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
+
+    rtr0.run("ifconfig {} mtu 1200".format(r0_r1_intf))
+
+    clear_ospf(tgen, "r0")
+
+    step("Verify that OSPF neighborship between R0 and R1 becomes full.")
+    result = verify_ospf_neighbor(tgen, topo)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    step(
+        "Unconfigure mtu-ignore command from the interface. "
+        "Reset ospf neighbors on R0."
+    )
+
+    r1_ospf_mtu = {
+        "r1": {"links": {"r0": {"ospf": {"mtu_ignore": True, "delete": True}}}}
+    }
+    result = config_ospf_interface(tgen, topo, r1_ospf_mtu)
+    assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
+
+    clear_ospf(tgen, "r0")
+
+    step(
+        "Verify that OSPF neighborship between R0 and R1 is stuck in Exstart" " State."
+    )
+    result = verify_ospf_neighbor(tgen, topo, expected=False)
+    assert result is not True, (
+        "Testcase {} : Failed \n OSPF nbrs are Full "
+        "instead of Exstart. Error: {}".format(tc_name, result)
+    )
+
+    step("Modify the MTU to again default valaue on R0 to R1 interface.")
+
+    rtr0.run("ifconfig {} mtu 1500".format(r0_r1_intf))
+
+    clear_ospf(tgen, "r0")
+
+    step("Verify that OSPF neighborship between R0 and R1 becomes full.")
+    result = verify_ospf_neighbor(tgen, topo)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    step(
+        "Configure ospf interface with jumbo MTU (9216)." "Reset ospf neighbors on R0."
+    )
+
+    rtr0.run("ifconfig {} mtu 9216".format(r0_r1_intf))
+    rtr1.run("ifconfig {} mtu 9216".format(r1_r0_intf))
+
+    clear_ospf(tgen, "r0")
+    clear_ospf(tgen, "r1")
+
+    step("Verify that OSPF neighborship between R0 and R1 becomes full.")
+    result = verify_ospf_neighbor(tgen, topo)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    step("Verify that jumbo MTU is updated in the show ip ospf interface.")
+    dut = "r0"
+    input_dict = {"r0": {"links": {"r1": {"ospf": {"mtuBytes": 9216}}}}}
+    result = verify_ospf_interface(tgen, topo, dut=dut, input_dict=input_dict)
+    assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
+
+    write_test_footer(tc_name)
+
+
 if __name__ == "__main__":
     args = ["-s"] + sys.argv[1:]
     sys.exit(pytest.main(args))