Skip to content

Commit 109504a

Browse files
[sfputil] Fix issue: should not do low power mode or reset for non-present ports
Signed-off-by: Junchao-Mellanox <junchao@nvidia.com>
1 parent 137d594 commit 109504a

File tree

2 files changed

+71
-17
lines changed

2 files changed

+71
-17
lines changed

sfputil/main.py

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1181,7 +1181,11 @@ def lpmode(port):
11811181
port_name = get_physical_port_name(logical_port_name, i, ganged)
11821182

11831183
try:
1184-
lpmode = platform_chassis.get_sfp(physical_port).get_lpmode()
1184+
sfp = platform_chassis.get_sfp(physical_port)
1185+
if not sfp.get_presence():
1186+
output_table.append([port_name, "Not Present"])
1187+
continue
1188+
lpmode = sfp.get_lpmode()
11851189
except NotImplementedError:
11861190
click.echo("This functionality is currently not implemented for this platform")
11871191
sys.exit(ERROR_NOT_IMPLEMENTED)
@@ -1261,12 +1265,15 @@ def set_lpmode(logical_port, enable):
12611265
ganged = True
12621266

12631267
for physical_port in physical_port_list:
1264-
click.echo("{} low-power mode for port {} ... ".format(
1265-
"Enabling" if enable else "Disabling",
1266-
get_physical_port_name(logical_port, i, ganged)), nl=False)
1267-
12681268
try:
1269-
result = platform_chassis.get_sfp(physical_port).set_lpmode(enable)
1269+
sfp = platform_chassis.get_sfp(physical_port)
1270+
if not sfp.get_presence():
1271+
click.echo(f"{logical_port}: module {physical_port} is not present, skipping")
1272+
continue
1273+
click.echo("{} low-power mode for port {} ... ".format(
1274+
"Enabling" if enable else "Disabling",
1275+
get_physical_port_name(logical_port, i, ganged)), nl=False)
1276+
result = sfp.set_lpmode(enable)
12701277
except NotImplementedError:
12711278
click.echo("This functionality is currently not implemented for this platform")
12721279
sys.exit(ERROR_NOT_IMPLEMENTED)
@@ -1321,10 +1328,13 @@ def reset(port_name):
13211328
ganged = True
13221329

13231330
for physical_port in physical_port_list:
1324-
click.echo("Resetting port {} ... ".format(get_physical_port_name(port_name, i, ganged)), nl=False)
1325-
13261331
try:
1327-
result = platform_chassis.get_sfp(physical_port).reset()
1332+
sfp = platform_chassis.get_sfp(physical_port)
1333+
if not sfp.get_presence():
1334+
click.echo(f"{port_name}: module {physical_port} is not present, skipping")
1335+
continue
1336+
click.echo("Resetting port {} ... ".format(get_physical_port_name(port_name, i, ganged)), nl=False)
1337+
result = sfp.reset()
13281338
except NotImplementedError:
13291339
click.echo("This functionality is currently not implemented for this platform")
13301340
sys.exit(ERROR_NOT_IMPLEMENTED)

tests/sfputil_test.py

Lines changed: 52 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -588,6 +588,7 @@ def test_show_lpmode(self, mock_chassis):
588588
mock_api = MagicMock()
589589
mock_sfp.get_xcvr_api = MagicMock(return_value=mock_api)
590590
mock_sfp.get_lpmode.return_value = True
591+
mock_sfp.get_presence = MagicMock(return_value=True)
591592
mock_chassis.get_sfp = MagicMock(return_value=mock_sfp)
592593
runner = CliRunner()
593594
result = runner.invoke(sfputil.cli.commands['show'].commands['lpmode'], ["-p", "Ethernet0"])
@@ -604,9 +605,19 @@ def test_show_lpmode(self, mock_chassis):
604605
expected_output = """Port Low-power Mode
605606
--------- ----------------
606607
Ethernet0 Off
608+
"""
609+
assert result.output == expected_output
610+
611+
mock_sfp.get_presence.return_value = False
612+
result = runner.invoke(sfputil.cli.commands['show'].commands['lpmode'], ["-p", "Ethernet0"])
613+
assert result.exit_code == 0
614+
expected_output = """Port Low-power Mode
615+
--------- ----------------
616+
Ethernet0 Not Present
607617
"""
608618
assert result.output == expected_output
609619

620+
mock_sfp.get_presence.return_value = True
610621
mock_sfp.get_lpmode.return_value = False
611622
mock_sfp.get_transceiver_info = MagicMock(return_value={'type': sfputil.RJ45_PORT_TYPE})
612623
mock_chassis.get_port_or_cage_type = MagicMock(return_value=sfputil.SfpBase.SFP_PORT_TYPE_BIT_RJ45)
@@ -1159,23 +1170,56 @@ def test_eeprom_hexdump_single_port(self, mock_isinstance, mock_dump, mock_chass
11591170
sfputil.eeprom_hexdump_single_port('Ethernet0', 3)
11601171
mock_dump.assert_called_with('Ethernet0', [0, 3], 3)
11611172

1162-
1163-
1164-
@patch('sfputil.main.logical_port_name_to_physical_port_list', MagicMock(return_value=1))
1165-
@patch('sfputil.main.is_port_type_rj45', MagicMock(return_value=True))
1173+
@patch('sfputil.main.logical_port_name_to_physical_port_list', MagicMock(return_value=[1]))
1174+
@patch('sfputil.main.platform_chassis')
1175+
@patch('sfputil.main.is_port_type_rj45')
11661176
@patch('sfputil.main.platform_sfputil', MagicMock(is_logical_port=MagicMock(return_value=1)))
1167-
def test_lpmode_set(self):
1177+
def test_lpmode_set(self, mock_is_rj45, mock_chassis):
11681178
runner = CliRunner()
1179+
mock_is_rj45.return_value = False
1180+
mock_sfp = MagicMock()
1181+
mock_api = MagicMock()
1182+
mock_sfp.get_xcvr_api = MagicMock(return_value=mock_api)
1183+
mock_sfp.get_presence.return_value = True
1184+
mock_chassis.get_sfp = MagicMock(return_value=mock_sfp)
1185+
result = runner.invoke(sfputil.cli.commands['lpmode'].commands['on'], ["Ethernet0"])
1186+
assert result.exit_code == 0
1187+
assert result.output == "Enabling low-power mode for port Ethernet0 ... OK\n"
1188+
1189+
mock_sfp.get_presence.return_value = False
1190+
result = runner.invoke(sfputil.cli.commands['lpmode'].commands['on'], ["Ethernet0"])
1191+
assert result.exit_code == 0
1192+
assert result.output == "Ethernet0: module 1 is not present, skipping\n"
1193+
1194+
mock_is_rj45.return_value = True
11691195
result = runner.invoke(sfputil.cli.commands['lpmode'].commands['on'], ["Ethernet0"])
11701196
assert result.output == 'Enabling low-power mode is not applicable for RJ45 port Ethernet0.\n'
11711197
assert result.exit_code == EXIT_FAIL
11721198

1173-
@patch('sfputil.main.logical_port_name_to_physical_port_list', MagicMock(return_value=1))
1174-
@patch('sfputil.main.is_port_type_rj45', MagicMock(return_value=True))
1199+
@patch('sfputil.main.logical_port_name_to_physical_port_list', MagicMock(return_value=[1]))
1200+
@patch('sfputil.main.platform_chassis')
1201+
@patch('sfputil.main.is_port_type_rj45')
11751202
@patch('sfputil.main.platform_sfputil', MagicMock(is_logical_port=MagicMock(return_value=1)))
1176-
def test_reset_RJ45(self):
1203+
def test_reset_RJ45(self, mock_is_rj45, mock_chassis):
1204+
mock_is_rj45.return_value = False
1205+
mock_sfp = MagicMock()
1206+
mock_api = MagicMock()
1207+
mock_sfp.get_xcvr_api = MagicMock(return_value=mock_api)
1208+
mock_sfp.get_presence = MagicMock(return_value=True)
1209+
mock_sfp.reset = MagicMock(return_value=True)
1210+
mock_chassis.get_sfp = MagicMock(return_value=mock_sfp)
11771211
runner = CliRunner()
11781212
result = runner.invoke(sfputil.cli.commands['reset'], ["Ethernet0"])
1213+
assert result.exit_code == 0
1214+
assert result.output == "Resetting port Ethernet0 ... OK\n"
1215+
1216+
mock_sfp.get_presence.return_value = False
1217+
result = runner.invoke(sfputil.cli.commands['reset'], ["Ethernet0"])
1218+
assert result.exit_code == 0
1219+
assert result.output == "Ethernet0: module 1 is not present, skipping\n"
1220+
1221+
mock_is_rj45.return_value = True
1222+
result = runner.invoke(sfputil.cli.commands['reset'], ["Ethernet0"])
11791223
assert result.output == 'Reset is not applicable for RJ45 port Ethernet0.\n'
11801224
assert result.exit_code == EXIT_FAIL
11811225

0 commit comments

Comments
 (0)