Source code for hammers.osrest.ironic
"""
Shims for Ironic. See `Ironic HTTP API Docs
<https://developer.openstack.org/api-ref/baremetal/>`_.
"""
from hammers.osrest.base import BaseAPI
_API_VERSION = '1.20'
API = BaseAPI('baremetal', {'X-OpenStack-Ironic-API-Version': _API_VERSION})
[docs]def node(auth, node):
"""Get node by ID or the ``uuid`` key out of a dictionary."""
if isinstance(node, dict):
node = node['uuid']
response = API.get(auth, '/v1/nodes/{}'.format(node))
return response.json()
[docs]def node_set_state(auth, node, state):
"""Set provision state of `node` to `state`.
.. seealso:: `Ironic's State Machine
<https://docs.openstack.org/ironic/pike/contributor/states.html>`_
"""
if isinstance(node, dict):
node = node['uuid']
response = API.put(auth, '/v1/nodes/{}/states/provision'.format(node),
{'target': state})
return response
[docs]def node_update(auth, node, **kwargs):
"""
Add/remove/replace properties on the node.
:param mapping replace: properties to replace by key
"""
replace = kwargs.get('replace')
patch = [
{'op': 'replace', 'path': k, 'value': v} for k, v in replace.items()]
if isinstance(node, dict):
node = node['uuid']
response = API.patch(auth, '/v1/nodes/{}'.format(node), json=patch)
return response.json()
[docs]def nodes(auth, details=False):
"""Retrieves all nodes, with more info if `details` is true."""
response = API.get(auth, '/v1/nodes/detail' if details else '/v1/nodes')
return {n['uuid']: n for n in response.json()['nodes']}
[docs]def ports(auth):
"""Retrieves all Ironic ports, returns a dictionary keyed by the port ID"""
response = API.get(auth, '/v1/ports/detail')
return {n['uuid']: n for n in response.json()['ports']}
__all__ = [
'ironic_node',
'ironic_node_set_state',
'ironic_node_update',
'ironic_nodes',
'ironic_ports',
]
ironic_node = node
ironic_node_set_state = node_set_state
ironic_node_update = node_update
ironic_nodes = nodes
ironic_ports = ports