From c46b720036a3cb6c07b3c76913ede8cb02ecdae2 Mon Sep 17 00:00:00 2001 From: Naohiro Tamura Date: Fri, 29 Jul 2016 14:12:52 +0900 Subject: [PATCH] iRMC management driver for Inject NMI This patch enhances iRMC management driver to support Inject NMI. Partial-Bug: #1526226 Change-Id: Id9dde5094239f215297d350a78b005accbdd8be4 --- ironic/drivers/modules/irmc/management.py | 23 +++++++++++++ .../drivers/modules/irmc/test_management.py | 33 +++++++++++++++++++ .../drivers/third_party_driver_mock_specs.py | 1 + .../irmc-inject-nmi-20b7824abad6beda.yaml | 4 +++ 4 files changed, 61 insertions(+) create mode 100644 releasenotes/notes/irmc-inject-nmi-20b7824abad6beda.yaml diff --git a/ironic/drivers/modules/irmc/management.py b/ironic/drivers/modules/irmc/management.py index ea85d92160..7aac1683fb 100644 --- a/ironic/drivers/modules/irmc/management.py +++ b/ironic/drivers/modules/irmc/management.py @@ -233,3 +233,26 @@ class IRMCManagement(ipmitool.IPMIManagement): return _get_sensors_data(task) elif sensor_method == 'ipmitool': return super(IRMCManagement, self).get_sensors_data(task) + + @METRICS.timer('IRMCManagement.inject_nmi') + @task_manager.require_exclusive_lock + def inject_nmi(self, task): + """Inject NMI, Non Maskable Interrupt. + + Inject NMI (Non Maskable Interrupt) for a node immediately. + + :param task: A TaskManager instance containing the node to act on. + :raises: IRMCOperationError on an error from SCCI + :returns: None + + """ + node = task.node + irmc_client = irmc_common.get_irmc_client(node) + try: + irmc_client(scci.POWER_RAISE_NMI) + except scci.SCCIClientError as err: + LOG.error( + _LE('iRMC Inject NMI failed for node %(node)s: %(err)s.'), + {'node': node.uuid, 'err': err}) + raise exception.IRMCOperationError( + operation=scci.POWER_RAISE_NMI, error=err) diff --git a/ironic/tests/unit/drivers/modules/irmc/test_management.py b/ironic/tests/unit/drivers/modules/irmc/test_management.py index f197692a4e..48da7ee9e3 100644 --- a/ironic/tests/unit/drivers/modules/irmc/test_management.py +++ b/ironic/tests/unit/drivers/modules/irmc/test_management.py @@ -361,3 +361,36 @@ class IRMCManagementTestCase(db_base.DbTestCase): self.assertEqual("Failed to get sensor data for node 1be26c0b-" + "03f2-4d2e-ae87-c02d7f33c123. Error: Fake Error", str(e)) + + @mock.patch.object(irmc_management.LOG, 'error', spec_set=True, + autospec=True) + @mock.patch.object(irmc_common, 'get_irmc_client', spec_set=True, + autospec=True) + def test_management_interface_inject_nmi_ok(self, mock_get_irmc_client, + mock_log): + irmc_client = mock_get_irmc_client.return_value + with task_manager.acquire(self.context, self.node.uuid) as task: + self.driver.management.inject_nmi(task) + + irmc_client.assert_called_once_with( + irmc_management.scci.POWER_RAISE_NMI) + self.assertFalse(mock_log.called) + + @mock.patch.object(irmc_management.LOG, 'error', spec_set=True, + autospec=True) + @mock.patch.object(irmc_common, 'get_irmc_client', spec_set=True, + autospec=True) + def test_management_interface_inject_nmi_fail(self, mock_get_irmc_client, + mock_log): + irmc_client = mock_get_irmc_client.return_value + irmc_client.side_effect = Exception() + irmc_management.scci.SCCIClientError = Exception + + with task_manager.acquire(self.context, self.node.uuid) as task: + self.assertRaises(exception.IRMCOperationError, + self.driver.management.inject_nmi, + task) + + irmc_client.assert_called_once_with( + irmc_management.scci.POWER_RAISE_NMI) + self.assertTrue(mock_log.called) diff --git a/ironic/tests/unit/drivers/third_party_driver_mock_specs.py b/ironic/tests/unit/drivers/third_party_driver_mock_specs.py index 0519e8c8ab..d7c766f1a8 100644 --- a/ironic/tests/unit/drivers/third_party_driver_mock_specs.py +++ b/ironic/tests/unit/drivers/third_party_driver_mock_specs.py @@ -114,6 +114,7 @@ SCCICLIENT_IRMC_SCCI_SPEC = ( 'POWER_ON', 'POWER_RESET', 'MOUNT_CD', + 'POWER_RAISE_NMI', 'UNMOUNT_CD', 'MOUNT_FD', 'UNMOUNT_FD', diff --git a/releasenotes/notes/irmc-inject-nmi-20b7824abad6beda.yaml b/releasenotes/notes/irmc-inject-nmi-20b7824abad6beda.yaml new file mode 100644 index 0000000000..f141d84917 --- /dev/null +++ b/releasenotes/notes/irmc-inject-nmi-20b7824abad6beda.yaml @@ -0,0 +1,4 @@ +--- +features: + - Adds support for the injection of Non-Masking Interrupts (NMI) to + iRMC driver.