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:
@@ -332,6 +332,19 @@ class Proxy(proxy.Proxy):
|
|||||||
"""
|
"""
|
||||||
return self._get_with_fields(_node.Node, node, fields=fields)
|
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):
|
def update_node(self, node, retry_on_conflict=True, **attrs):
|
||||||
"""Update a node.
|
"""Update a node.
|
||||||
|
|
||||||
|
@@ -96,8 +96,8 @@ class Node(_common.ListMixin, resource.Resource):
|
|||||||
is_maintenance='maintenance',
|
is_maintenance='maintenance',
|
||||||
)
|
)
|
||||||
|
|
||||||
# Ability to change boot_mode and secure_boot, introduced in 1.76 (Xena).
|
# Ability to get node inventory, introduced in 1.81 (Antelope).
|
||||||
_max_microversion = '1.76'
|
_max_microversion = '1.81'
|
||||||
|
|
||||||
# Properties
|
# Properties
|
||||||
#: The UUID of the allocation associated with this node. Added in API
|
#: 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)
|
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(
|
def patch(
|
||||||
self,
|
self,
|
||||||
session,
|
session,
|
||||||
|
@@ -1165,3 +1165,46 @@ class TestNodeConsole(base.TestCase):
|
|||||||
self.session,
|
self.session,
|
||||||
'true', # not a bool
|
'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.
|
Reference in New Issue
Block a user