Adds support for node hardware inventory

Adds support for querying a node's hardware inventory as per
functionality introduced in API 1.81.

Change-Id: I218f3458d701ee9d0ff163884ee6f09992e84363
This commit is contained in:
Mahnoor Asghar 2023-06-13 12:22:11 -04:00
parent c70e5d7d96
commit a087bc0b4b
4 changed files with 82 additions and 2 deletions
openstack
baremetal/v1
tests/unit/baremetal/v1
releasenotes/notes

@ -332,6 +332,19 @@ class Proxy(proxy.Proxy):
"""
return self._get_with_fields(_node.Node, node, fields=fields)
def get_node_inventory(self, node):
"""Get a specific node's hardware inventory.
:param node: The value can be the name or ID of a node or a
:class:`~openstack.baremetal.v1.node.Node` instance.
:returns: The node inventory
:raises: :class:`~openstack.exceptions.ResourceNotFound` when no
inventory could be found.
"""
res = self._get_resource(_node.Node, node)
return res.get_node_inventory(self, node)
def update_node(self, node, retry_on_conflict=True, **attrs):
"""Update a node.

@ -96,8 +96,8 @@ class Node(_common.ListMixin, resource.Resource):
is_maintenance='maintenance',
)
# Ability to change boot_mode and secure_boot, introduced in 1.76 (Xena).
_max_microversion = '1.76'
# Ability to get node inventory, introduced in 1.81 (Antelope).
_max_microversion = '1.81'
# Properties
#: The UUID of the allocation associated with this node. Added in API
@ -1312,6 +1312,25 @@ class Node(_common.ListMixin, resource.Resource):
)
exceptions.raise_from_response(response, error_message=msg)
def get_node_inventory(self, session, node_id):
session = self._get_session(session)
version = self._get_microversion(session, action='fetch')
request = self._prepare_request(requires_id=True)
request.url = utils.urljoin(request.url, 'inventory')
response = session.get(
request.url,
headers=request.headers,
microversion=version,
retriable_status_codes=_common.RETRIABLE_STATUS_CODES,
)
msg = "Failed to get inventory for node {node}".format(
node=node_id,
)
exceptions.raise_from_response(response, error_message=msg)
return response.json()
def patch(
self,
session,

@ -1165,3 +1165,46 @@ class TestNodeConsole(base.TestCase):
self.session,
'true', # not a bool
)
@mock.patch.object(node.Node, 'fetch', lambda self, session: self)
@mock.patch.object(exceptions, 'raise_from_response', mock.Mock())
class TestNodeInventory(base.TestCase):
def setUp(self):
super().setUp()
self.node = node.Node(**FAKE)
self.session = mock.Mock(
spec=adapter.Adapter,
default_microversion='1.81',
)
def test_get_inventory(self):
node_inventory = {
'inventory': {
'memory': {'physical_mb': 3072},
'cpu': {
'count': 1,
'model_name': 'qemu64',
'architecture': 'x86_64',
},
'disks': [{'name': 'testvm1.qcow2', 'size': 11811160064}],
'interfaces': [{'mac_address': '52:54:00:c7:02:45'}],
'system_vendor': {
'product_name': 'testvm1',
'manufacturer': 'Sushy Emulator',
},
'boot': {'current_boot_mode': 'uefi'},
},
'plugin_data': {'fake_plugin_data'},
}
self.session.get.return_value.json.return_value = node_inventory
res = self.node.get_node_inventory(self.session, self.node.id)
self.assertEqual(node_inventory, res)
self.session.get.assert_called_once_with(
'nodes/%s/inventory' % self.node.id,
headers=mock.ANY,
microversion='1.81',
retriable_status_codes=_common.RETRIABLE_STATUS_CODES,
)

@ -0,0 +1,5 @@
---
features:
- |
Adds support for querying a node's hardware inventory as per functionality
introduced in API 1.81.