Ipmitool management driver for Inject NMI

This patch enhances ipmitool management driver to support Inject NMI.

Partial-Bug: #1526226
Change-Id: I6def498a6f242b34f647bb670d3fbfcb99fb667a
This commit is contained in:
Naohiro Tamura 2016-07-29 12:02:59 +09:00
parent 58d59db30f
commit 22a3a5a271
3 changed files with 48 additions and 0 deletions

View File

@ -1037,6 +1037,27 @@ class IPMIManagement(base.ManagementInterface):
return _parse_ipmi_sensors_data(task.node, out)
@METRICS.timer('IPMIManagement.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: IPMIFailure on an error from ipmitool.
:returns: None
"""
driver_info = _parse_driver_info(task.node)
try:
_exec_ipmitool(driver_info, "power diag")
except (exception.PasswordFileFailedToCreate,
processutils.ProcessExecutionError) as err:
LOG.error(_LE('Inject NMI failed for node %(node)s: %(err)s.'),
{'node': task.node.uuid, 'err': err})
raise exception.IPMIFailure(cmd="power diag")
class VendorPassthru(base.VendorInterface):

View File

@ -1958,6 +1958,30 @@ class IPMIToolDriverTestCase(db_base.DbTestCase):
self.assertRaises(exception.MissingParameterValue,
task.driver.management.validate, task)
@mock.patch.object(ipmi.LOG, 'error', spec_set=True, autospec=True)
@mock.patch.object(ipmi, '_exec_ipmitool', autospec=True)
def test_management_interface_inject_nmi_ok(self, mock_exec, mock_log):
with task_manager.acquire(self.context, self.node.uuid) as task:
driver_info = ipmi._parse_driver_info(task.node)
self.driver.management.inject_nmi(task)
mock_exec.assert_called_once_with(driver_info, "power diag")
self.assertFalse(mock_log.called)
@mock.patch.object(ipmi.LOG, 'error', spec_set=True, autospec=True)
@mock.patch.object(ipmi, '_exec_ipmitool', autospec=True)
def test_management_interface_inject_nmi_fail(self, mock_exec, mock_log):
mock_exec.side_effect = exception.PasswordFileFailedToCreate('error')
with task_manager.acquire(self.context, self.node.uuid) as task:
driver_info = ipmi._parse_driver_info(task.node)
self.assertRaises(exception.IPMIFailure,
self.driver.management.inject_nmi,
task)
mock_exec.assert_called_once_with(driver_info, "power diag")
self.assertTrue(mock_log.called)
def test__parse_ipmi_sensor_data_ok(self):
fake_sensors_data = """
Sensor ID : Temp (0x1)

View File

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