baremetal: Add Node.inject_nmi method
Noted while attempting to migrate nova from ironicclient to openstacksdk. Change-Id: I3fc92219f55bb723d7675c1c0c078b9c9b8da304 Signed-off-by: Stephen Finucane <stephenfin@redhat.com>
This commit is contained in:
parent
12f75fc818
commit
d0e8970503
@ -16,10 +16,18 @@ Node Operations
|
|||||||
^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^
|
||||||
.. autoclass:: openstack.baremetal.v1._proxy.Proxy
|
.. autoclass:: openstack.baremetal.v1._proxy.Proxy
|
||||||
:noindex:
|
:noindex:
|
||||||
:members: nodes, find_node, get_node, create_node, update_node, patch_node, delete_node,
|
:members: nodes, create_node, find_node, get_node, update_node, patch_node, delete_node,
|
||||||
validate_node, set_node_power_state, set_node_provision_state,
|
set_node_provision_state, set_node_boot_device, set_node_boot_mode,
|
||||||
wait_for_nodes_provision_state, wait_for_node_power_state,
|
set_node_secure_boot, inject_nmi_to_node, wait_for_nodes_provision_state,
|
||||||
wait_for_node_reservation, set_node_maintenance, unset_node_maintenance
|
set_node_power_state, wait_for_node_power_state,
|
||||||
|
wait_for_node_reservation, validate_node, set_node_maintenance,
|
||||||
|
unset_node_maintenance, delete_node, list_node_vendor_passthru
|
||||||
|
|
||||||
|
Node Trait Operations
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
.. autoclass:: openstack.baremetal.v1._proxy.Proxy
|
||||||
|
:noindex:
|
||||||
|
:members: add_node_trait, remove_node_trait, set_node_traits
|
||||||
|
|
||||||
Port Operations
|
Port Operations
|
||||||
^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^
|
||||||
|
@ -68,6 +68,9 @@ STATE_VERSIONS = {
|
|||||||
VIF_VERSION = '1.28'
|
VIF_VERSION = '1.28'
|
||||||
"""API version in which the VIF operations were introduced."""
|
"""API version in which the VIF operations were introduced."""
|
||||||
|
|
||||||
|
INJECT_NMI_VERSION = '1.29'
|
||||||
|
"""API vresion in which support for injecting NMI was introduced."""
|
||||||
|
|
||||||
CONFIG_DRIVE_REBUILD_VERSION = '1.35'
|
CONFIG_DRIVE_REBUILD_VERSION = '1.35'
|
||||||
"""API version in which rebuild accepts a configdrive."""
|
"""API version in which rebuild accepts a configdrive."""
|
||||||
|
|
||||||
|
@ -445,6 +445,21 @@ class Proxy(proxy.Proxy):
|
|||||||
res = self._get_resource(_node.Node, node)
|
res = self._get_resource(_node.Node, node)
|
||||||
return res.set_secure_boot(self, target)
|
return res.set_secure_boot(self, target)
|
||||||
|
|
||||||
|
def inject_nmi_to_node(self, node):
|
||||||
|
"""Inject NMI to node.
|
||||||
|
|
||||||
|
Injects a non-maskable interrupt (NMI) message to the node. This is
|
||||||
|
used when response time is critical, such as during non-recoverable
|
||||||
|
hardware errors. In addition, virsh inject-nmi is useful for triggering
|
||||||
|
a crashdump in Windows guests.
|
||||||
|
|
||||||
|
:param node: The value can be the name or ID of a node or a
|
||||||
|
:class:`~openstack.baremetal.v1.node.Node` instance.
|
||||||
|
:return: None
|
||||||
|
"""
|
||||||
|
res = self._get_resource(_node.Node, node)
|
||||||
|
res.inject_nmi(self)
|
||||||
|
|
||||||
def wait_for_nodes_provision_state(self, nodes, expected_state,
|
def wait_for_nodes_provision_state(self, nodes, expected_state,
|
||||||
timeout=None,
|
timeout=None,
|
||||||
abort_on_failed_state=True,
|
abort_on_failed_state=True,
|
||||||
|
@ -602,6 +602,34 @@ class Node(_common.ListMixin, resource.Resource):
|
|||||||
"the last error is %(error)s" %
|
"the last error is %(error)s" %
|
||||||
{'node': self.id, 'error': self.last_error})
|
{'node': self.id, 'error': self.last_error})
|
||||||
|
|
||||||
|
def inject_nmi(self, session):
|
||||||
|
"""Inject NMI.
|
||||||
|
|
||||||
|
:param session: The session to use for making this request.
|
||||||
|
:return: None
|
||||||
|
"""
|
||||||
|
session = self._get_session(session)
|
||||||
|
version = self._assert_microversion_for(
|
||||||
|
session,
|
||||||
|
'commit',
|
||||||
|
_common.INJECT_NMI_VERSION,
|
||||||
|
)
|
||||||
|
request = self._prepare_request(requires_id=True)
|
||||||
|
request.url = utils.urljoin(request.url, 'management', 'inject_nmi')
|
||||||
|
|
||||||
|
body = {}
|
||||||
|
|
||||||
|
response = session.put(
|
||||||
|
request.url,
|
||||||
|
json=body,
|
||||||
|
headers=request.headers,
|
||||||
|
microversion=version,
|
||||||
|
retriable_status_codes=_common.RETRIABLE_STATUS_CODES,
|
||||||
|
)
|
||||||
|
|
||||||
|
msg = ("Failed to inject NMI to node {node}".format(node=self.id))
|
||||||
|
exceptions.raise_from_response(response, error_message=msg)
|
||||||
|
|
||||||
def set_power_state(self, session, target, wait=False, timeout=None):
|
def set_power_state(self, session, target, wait=False, timeout=None):
|
||||||
"""Run an action modifying this node's power state.
|
"""Run an action modifying this node's power state.
|
||||||
|
|
||||||
|
@ -590,6 +590,35 @@ class TestNodeWaitForReservation(base.TestCase):
|
|||||||
mock_fetch.assert_called_with(self.node, self.session)
|
mock_fetch.assert_called_with(self.node, self.session)
|
||||||
|
|
||||||
|
|
||||||
|
@mock.patch.object(exceptions, 'raise_from_response', mock.Mock())
|
||||||
|
class TestNodeInjectNMI(base.TestCase):
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
super().setUp()
|
||||||
|
self.node = node.Node(**FAKE)
|
||||||
|
self.session = mock.Mock(spec=adapter.Adapter)
|
||||||
|
self.session.default_microversion = '1.29'
|
||||||
|
self.node = node.Node(**FAKE)
|
||||||
|
|
||||||
|
def test_inject_nmi(self):
|
||||||
|
self.node.inject_nmi(self.session)
|
||||||
|
self.session.put.assert_called_once_with(
|
||||||
|
'nodes/%s/management/inject_nmi' % FAKE['uuid'],
|
||||||
|
json={},
|
||||||
|
headers=mock.ANY,
|
||||||
|
microversion='1.29',
|
||||||
|
retriable_status_codes=_common.RETRIABLE_STATUS_CODES,
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_incompatible_microversion(self):
|
||||||
|
self.session.default_microversion = '1.28'
|
||||||
|
self.assertRaises(
|
||||||
|
exceptions.NotSupported,
|
||||||
|
self.node.inject_nmi,
|
||||||
|
self.session,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@mock.patch.object(node.Node, '_assert_microversion_for', _fake_assert)
|
@mock.patch.object(node.Node, '_assert_microversion_for', _fake_assert)
|
||||||
@mock.patch.object(exceptions, 'raise_from_response', mock.Mock())
|
@mock.patch.object(exceptions, 'raise_from_response', mock.Mock())
|
||||||
class TestNodeSetPowerState(base.TestCase):
|
class TestNodeSetPowerState(base.TestCase):
|
||||||
|
6
releasenotes/notes/node-inject-nmi-53d12681026e0b6c.yaml
Normal file
6
releasenotes/notes/node-inject-nmi-53d12681026e0b6c.yaml
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
features:
|
||||||
|
- |
|
||||||
|
Adds ``inject_nmi`` ``openstack.baremetal.v1.Node``.
|
||||||
|
- |
|
||||||
|
Adds ``inject_nmi_to_node`` to the baremetal Proxy.
|
Loading…
x
Reference in New Issue
Block a user