Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[show][config] cli support for firmware upgrade on Y-Cable #1528

Merged
merged 13 commits into from
Apr 5, 2021
39 changes: 22 additions & 17 deletions config/muxcable.py
Original file line number Diff line number Diff line change
Expand Up @@ -648,8 +648,9 @@ def get_per_npu_statedb(per_npu_statedb, port_table_keys):
per_npu_statedb[asic_id].STATE_DB, 'MUX_CABLE_TABLE|*')


def get_physical_port_list(port, physical_port_list):
def get_physical_port_list(port):

physical_port_list = []
if platform_sfputil is not None:
physical_port_list = platform_sfputil_helper.logical_port_name_to_physical_port_list(port)

Expand All @@ -673,10 +674,10 @@ def get_physical_port_list(port, physical_port_list):
", ".join(physical_port_list), port))
sys.exit(CONFIG_FAIL)

return asic_index
return (physical_port_list, asic_index)


def perform_download_firmware(physical_port, fwfile):
def perform_download_firmware(physical_port, fwfile, port):
import sonic_y_cable.y_cable
result = sonic_y_cable.y_cable.download_firmware(physical_port, fwfile)
if result == sonic_y_cable.y_cable.FIRMWARE_DOWNLOAD_SUCCESS:
Expand All @@ -687,7 +688,7 @@ def perform_download_firmware(physical_port, fwfile):
return False


def perform_activate_firmware(physical_port):
def perform_activate_firmware(physical_port, port):
import sonic_y_cable.y_cable
result = sonic_y_cable.y_cable.activate_firmware(physical_port)
if result == sonic_y_cable.y_cable.FIRMWARE_ACTIVATE_SUCCESS:
Expand All @@ -698,7 +699,7 @@ def perform_activate_firmware(physical_port):
return False


def perform_rollback_firmware(physical_port):
def perform_rollback_firmware(physical_port, port):
import sonic_y_cable.y_cable
result = sonic_y_cable.y_cable.rollback_firmware(physical_port)
if result == sonic_y_cable.y_cable.FIRMWARE_ROLLBACK_SUCCESS:
Expand Down Expand Up @@ -730,13 +731,16 @@ def download(fwfile, port):
if port is not None and port != "all":

physical_port_list = []
get_physical_port_list(port, physical_port_list)
physical_port_list, asic_index = get_physical_port_list(port)
f = open("demofile2.txt", "w")
f.write("yes ")
f.write("{} ".format(len(physical_port_list)))
jleveque marked this conversation as resolved.
Show resolved Hide resolved
physical_port = physical_port_list[0]
if per_npu_statedb[asic_index] is not None:
y_cable_asic_table_keys = port_table_keys[asic_index]
logical_key = "MUX_CABLE_TABLE|{}".format(port)
if logical_key in y_cable_asic_table_keys:
perform_download_firmware(physical_port, fwfile)
perform_download_firmware(physical_port, fwfile, port)

else:
click.echo("this is not a valid port present on mux_cable".format(port))
Expand All @@ -754,11 +758,11 @@ def download(fwfile, port):
port = key.split("|")[1]

physical_port_list = []
get_physical_port_list(port, physical_port_list)
(physical_port_list, asic_index) = get_physical_port_list(port)

physical_port = physical_port_list[0]

status = perform_download_firmware(physical_port, fwfile)
status = perform_download_firmware(physical_port, fwfile, port)

if status is not True:
rc = CONFIG_FAIL
Expand All @@ -780,13 +784,13 @@ def activate(port):
if port is not None and port != "all":

physical_port_list = []
get_physical_port_list(port, physical_port_list)
(physical_port_list, asic_index) = get_physical_port_list(port)
physical_port = physical_port_list[0]
if per_npu_statedb[asic_index] is not None:
y_cable_asic_table_keys = port_table_keys[asic_index]
logical_key = "MUX_CABLE_TABLE|{}".format(port)
if logical_key in y_cable_asic_table_keys:
perform_activate_firmware(physical_port)
perform_activate_firmware(physical_port, port)

else:
click.echo("this is not a valid port present on mux_cable".format(port))
Expand All @@ -805,15 +809,16 @@ def activate(port):

physical_port_list = []

get_physical_port_list(port, physical_port_list)
(physical_port_list, asic_index) = get_physical_port_list(port)
physical_port = physical_port_list[0]
status = perform_activate_firmware(physical_port)
status = perform_activate_firmware(physical_port, port)

if status is not True:
rc = CONFIG_FAIL

sys.exit(rc)


@firmware.command()
@click.argument('port', metavar='<port_name>', required=True, default=None)
def rollback(port):
Expand All @@ -828,13 +833,13 @@ def rollback(port):
if port is not None and port != "all":

physical_port_list = []
get_physical_port_list(port, physical_port_list)
(physical_port_list, asic_index) = get_physical_port_list(port)
physical_port = physical_port_list[0]
if per_npu_statedb[asic_index] is not None:
y_cable_asic_table_keys = port_table_keys[asic_index]
logical_key = "MUX_CABLE_TABLE|{}".format(port)
if logical_key in y_cable_asic_table_keys:
perform_rollback_firmware(physical_port)
perform_rollback_firmware(physical_port, port)

else:
click.echo("this is not a valid port present on mux_cable".format(port))
Expand All @@ -852,9 +857,9 @@ def rollback(port):
port = key.split("|")[1]

physical_port_list = []
get_physical_port_list(port, physical_port_list)
(physical_port_list, asic_index) = get_physical_port_list(port)
physical_port = physical_port_list[0]
status = perform_rollback_firmware(physical_port)
status = perform_rollback_firmware(physical_port, port)

if status is not True:
rc = CONFIG_FAIL
Expand Down
152 changes: 32 additions & 120 deletions show/muxcable.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
from natsort import natsorted
from sonic_py_common import multi_asic
from swsscommon.swsscommon import SonicV2Connector, ConfigDBConnector
from swsscommon import swsscommon
from tabulate import tabulate
from utilities_common import platform_sfputil_helper

Expand Down Expand Up @@ -822,125 +823,20 @@ def switchmode(port):
sys.exit(EXIT_FAIL)


def create_result_dict(physical_port, mux_info_dict, result_dict):

import sonic_y_cable.y_cable
read_side = sonic_y_cable.y_cable.check_read_side(physical_port)

version_build_slot1_nic = mux_info_dict[("version_slot1_nic".format(side))] + \
mux_info_dict[("build_slot1_nic".format(side))]
version_build_slot2_nic = mux_info_dict[("version_slot2_nic".format(side))] + \
mux_info_dict[("build_slot2_nic".format(side))]
version_build_slot1_tor1 = mux_info_dict[("version_slot1_tor1".format(side))] + \
mux_info_dict[("build_slot1_tor1".format(side))]
version_build_slot2_tor1 = mux_info_dict[("version_slot2_tor1".format(side))] + \
mux_info_dict[("build_slot2_tor1".format(side))]
version_build_slot1_tor2 = mux_info_dict[("version_slot1_tor2".format(side))] + \
mux_info_dict[("build_slot1_tor2".format(side))]
version_build_slot2_tor2 = mux_info_dict[("version_slot2_tor2".format(side))] + \
mux_info_dict[("build_slot2_tor2".format(side))]

if read_side == 1:
if mux_info_dict[("run_slot1_tor1".format(side))] == "True":
# slot 1 is active for self
result_dict["version_self_active"] = version_build_slot1_tor1
result_dict["version_self_inactive"] = version_build_slot2_tor1
elif mux_info_dict[("run_slot2_tor1".format(side))] == "True":
# slot 2 is active for self
result_dict["version_self_active"] = version_build_slot2_tor1
result_dict["version_self_inactive"] = version_build_slot1_tor1

if mux_info_dict[("run_slot1_tor2".format(side))] == "True":
# slot 1 is active for peer
result_dict["version_peer_active"] = version_build_slot1_tor2
result_dict["version_peer_inactive"] = version_build_slot2_tor2
elif mux_info_dict[("run_slot2_tor2".format(side))] == "True":
# slot 2 is active for peer
result_dict["version_peer_active"] = version_build_slot2_tor2
result_dict["version_peer_inactive"] = version_build_slot1_tor2

if mux_info_dict[("commit_slot1_tor1".format(side))] == "True":
result_dict["version_self_next"] = version_build_slot1_tor1
elif mux_info_dict[("commit_slot2_tor1".format(side))] == "True":
result_dict["version_self_next"] = version_build_slot2_tor1

if mux_info_dict[("commit_slot1_tor2".format(side))] == "True":
result_dict["version_peer_next"] = version_build_slot1_tor2
elif mux_info_dict[("commit_slot2_tor2".format(side))] == "True":
result_dict["version_peer_next"] = version_build_slot2_tor2

elif read_side == 2:
if mux_info_dict[("run_slot1_tor2".format(side))] == "True":
# slot 1 is active for self
result_dict["version_self_active"] = version_build_slot1_tor2
result_dict["version_self_inactive"] = version_build_slot2_tor2
elif mux_info_dict[("run_slot2_tor2".format(side))] == "True":
# slot 2 is active for self
result_dict["version_self_active"] = version_build_slot2_tor2
result_dict["version_self_inactive"] = version_build_slot1_tor2

if mux_info_dict[("run_slot1_tor1".format(side))] == "True":
# slot 1 is active for peer
result_dict["version_peer_active"] = version_build_slot1_tor1
result_dict["version_peer_inactive"] = version_build_slot2_tor1
elif mux_info_dict[("run_slot2_tor1".format(side))] == "True":
# slot 2 is active for peer
result_dict["version_peer_active"] = version_build_slot2_tor1
result_dict["version_peer_inactive"] = version_build_slot1_tor1

if mux_info_dict[("commit_slot1_tor2".format(side))] == "True":
result_dict["version_self_next"] = version_build_slot1_tor2
elif mux_info_dict[("commit_slot2_tor2".format(side))] == "True":
result_dict["version_self_next"] = version_build_slot2_tor2

if mux_info_dict[("commit_slot1_tor1".format(side))] == "True":
result_dict["version_peer_next"] = version_build_slot1_tor1
elif mux_info_dict[("commit_slot2_tor1".format(side))] == "True":
result_dict["version_peer_next"] = version_build_slot2_tor1

if mux_info_dict[("run_slot1_nic".format(side))] == "True":
# slot 1 is active for self
result_dict["version_nic_active"] = version_build_slot1_nic
result_dict["version_nic_inactive"] = version_build_slot2_nic
elif mux_info_dict[("run_slot2_nic".format(side))] == "True":
# slot 2 is active for self
result_dict["version_nic_active"] = version_build_slot2_nic
result_dict["version_nic_inactive"] = version_build_slot1_nic

if mux_info_dict[("commit_slot1_nic".format(side))] == "True":
result_dict["version_nic_next"] = version_build_slot1_nic
elif mux_info_dict[("commit_slot2_nic".format(side))] == "True":
result_dict["version_nic_next"] = version_build_slot2_nic


def get_firmware_dict(physical_port, target, side, mux_info_dict):

import sonic_y_cable.y_cable
result = sonic_y_cable.y_cable.get_firmware_version(physical_port, target)

if result is not None and isinstance(result, dict):
mux_info_dict[("build_slot1_{}".format(side))] = result.get("build_slot1", None)
mux_info_dict[("version_slot1_{}".format(side))] = result.get("version_slot1", None)
mux_info_dict[("build_slot2_{}".format(side))] = result.get("build_slot2", None)
mux_info_dict[("version_slot2_{}".format(side))] = result.get("version_slot2", None)
mux_info_dict[("run_slot1_{}".format(side))] = result.get("run_slot1", None)
mux_info_dict[("run_slot2_{}".format(side))] = result.get("run_slot2", None)
mux_info_dict[("commit_slot1_{}".format(side))] = result.get("commit_slot1", None)
mux_info_dict[("commit_slot2_{}".format(side))] = result.get("commit_slot2", None)
mux_info_dict[("empty_slot1_{}".format(side))] = result.get("empty_slot1", None)
mux_info_dict[("empty_slot2_{}".format(side))] = result.get("empty_slot2", None)
mux_info_dict[("version_{}_active".format(side))] = result.get("version_active", None)
mux_info_dict[("version_{}_inactive".format(side))] = result.get("version_inactive", None)
mux_info_dict[("version_{}_next".format(side))] = result.get("version_next", None)

else:
mux_info_dict[("build_slot1_{}".format(side))] = "N/A"
mux_info_dict[("version_slot1_{}".format(side))] = "N/A"
mux_info_dict[("build_slot2_{}".format(side))] = "N/A"
mux_info_dict[("version_slot2_{}".format(side))] = "N/A"
mux_info_dict[("run_slot1_{}".format(side))] = "N/A"
mux_info_dict[("run_slot2_{}".format(side))] = "N/A"
mux_info_dict[("commit_slot1_{}".format(side))] = "N/A"
mux_info_dict[("commit_slot2_{}".format(side))] = "N/A"
mux_info_dict[("empty_slot1_{}".format(side))] = "N/A"
mux_info_dict[("empty_slot2_{}".format(side))] = "N/A"
mux_info_dict[("version_{}_active".format(side))] = "N/A"
mux_info_dict[("version_{}_inactive".format(side))] = "N/A"
mux_info_dict[("version_{}_next".format(side))] = "N/A"


@muxcable.group(cls=clicommon.AbbreviationGroup)
Expand All @@ -957,6 +853,7 @@ def version(port):
port_table_keys = {}
y_cable_asic_table_keys = {}
per_npu_statedb = {}
physical_port_list = []

# Getting all front asic namespace and correspding config and state DB connector

Expand All @@ -970,10 +867,13 @@ def version(port):
port_table_keys[asic_id] = per_npu_statedb[asic_id].keys(
per_npu_statedb[asic_id].STATE_DB, 'MUX_CABLE_TABLE|*')

if port is not None and port != "all":
if port is not None:

if platform_sfputil is not None:
physical_port_list = platform_sfputil_helper.logical_port_name_to_physical_port_list(port)
logical_port_list = platform_sfputil_helper.get_logical_list()

if port not in logical_port_list:
click.echo(("ERR: Not a valid logical port for muxcable firmware {}".format(port)))
sys.exit(CONFIG_FAIL)

asic_index = None
if platform_sfputil is not None:
Expand All @@ -986,6 +886,9 @@ def version(port):
if asic_index is None:
click.echo("Got invalid asic index for port {}, cant retreive mux status".format(port))

if platform_sfputil is not None:
physical_port_list = platform_sfputil_helper.logical_port_name_to_physical_port_list(port)

if not isinstance(physical_port_list, list):
click.echo(("ERR: Unable to locate physical port information for {}".format(port)))
sys.exit(CONFIG_FAIL)
Expand All @@ -996,17 +899,26 @@ def version(port):
sys.exit(CONFIG_FAIL)

mux_info_dict = {}
result_dict = {}
physical_port = physical_port_list[0]
if per_npu_statedb[asic_index] is not None:
y_cable_asic_table_keys = port_table_keys[asic_index]
logical_key = "MUX_CABLE_TABLE|{}".format(port)
import sonic_y_cable.y_cable
read_side = sonic_y_cable.y_cable.check_read_side(physical_port)
if logical_key in y_cable_asic_table_keys:
get_firmware_dict(physical_port, 0, "nic", mux_info_dict)
get_firmware_dict(physical_port, 1, "tor1", mux_info_dict)
get_firmware_dict(physical_port, 2, "tor2", mux_info_dict)
create_result_dict(physical_port, mux_info_dict, result_dict)
click.echo("{}".format(json.dumps(mux_info_dict, indent=4)))
if read_side == 1:
get_firmware_dict(physical_port, 1, "self", mux_info_dict)
get_firmware_dict(physical_port, 2, "peer", mux_info_dict)
get_firmware_dict(physical_port, 0, "nic", mux_info_dict)
click.echo("{}".format(json.dumps(mux_info_dict, indent=4)))
elif read_side == 2:
get_firmware_dict(physical_port, 2, "self", mux_info_dict)
get_firmware_dict(physical_port, 1, "peer", mux_info_dict)
get_firmware_dict(physical_port, 0, "nic", mux_info_dict)
click.echo("{}".format(json.dumps(mux_info_dict, indent=4)))
else:
click.echo("Did not get a valid read_side for muxcable".format(port))
sys.exit(CONFIG_FAIL)

else:
click.echo("this is not a valid port present on mux_cable".format(port))
Expand Down
Loading