Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 19 additions & 9 deletions sfputil/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -1181,7 +1181,11 @@ def lpmode(port):
port_name = get_physical_port_name(logical_port_name, i, ganged)

try:
lpmode = platform_chassis.get_sfp(physical_port).get_lpmode()
sfp = platform_chassis.get_sfp(physical_port)
if not sfp.get_presence():
output_table.append([port_name, "Not Present"])
continue
lpmode = sfp.get_lpmode()
except NotImplementedError:
click.echo("This functionality is currently not implemented for this platform")
sys.exit(ERROR_NOT_IMPLEMENTED)
Expand Down Expand Up @@ -1261,12 +1265,15 @@ def set_lpmode(logical_port, enable):
ganged = True

for physical_port in physical_port_list:
click.echo("{} low-power mode for port {} ... ".format(
"Enabling" if enable else "Disabling",
get_physical_port_name(logical_port, i, ganged)), nl=False)

try:
result = platform_chassis.get_sfp(physical_port).set_lpmode(enable)
sfp = platform_chassis.get_sfp(physical_port)
if not sfp.get_presence():
click.echo(f"{logical_port}: module {physical_port} is not present, skipping")
continue
click.echo("{} low-power mode for port {} ... ".format(
"Enabling" if enable else "Disabling",
get_physical_port_name(logical_port, i, ganged)), nl=False)
result = sfp.set_lpmode(enable)
except NotImplementedError:
click.echo("This functionality is currently not implemented for this platform")
sys.exit(ERROR_NOT_IMPLEMENTED)
Expand Down Expand Up @@ -1321,10 +1328,13 @@ def reset(port_name):
ganged = True

for physical_port in physical_port_list:
click.echo("Resetting port {} ... ".format(get_physical_port_name(port_name, i, ganged)), nl=False)

try:
result = platform_chassis.get_sfp(physical_port).reset()
sfp = platform_chassis.get_sfp(physical_port)
if not sfp.get_presence():
click.echo(f"{port_name}: module {physical_port} is not present, skipping")
continue
click.echo("Resetting port {} ... ".format(get_physical_port_name(port_name, i, ganged)), nl=False)
result = sfp.reset()
except NotImplementedError:
click.echo("This functionality is currently not implemented for this platform")
sys.exit(ERROR_NOT_IMPLEMENTED)
Expand Down
60 changes: 52 additions & 8 deletions tests/sfputil_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -588,6 +588,7 @@ def test_show_lpmode(self, mock_chassis):
mock_api = MagicMock()
mock_sfp.get_xcvr_api = MagicMock(return_value=mock_api)
mock_sfp.get_lpmode.return_value = True
mock_sfp.get_presence = MagicMock(return_value=True)
mock_chassis.get_sfp = MagicMock(return_value=mock_sfp)
runner = CliRunner()
result = runner.invoke(sfputil.cli.commands['show'].commands['lpmode'], ["-p", "Ethernet0"])
Expand All @@ -607,6 +608,16 @@ def test_show_lpmode(self, mock_chassis):
"""
assert result.output == expected_output

mock_sfp.get_presence.return_value = False
result = runner.invoke(sfputil.cli.commands['show'].commands['lpmode'], ["-p", "Ethernet0"])
assert result.exit_code == 0
expected_output = """Port Low-power Mode
--------- ----------------
Ethernet0 Not Present
"""
assert result.output == expected_output

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



@patch('sfputil.main.logical_port_name_to_physical_port_list', MagicMock(return_value=1))
@patch('sfputil.main.is_port_type_rj45', MagicMock(return_value=True))
@patch('sfputil.main.logical_port_name_to_physical_port_list', MagicMock(return_value=[1]))
@patch('sfputil.main.platform_chassis')
@patch('sfputil.main.is_port_type_rj45')
@patch('sfputil.main.platform_sfputil', MagicMock(is_logical_port=MagicMock(return_value=1)))
def test_lpmode_set(self):
def test_lpmode_set(self, mock_is_rj45, mock_chassis):
runner = CliRunner()
mock_is_rj45.return_value = False
mock_sfp = MagicMock()
mock_api = MagicMock()
mock_sfp.get_xcvr_api = MagicMock(return_value=mock_api)
mock_sfp.get_presence.return_value = True
mock_chassis.get_sfp = MagicMock(return_value=mock_sfp)
result = runner.invoke(sfputil.cli.commands['lpmode'].commands['on'], ["Ethernet0"])
assert result.exit_code == 0
assert result.output == "Enabling low-power mode for port Ethernet0 ... OK\n"

mock_sfp.get_presence.return_value = False
result = runner.invoke(sfputil.cli.commands['lpmode'].commands['on'], ["Ethernet0"])
assert result.exit_code == 0
assert result.output == "Ethernet0: module 1 is not present, skipping\n"

mock_is_rj45.return_value = True
result = runner.invoke(sfputil.cli.commands['lpmode'].commands['on'], ["Ethernet0"])
assert result.output == 'Enabling low-power mode is not applicable for RJ45 port Ethernet0.\n'
assert result.exit_code == EXIT_FAIL

@patch('sfputil.main.logical_port_name_to_physical_port_list', MagicMock(return_value=1))
@patch('sfputil.main.is_port_type_rj45', MagicMock(return_value=True))
@patch('sfputil.main.logical_port_name_to_physical_port_list', MagicMock(return_value=[1]))
@patch('sfputil.main.platform_chassis')
@patch('sfputil.main.is_port_type_rj45')
@patch('sfputil.main.platform_sfputil', MagicMock(is_logical_port=MagicMock(return_value=1)))
def test_reset_RJ45(self):
def test_reset_RJ45(self, mock_is_rj45, mock_chassis):
mock_is_rj45.return_value = False
mock_sfp = MagicMock()
mock_api = MagicMock()
mock_sfp.get_xcvr_api = MagicMock(return_value=mock_api)
mock_sfp.get_presence = MagicMock(return_value=True)
mock_sfp.reset = MagicMock(return_value=True)
mock_chassis.get_sfp = MagicMock(return_value=mock_sfp)
runner = CliRunner()
result = runner.invoke(sfputil.cli.commands['reset'], ["Ethernet0"])
assert result.exit_code == 0
assert result.output == "Resetting port Ethernet0 ... OK\n"

mock_sfp.get_presence.return_value = False
result = runner.invoke(sfputil.cli.commands['reset'], ["Ethernet0"])
assert result.exit_code == 0
assert result.output == "Ethernet0: module 1 is not present, skipping\n"

mock_is_rj45.return_value = True
result = runner.invoke(sfputil.cli.commands['reset'], ["Ethernet0"])
assert result.output == 'Reset is not applicable for RJ45 port Ethernet0.\n'
assert result.exit_code == EXIT_FAIL

Expand Down
Loading