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:
parent
58d59db30f
commit
22a3a5a271
|
@ -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):
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -0,0 +1,3 @@
|
|||
---
|
||||
features: Adds support for the injection of Non-Masking Interrupts
|
||||
(NMI) to ipmitool driver.
|
Loading…
Reference in New Issue