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:
Naohiro Tamura 2016-07-29 14:12:52 +09:00
parent 58d59db30f
commit c46b720036
4 changed files with 61 additions and 0 deletions

View File

@ -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)

View File

@ -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)

View File

@ -114,6 +114,7 @@ SCCICLIENT_IRMC_SCCI_SPEC = (
'POWER_ON',
'POWER_RESET',
'MOUNT_CD',
'POWER_RAISE_NMI',
'UNMOUNT_CD',
'MOUNT_FD',
'UNMOUNT_FD',

View File

@ -0,0 +1,4 @@
---
features:
- Adds support for the injection of Non-Masking Interrupts (NMI) to
iRMC driver.