iRMC management driver for Inject NMI
This patch enhances iRMC management driver to support Inject NMI. Partial-Bug: #1526226 Change-Id: Id9dde5094239f215297d350a78b005accbdd8be4
This commit is contained in:
parent
58d59db30f
commit
c46b720036
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -114,6 +114,7 @@ SCCICLIENT_IRMC_SCCI_SPEC = (
|
||||
'POWER_ON',
|
||||
'POWER_RESET',
|
||||
'MOUNT_CD',
|
||||
'POWER_RAISE_NMI',
|
||||
'UNMOUNT_CD',
|
||||
'MOUNT_FD',
|
||||
'UNMOUNT_FD',
|
||||
|
4
releasenotes/notes/irmc-inject-nmi-20b7824abad6beda.yaml
Normal file
4
releasenotes/notes/irmc-inject-nmi-20b7824abad6beda.yaml
Normal file
@ -0,0 +1,4 @@
|
||||
---
|
||||
features:
|
||||
- Adds support for the injection of Non-Masking Interrupts (NMI) to
|
||||
iRMC driver.
|
Loading…
x
Reference in New Issue
Block a user