diff --git a/sfputil/main.py b/sfputil/main.py index 5f1ba0af2d..be335cb97b 100644 --- a/sfputil/main.py +++ b/sfputil/main.py @@ -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) @@ -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) @@ -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) diff --git a/tests/sfputil_test.py b/tests/sfputil_test.py index ddfb4c8d41..551584d4b9 100644 --- a/tests/sfputil_test.py +++ b/tests/sfputil_test.py @@ -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"]) @@ -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) @@ -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