def test_portchannel_interface_tc2_xfail(duthost, op, name, dummy_portchannel_interface_v4, dummy_portchannel_interface_v6): """ Test invalid ip address and remove unexited interface ("add", "PortChannel0001", "10.0.0.256/31", "FC00::71/126"), ADD Invalid IPv4 address ("add", "PortChannel0001", "10.0.0.56/31", "FC00::xyz/126"), ADD Invalid IPv6 address ("remove", "PortChannel0001", "10.0.0.57/31", "FC00::71/126"), REMOVE Unexist IPv4 address ("remove", "PortChannel0001", "10.0.0.56/31", "FC00::72/126"), REMOVE Unexist IPv6 address """ dummy_portchannel_interface_v4 = name + "|" + dummy_portchannel_interface_v4 dummy_portchannel_interface_v6 = name + "|" + dummy_portchannel_interface_v6 json_patch = [ { "op": "{}".format(op), "path": create_path(["PORTCHANNEL_INTERFACE", dummy_portchannel_interface_v4]), "value": {} }, { "op": "{}".format(op), "path": create_path(["PORTCHANNEL_INTERFACE", dummy_portchannel_interface_v6]), "value": {} } ] tmpfile = generate_tmpfile(duthost) logger.info("tmpfile {}".format(tmpfile)) try: output = apply_patch(duthost, json_data=json_patch, dest_file=tmpfile) expect_op_failure(output) finally: delete_tmpfile(duthost, tmpfile)
def test_vlan_interface_tc2_xfail(duthost, op, name, dummy_vlan_interface_v4, dummy_vlan_interface_v6): """ Test expect fail testcase ("add", "Vlan1000", "587.168.0.1/21", "fc02:1000::1/64"), ADD Invalid IPv4 address ("add", "Vlan1000", "192.168.0.1/21", "fc02:1000::xyz/64"), ADD Invalid IPv6 address ("remove", "Vlan1000", "192.168.0.2/21", "fc02:1000::1/64"), REMOVE Unexist IPv4 address ("remove", "Vlan1000", "192.168.0.1/21", "fc02:1000::2/64") REMOVE Unexist IPv6 address """ dummy_vlan_interface_v4 = name + "|" + dummy_vlan_interface_v4 dummy_vlan_interface_v6 = name + "|" + dummy_vlan_interface_v6 json_patch = [{ "op": "{}".format(op), "path": create_path(["VLAN_INTERFACE", dummy_vlan_interface_v4]), "value": {} }, { "op": "{}".format(op), "path": create_path(["VLAN_INTERFACE", dummy_vlan_interface_v6]), "value": {} }] tmpfile = generate_tmpfile(duthost) logger.info("tmpfile {}".format(tmpfile)) try: output = apply_patch(duthost, json_data=json_patch, dest_file=tmpfile) expect_op_failure(output) finally: delete_tmpfile(duthost, tmpfile)
def test_tacacs_server_tc11_add_invalid(duthost, tacacs_server_options, invalid_input): """ Test invalid input for tacacs server valid input restriction: auth_type:[chap, pap, mschap, login] passkey: cannot contain space, "#" and "," priority: range[1, 64] tcp_port: [0, 65535] timeout: range[1, 60] """ cleanup_tacacs_server(duthost) json_patch = [{ "op": "add", "path": "/TACPLUS_SERVER", "value": { DEFAULT_TACACS_SERVER: { tacacs_server_options: invalid_input } } }] tmpfile = generate_tmpfile(duthost) logger.info("tmpfile {}".format(tmpfile)) try: output = apply_patch(duthost, json_data=json_patch, dest_file=tmpfile) expect_op_failure(output) finally: delete_tmpfile(duthost, tmpfile)
def test_pfcwd_interval_config_updates(duthost, ensure_dut_readiness, operation, field_pre_status, is_valid_config_update): new_interval = get_new_interval(duthost, is_valid_config_update) operation_to_new_value_map = {"add": "{}".format(new_interval), "replace": "{}".format(new_interval), "remove": ""} detection_time, restoration_time = get_detection_restoration_times(duthost) pre_status = max(detection_time, restoration_time) field_pre_status_to_value_map = {"existing": "{}".format(pre_status), "nonexistent": ""} prepare_pfcwd_interval_config(duthost, field_pre_status_to_value_map[field_pre_status]) tmpfile = generate_tmpfile(duthost) logger.info("tmpfile {} created for json patch of pfcwd poll interval and operation: {}".format(tmpfile, operation)) value = operation_to_new_value_map[operation] logger.info("value to be added to json patch: {}".format(value)) json_patch = [ { "op": "{}".format(operation), "path": "/PFC_WD/GLOBAL/POLL_INTERVAL", "value": "{}".format(value) }] try: output = apply_patch(duthost, json_data=json_patch, dest_file=tmpfile) if is_valid_config_update: expect_op_success(duthost, output) ensure_application_of_updated_config(duthost, value) else: expect_op_failure(output) finally: delete_tmpfile(duthost, tmpfile)
def test_tacacs_global_tc6_invalid_input(duthost, tacacs_global_type, invalid_input): """ Test tacacs global invalid input option restriction: auth_type:[chap, pap, mschap, login] passkey: cannot contain space, "#" and "," timeout: range[1, 60] """ json_patch = [{ "op": "add", "path": "/TACPLUS", "value": { "global": { tacacs_global_type: invalid_input } } }] tmpfile = generate_tmpfile(duthost) logger.info("tmpfile {}".format(tmpfile)) try: output = apply_patch(duthost, json_data=json_patch, dest_file=tmpfile) expect_op_failure(output) finally: delete_tmpfile(duthost, tmpfile)
def test_lo_interface_tc3_xfail(duthost, op, name, dummy_lo_interface_v4, dummy_lo_interface_v6): """ Test expect fail testcase ("add", "Loopback0", "587.1.0.32~132", "FC00:1::32~1128"), ADD Invalid IPv4 address ("add", "Loopback0", "10.1.0.32~132", "FC00:1::xyz~1128"), ADD Invalid IPv6 address ("remove", "Loopback0", "10.1.0.33~132", "FC00:1::32~1128"), REMOVE Unexist IPv4 address ("remove", "Loopback0", "10.1.0.32~132", "FC00:1::33~1128") REMOVE Unexist IPv6 address """ dummy_lo_interface_v4 = name + "|" + dummy_lo_interface_v4 dummy_lo_interface_v6 = name + "|" + dummy_lo_interface_v6 json_patch = [ { "op": "{}".format(op), "path": "/LOOPBACK_INTERFACE/{}".format(dummy_lo_interface_v4), "value": {} }, { "op": "{}".format(op), "path": "/LOOPBACK_INTERFACE/{}".format(dummy_lo_interface_v6), "value": {} } ] tmpfile = generate_tmpfile(duthost) logger.info("tmpfile {}".format(tmpfile)) try: output = apply_patch(duthost, json_data=json_patch, dest_file=tmpfile) expect_op_failure(output) finally: delete_tmpfile(duthost, tmpfile)
def test_update_speed(duthost, ensure_dut_readiness, speed, is_valid): json_patch = [{ "op": "replace", "path": "/PORT/Ethernet0/speed", "value": "{}".format(speed) }] tmpfile = generate_tmpfile(duthost) logger.info("tmpfile {}".format(tmpfile)) try: output = apply_patch(duthost, json_data=json_patch, dest_file=tmpfile) if is_valid: expect_op_success(duthost, output) current_status_speed = check_interface_status(duthost, "Speed").replace( "G", "000") pytest_assert( current_status_speed == speed, "Failed to properly configure interface speed to requested value {}" .format(speed)) else: expect_op_failure(output) finally: delete_tmpfile(duthost, tmpfile)
def test_dhcp_relay_tc2_rm_on_empty(duthost, init_dhcp_server_config, vlan_intfs_list): """Test remove dhcp server on no dhcp server setup """ if init_dhcp_server_config != CONFIG_CLEANUP: pytest.skip("Unsupported init config") logger.info("vlan_intfs_list {}".format(vlan_intfs_list)) dhcp_rm_on_empty_json = [{ "op": "remove", "path": "/VLAN/Vlan" + str(vlan_intfs_list[0]) + "/dhcp_servers/1" }] tmpfile = generate_tmpfile(duthost) logger.info("tmpfile {}".format(tmpfile)) try: output = apply_patch(duthost, json_data=dhcp_rm_on_empty_json, dest_file=tmpfile) expect_op_failure(output) finally: delete_tmpfile(duthost, tmpfile)
def bgp_prefix_tc1_xfail(duthost, community_table): """ Test input with invalid prefixes """ xfail_input = [ ("add", "10.256.0.0/16", PREFIXES_V6_DUMMY), # Invalid v4 prefix ("add", PREFIXES_V4_DUMMY, "fc01:xyz::/64"), # Invalid v6 prefix ("remove", PREFIXES_V4_DUMMY, PREFIXES_V6_INIT), # Unexisted v4 prefix ("remove", PREFIXES_V4_INIT, PREFIXES_V6_DUMMY) # Unexisted v6 prefix ] for op, prefixes_v4, prefixes_v6 in xfail_input: json_patch = [ { "op": op, "path": "/BGP_ALLOWED_PREFIXES/DEPLOYMENT_ID|0{}/prefixes_v6/0".format(community_table), "value": prefixes_v6 }, { "op": op, "path": "/BGP_ALLOWED_PREFIXES/DEPLOYMENT_ID|0{}/prefixes_v4/0".format(community_table), "value": prefixes_v4 } ] tmpfile = generate_tmpfile(duthost) logger.info("tmpfile {}".format(tmpfile)) try: output = apply_patch(duthost, json_data=json_patch, dest_file=tmpfile) expect_op_failure(output) finally: delete_tmpfile(duthost, tmpfile)
def test_syslog_server_tc3_xfail(duthost, init_syslog_config, op, dummy_syslog_server_v4, dummy_syslog_server_v6): """ Test expect fail testcase ("add", "10.0.0.587", "cc98:2008::1"), ADD Invalid IPv4 address ("add", "10.0.0.5", "cc98:2008::xyz"), ADD Invalid IPv6 address ("remove", "10.0.0.6", "cc98:2008:1"), REMOVE Unexist IPv4 address ("remove", "10.0.0.5", "cc98:2008::2") REMOVE Unexist IPv6 address """ if init_syslog_config != CONFIG_ADD_DEFAULT: pytest.skip("Unsupported initial config") json_patch = [{ "op": "{}".format(op), "path": "/SYSLOG_SERVER/{}".format(dummy_syslog_server_v4), "value": {} }, { "op": "{}".format(op), "path": "/SYSLOG_SERVER/{}".format(dummy_syslog_server_v6), "value": {} }] tmpfile = generate_tmpfile(duthost) logger.info("tmpfile {}".format(tmpfile)) try: output = apply_patch(duthost, json_data=json_patch, dest_file=tmpfile) expect_op_failure(output) finally: delete_tmpfile(duthost, tmpfile)
def test_syslog_server_tc3_xfail(duthost, setup_env, op, dummy_syslog_server_v4, dummy_syslog_server_v6): """ Test expect fail testcase ("add", "10.0.0.587", "cc98:2008::1"), ADD Invalid IPv4 address ("add", "10.0.0.5", "cc98:2008::xyz"), ADD Invalid IPv6 address ("remove", "10.0.0.6", "cc98:2008:1"), REMOVE Unexist IPv4 address ("remove", "10.0.0.5", "cc98:2008::2") REMOVE Unexist IPv6 address """ json_patch = [{ "op": "{}".format(op), "path": "/SYSLOG_SERVER/{}".format(dummy_syslog_server_v4), "value": {} }, { "op": "{}".format(op), "path": "/SYSLOG_SERVER/{}".format(dummy_syslog_server_v6), "value": {} }] tmpfile = generate_tmpfile(duthost) logger.info("tmpfile {}".format(tmpfile)) output = apply_patch(duthost, json_data=json_patch, dest_file=tmpfile) expect_op_failure(output) delete_tmpfile(duthost, tmpfile)
def cacl_tc7_remove_unexist_rule(duthost): """ Remove unexisted acl rule """ json_patch = [{"op": "remove", "path": "/ACL_RULE/SSH_ONLY|TEST_DROP2"}] tmpfile = generate_tmpfile(duthost) logger.info("tmpfile {}".format(tmpfile)) try: output = apply_patch(duthost, json_data=json_patch, dest_file=tmpfile) expect_op_failure(output) finally: delete_tmpfile(duthost, tmpfile)
def test_remove_lanes(duthost, ensure_dut_readiness): json_patch = [{"op": "remove", "path": "/PORT/Ethernet0/lanes"}] tmpfile = generate_tmpfile(duthost) logger.info("tmpfile {}".format(tmpfile)) try: output = apply_patch(duthost, json_data=json_patch, dest_file=tmpfile) expect_op_failure(output) finally: delete_tmpfile(duthost, tmpfile)
def test_cacl_tc9_remove_table_before_rule(duthost): """ Remove acl table before removing acl rule """ json_patch = [{"op": "remove", "path": "/ACL_TABLE"}] tmpfile = generate_tmpfile(duthost) logger.info("tmpfile {}".format(tmpfile)) output = apply_patch(duthost, json_data=json_patch, dest_file=tmpfile) expect_op_failure(output) delete_tmpfile(duthost, tmpfile)
def test_cacl_tc10_remove_unexist_rule_or_table(duthost, unexist_rule_or_table): """ Remove unexisted acl rule or acl table """ json_patch = [{"op": "remove", "path": "{}".format(unexist_rule_or_table)}] tmpfile = generate_tmpfile(duthost) logger.info("tmpfile {}".format(tmpfile)) output = apply_patch(duthost, json_data=json_patch, dest_file=tmpfile) expect_op_failure(output) delete_tmpfile(duthost, tmpfile)
def test_invalid_ipv6_neighbor(duthost, ensure_dut_readiness, op, dummy_neighbor_ipv6_address): json_patch = [{ "op": "{}".format(op), "path": "/BGP_NEIGHBOR/{}".format(dummy_neighbor_ipv6_address), "value": {} }] tmpfile = generate_tmpfile(duthost) logger.info("tmpfile {}".format(tmpfile)) try: output = apply_patch(duthost, json_data=json_patch, dest_file=tmpfile) expect_op_failure(output) finally: delete_tmpfile(duthost, tmpfile)
def test_update_valid_invalid_index(duthost, ensure_dut_readiness, index, is_valid): json_patch = [{ "op": "replace", "path": "/PORT/Ethernet0/index", "value": "{}".format(index) }] tmpfile = generate_tmpfile(duthost) logger.info("tmpfile {}".format(tmpfile)) try: output = apply_patch(duthost, json_data=json_patch, dest_file=tmpfile) if is_valid: expect_op_success(duthost, output) else: expect_op_failure(output) finally: delete_tmpfile(duthost, tmpfile)
def test_tacacs_server_tc10_add_max(duthost): """ Test tacacs server reach maximum 8 servers """ cleanup_tacacs_server(duthost) servers = {} for i in range(10, 19): # Add 9 servers servers["10.0.0.{}".format(i)] = {} json_patch = [{"op": "add", "path": "/TACPLUS_SERVER", "value": servers}] tmpfile = generate_tmpfile(duthost) logger.info("tmpfile {}".format(tmpfile)) try: output = apply_patch(duthost, json_data=json_patch, dest_file=tmpfile) expect_op_failure(output) finally: delete_tmpfile(duthost, tmpfile)
def test_replace_lanes(duthost, ensure_dut_readiness): cur_lanes = check_interface_status(duthost, "Lanes") cur_lanes = cur_lanes.split(",") cur_lanes.sort() update_lanes = cur_lanes update_lanes[-1] = str(int(update_lanes[-1]) + 1) update_lanes = ",".join(update_lanes) json_patch = [{ "op": "replace", "path": "/PORT/Ethernet0/lanes", "value": "{}".format(update_lanes) }] tmpfile = generate_tmpfile(duthost) logger.info("tmpfile {}".format(tmpfile)) try: output = apply_patch(duthost, json_data=json_patch, dest_file=tmpfile) expect_op_failure(output) finally: delete_tmpfile(duthost, tmpfile)
def test_cacl_tc4_add_invalid_table(duthost): """ Add invalid acl table with wrong type """ json_patch = [{ "op": "add", "path": "/ACL_TABLE/TEST_2", "value": { "policy_desc": "Test Table 2", "services": ["SSH"], "stage": "ingress", "type": "CONTROLLING PLANE" } }] tmpfile = generate_tmpfile(duthost) logger.info("tmpfile {}".format(tmpfile)) output = apply_patch(duthost, json_data=json_patch, dest_file=tmpfile) expect_op_failure(output) delete_tmpfile(duthost, tmpfile)
def test_dhcp_relay_tc4_add_exist(duthost, setup_vlan, init_dhcp_server_config, vlan_intfs_list): """Test add existed dhcp server on default setup """ if init_dhcp_server_config != "default_setup": pytest.skip("Unsupported init config") dhcp_add_exist_json = [{ "op": "add", "path": "/VLAN/Vlan" + str(vlan_intfs_list[0]) + "/dhcp_servers/2", "value": "192.0." + str(vlan_intfs_list[0]) + ".3" }] tmpfile = generate_tmpfile(duthost) logger.info("tmpfile {}".format(tmpfile)) output = apply_patch(duthost, json_data=dhcp_add_exist_json, dest_file=tmpfile) expect_op_failure(output) delete_tmpfile(duthost, tmpfile)
def test_syslog_server_tc6_exceed_max(duthost, setup_env): """ Exceed syslog server maximum test """ if SYSLOG_MAX_SERVER == -1 or SYSLOG_MAX_SERVER > SYSLOG_TEST_MAX_UPPER_LIMIT: pytest.skip( "SYSLOG_MAX_SERVER is not set or is over the test max upper limit") json_patch = [{ "op": "add", "path": "/SYSLOG_SERVER/10.0.0.{}".format(SYSLOG_MAX_SERVER + 1), "value": {} }] tmpfile = generate_tmpfile(duthost) logger.info("tmpfile {}".format(tmpfile)) output = apply_patch(duthost, json_data=json_patch, dest_file=tmpfile) expect_op_failure(output) delete_tmpfile(duthost, tmpfile)
def test_cacl_tc4_add_invalid_table(duthost): """ Add invalid acl table """ invalid_table = [ { "service": "SSH", "stage": "ogress", "type": "CTRLPLANE" }, # wrong stage { "service": "SSH", "stage": "ingress", "type": "TRLPLANE" } # wrong type ] for ele in invalid_table: json_patch = [{ "op": "add", "path": "/ACL_TABLE/TEST_2", "value": { "policy_desc": "Test_Table_2", "services": ["{}".format(ele["service"])], "stage": "{}".format(ele["stage"]), "type": "{}".format(ele["type"]) } }] tmpfile = generate_tmpfile(duthost) logger.info("tmpfile {}".format(tmpfile)) try: output = apply_patch(duthost, json_data=json_patch, dest_file=tmpfile) expect_op_failure(output) finally: delete_tmpfile(duthost, tmpfile)
def test_cacl_tc8_add_invalid_rule(duthost): """ Add invalid acl rule for test """ json_patch = [{ "op": "add", "path": "/ACL_RULE/TEST_2|TEST_DROP", "value": { "L4_DST_PORT": "22", "IP_PROTOCOL": "6", "IP_TYPE": "IP", "PACKET_ACTION": "DROP", "PRIORITY": "9998", "SRC_IP": "9.9.9.9/32" } }] tmpfile = generate_tmpfile(duthost) logger.info("tmpfile {}".format(tmpfile)) output = apply_patch(duthost, json_data=json_patch, dest_file=tmpfile) expect_op_failure(output) delete_tmpfile(duthost, tmpfile)
def test_dhcp_relay_tc3_rm_nonexist(duthost, init_dhcp_server_config, vlan_intfs_list): """Test remove nonexisted dhcp server on default setup """ if init_dhcp_server_config != CONFIG_ADD_DEFAULT: pytest.skip("Unsupported init config") dhcp_rm_nonexist_json = [{ "op": "remove", "path": "/VLAN/Vlan" + str(vlan_intfs_list[0]) + "/dhcp_servers/5" }] tmpfile = generate_tmpfile(duthost) logger.info("tmpfile {}".format(tmpfile)) try: output = apply_patch(duthost, json_data=dhcp_rm_nonexist_json, dest_file=tmpfile) expect_op_failure(output) finally: delete_tmpfile(duthost, tmpfile)
def cacl_tc7_add_rule_to_unexisted_table(duthost): """ Add acl rule to unexisted table """ json_patch = [{ "op": "add", "path": "/ACL_RULE/TEST_2|TEST_DROP", "value": { "L4_DST_PORT": "22", "IP_PROTOCOL": "6", "IP_TYPE": "IP", "PACKET_ACTION": "DROP", "PRIORITY": "9998", "SRC_IP": "9.9.9.9/32" } }] tmpfile = generate_tmpfile(duthost) logger.info("tmpfile {}".format(tmpfile)) try: output = apply_patch(duthost, json_data=json_patch, dest_file=tmpfile) expect_op_failure(output) finally: delete_tmpfile(duthost, tmpfile)