ironic_inspector.node_cache module¶
Cache for nodes currently under introspection.
- class ironic_inspector.node_cache.NodeInfo(uuid, version_id=None, state=None, started_at=None, finished_at=None, error=None, node=None, ports=None, ironic=None, manage_boot=True)[source]¶
Bases:
object
Record about a node in the cache.
This class optionally allows to acquire a lock on a node. Note that the class instance itself is NOT thread-safe, you need to create a new instance for every thread.
- acquire_lock(blocking=True)[source]¶
Acquire a lock on the associated node.
Exits with success if a lock is already acquired using this NodeInfo object.
- Parameters:
blocking – if True, wait for lock to be acquired, otherwise return immediately.
- Returns:
boolean value, whether lock was acquired successfully
- add_attribute(name, value)[source]¶
Store look up attribute for a node in the database.
- Parameters:
name – attribute name
value – attribute value or list of possible values
- add_trait(trait, ironic=None)[source]¶
Add a trait to the node.
- Parameters:
trait – trait to add
ironic – Ironic client to use instead of self.ironic
- property attributes¶
Node look up attributes as a dict.
- create_ports(ports, ironic=None)[source]¶
Create one or several ports for this node.
- Parameters:
ports – List of ports with all their attributes e.g [{‘mac’: xx, ‘ip’: xx, ‘client_id’: None}, {‘mac’: xx, ‘ip’: None, ‘client_id’: None}] It also support the old style of list of macs. A warning is issued if port already exists on a node.
ironic – Ironic client to use instead of self.ironic
- delete_port(port, ironic=None)[source]¶
Delete port.
- Parameters:
port – port object or its MAC
ironic – Ironic client to use instead of self.ironic
- finished(event, error=None)[source]¶
Record status for this node and process a terminal transition.
Also deletes look up attributes from the cache.
- Parameters:
event – the event to process
error – error message
- fsm_event(event, strict=False)[source]¶
Update node_info.state based on a fsm.process_event(event) call.
An AutomatonException triggers an error event. If strict, node_info.finished(istate.Events.error, error=str(exc)) is called with the AutomatonException instance and a EventError raised.
- Parameters:
event – an event to process by the fsm
- Strict:
whether to fail the introspection upon an invalid event
- Raises:
NodeStateInvalidEvent
- get_by_path(path)[source]¶
Get field value by ironic-style path (e.g. /extra/foo).
- Parameters:
path – path to a field
- Returns:
field value
- Raises:
KeyError if field was not found
- property ironic¶
Ironic client instance.
- property manage_boot¶
Whether to manage boot for this node.
- property options¶
Node introspection options as a dict.
- patch(patches, ironic=None, **kwargs)[source]¶
Apply JSON patches to a node.
Refreshes cached node instance.
- Parameters:
patches – JSON patches to apply
ironic – Ironic client to use instead of self.ironic
kwargs – Arguments to pass to ironicclient.
- Raises:
openstacksdk exceptions
- patch_port(port, patches, ironic=None)[source]¶
Apply JSON patches to a port.
- Parameters:
port – port object or its MAC
patches – JSON patches to apply
ironic – Ironic client to use instead of self.ironic
- ports(ironic=None)[source]¶
Get Ironic port objects associated with the cached node record.
This value is cached as well, use invalidate_cache() to clean.
- Returns:
dict MAC -> port object
- release_lock()[source]¶
Release a lock on a node.
Does nothing if lock was not acquired using this NodeInfo object.
- remove_trait(trait, ironic=None)[source]¶
Remove a trait from the node.
- Parameters:
trait – trait to add
ironic – Ironic client to use instead of self.ironic
- replace_field(path, func, **kwargs)[source]¶
Replace a field on ironic node.
- Parameters:
path – path to a field as used by the ironic client
func – function accepting an old value and returning a new one
kwargs – if ‘default’ value is passed here, it will be used when no existing value is found.
- Raises:
KeyError if value is not found and default is not set
- Raises:
everything that patch() may raise
- property state¶
State of the node_info object.
- update_capabilities(ironic=None, **caps)[source]¶
Update capabilities on a node.
- Parameters:
caps – capabilities to update
ironic – Ironic client to use instead of self.ironic
- update_properties(ironic=None, **props)[source]¶
Update properties on a node.
- Parameters:
props – properties to update
ironic – Ironic client to use instead of self.ironic
- property version_id¶
Deprecated - Get the version id
- ironic_inspector.node_cache.active_macs()[source]¶
List all MAC’s that are on introspection right now.
- ironic_inspector.node_cache.add_node(uuid, state, manage_boot=True, **attributes)[source]¶
Store information about a node under introspection.
All existing information about this node is dropped. Empty values are skipped.
- Parameters:
uuid – Ironic node UUID
state – The initial state of the node
manage_boot – whether to manage boot for this node
attributes – attributes known about this node (like macs, BMC etc); also ironic client instance may be passed under ‘ironic’
- Returns:
NodeInfo
- ironic_inspector.node_cache.clean_up()[source]¶
Clean up the cache.
Finish introspection for timed out nodes.
- Returns:
list of timed out node UUID’s
- ironic_inspector.node_cache.create_node(driver, ironic=None, **attributes)[source]¶
Create ironic node and cache it.
Create new node in ironic.
Cache it in inspector.
Sets node_info state to enrolling.
- Parameters:
driver – driver for Ironic node.
ironic – ironic client instance.
attributes – dict, additional keyword arguments to pass to the ironic client on node creation.
- Returns:
NodeInfo, or None in case error happened.
- ironic_inspector.node_cache.delete_nodes_not_in_list(uuids)[source]¶
Delete nodes which don’t exist in Ironic node UUIDs.
- Parameters:
uuids – Ironic node UUIDs
- ironic_inspector.node_cache.find_node(**attributes)[source]¶
Find node in cache.
Looks up a node based on attributes in a best-match fashion. This function acquires a lock on a node.
- Parameters:
attributes – attributes known about this node (like macs, BMC etc) also ironic client instance may be passed under ‘ironic’
- Returns:
structure NodeInfo with attributes
uuid
andcreated_at
- Raises:
Error if node is not found or multiple nodes match the attributes
- ironic_inspector.node_cache.fsm_event_after(event, strict=False)[source]¶
Trigger an fsm event after the function execution.
It is assumed the first function arg of the decorated function is always a NodeInfo instance.
- Parameters:
event – the event to process after the function call
strict – make an invalid fsm event trigger an error event
- ironic_inspector.node_cache.fsm_event_before(event, strict=False)[source]¶
Trigger an fsm event before the function execution.
It is assumed the first function arg of the decorated function is always a NodeInfo instance.
- Parameters:
event – the event to process before the function call
strict – make an invalid fsm event trigger an error event
- ironic_inspector.node_cache.fsm_transition(event, reentrant=True, **exc_kwargs)[source]¶
Decorate a function to perform a (non-)reentrant transition.
If True, reentrant transition will be performed at the end of a function call. If False, the transition will be performed before the function call. The function is decorated with the triggers_fsm_error_transition decorator as well.
- Parameters:
event – the event to bind the transition to.
reentrant – whether the transition is reentrant.
exc_kwargs – passed on to the triggers_fsm_error_transition decorator
- ironic_inspector.node_cache.get_introspection_data(node_id, processed=True)[source]¶
Get introspection data for this node.
- Parameters:
node_id – node UUID.
processed – Specify the type of introspected data, set to False indicates retrieving the unprocessed data.
- Returns:
A dictionary representation of intropsected data
- ironic_inspector.node_cache.get_node(node_id, ironic=None)[source]¶
Get node from cache.
- Parameters:
node_id – node UUID or name.
ironic – optional ironic client instance
- Returns:
structure NodeInfo.
- ironic_inspector.node_cache.get_node_list(ironic=None, marker=None, limit=None, state=None)[source]¶
Get node list from the cache.
The list of the nodes is ordered based on the (started_at, uuid) attribute pair, newer items first.
- Parameters:
ironic – optional ironic client instance
marker – pagination marker (an UUID or None)
limit – pagination limit; None for default CONF.api_max_limit
state – list of states for the filter; None for no state filter
- Returns:
a list of NodeInfo instances.
- ironic_inspector.node_cache.introspection_active()[source]¶
Check if introspection is active for at least one node.
- ironic_inspector.node_cache.record_node(ironic=None, bmc_addresses=None, macs=None)[source]¶
Create a cache record for a known active node.
- Parameters:
ironic – ironic client instance.
bmc_addresses – list of BMC addresses.
macs – list of MAC addresses.
- Returns:
NodeInfo
- ironic_inspector.node_cache.release_lock(func)[source]¶
Decorate a node_info-function to release the node_info lock.
Assumes the first parameter of the function func is always a NodeInfo instance.
- ironic_inspector.node_cache.start_introspection(uuid, **kwargs)[source]¶
Start the introspection of a node.
If a node_info record exists in the DB, a start transition is used rather than dropping the record in order to check for the start transition validity in particular node state.
- Parameters:
uuid – Ironic node UUID
kwargs – passed on to add_node()
- Raises:
NodeStateInvalidEvent in case the start transition is invalid in the current node state
- Raises:
NodeStateRaceCondition if a mismatch was detected between the node_info cache and the DB
- Returns:
NodeInfo
- ironic_inspector.node_cache.store_introspection_data(node_id, introspection_data, processed=True)[source]¶
Store introspection data for this node.
- Parameters:
node_id – node UUID.
introspection_data – A dictionary of introspection data
processed – Specify the type of introspected data, set to False indicates the data is unprocessed.
- ironic_inspector.node_cache.triggers_fsm_error_transition(errors=(<class 'Exception'>, ), no_errors=(<class 'ironic_inspector.utils.NodeStateInvalidEvent'>, <class 'ironic_inspector.utils.NodeStateRaceCondition'>))[source]¶
Trigger an fsm error transition upon certain errors.
It is assumed the first function arg of the decorated function is always a NodeInfo instance.
- Parameters:
errors – a tuple of exceptions upon which an error event is triggered. Re-raised.
no_errors – a tuple of exceptions that won’t trigger the error event.