def test_portchannel_interface_tc2_add_duplicate(duthost): """ Test adding duplicate portchannel interface """ json_patch = [ { "op": "add", "path": create_path(["PORTCHANNEL_INTERFACE", "PortChannel0001|10.0.0.56/31"]), "value": {} }, { "op": "add", "path": create_path(["PORTCHANNEL_INTERFACE", "PortChannel0001|FC00::71/126"]), "value": {} } ] logger.info("json patch {}".format(json_patch)) tmpfile = generate_tmpfile(duthost) logger.info("tmpfile {}".format(tmpfile)) try: output = apply_patch(duthost, json_data=json_patch, dest_file=tmpfile) expect_op_success(duthost, output) check_show_ip_intf(duthost, "PortChannel0001", ["10.0.0.56/31"], [], is_ipv4=True) check_show_ip_intf(duthost, "PortChannel0001", ["fc00::71/126"], [], is_ipv4=False) finally: delete_tmpfile(duthost, tmpfile)
def test_lo_interface_tc6_vrf_change(duthost): """ Replace lo interface vrf admin@vlab-01:~$ show ip interfaces | grep Loopback0 Loopback0 Vrf_02 10.1.0.32/32 up/up N/A N/A admin@vlab-01:~$ show ipv6 interfaces | grep Loopback0 Loopback0 Vrf_02 fc00:1::32/128 up/up N/A N/A fe80::a8cb:e8ff:fe6e:df6e%Loopback0/64 N/A N/A admin@vlab-01:~$ show ip route vrf Vrf_02 VRF Vrf_02: C>* 10.1.0.32/32 is directly connected, Loopback0, 00:00:17 """ setup_vrf_config(duthost) json_patch = [ { "op": "replace", "path": "/LOOPBACK_INTERFACE/Loopback0/vrf_name", "value": "Vrf_02" } ] tmpfile = generate_tmpfile(duthost) logger.info("tmpfile {}".format(tmpfile)) try: output = apply_patch(duthost, json_data=json_patch, dest_file=tmpfile) expect_op_success(duthost, output) check_show_ip_intf(duthost, "Loopback0", ["10.1.0.32/32", "Vrf_02"], [], is_ipv4=True) check_show_ip_intf(duthost, "Loopback0", ["fc00:1::32/128", "Vrf_02"], [], is_ipv4=False) check_vrf_route_for_intf(duthost, "Vrf_02", "Loopback0", is_ipv4=True) check_vrf_route_for_intf(duthost, "Vrf_02", "Loopback0", is_ipv4=False) finally: delete_tmpfile(duthost, tmpfile)
def test_lo_interface_tc2_add_duplicate(duthost): """ Add v4 and v6 duplicate lo intf to config Note: the Identifier '/' as changed to '~1' Initial Loopback setup in t0 "LOOPBACK_INTERFACE": { "Loopback0": {}, "Loopback0|10.1.0.32/32": {}, "Loopback0|FC00:1::32/128": {} } """ json_patch = [ { "op": "add", "path": "/LOOPBACK_INTERFACE/Loopback0|10.1.0.32~132", "value": {} }, { "op": "add", "path": "/LOOPBACK_INTERFACE/Loopback0|FC00:1::32~1128", "value": {} } ] tmpfile = generate_tmpfile(duthost) logger.info("tmpfile {}".format(tmpfile)) try: output = apply_patch(duthost, json_data=json_patch, dest_file=tmpfile) expect_op_success(duthost, output) check_show_ip_intf(duthost, "Loopback0", ["10.1.0.32/32"], [], is_ipv4=True) check_show_ip_intf(duthost, "Loopback0", ["fc00:1::32/128"], [], is_ipv4=False) finally: delete_tmpfile(duthost, tmpfile)
def test_portchannel_interface_tc1_add_new_portchannel(duthost): """ Clean up original portchannel intf and apply-patch to default config Expected output admin@vlab-01:~$ show ip interfaces Interface Master IPv4 address/mask Admin/Oper BGP Neighbor Neighbor IP --------------- -------- ------------------- ------------ -------------- ------------- ... PortChannel0005 10.0.0.64/31 up/down N/A N/A admin@vlab-01:~$ show ipv6 interfaces Interface Master IPv4 address/mask Admin/Oper BGP Neighbor Neighbor IP --------------- --------------- ------------------------------------------ ------------ -------------- ------------- ... PortChannel0005 fc00::81/126 up/down N/A N/A """ json_patch = [{ "op": "add", "path": "/PORTCHANNEL/PortChannel0005", "value": { "admin_status": "up" } }, { "op": "add", "path": "/PORTCHANNEL_INTERFACE/PortChannel0005", "value": {} }, { "op": "add", "path": create_path(["PORTCHANNEL_INTERFACE", "PortChannel0005|10.0.0.64/31"]), "value": {} }, { "op": "add", "path": create_path(["PORTCHANNEL_INTERFACE", "PortChannel0005|FC00::81/126"]), "value": {} }] logger.info("json patch {}".format(json_patch)) tmpfile = generate_tmpfile(duthost) logger.info("tmpfile {}".format(tmpfile)) try: output = apply_patch(duthost, json_data=json_patch, dest_file=tmpfile) expect_op_success(duthost, output) check_show_ip_intf(duthost, "PortChannel0005", ["10.0.0.64/31"], [], is_ipv4=True) check_show_ip_intf(duthost, "PortChannel0005", ["fc00::81/126"], [], is_ipv4=False) finally: delete_tmpfile(duthost, tmpfile)
def check_portchannel_table(duthost, portchannel_table): """This is to check if portchannel interfaces are the same as t0 initial setup """ for portchannel_name, ips in portchannel_table.items(): check_show_ip_intf(duthost, portchannel_name, [ips['ip']], [], is_ipv4=True) check_show_ip_intf(duthost, portchannel_name, [ips['ipv6']], [], is_ipv4=False)
def test_portchannel_interface_tc3_replace(duthost, portchannel_table): """ Test portchannel interface replace ip address """ org_ip = portchannel_table["PortChannel101"]["ip"] org_ipv6 = portchannel_table["PortChannel101"]["ipv6"] rep_ip = "10.0.0.156/31" rep_ipv6 = "fc00::171/126" json_patch = [{ "op": "remove", "path": create_path( ["PORTCHANNEL_INTERFACE", "PortChannel101|{}".format(org_ip)]) }, { "op": "remove", "path": create_path([ "PORTCHANNEL_INTERFACE", "PortChannel101|{}".format(org_ipv6.upper()) ]) }, { "op": "add", "path": create_path( ["PORTCHANNEL_INTERFACE", "PortChannel101|{}".format(rep_ip)]), "value": {} }, { "op": "add", "path": create_path( ["PORTCHANNEL_INTERFACE", "PortChannel101|{}".format(rep_ipv6)]), "value": {} }] logger.info("json patch {}".format(json_patch)) tmpfile = generate_tmpfile(duthost) logger.info("tmpfile {}".format(tmpfile)) try: output = apply_patch(duthost, json_data=json_patch, dest_file=tmpfile) expect_op_success(duthost, output) check_show_ip_intf(duthost, "PortChannel101", [rep_ip], [org_ip], is_ipv4=True) check_show_ip_intf(duthost, "PortChannel101", [rep_ipv6], [org_ipv6], is_ipv4=False) finally: delete_tmpfile(duthost, tmpfile)
def test_vlan_interface_tc4_replace(duthost): """ Test replace testcase Expected output "VLAN_INTERFACE": { "Vlan1000": {}, "Vlan1000|192.168.0.2/21": {}, "Vlan1000|fc02:1000::2/64": {} } """ json_patch = [{ "op": "remove", "path": create_path(["VLAN_INTERFACE", "Vlan1000|fc02:1000::1/64"]), }, { "op": "remove", "path": create_path(["VLAN_INTERFACE", "Vlan1000|192.168.0.1/21"]), }, { "op": "add", "path": create_path(["VLAN_INTERFACE", "Vlan1000|192.168.0.2/21"]), "value": {} }, { "op": "add", "path": create_path(["VLAN_INTERFACE", "Vlan1000|fc02:1000::2/64"]), "value": {} }] tmpfile = generate_tmpfile(duthost) logger.info("tmpfile {}".format(tmpfile)) try: output = apply_patch(duthost, json_data=json_patch, dest_file=tmpfile) expect_op_success(duthost, output) check_show_ip_intf(duthost, "Vlan1000", ["192.168.0.2/21"], ["192.168.0.1/21"], is_ipv4=True) check_show_ip_intf(duthost, "Vlan1000", ["fc02:1000::2/64"], ["fc02:1000::1/64"], is_ipv4=False) finally: delete_tmpfile(duthost, tmpfile)
def test_lo_interface_tc4_replace(duthost): """ Replace v4 and v6 loopback intf ip Expected output "LOOPBACK_INTERFACE": { "Loopback0": {}, "Loopback0|10.1.0.33/32": {}, "Loopback0|FC00:1::33/128": {} } admin@vlab-01:~$ show ip interfaces | grep Loopback0 Loopback0 10.1.0.33/32 up/up N/A N/A admin@vlab-01:~$ show ipv6 interfaces | grep Loopback0 Loopback0 fc00:1::33/128 up/up N/A N/A fe80::a8cb:e8ff:fe6e:df6e%Loopback0/64 N/A N/A """ json_patch = [ { "op": "remove", "path": "/LOOPBACK_INTERFACE/Loopback0|FC00:1::32~1128" }, { "op": "remove", "path": "/LOOPBACK_INTERFACE/Loopback0|10.1.0.32~132" }, { "op": "add", "path": "/LOOPBACK_INTERFACE/Loopback0|10.1.0.33~132", "value": {} }, { "op": "add", "path": "/LOOPBACK_INTERFACE/Loopback0|FC00:1::33~1128", "value": {} } ] tmpfile = generate_tmpfile(duthost) logger.info("tmpfile {}".format(tmpfile)) try: output = apply_patch(duthost, json_data=json_patch, dest_file=tmpfile) expect_op_success(duthost, output) check_show_ip_intf(duthost, "Loopback0", ["10.1.0.33/32"], ["10.1.0.32/32"], is_ipv4=True) check_show_ip_intf(duthost, "Loopback0", ["fc00:1::33/128"], ["fc00:1::32/128"], is_ipv4=False) finally: delete_tmpfile(duthost, tmpfile)
def test_vlan_interface_tc5_remove(duthost): """ Remove all VLAN intf """ json_patch = [{"op": "remove", "path": "/VLAN_INTERFACE"}] tmpfile = generate_tmpfile(duthost) logger.info("tmpfile {}".format(tmpfile)) try: output = apply_patch(duthost, json_data=json_patch, dest_file=tmpfile) expect_op_success(duthost, output) check_show_ip_intf(duthost, "Vlan1000", [], ["192.168.0.1/21"], is_ipv4=True) check_show_ip_intf(duthost, "Vlan1000", [], ["fc02:1000::1/64"], is_ipv4=False) finally: delete_tmpfile(duthost, tmpfile)
def test_vlan_interface_tc1_add_duplicate(duthost): """ Add duplicate v4 and v6 lo intf to config Sample output "VLAN_INTERFACE": { "Vlan1000": {}, "Vlan1000|192.168.0.1/21": {}, "Vlan1000|fc02:1000::1/64": {} } """ json_patch = [{ "op": "add", "path": create_path(["VLAN_INTERFACE", "Vlan1000|192.168.0.1/21"]), "value": {} }, { "op": "add", "path": create_path(["VLAN_INTERFACE", "Vlan1000|fc02:1000::1/64"]), "value": {} }] logger.info("json patch {}".format(json_patch)) tmpfile = generate_tmpfile(duthost) logger.info("tmpfile {}".format(tmpfile)) try: output = apply_patch(duthost, json_data=json_patch, dest_file=tmpfile) expect_op_success(duthost, output) check_show_ip_intf(duthost, "Vlan1000", ["192.168.0.1/21"], [], is_ipv4=True) check_show_ip_intf(duthost, "Vlan1000", ["fc02:1000::1/64"], [], is_ipv4=False) finally: delete_tmpfile(duthost, tmpfile)
def setup_vrf_config(duthost): """Create two vrf and bind Loopback0 to Vrf_01 admin@vlab-01:~$ show ip interfaces | grep Loopback0 Loopback0 Vrf_01 10.1.0.32/32 up/up N/A N/A admin@vlab-01:~$ show ipv6 interfaces | grep Loopback0 Loopback0 Vrf_01 fc00:1::32/128 up/up N/A N/A fe80::a8cb:e8ff:fe6e:df6e%Loopback0/64 N/A N/A admin@vlab-01:~$ show ip route vrf Vrf_01 VRF Vrf_01: C>* 10.1.0.32/32 is directly connected, Loopback0, 00:00:13 """ cmds = [] cmds.append("config vrf add Vrf_01") cmds.append("config vrf add Vrf_02") output = duthost.shell_cmds(cmds=cmds) json_patch = [ { "op": "add", "path": "/LOOPBACK_INTERFACE/Loopback0/vrf_name", "value": "Vrf_01" } ] tmpfile = generate_tmpfile(duthost) logger.info("tmpfile {}".format(tmpfile)) try: output = apply_patch(duthost, json_data=json_patch, dest_file=tmpfile) expect_op_success(duthost, output) check_show_ip_intf(duthost, "Loopback0", ["10.1.0.32/32", "Vrf_01"], [], is_ipv4=True) check_show_ip_intf(duthost, "Loopback0", ["fc00:1::32/128", "Vrf_01"], [], is_ipv4=False) check_vrf_route_for_intf(duthost, "Vrf_01", "Loopback0", is_ipv4=True) check_vrf_route_for_intf(duthost, "Vrf_01", "Loopback0", is_ipv4=False) finally: delete_tmpfile(duthost, tmpfile)
def test_portchannel_interface_tc4_remove(duthost, portchannel_table): """ Test remove all portchannel intf """ json_patch = [{"op": "remove", "path": "/PORTCHANNEL_INTERFACE"}] tmpfile = generate_tmpfile(duthost) logger.info("tmpfile {}".format(tmpfile)) try: output = apply_patch(duthost, json_data=json_patch, dest_file=tmpfile) expect_op_success(duthost, output) for portchannel_name, ips in portchannel_table.items(): check_show_ip_intf(duthost, portchannel_name, [], [ips['ip']], is_ipv4=True) check_show_ip_intf(duthost, portchannel_name, [], [ips['ipv6']], is_ipv4=False) finally: delete_tmpfile(duthost, tmpfile)
def setup_env(duthosts, rand_one_dut_hostname): """ Setup/teardown fixture for each loopback interface test. rollback to check if it goes back to starting config without vrf set Args: duthosts: list of DUTs. rand_selected_dut: The fixture returns a randomly selected DuT. """ duthost = duthosts[rand_one_dut_hostname] create_checkpoint(duthost) yield try: logger.info("Rolled back to original checkpoint") rollback_or_reload(duthost) check_show_ip_intf(duthost, "Loopback0", ["10.1.0.32/32"], ["Vrf"], is_ipv4=True) check_show_ip_intf(duthost, "Loopback0", ["fc00:1::32/128"], ["Vrf"], is_ipv4=False) finally: delete_checkpoint(duthost)
def test_lo_interface_tc5_remove(duthost): """ Remove v4 and v6 loopback intf config """ json_patch = [ { "op": "remove", "path": "/LOOPBACK_INTERFACE" } ] tmpfile = generate_tmpfile(duthost) logger.info("tmpfile {}".format(tmpfile)) try: output = apply_patch(duthost, json_data=json_patch, dest_file=tmpfile) expect_op_success(duthost, output) check_show_ip_intf(duthost, "Loopback0", [], ["10.1.0.32/32"], is_ipv4=True) check_show_ip_intf(duthost, "Loopback0", [], ["fc00:1::32/128"], is_ipv4=False) finally: delete_tmpfile(duthost, tmpfile)
def test_portchannel_interface_tc2_add_duplicate(duthost, portchannel_table): """ Test adding duplicate portchannel interface """ dup_ip = portchannel_table["PortChannel101"]["ip"] dup_ipv6 = portchannel_table["PortChannel101"]["ipv6"] json_patch = [{ "op": "add", "path": create_path( ["PORTCHANNEL_INTERFACE", "PortChannel101|{}".format(dup_ip)]), "value": {} }, { "op": "add", "path": create_path([ "PORTCHANNEL_INTERFACE", "PortChannel101|{}".format(dup_ipv6.upper()) ]), "value": {} }] logger.info("json patch {}".format(json_patch)) tmpfile = generate_tmpfile(duthost) logger.info("tmpfile {}".format(tmpfile)) try: output = apply_patch(duthost, json_data=json_patch, dest_file=tmpfile) expect_op_success(duthost, output) check_show_ip_intf(duthost, "PortChannel101", [dup_ip], [], is_ipv4=True) check_show_ip_intf(duthost, "PortChannel101", [dup_ipv6], [], is_ipv4=False) finally: delete_tmpfile(duthost, tmpfile)
def cleanup_test_env(duthosts, rand_one_dut_hostname): """ Setup/teardown fixture for VLAN interface config Args: duthosts: list of DUTs. rand_selected_dut: The fixture returns a randomly selected DuT. """ duthost = duthosts[rand_one_dut_hostname] create_checkpoint(duthost) yield try: logger.info("Rolled back to original checkpoint") rollback_or_reload(duthost) check_show_ip_intf(duthost, "Vlan1000", ["192.168.0.1/21"], [], is_ipv4=True) check_show_ip_intf(duthost, "Vlan1000", ["fc02:1000::1/64"], [], is_ipv4=False) finally: delete_checkpoint(duthost)
def test_lo_interface_tc1_add_init(duthost, cfg_facts): """ Clean up orig lo interface and test initial addion of v4 and v6 lo intf Expected output "LOOPBACK_INTERFACE": { "Loopback0": {}, "Loopback0|10.1.0.32/32": {}, "Loopback0|FC00:1::32/128": {} } """ cleanup_lo_interface_config(duthost, cfg_facts) json_patch = [ { "op": "add", "path": "/LOOPBACK_INTERFACE", "value": { "Loopback0": {}, "Loopback0|10.1.0.32/32": {}, "Loopback0|FC00:1::32/128": {} } } ] tmpfile = generate_tmpfile(duthost) logger.info("tmpfile {}".format(tmpfile)) try: output = apply_patch(duthost, json_data=json_patch, dest_file=tmpfile) expect_op_success(duthost, output) check_show_ip_intf(duthost, "Loopback0", ["10.1.0.32/32"], [], is_ipv4=True) check_show_ip_intf(duthost, "Loopback0", ["fc00:1::32/128"], [], is_ipv4=False) finally: delete_tmpfile(duthost, tmpfile)
def test_vlan_interface_tc3_add_new(duthost): """ Add an brand new vlan interface Vlan2000 Sample output: "VLAN": { "Vlan1000": { "dhcp_servers": [ "192.0.0.1", "192.0.0.2", "192.0.0.3", "192.0.0.4" ], "vlanid": "1000" }, "Vlan2000": { "vlanid": "2000" } }, "VLAN_INTERFACE": { "Vlan1000": {}, "Vlan2000": {}, "Vlan1000|192.168.0.1/21": {}, "Vlan1000|fc02:1000::1/64": {}, "Vlan2000|192.168.8.1/21": {}, "Vlan2000|fc02:2000::1/64": {} } admin@vlab-01:~/vlan$ show ip interfaces | grep -w Vlan2000 Vlan2000 192.168.8.1/21 up/up N/A N/A admin@vlab-01:~/vlan$ show ipv6 interfaces | grep -w Vlan2000 Vlan2000 fc02:2000::1/64 up/up N/A N/A fe80::5054:ff:feda:c6af%Vlan2000/64 N/A N/A """ json_patch = [{ "op": "add", "path": "/VLAN_INTERFACE/Vlan2000", "value": {} }, { "op": "add", "path": create_path(["VLAN_INTERFACE", "Vlan2000|192.168.8.1/21"]), "value": {} }, { "op": "add", "path": create_path(["VLAN_INTERFACE", "Vlan2000|fc02:2000::1/64"]), "value": {} }, { "op": "add", "path": "/VLAN/Vlan2000", "value": { "vlanid": "2000" } }] tmpfile = generate_tmpfile(duthost) logger.info("tmpfile {}".format(tmpfile)) try: output = apply_patch(duthost, json_data=json_patch, dest_file=tmpfile) expect_op_success(duthost, output) check_show_ip_intf(duthost, "Vlan2000", ["192.168.8.1/21"], [], is_ipv4=True) check_show_ip_intf(duthost, "Vlan2000", ["fc02:2000::1/64"], [], is_ipv4=False) finally: delete_tmpfile(duthost, tmpfile)