diff --git a/config/muxcable.py b/config/muxcable.py index a627ca70a7..1ce8cc35f2 100644 --- a/config/muxcable.py +++ b/config/muxcable.py @@ -1,6 +1,7 @@ import json import os import sys +import time import click import re @@ -54,7 +55,7 @@ def delete_all_keys_in_db_table(db_type, table_name): table[asic_id]._del(key) -def update_and_get_response_for_xcvr_cmd(cmd_name, rsp_name, exp_rsp, cmd_table_name, rsp_table_name, port, arg=None): +def update_and_get_response_for_xcvr_cmd(cmd_name, rsp_name, exp_rsp, cmd_table_name, rsp_table_name, port, cmd_timeout_secs, arg=None): res_dict = {} state_db, appl_db = {}, {} @@ -62,6 +63,10 @@ def update_and_get_response_for_xcvr_cmd(cmd_name, rsp_name, exp_rsp, cmd_table_ firmware_rsp_sub_tbl = {} firmware_cmd_tbl = {} + CMD_TIMEOUT_SECS = cmd_timeout_secs + + time_start = time.time() + sel = swsscommon.Select() namespaces = multi_asic.get_front_end_namespaces() for namespace in namespaces: @@ -116,6 +121,11 @@ def update_and_get_response_for_xcvr_cmd(cmd_name, rsp_name, exp_rsp, cmd_table_ (state, selectableObj) = sel.select(SELECT_TIMEOUT) + time_now = time.time() + time_diff = time_now - time_start + if time_diff >= CMD_TIMEOUT_SECS: + return res_dict + if state == swsscommon.Select.TIMEOUT: # Do not flood log when select times out continue @@ -154,6 +164,7 @@ def update_and_get_response_for_xcvr_cmd(cmd_name, rsp_name, exp_rsp, cmd_table_ # check if xcvrd got a probe command result = fvp_dict[rsp_name] + if result == exp_rsp: res_dict[1] = result res_dict[0] = 0 @@ -422,7 +433,7 @@ def state(db, state, port): res_dict = {} res_dict [0] = CONFIG_FAIL res_dict [1] = "unknown" - res_dict = update_and_get_response_for_xcvr_cmd("config","result", "True", "XCVRD_CONFIG_HWMODE_DIR_CMD", "XCVRD_CONFIG_HWMODE_DIR_RSP", port, res_dict, state) + res_dict = update_and_get_response_for_xcvr_cmd("config","result", "True", "XCVRD_CONFIG_HWMODE_DIR_CMD", "XCVRD_CONFIG_HWMODE_DIR_RSP", port, 1, state) rc = res_dict[0] if rc == 0: @@ -465,7 +476,7 @@ def state(db, state, port): res_dict [0] = CONFIG_FAIL res_dict [1] = 'unknown' - res_dict = update_and_get_response_for_xcvr_cmd("config","result", "True", "XCVRD_CONFIG_HWMODE_DIR_CMD", "XCVRD_CONFIG_HWMODE_DIR_RSP", port, res_dict, state) + res_dict = update_and_get_response_for_xcvr_cmd("config","result", "True", "XCVRD_CONFIG_HWMODE_DIR_CMD", "XCVRD_CONFIG_HWMODE_DIR_RSP", port, 1, state) rc = res_dict[0] @@ -497,7 +508,7 @@ def setswitchmode(db, state, port): res_dict = {} res_dict [0] = CONFIG_FAIL res_dict [1] = "unknown" - res_dict = update_and_get_response_for_xcvr_cmd("config", "result", "True", "XCVRD_CONFIG_HWMODE_SWMODE_CMD", "XCVRD_CONFIG_HWMODE_SWMODE_RSP", port, res_dicti, state) + res_dict = update_and_get_response_for_xcvr_cmd("config", "result", "True", "XCVRD_CONFIG_HWMODE_SWMODE_CMD", "XCVRD_CONFIG_HWMODE_SWMODE_RSP", port, 1, state) rc = res_dict[0] @@ -540,7 +551,7 @@ def setswitchmode(db, state, port): res_dict = {} res_dict [0] = CONFIG_FAIL res_dict [1] = "unknown" - res_dict = update_and_get_response_for_xcvr_cmd("config", "result", "True", "XCVRD_CONFIG_HWMODE_SWMODE_CMD", "XCVRD_CONFIG_HWMODE_SWMODE_RSP", port, res_dicti, state) + res_dict = update_and_get_response_for_xcvr_cmd("config", "result", "True", "XCVRD_CONFIG_HWMODE_SWMODE_CMD", "XCVRD_CONFIG_HWMODE_SWMODE_RSP", port, 1, state) rc = res_dict[0] @@ -566,7 +577,7 @@ def firmware(): def download(db, fwfile, port): """Config muxcable firmware download""" - #port = platform_sfputil_helper.get_interface_alias(port, db) + port = platform_sfputil_helper.get_interface_alias(port, db) delete_all_keys_in_db_table("STATE_DB", "XCVRD_DOWN_FW_RSP") delete_all_keys_in_db_table("APPL_DB", "XCVRD_DOWN_FW_CMD") @@ -576,7 +587,7 @@ def download(db, fwfile, port): res_dict = {} res_dict [0] = CONFIG_FAIL res_dict [1] = "unknown" - res_dict = update_and_get_response_for_xcvr_cmd("download_firmware", "status", "0", "XCVRD_DOWN_FW_CMD", "XCVRD_DOWN_FW_RSP", port, fwfile) + res_dict = update_and_get_response_for_xcvr_cmd("download_firmware", "status", "0", "XCVRD_DOWN_FW_CMD", "XCVRD_DOWN_FW_RSP", port, 1000, fwfile) rc = res_dict[0] if rc == 0: @@ -619,7 +630,7 @@ def download(db, fwfile, port): res_dict [0] = CONFIG_FAIL res_dict [1] = "unknown" - res_dict = update_and_get_response_for_xcvr_cmd("download_firmware", "status", "0", "XCVRD_DOWN_FW_CMD", "XCVRD_DOWN_FW_RSP", port, fwfile) + res_dict = update_and_get_response_for_xcvr_cmd("download_firmware", "status", "0", "XCVRD_DOWN_FW_CMD", "XCVRD_DOWN_FW_RSP", port, 1000, fwfile) rc = res_dict[0] @@ -639,7 +650,7 @@ def download(db, fwfile, port): def activate(db, port, fwfile): """Config muxcable firmware activate""" - #port = platform_sfputil_helper.get_interface_alias(port, db) + port = platform_sfputil_helper.get_interface_alias(port, db) delete_all_keys_in_db_table("STATE_DB", "XCVRD_ACTI_FW_RSP") delete_all_keys_in_db_table("APPL_DB", "XCVRD_ACTI_FW_CMD") @@ -649,13 +660,13 @@ def activate(db, port, fwfile): res_dict = {} res_dict [0] = CONFIG_FAIL res_dict [1] = "unknown" - res_dict = update_and_get_response_for_xcvr_cmd("activate_firmware", "status", "0", "XCVRD_ACTI_FW_CMD", "XCVRD_ACTI_FW_RSP", port, fwfile) + res_dict = update_and_get_response_for_xcvr_cmd("activate_firmware", "status", "0", "XCVRD_ACTI_FW_CMD", "XCVRD_ACTI_FW_RSP", port, 60, fwfile) rc = res_dict[0] if rc == 0: - click.echo("Success in activating firmware port {} {}".format(port, fwfile)) + click.echo("Success in activate firmware port {} fwfile {}".format(port, fwfile)) else: - click.echo("ERR: Unable to activating firmware port {} {}".format(port, fwfile)) + click.echo("ERR: Unable to activate firmware port {} fwfile {}".format(port, fwfile)) sys.exit(CONFIG_FAIL) elif port == "all": @@ -691,14 +702,14 @@ def activate(db, port, fwfile): res_dict [0] = CONFIG_FAIL res_dict [1] = "unknown" - res_dict = update_and_get_response_for_xcvr_cmd("activate_firmware", "status", "0", "XCVRD_ACTI_FW_CMD", "XCVRD_ACTI_FW_RSP", port, fwfile) + res_dict = update_and_get_response_for_xcvr_cmd("activate_firmware", "status", "0", "XCVRD_ACTI_FW_CMD", "XCVRD_ACTI_FW_RSP", port, 60, fwfile) - rc = res_dict[1] + rc = res_dict[0] if rc == 0: - click.echo("Success in activate firmware port {} {}".format(port, fwfile)) + click.echo("Success in activate firmware port {} fwfile {}".format(port, fwfile)) else: - click.echo("ERR: Unable to activate firmware port {} {}".format(port, fwfile)) + click.echo("ERR: Unable to activate firmware port {} fwfile {}".format(port, fwfile)) rc_exit = CONFIG_FAIL sys.exit(rc_exit) @@ -711,6 +722,8 @@ def activate(db, port, fwfile): def rollback(db, port, fwfile): """Config muxcable firmware rollback""" + port = platform_sfputil_helper.get_interface_alias(port, db) + delete_all_keys_in_db_table("STATE_DB", "XCVRD_ROLL_FW_RSP") delete_all_keys_in_db_table("APPL_DB", "XCVRD_ROLL_FW_CMD") @@ -719,13 +732,13 @@ def rollback(db, port, fwfile): res_dict = {} res_dict [0] = CONFIG_FAIL res_dict [1] = "unknown" - res_dict = update_and_get_response_for_xcvr_cmd("rollback_firmware", "status", "0", "XCVRD_ROLL_FW_CMD", "XCVRD_ROLL_FW_RSP", port, fwfile) + res_dict = update_and_get_response_for_xcvr_cmd("rollback_firmware", "status", "0", "XCVRD_ROLL_FW_CMD", "XCVRD_ROLL_FW_RSP", port, 60, fwfile) rc = res_dict[0] if rc == 0: - click.echo("Success in rollback firmware port {} {}".format(port, fwfile)) + click.echo("Success in rollback firmware port {} fwfile {}".format(port, fwfile)) else: - click.echo("ERR: Unable to rollback firmware port {} {}".format(port, fwfile)) + click.echo("ERR: Unable to rollback firmware port {} fwfile {}".format(port, fwfile)) sys.exit(CONFIG_FAIL) elif port == "all": @@ -761,14 +774,14 @@ def rollback(db, port, fwfile): res_dict [0] = CONFIG_FAIL res_dict [1] = "unknown" - res_dict = update_and_get_response_for_xcvr_cmd("rollback_firmware", "status", "0", "XCVRD_ROLL_FW_CMD", "XCVRD_ROLL_FW_RSP", port, fwfile) + res_dict = update_and_get_response_for_xcvr_cmd("rollback_firmware", "status", "0", "XCVRD_ROLL_FW_CMD", "XCVRD_ROLL_FW_RSP", port, 60, fwfile) rc = res_dict[0] if rc == 0: - click.echo("Success in rollback firmware port {} {}".format(port, fwfile)) + click.echo("Success in rollback firmware port {} fwfile {}".format(port, fwfile)) else: - click.echo("ERR: Unable to rollback firmware port {} {}".format(port, fwfile)) + click.echo("ERR: Unable to rollback firmware port {} fwfile {}".format(port, fwfile)) rc_exit = CONFIG_FAIL sys.exit(rc_exit) diff --git a/show/muxcable.py b/show/muxcable.py index ae64eeb761..4d972bb8ed 100644 --- a/show/muxcable.py +++ b/show/muxcable.py @@ -32,9 +32,11 @@ VENDOR_NAME = "Credo" VENDOR_MODEL_REGEX = re.compile(r"CAC\w{3}321P2P\w{2}MS") + def db_connect(db_name, namespace=EMPTY_NAMESPACE): return swsscommon.DBConnector(db_name, REDIS_TIMEOUT_MSECS, True, namespace) + def delete_all_keys_in_db_table(db_type, table_name): redis_db = {} @@ -50,6 +52,7 @@ def delete_all_keys_in_db_table(db_type, table_name): for key in table_keys[asic_id]: table[asic_id]._del(key) + def get_response_for_version(port, mux_info_dict): state_db = {} xcvrd_show_fw_res_tbl = {} @@ -60,7 +63,6 @@ def get_response_for_version(port, mux_info_dict): state_db[asic_id] = db_connect("STATE_DB", namespace) xcvrd_show_fw_res_tbl[asic_id] = swsscommon.Table(state_db[asic_id], "XCVRD_SHOW_FW_RES") - logical_port_list = platform_sfputil_helper.get_logical_list() if port not in logical_port_list: click.echo("ERR: This is not a valid port, valid ports ({})".format(", ".join(logical_port_list))) @@ -82,7 +84,6 @@ def get_response_for_version(port, mux_info_dict): res_dict[1] = rc return mux_info_dict - (status, fvp) = xcvrd_show_fw_res_tbl[asic_index].get(port) res_dir = dict(fvp) mux_info_dict["version_nic_active"] = res_dir.get("version_nic_active", None) @@ -97,7 +98,8 @@ def get_response_for_version(port, mux_info_dict): return mux_info_dict -def update_and_get_response_for_xcvr_cmd(cmd_name, rsp_name, exp_rsp, cmd_table_name, rsp_table_name, port, arg=None): + +def update_and_get_response_for_xcvr_cmd(cmd_name, rsp_name, exp_rsp, cmd_table_name, rsp_table_name, port, cmd_timeout_secs, arg=None): res_dict = {} state_db, appl_db = {}, {} @@ -106,6 +108,10 @@ def update_and_get_response_for_xcvr_cmd(cmd_name, rsp_name, exp_rsp, cmd_table_ firmware_cmd_tbl = {} firmware_res_tbl = {} + CMD_TIMEOUT_SECS = cmd_timeout_secs + + time_start = time.time() + sel = swsscommon.Select() namespaces = multi_asic.get_front_end_namespaces() for namespace in namespaces: @@ -160,6 +166,11 @@ def update_and_get_response_for_xcvr_cmd(cmd_name, rsp_name, exp_rsp, cmd_table_ (state, selectableObj) = sel.select(SELECT_TIMEOUT) + time_now = time.time() + time_diff = time_now - time_start + if time_diff >= CMD_TIMEOUT_SECS: + return res_dict + if state == swsscommon.Select.TIMEOUT: # Do not flood log when select times out continue @@ -218,6 +229,7 @@ def update_and_get_response_for_xcvr_cmd(cmd_name, rsp_name, exp_rsp, cmd_table_ # 'muxcable' command ("show muxcable") # + @click.group(name='muxcable', cls=clicommon.AliasedGroup) def muxcable(): """SONiC command line - 'show muxcable' command""" @@ -643,7 +655,7 @@ def hwmode(): def muxdirection(db, port): """Shows the current direction of the muxcable {active/standy}""" - #port = platform_sfputil_helper.get_interface_alias(port, db) + port = platform_sfputil_helper.get_interface_alias(port, db) delete_all_keys_in_db_table("APPL_DB", "XCVRD_SHOW_HWMODE_DIR_CMD") delete_all_keys_in_db_table("STATE_DB", "XCVRD_SHOW_HWMODE_DIR_RSP") @@ -651,9 +663,10 @@ def muxdirection(db, port): if port is not None: res_dict = {} - res_dict [0] = CONFIG_FAIL - res_dict [1] = "unknown" - res_dict = update_and_get_response_for_xcvr_cmd("state", "state", "True", "XCVRD_SHOW_HWMODE_DIR_CMD", "XCVRD_SHOW_HWMODE_DIR_RSP", port, "probe") + res_dict[0] = CONFIG_FAIL + res_dict[1] = "unknown" + res_dict = update_and_get_response_for_xcvr_cmd( + "state", "state", "True", "XCVRD_SHOW_HWMODE_DIR_CMD", "XCVRD_SHOW_HWMODE_DIR_RSP", port, 1, "probe") body = [] temp_list = [] @@ -698,9 +711,10 @@ def muxdirection(db, port): temp_list = [] res_dict = {} - res_dict [0] = CONFIG_FAIL - res_dict [1] = "unknown" - res_dict = update_and_get_response_for_xcvr_cmd("state", "state", "True", "XCVRD_SHOW_HWMODE_DIR_CMD", "XCVRD_SHOW_HWMODE_DIR_RSP", port, "probe") + res_dict[0] = CONFIG_FAIL + res_dict[1] = "unknown" + res_dict = update_and_get_response_for_xcvr_cmd( + "state", "state", "True", "XCVRD_SHOW_HWMODE_DIR_CMD", "XCVRD_SHOW_HWMODE_DIR_RSP", port, 1, "probe") temp_list.append(port) temp_list.append(res_dict[1]) body.append(temp_list) @@ -714,22 +728,24 @@ def muxdirection(db, port): if rc_exit == False: sys.exit(EXIT_FAIL) + @hwmode.command() @click.argument('port', metavar='', required=False, default=None) @clicommon.pass_db def switchmode(db, port): """Shows the current switching mode of the muxcable {auto/manual}""" - #port = platform_sfputil_helper.get_interface_alias(port, db) + port = platform_sfputil_helper.get_interface_alias(port, db) delete_all_keys_in_db_table("APPL_DB", "XCVRD_SHOW_HWMODE_SWMODE_CMD") delete_all_keys_in_db_table("STATE_DB", "XCVRD_SHOW_HWMODE_SWMODE_RSP") if port is not None: res_dict = {} - res_dict [0] = CONFIG_FAIL - res_dict [1] = "unknown" - res_dict = update_and_get_response_for_xcvr_cmd("state","state", "True", "XCVRD_SHOW_HWMODE_SWMODE_CMD", "XCVRD_SHOW_HWMODE_SWMODE_RSP", port, "probe") + res_dict[0] = CONFIG_FAIL + res_dict[1] = "unknown" + res_dict = update_and_get_response_for_xcvr_cmd( + "state", "state", "True", "XCVRD_SHOW_HWMODE_SWMODE_CMD", "XCVRD_SHOW_HWMODE_SWMODE_RSP", port, 1, "probe") body = [] temp_list = [] @@ -774,9 +790,10 @@ def switchmode(db, port): temp_list = [] res_dict = {} - res_dict [0] = CONFIG_FAIL - res_dict [1] = "unknown" - res_dict = update_and_get_response_for_xcvr_cmd("state","state", "True", "XCVRD_SHOW_HWMODE_SWMODE_CMD", "XCVRD_SHOW_HWMODE_SWMODE_RSP", port, "probe") + res_dict[0] = CONFIG_FAIL + res_dict[1] = "unknown" + res_dict = update_and_get_response_for_xcvr_cmd( + "state", "state", "True", "XCVRD_SHOW_HWMODE_SWMODE_CMD", "XCVRD_SHOW_HWMODE_SWMODE_RSP", port, 1, "probe") temp_list.append(port) temp_list.append(res_dict[1]) rc = res_dict[1] @@ -955,19 +972,20 @@ def firmware(): def version(db, port, active): """Show muxcable firmware version""" - #port = platform_sfputil_helper.get_interface_alias(port, db) + port = platform_sfputil_helper.get_interface_alias(port, db) delete_all_keys_in_db_table("APPL_DB", "XCVRD_DOWN_FW_CMD") delete_all_keys_in_db_table("STATE_DB", "XCVRD_DOWN_FW_RSP") delete_all_keys_in_db_table("APPL_DB", "XCVRD_SHOW_FW_CMD") delete_all_keys_in_db_table("STATE_DB", "XCVRD_SHOW_FW_RSP") + delete_all_keys_in_db_table("STATE_DB", "XCVRD_SHOW_FW_RES") if port is not None: res_dict = {} mux_info_dict, mux_info_active_dict = {}, {} - res_dict [0] = CONFIG_FAIL - res_dict [1] = "unknown" + res_dict[0] = CONFIG_FAIL + res_dict[1] = "unknown" mux_info_dict["version_nic_active"] = "N/A" mux_info_dict["version_nic_inactive"] = "N/A" mux_info_dict["version_nic_next"] = "N/A" @@ -978,7 +996,8 @@ def version(db, port, active): mux_info_dict["version_self_inactive"] = "N/A" mux_info_dict["version_self_next"] = "N/A" - res_dict = update_and_get_response_for_xcvr_cmd("firmware_version","status", "True", "XCVRD_SHOW_FW_CMD", "XCVRD_SHOW_FW_RSP", port, "probe") + res_dict = update_and_get_response_for_xcvr_cmd( + "firmware_version", "status", "True", "XCVRD_SHOW_FW_CMD", "XCVRD_SHOW_FW_RSP", port, 20, "probe") if res_dict[1] == "True": mux_info_dict = get_response_for_version(port, mux_info_dict)