Skip to content

Commit 71185ef

Browse files
g[sfputil debug] Fix issue: do not check output status when CMIS version is lower than 5.0
1 parent 5db9c27 commit 71185ef

File tree

2 files changed

+52
-7
lines changed

2 files changed

+52
-7
lines changed

sfputil/debug.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,11 +97,13 @@ def set_output(port_name, enable, direction):
9797
if direction == "tx":
9898
lane_count = get_media_lane_count(port_name)
9999
disable_func = sfp.tx_disable_channel
100+
get_disable_status_func = api.get_tx_disable
100101
get_status_func = api.get_tx_output_status
101102
status_key = "TxOutputStatus"
102103
elif direction == "rx":
103104
lane_count = get_host_lane_count(port_name)
104105
disable_func = sfp.rx_disable_channel
106+
get_disable_status_func = api.get_rx_disable
105107
get_status_func = api.get_rx_output_status
106108
status_key = "RxOutputStatus"
107109

@@ -112,6 +114,39 @@ def set_output(port_name, enable, direction):
112114

113115
time.sleep(TX_RX_OUTPUT_UPDATE_WAIT_TIME)
114116

117+
disable_status_list = get_disable_status_func()
118+
if not disable_status_list:
119+
click.echo(f"{port_name}: {direction.upper()} disable status not available for subport {subport}")
120+
sys.exit(EXIT_FAIL)
121+
122+
for lane in range(1, CMIS_MAX_CHANNELS + 1):
123+
if lane_mask & (1 << (lane - 1)):
124+
disable_status = disable_status_list[lane - 1]
125+
if enable == "disable":
126+
if not disable_status or disable_status == "N/A":
127+
click.echo(f"{port_name}: {direction.upper()} output on lane {lane} is still "
128+
f"enabled on subport {subport}. Restoring state.")
129+
sys.exit(EXIT_FAIL)
130+
else:
131+
if disable_status or disable_status == "N/A":
132+
click.echo(f"{port_name}: {direction.upper()} output on lane {lane} is still "
133+
f"disabled on subport {subport}. Restoring state.")
134+
sys.exit(EXIT_FAIL)
135+
136+
if hasattr(api, 'get_cmis_rev'):
137+
cmis_rev = api.get_cmis_rev()
138+
if cmis_rev is None:
139+
click.echo(f"{port_name}: CMIS revision not available for subport {subport}")
140+
sys.exit(EXIT_FAIL)
141+
142+
# OutputStatusRx and OutputStatusTx are supported from CMIS 5.0
143+
if float(cmis_rev) < 5.0:
144+
click.echo(
145+
f"{port_name}: {direction.upper()} output "
146+
f"{'disabled' if enable == 'disable' else 'enabled'} on subport {subport}"
147+
)
148+
return
149+
115150
output_dict = get_status_func()
116151
if output_dict is None:
117152
click.echo(f"{port_name}: {direction.upper()} output status not available for subport {subport}")

tests/sfputil_test.py

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1822,23 +1822,29 @@ def test_debug_loopback(self, mock_sonic_v2_connector, mock_config_db_connector,
18221822
assert result.exit_code == EXIT_FAIL
18231823

18241824
@pytest.mark.parametrize(
1825-
"direction, lane_count, enable, disable_func_result, output_dict, expected_echo, expected_exit",
1825+
"direction, lane_count, enable, disable_func_result, disable_status, output_dict, expected_echo, expected_exit",
18261826
[
18271827
# TX disable success
18281828
(
1829-
"tx", 2, "disable", True, {"TxOutputStatus1": False, "TxOutputStatus2": False},
1829+
"tx", 2, "disable", True, [True, True], {"TxOutputStatus1": False, "TxOutputStatus2": False},
18301830
"TX output disabled", None
18311831
),
18321832
# RX enable success
1833-
("rx", 1, "enable", True, {"RxOutputStatus1": True}, "RX output enabled", None),
1833+
("rx", 1, "enable", True, [False], {"RxOutputStatus1": True}, "RX output enabled", None),
18341834
# TX disable fails to disable
1835-
("tx", 1, "disable", True, {"TxOutputStatus1": True}, "TX output on lane 1 is still enabled", SystemExit),
1835+
(
1836+
"tx", 1, "disable", True, [True], {"TxOutputStatus1": True},
1837+
"TX output on lane 1 is still enabled", SystemExit
1838+
),
18361839
# RX enable fails to enable
1837-
("rx", 1, "enable", True, {"RxOutputStatus1": False}, "RX output on lane 1 is still disabled", SystemExit),
1840+
(
1841+
"rx", 1, "enable", True, [False], {"RxOutputStatus1": False},
1842+
"RX output on lane 1 is still disabled", SystemExit
1843+
),
18381844
# TX disable_func returns False
1839-
("tx", 1, "disable", False, {}, "TX disable failed", SystemExit),
1845+
("tx", 1, "disable", False, [True], {}, "TX disable failed", SystemExit),
18401846
# RX output_dict is None
1841-
("rx", 1, "disable", True, None, "RX output status not available", SystemExit),
1847+
("rx", 1, "disable", True, [True], None, "RX output status not available", SystemExit),
18421848
]
18431849
)
18441850
@patch("sfputil.debug.get_sfp_object")
@@ -1857,6 +1863,7 @@ def test_set_output_cli(
18571863
lane_count,
18581864
enable,
18591865
disable_func_result,
1866+
disable_status,
18601867
output_dict,
18611868
expected_echo,
18621869
expected_exit
@@ -1875,12 +1882,15 @@ def test_set_output_cli(
18751882
# Mock SFP and API
18761883
mock_sfp = MagicMock()
18771884
mock_api = MagicMock()
1885+
mock_api.get_cmis_rev.return_value = "5.0"
18781886
if direction == "tx":
18791887
mock_sfp.tx_disable_channel.return_value = disable_func_result
18801888
mock_api.get_tx_output_status.return_value = output_dict
1889+
mock_api.get_tx_disable.return_value = disable_status
18811890
elif direction == "rx":
18821891
mock_sfp.rx_disable_channel.return_value = disable_func_result
18831892
mock_api.get_rx_output_status.return_value = output_dict
1893+
mock_api.get_rx_disable.return_value = disable_status
18841894
mock_sfp.get_xcvr_api.return_value = mock_api
18851895
mock_get_sfp_object.return_value = mock_sfp
18861896

0 commit comments

Comments
 (0)