OpenKeel: the sovereign French Cloud solution of the inherent group, with a European reach Discover inherent

Reverse-spec · Services

ironic — Errors

Errors — ironic — branch stable/2026.2

Branch stable/2026.2 @ 39ce09ec3b0d — repository https://opendev.org/openstack/ironic — analysed on 2026-10-29

Ironic has one exception hierarchy, rooted at IronicException (ironic/common/exception.py:79): each class carries an HTTP code (500 by default) and a _msg_fmt template formatted with keyword arguments. 214 classes, 1 208 raise sites in the non-test code. The full catalogue below is generated from the imported classes (_rewrite/tools/ironic_errors.py, data in _rewrite/errors_stable-2026.2.json, every raise site listed there); the sections after it describe the situations that matter to a client or an operator.

1. Exception → HTTP translation

LayerRuleSource
API handlerEvery handler is wrapped by @method.expose: any exception is caught; if it has a code that is a known HTTP status, that status is used, otherwise 500. 4xx bodies carry faultcode: "Client" and faultstring = str(exc); 5xx bodies carry faultcode: "Server", the message, and the traceback only when [DEFAULT]/debug_tracebacks_in_api is true.ironic/api/method.py:35, ironic/api/method.py:114
MiddlewareThe body is then wrapped in {"error_message": "<inner JSON as a string>"} and Content-Type: application/json.ironic/api/middleware/parsable_error.py:36
RPC (oslo.messaging)Conductor methods declare @messaging.expected_exceptions(...): those are re-raised on the API side with their class and code; any other exception becomes a RemoteError-like 500. NoExceptionTracebackHook strips the remote traceback from the message.ironic/conductor/manager.py:125, ironic/api/hooks.py:127
RPC (JSON-RPC)The server returns {"error": {"code": <exc.code>, "message": str(exc), "data": {"class": "ironic.common.exception.X"}}}; the client re-creates the class when it is in an allowed namespace, otherwise raises a generic IronicException (500).ironic/common/json_rpc/server.py:163, ironic/common/json_rpc/client.py:124
Special codes set at the call siteNoValidHost (404 by class) is turned into 400 by the ramdisk endpoints (e.code = BAD_REQUEST), into 400 by node creation; TemporaryFailure (503) when no conductor is alive.ironic/api/controllers/v1/ramdisk.py:197, ironic/conductor/rpcapi.py:278
webob errorsRaised directly by Pecan or by handlers (HTTPNotFound, HTTPMethodNotAllowed…) and by the version check (HTTPNotAcceptable, 406).ironic/api/controllers/v1/__init__.py:155

What falls through to 500. Any exception without a 4xx code: NetworkError (Neutron failures during VIF attach: 45 raise sites), RedfishError (60), ImageRefValidationFailed (24), ConsoleContainerError (28), and programming errors. The version probe found two unexpected 500s (01 § 3.2).

Same exception, different statuses. NoValidHost (404 class) appears as 400 (lookup, heartbeat, node create); NotFound is used as a version gate (allow_* → 404 "Resource could not be found.") as well as for missing resources; InvalidState is 409 while InvalidStateRequested is 400, and the provision API chooses between NodeLocked (409) and InvalidStateRequested (400) for the same refused transition depending on whether the node is reserved (ironic/api/controllers/v1/node.py:1282). Clients that branch on the status (Nova retries 409 and 503 through openstacksdk, sdk:openstack/baremetal/v1/_common.py:22) depend on these choices.

2. Catalogue

<!-- GEN:errors-table -->

ExceptionParentHTTPMessage templateRaise sitesFirst raise sites
ImageChecksumAlgorithmFailure (ironic/common/exception.py:1000)InvalidImage500The requested image checksum algorithm cannot be loaded.3ironic/common/checksum_utils.py:105, ironic/common/checksum_utils.py:191, ironic/common/checksum_utils.py:321
ImageChecksumURLNotSupported (ironic/common/exception.py:1005)InvalidImage500Use of remote checksum files is not supported.1ironic/common/checksum_utils.py:206
ImageChecksumFileReadFailure (ironic/common/exception.py:1010)InvalidImage503Failed to read the file from local storage to perform a checksum operation.1ironic/common/checksum_utils.py:109
ParentNodeLocked (ironic/common/exception.py:1017)Conflict409Node %(node)s parent_node %(parent)s is presently locked and we are unable to perform any action on it at this time. Please retry after the current operation…1ironic/conductor/utils.py:435
ChildNodeLocked (ironic/common/exception.py:1024)Conflict409Node %(node)s child_node %(child)s is presently locked and we are unable to perform any action on it at this time. Please retry after the current operation i…1ironic/conductor/utils.py:468
InvalidMetricConfig (ironic/common/exception.py:1031)Invalid400Unacceptable parameters.2ironic/common/metrics_utils.py:47, ironic/common/metrics_utils.py:76
MetricsNotSupported (ironic/common/exception.py:1037)IronicException500Metrics action is not supported. You may need to adjust the [metrics] section in ironic.conf.1ironic/common/metrics.py:295
ServiceLookupFailure (ironic/common/exception.py:1042)IronicException500Cannot find %(service)s service through multicast.0—
ServiceRegistrationFailure (ironic/common/exception.py:1046)IronicException500Cannot register %(service)s service: %(error)s3ironic/common/mdns.py:169, ironic/common/mdns.py:153, ironic/common/mdns.py:111
Unauthorized (ironic/common/exception.py:1050)IronicException401An unknown exception occurred.1ironic/common/auth_basic.py:214
SecurityProxyNegotiationFailed (ironic/common/exception.py:1055)IronicException500Failed to negotiate security type with server: %(reason)s6ironic/console/securityproxy/rfb.py:112, ironic/console/securityproxy/rfb.py:127, ironic/console/securityproxy/rfb.py:149
RFBAuthHandshakeFailed (ironic/common/exception.py:1059)IronicException500Failed to complete auth handshake: %(reason)s1ironic/console/securityproxy/rfb.py:99
RFBAuthNoAvailableScheme (ironic/common/exception.py:1063)IronicException500No matching auth scheme: allowed types: '%(allowed_types)s', desired types: '%(desired_types)s'1ironic/console/rfb/auths.py:49
ConsoleContainerError (ironic/common/exception.py:1069)IronicException500Console container error with provider '%(provider)s', reason: %(reason)s28ironic/common/console_factory.py:61, ironic/console/container/systemd.py:191, ironic/console/container/systemd.py:54
ImageHostRateLimitFailure (ironic/common/exception.py:1074)TemporaryFailure503The image registry has indicates the rate limit has been exceeded for url %(image_ref)s. Please try again later or consider using authentication and/or tryin…1ironic/common/oci_registry.py:143
ImageMatchFailure (ironic/common/exception.py:1080)InvalidImage500The requested image lacks the required attributes to identify the file to select.0—
OciImageNotSpecific (ironic/common/exception.py:1085)InvalidImage500The requested image (%(image_ref)s) was not specific. Please supply a full URL mapping to the manifest to be utilized for the file download.2ironic/common/image_service.py:528, ironic/common/image_service.py:565
OciImageTagNotFound (ironic/common/exception.py:1091)ImageNotFound404Image tag %(image_url)s could not be found, available tags are %(tags)s1ironic/common/oci_registry.py:730
ImageServiceAuthenticationRequired (ironic/common/exception.py:1096)ImageUnacceptable500The requested image %(image_ref)s requires authentication which has not been provided. Unable to proceed.5ironic/common/oci_registry.py:445, ironic/common/oci_registry.py:592, ironic/common/oci_registry.py:645
InspectionRuleAlreadyExists (ironic/common/exception.py:1102)Conflict409A rule with UUID %(uuid)s already exists.1ironic/db/sqlalchemy/api.py:3441
InspectionRuleNotFound (ironic/common/exception.py:1107)NotFound404Rule %(rule)s could not be found.3ironic/db/sqlalchemy/api.py:3470, ironic/db/sqlalchemy/api.py:3501, ironic/db/sqlalchemy/api.py:3457
InspectionRuleValidationFailure (ironic/common/exception.py:1112)IronicException500Inspection rule validation failed. Reason: %(reason)s3ironic/common/inspection_rules/base.py:70, ironic/common/inspection_rules/base.py:113, ironic/common/inspection_rules/base.py:110
InspectionRuleExecutionFailure (ironic/common/exception.py:1117)HardwareInspectionFailure500Inspection rule execution failed. Reason: %(reason)s4ironic/common/inspection_rules/actions.py:115, ironic/common/inspection_rules/operators.py:193, ironic/common/inspection_rules/operators.py:250
RuleActionExecutionFailure (ironic/common/exception.py:1122)InspectionRuleExecutionFailure500Inspection rule action execution failed. Reason: %(reason)s17ironic/common/inspection_rules/actions.py:149, ironic/common/inspection_rules/actions.py:171, ironic/common/inspection_rules/actions.py:183
RuleConditionCheckFailure (ironic/common/exception.py:1128)InspectionRuleExecutionFailure500Inspection rule condition check failed. Reason: %(reason)s1ironic/common/inspection_rules/operators.py:141
ConfigDriveRegenerationFailure (ironic/common/exception.py:1133)IronicException500An unknown exception occurred.1ironic/conductor/configdrive_utils.py:438
TraitBasedNetworkingException (ironic/common/exception.py:1139)IronicException500An unknown exception occurred.0—
TBNComparatorPrefixMatchTypeMismatch (ironic/common/exception.py:1144)TraitBasedNetworkingException500An unknown exception occurred.1ironic/common/trait_based_networking/base.py:91
TBNComparatorCollectionTypeMismatch (ironic/common/exception.py:1149)TraitBasedNetworkingException500An unknown exception occurred.1ironic/common/trait_based_networking/base.py:112
TBNNoTraitsApplicableToNode (ironic/common/exception.py:1154)TraitBasedNetworkingException500No Trait Based Networking traits were found which could apply to the node %(node)s.1ironic/drivers/modules/network/common.py:698
TBNNoPortMatchesFound (ironic/common/exception.py:1159)TraitBasedNetworkingException500An unknown exception occurred.1ironic/drivers/modules/network/common.py:712
InvalidContent (ironic/common/exception.py:1164)Invalid400Invalid or potentially malicious content has been provided to the conductor and the conductor will not proceed.5ironic/common/kickstart_utils.py:60, ironic/common/utils.py:1172, ironic/common/utils.py:1182
NotAuthorized (ironic/common/exception.py:128)IronicException403Not authorized.11ironic/common/vnc.py:67, ironic/common/vnc.py:71, ironic/common/vnc.py:75
OperationNotPermitted (ironic/common/exception.py:133)NotAuthorized403Operation not permitted.1ironic/api/controllers/v1/port.py:309
Invalid (ironic/common/exception.py:137)IronicException400Unacceptable parameters.38ironic/common/neutron.py:1142, ironic/common/inspection_rules/actions.py:54, ironic/common/inspection_rules/operators.py:45
BadRequest (ironic/common/exception.py:137)IronicException400Unacceptable parameters.9ironic/drivers/modules/inspect_utils.py:356, ironic/objects/deployment.py:115, ironic/objects/node.py:482
MalformedRequestURI (ironic/common/exception.py:142)Invalid400Malformed request URI.20ironic/api/controllers/v1/port.py:606, ironic/api/controllers/v1/port.py:627, ironic/api/controllers/v1/port.py:749
Conflict (ironic/common/exception.py:146)IronicException409Conflict.7ironic/drivers/modules/console_utils.py:173, ironic/drivers/modules/network/common.py:591, ironic/drivers/modules/network/common.py:631
TemporaryFailure (ironic/common/exception.py:151)IronicException503Resource temporarily unavailable, please retry.8ironic/common/hash_ring.py:108, ironic/common/oci_registry.py:598, ironic/common/oci_registry.py:651
NotAcceptable (ironic/common/exception.py:156)IronicException406Request not acceptable.58ironic/api/controllers/v1/port.py:400, ironic/api/controllers/v1/port.py:403, ironic/api/controllers/v1/port.py:406
InvalidState (ironic/common/exception.py:163)Conflict409Invalid resource state.18ironic/common/async_steps.py:58, ironic/common/fsm.py:122, ironic/common/fsm.py:125
NodeAlreadyExists (ironic/common/exception.py:167)Conflict409A node with UUID %(uuid)s already exists.2ironic/db/sqlalchemy/api.py:855, ironic/db/sqlalchemy/api.py:1013
MACAlreadyExists (ironic/common/exception.py:171)Conflict409A port with MAC address %(mac)s already exists.2ironic/db/sqlalchemy/api.py:1169, ironic/db/sqlalchemy/api.py:1193
ChassisAlreadyExists (ironic/common/exception.py:175)Conflict409A chassis with UUID %(uuid)s already exists.1ironic/db/sqlalchemy/api.py:1394
PortAlreadyExists (ironic/common/exception.py:179)Conflict409A port with UUID %(uuid)s already exists.1ironic/db/sqlalchemy/api.py:1170
PortDuplicateName (ironic/common/exception.py:183)Conflict409A port with name %(name)s already exists.1ironic/db/sqlalchemy/api.py:1191
PortgroupAlreadyExists (ironic/common/exception.py:187)Conflict409A portgroup with UUID %(uuid)s already exists.1ironic/db/sqlalchemy/api.py:1303
PortgroupDuplicateName (ironic/common/exception.py:191)Conflict409A portgroup with name %(name)s already exists.2ironic/db/sqlalchemy/api.py:1299, ironic/db/sqlalchemy/api.py:1323
PortgroupMACAlreadyExists (ironic/common/exception.py:195)Conflict409A portgroup with MAC address %(mac)s already exists.2ironic/db/sqlalchemy/api.py:1301, ironic/db/sqlalchemy/api.py:1325
InstanceAssociated (ironic/common/exception.py:199)Conflict409Instance %(instance_uuid)s is already associated with a node, it cannot be associated with this other node %(node)s3ironic/db/sqlalchemy/api.py:852, ironic/db/sqlalchemy/api.py:2577, ironic/db/sqlalchemy/api.py:1015
DuplicateName (ironic/common/exception.py:204)Conflict409A node with name %(name)s already exists.2ironic/db/sqlalchemy/api.py:850, ironic/db/sqlalchemy/api.py:1011
VolumeConnectorAlreadyExists (ironic/common/exception.py:208)Conflict409A volume connector with UUID %(uuid)s already exists.1ironic/db/sqlalchemy/api.py:1811
VolumeConnectorTypeAndIdAlreadyExists (ironic/common/exception.py:212)Conflict409A volume connector with type %(type)s and connector ID %(connector_id)s already exists.2ironic/db/sqlalchemy/api.py:1831, ironic/db/sqlalchemy/api.py:1808
VolumeTargetAlreadyExists (ironic/common/exception.py:217)Conflict409A volume target with UUID %(uuid)s already exists.1ironic/db/sqlalchemy/api.py:1911
VolumeTargetBootIndexAlreadyExists (ironic/common/exception.py:221)Conflict409A volume target with boot index '%(boot_index)s' for the same node already exists.2ironic/db/sqlalchemy/api.py:1930, ironic/db/sqlalchemy/api.py:1909
NodeInventoryAlreadyExists (ironic/common/exception.py:226)Conflict409A node inventory with ID %(id)s already exists.0—
VifAlreadyAttached (ironic/common/exception.py:230)Conflict409Unable to attach VIF because VIF %(vif)s is already attached to Ironic %(object_type)s %(object_uuid)s1ironic/drivers/modules/network/common.py:73
NoFreePhysicalPorts (ironic/common/exception.py:235)Invalid400Unable to attach VIF %(vif)s, not enough free physical ports.1ironic/drivers/modules/network/common.py:211
VifNotAttached (ironic/common/exception.py:240)Invalid400Unable to detach VIF %(vif)s from node %(node)s because it is not attached to it.2ironic/drivers/modules/network/common.py:261, ironic/drivers/modules/network/common.py:479
InvalidUUID (ironic/common/exception.py:245)Invalid400Expected a UUID but received %(uuid)s.3ironic/db/sqlalchemy/api.py:912, ironic/api/controllers/v1/volume_target.py:386, ironic/api/controllers/v1/volume_connector.py:349
InvalidUuidOrName (ironic/common/exception.py:249)Invalid400Expected a logical name or UUID but received %(name)s.5ironic/api/controllers/v1/utils.py:613, ironic/api/controllers/v1/utils.py:652, ironic/api/controllers/v1/utils.py:691
InvalidName (ironic/common/exception.py:253)Invalid400Expected a logical name but received %(name)s.0—
InvalidConductorGroup (ironic/common/exception.py:257)Invalid400Expected a conductor group but received %(group)s.2ironic/common/utils.py:564, ironic/common/utils.py:566
InvalidIdentity (ironic/common/exception.py:261)Invalid400Expected a UUID or int but received %(identity)s.10ironic/objects/port.py:208, ironic/objects/volume_target.py:64, ironic/objects/portgroup.py:176
InvalidMAC (ironic/common/exception.py:265)Invalid400Expected a MAC address but received %(mac)s.1ironic/common/utils.py:246
InvalidSwitchID (ironic/common/exception.py:269)Invalid400Expected a MAC address or OpenFlow datapath ID but received %(switch_id)s.1ironic/api/controllers/v1/utils.py:203
InvalidDatapathID (ironic/common/exception.py:274)Invalid400Expected an OpenFlow datapath ID but received %(datapath_id)s.1ironic/common/utils.py:272
InvalidStateRequested (ironic/common/exception.py:279)Invalid400The requested action "%(action)s" can not be performed on node "%(node)s" while it is in state "%(state)s".20ironic/api/controllers/v1/node.py:884, ironic/api/controllers/v1/node.py:1294, ironic/api/controllers/v1/node.py:891
PatchError (ironic/common/exception.py:284)Invalid400Couldn't apply patch '%(patch)s'. Reason: %(reason)s3ironic/api/controllers/v1/utils.py:488, ironic/api/controllers/v1/runbook.py:520, ironic/api/controllers/v1/inspection_rule.py:286
InstanceDeployFailure (ironic/common/exception.py:288)IronicException500Failed to deploy instance: %(reason)s13ironic/drivers/modules/agent_base.py:308, ironic/drivers/modules/autodetect.py:78, ironic/drivers/modules/deploy_utils.py:235
ImageUnacceptable (ironic/common/exception.py:292)IronicException500Image %(image_id)s is unacceptable: %(reason)s5ironic/common/pxe_utils.py:773, ironic/common/images.py:510, ironic/common/images.py:504
ImageConvertFailed (ironic/common/exception.py:296)IronicException500Image %(image_id)s is unacceptable: %(reason)s1ironic/common/images.py:561
InvalidParameterValue (ironic/common/exception.py:302)Invalid400%(err)s217ironic/drivers/utils.py:263, ironic/drivers/utils.py:98, ironic/drivers/utils.py:271
MissingParameterValue (ironic/common/exception.py:306)InvalidParameterValue400%(err)s29ironic/drivers/utils.py:492, ironic/drivers/utils.py:92, ironic/drivers/modules/ipmitool.py:364
Duplicate (ironic/common/exception.py:310)IronicException500Resource already exists.1ironic/common/fsm.py:45
NotFound (ironic/common/exception.py:314)IronicException404Resource could not be found.26ironic/drivers/modules/inspect_utils.py:279, ironic/drivers/modules/inspect_utils.py:318, ironic/drivers/modules/inspect_utils.py:379
HTTPNotFound (ironic/common/exception.py:314)IronicException404Resource could not be found.11ironic/api/controllers/v1/port.py:583, ironic/api/controllers/v1/portgroup.py:407, ironic/api/controllers/v1/allocation.py:589
DHCPLoadError (ironic/common/exception.py:319)IronicException500Failed to load DHCP provider %(dhcp_provider_name)s, reason: %(reason)s1ironic/common/dhcp_factory.py:59
DriverNotFound (ironic/common/exception.py:328)NotFound404Could not find the following driver(s) or hardware type(s): %(driver_name)s.4ironic/common/driver_factory.py:250, ironic/common/hash_ring.py:115, ironic/api/controllers/v1/driver.py:414
DriverNotFoundInEntrypoint (ironic/common/exception.py:333)DriverNotFound404Could not find the following items in the '%(entrypoint)s' entrypoint: %(names)s.1ironic/common/driver_factory.py:383
InterfaceNotFoundInEntrypoint (ironic/common/exception.py:338)InvalidParameterValue400Could not find the following interface in the '%(entrypoint)s' entrypoint: %(iface)s. Valid interfaces are %(valid)s.1ironic/common/driver_factory.py:97
IncompatibleInterface (ironic/common/exception.py:344)InvalidParameterValue400%(interface_type)s interface implementation '%(interface_impl)s' is not supported by hardware type %(hardware_type)s.1ironic/common/driver_factory.py:111
NoValidDefaultForInterface (ironic/common/exception.py:350)InvalidParameterValue400For%(node_info)s hardware type '%(driver)s', no default value found for %(interface_type)s interface could be determined. Please ensure the interfaces are en…2ironic/common/driver_factory.py:174, ironic/common/driver_factory.py:149
ImageNotFound (ironic/common/exception.py:359)NotFound404Image %(image_id)s could not be found.5ironic/common/oci_registry.py:595, ironic/common/oci_registry.py:648, ironic/common/oci_registry.py:891
NoValidHost (ironic/common/exception.py:363)NotFound404No valid host was found. Reason: %(reason)s1ironic/conductor/rpcapi.py:265
InstanceNotFound (ironic/common/exception.py:367)NotFound404Instance %(instance)s could not be found.1ironic/db/sqlalchemy/api.py:921
InputFileError (ironic/common/exception.py:371)IronicException500Error with file %(file_name)s. Reason: %(reason)s1ironic/api/app.py:130
NodeNotFound (ironic/common/exception.py:375)NotFound404Node %(node)s could not be found.19ironic/db/sqlalchemy/api.py:725, ironic/db/sqlalchemy/api.py:745, ironic/db/sqlalchemy/api.py:873
SwitchNotFound (ironic/common/exception.py:379)NotFound404Switch %(switch_id)s could not be found or is not supported by any configured switch driver.2ironic/drivers/modules/switch/generic_switch.py:122, ironic/networking/manager.py:262
DuplicateNodeOnLookup (ironic/common/exception.py:384)NodeNotFound404Node %(node)s could not be found.1ironic/db/sqlalchemy/api.py:1753
PortgroupNotFound (ironic/common/exception.py:388)NotFound404Portgroup %(portgroup)s could not be found.9ironic/db/sqlalchemy/api.py:1216, ironic/db/sqlalchemy/api.py:1226, ironic/db/sqlalchemy/api.py:1239
PortgroupNotEmpty (ironic/common/exception.py:392)Invalid400Cannot complete the requested action because portgroup %(portgroup)s contains ports.2ironic/db/sqlalchemy/api.py:1346, ironic/conductor/manager.py:2871
NodeAssociated (ironic/common/exception.py:397)InvalidState409Node %(node)s is associated with instance %(instance)s.3ironic/db/sqlalchemy/api.py:2554, ironic/conductor/manager.py:273, ironic/conductor/manager.py:2348
PortNotFound (ironic/common/exception.py:401)NotFound404Port %(port)s could not be found.10ironic/common/inspection_rules/actions.py:345, ironic/common/inspection_rules/actions.py:373, ironic/common/inspection_rules/actions.py:410
FailedToUpdateDHCPOptOnPort (ironic/common/exception.py:405)IronicException500Update DHCP options on port: %(port_id)s failed.3ironic/dhcp/neutron.py:128, ironic/dhcp/neutron.py:96, ironic/dhcp/neutron.py:143
FailedToCleanDHCPOpts (ironic/common/exception.py:409)IronicException500Clean up DHCP options on node: %(node)s failed.0—
FailedToGetIPAddressOnPort (ironic/common/exception.py:413)IronicException500Retrieve IP address on port: %(port_id)s failed.2ironic/dhcp/neutron.py:205, ironic/dhcp/neutron.py:228
InvalidIPv4Address (ironic/common/exception.py:417)IronicException500Invalid IPv4 address %(ip_address)s.1ironic/dhcp/neutron.py:197
InvalidIPAddress (ironic/common/exception.py:421)IronicException500Invalid IP address %(ip_address)s.1ironic/dhcp/neutron.py:201
FailedToUpdateMacOnPort (ironic/common/exception.py:425)IronicException500Update MAC address on port: %(port_id)s failed.1ironic/common/neutron.py:281
ChassisNotFound (ironic/common/exception.py:429)NotFound404Chassis %(chassis)s could not be found.4ironic/db/sqlalchemy/api.py:1363, ironic/db/sqlalchemy/api.py:1374, ironic/db/sqlalchemy/api.py:1410
VolumeConnectorNotFound (ironic/common/exception.py:433)NotFound404Volume connector %(connector)s could not be found.5ironic/db/sqlalchemy/api.py:1772, ironic/db/sqlalchemy/api.py:1782, ironic/db/sqlalchemy/api.py:1836
VolumeTargetNotFound (ironic/common/exception.py:437)NotFound404Volume target %(target)s could not be found.5ironic/db/sqlalchemy/api.py:1863, ironic/db/sqlalchemy/api.py:1873, ironic/db/sqlalchemy/api.py:1933
NoDriversLoaded (ironic/common/exception.py:441)IronicException500Conductor %(conductor)s cannot be started because no hardware types were loaded.1ironic/conductor/base_manager.py:253
ConductorNotFound (ironic/common/exception.py:446)NotFound404Conductor %(conductor)s could not be found.4ironic/db/sqlalchemy/api.py:1535, ironic/db/sqlalchemy/api.py:1465, ironic/db/sqlalchemy/api.py:1476
ConductorAlreadyRegistered (ironic/common/exception.py:450)IronicException500Conductor %(conductor)s already registered.1ironic/db/sqlalchemy/api.py:1438
ConductorHardwareInterfacesAlreadyRegistered (ironic/common/exception.py:454)IronicException500Duplication detected for hardware_type, interface_type and interface combinations for this conductor while registering the row %(row)s0—
PowerStateFailure (ironic/common/exception.py:460)InvalidState409Failed to set node power state to %(pstate)s.8ironic/drivers/modules/agent_power.py:128, ironic/drivers/modules/agent_power.py:209, ironic/drivers/modules/agent_power.py:214
ExclusiveLockRequired (ironic/common/exception.py:464)NotAuthorized403An exclusive lock is required, but the current context has a shared lock.1ironic/conductor/task_manager.py:150
NodeMaintenanceFailure (ironic/common/exception.py:469)Invalid400Failed to toggle maintenance-mode flag for node %(node)s: %(reason)s0—
NodeConsoleNotEnabled (ironic/common/exception.py:474)Invalid400Console access is not enabled on node %(node)s1ironic/conductor/manager.py:2605
NodeInMaintenance (ironic/common/exception.py:478)Invalid400The %(op)s operation can't be performed on node %(node)s because it's in maintenance mode.7ironic/api/controllers/v1/node.py:1274, ironic/conductor/deployments.py:51, ironic/conductor/manager.py:702
ChassisNotEmpty (ironic/common/exception.py:483)Invalid400Cannot complete the requested action because chassis %(chassis)s contains nodes.1ironic/db/sqlalchemy/api.py:1421
IPMIFailure (ironic/common/exception.py:488)IronicException500IPMI call failed: %(cmd)s.9ironic/drivers/modules/ipmitool.py:783, ironic/drivers/modules/ipmitool.py:849, ironic/drivers/modules/ipmitool.py:963
UnsupportedDriverExtension (ironic/common/exception.py:492)Invalid400Driver %(driver)s does not support %(extension)s (disabled or not implemented).32ironic/drivers/base.py:855, ironic/drivers/base.py:866, ironic/drivers/base.py:1234
GlanceConnectionFailed (ironic/common/exception.py:497)IronicException500Connection to glance endpoint %(endpoint)s failed: %(reason)s1ironic/common/glance_service/image_service.py:162
ImageNotAuthorized (ironic/common/exception.py:502)NotAuthorized403Not authorized for image %(image_id)s.0—
InvalidImageRef (ironic/common/exception.py:506)InvalidParameterValue400Invalid image href %(image_href)s.5ironic/drivers/modules/agent.py:955, ironic/common/oci_registry.py:727, ironic/common/image_service.py:912
ImageRefValidationFailed (ironic/common/exception.py:510)IronicException500Validation of image href %(image_href)s failed, reason: %(reason)s24ironic/common/oci_registry.py:837, ironic/common/oci_registry.py:854, ironic/common/image_service.py:246
ImageDownloadFailed (ironic/common/exception.py:515)IronicException500Failed to download image %(image_href)s, reason: %(reason)s10ironic/drivers/modules/image_cache.py:240, ironic/drivers/modules/image_cache.py:259, ironic/common/oci_registry.py:900
KeystoneUnauthorized (ironic/common/exception.py:519)IronicException500Not authorized in Keystone.1ironic/common/keystone.py:50
KeystoneFailure (ironic/common/exception.py:523)IronicException500An unknown exception occurred.1ironic/common/keystone.py:57
CatalogNotFound (ironic/common/exception.py:527)IronicException500Service type %(service_type)s with endpoint type %(endpoint_type)s not found in keystone service catalog.2ironic/common/keystone.py:129, ironic/common/keystone.py:47
ServiceUnavailable (ironic/common/exception.py:532)IronicException500Connection failed3ironic/networking/rpcapi.py:90, ironic/conductor/rpcapi.py:50, ironic/conductor/rpcapi.py:220
InvalidEndpoint (ironic/common/exception.py:540)IronicException500The provided endpoint is invalid0—
CommunicationError (ironic/common/exception.py:544)IronicException500Unable to communicate with the server.0—
HTTPForbidden (ironic/common/exception.py:548)NotAuthorized403Access was denied to the following resource: %(resource)s5ironic/common/policy.py:2172, ironic/api/controllers/v1/utils.py:1790, ironic/api/controllers/v1/ramdisk.py:161
ConfigNotFound (ironic/common/exception.py:556)IronicException500Could not find config at %(path)s0—
NodeLocked (ironic/common/exception.py:560)Conflict409Node %(node)s is locked by host %(host)s, please retry after the current operation is completed.5ironic/db/sqlalchemy/api.py:777, ironic/db/sqlalchemy/api.py:785, ironic/db/sqlalchemy/api.py:811
NodeNotLocked (ironic/common/exception.py:565)Invalid400Node %(node)s found not to be locked on release1ironic/db/sqlalchemy/api.py:809
NoFreeConductorWorker (ironic/common/exception.py:569)TemporaryFailure503Requested action cannot be performed due to lack of free conductor workers.2ironic/conductor/base_manager.py:578, ironic/conductor/base_manager.py:571
VendorPassthruException (ironic/common/exception.py:575)IronicException500An unknown exception occurred.1ironic/drivers/base.py:1076
ConfigInvalid (ironic/common/exception.py:579)IronicException500Invalid configuration file. %(error_msg)s12ironic/networking/manager.py:177, ironic/networking/switch_drivers/driver_factory.py:87, ironic/networking/switch_drivers/driver_factory.py:76
DriverLoadError (ironic/common/exception.py:583)IronicException500Driver, hardware type or interface %(driver)s could not be loaded. Reason: %(reason)s.5ironic/drivers/modules/ipmitool.py:1024, ironic/common/driver_factory.py:357, ironic/common/driver_factory.py:490
DriverOperationError (ironic/common/exception.py:588)IronicException500Runtime driver %(driver)s failure. Reason: %(reason)s.0—
ConsoleError (ironic/common/exception.py:592)IronicException500An unknown exception occurred.2ironic/drivers/modules/console_utils.py:73, ironic/drivers/modules/console_utils.py:132
NoConsolePid (ironic/common/exception.py:596)ConsoleError500Could not find pid in pid file %(pid_path)s1ironic/drivers/modules/console_utils.py:94
ConsoleSubprocessFailed (ironic/common/exception.py:600)ConsoleError500Console subprocess failed to start. %(error)s2ironic/drivers/modules/console_utils.py:380, ironic/drivers/modules/console_utils.py:337
PasswordFileFailedToCreate (ironic/common/exception.py:604)IronicException500Failed to create the password file. %(error)s2ironic/drivers/modules/ipmitool.py:302, ironic/drivers/modules/console_utils.py:151
DracOperationError (ironic/common/exception.py:608)DriverOperationError500DRAC operation failed. Reason: %(error)s0—
FailedToGetSensorData (ironic/common/exception.py:612)IronicException500Failed to get sensor data for node %(node)s. Error: %(error)s1ironic/drivers/modules/ipmitool.py:1424
FailedToParseSensorData (ironic/common/exception.py:617)IronicException500Failed to parse sensor data for node %(node)s. Error: %(error)s2ironic/drivers/modules/ipmitool.py:887, ironic/drivers/modules/ipmitool.py:927
InsufficientDiskSpace (ironic/common/exception.py:622)IronicException500Disk volume where '%(path)s' is located doesn't have enough disk space. Required %(required)d MiB, only %(actual)d MiB available space present.2ironic/drivers/modules/image_cache.py:501, ironic/common/utils.py:421
ImageCreationFailed (ironic/common/exception.py:628)IronicException500Creating %(image_type)s image failed: %(error)s11ironic/common/images.py:901, ironic/common/images.py:106, ironic/common/images.py:879
SwiftOperationError (ironic/common/exception.py:632)IronicException500Swift operation '%(operation)s' failed: %(error)s6ironic/common/swift.py:65, ironic/common/swift.py:75, ironic/common/swift.py:94
SwiftObjectNotFoundError (ironic/common/exception.py:636)SwiftOperationError500Swift object %(obj)s from container %(container)s not found. Operation '%(operation)s' failed.3ironic/drivers/modules/inspect_utils.py:225, ironic/drivers/modules/inspect_utils.py:233, ironic/common/swift.py:172
SNMPFailure (ironic/common/exception.py:641)DriverOperationError500SNMP operation '%(operation)s' failed: %(error)s0—
FileSystemNotSupported (ironic/common/exception.py:645)IronicException500Failed to create a file system. File system %(fs)s is not supported.1ironic/common/utils.py:808
HardwareInspectionFailure (ironic/common/exception.py:650)IronicException500Failed to inspect hardware. Reason: %(error)s11ironic/drivers/modules/inspect_utils.py:536, ironic/drivers/modules/inspect_utils.py:615, ironic/drivers/modules/inspect_utils.py:571
NodeCleaningFailure (ironic/common/exception.py:654)IronicException500Failed to clean node %(node)s: %(reason)s7ironic/drivers/modules/ansible/deploy.py:332, ironic/drivers/modules/ansible/deploy.py:337, ironic/drivers/modules/ansible/deploy.py:354
NodeServicingFailure (ironic/common/exception.py:658)IronicException500Failed to service node %(node)s: %(reason)s0—
PathNotFound (ironic/common/exception.py:662)IronicException500Path %(dir)s does not exist.1ironic/common/utils.py:390
DirectoryNotWritable (ironic/common/exception.py:666)IronicException500Directory %(dir)s is not writable.1ironic/common/utils.py:405
ImageUploadFailed (ironic/common/exception.py:670)IronicException500Failed to upload %(image_name)s image to web server %(web_server)s, reason: %(reason)s0—
NodeTagNotFound (ironic/common/exception.py:675)IronicException500Node %(node_id)s doesn't have a tag '%(tag)s'1ironic/db/sqlalchemy/api.py:1727
NetworkError (ironic/common/exception.py:679)IronicException500Network operation failure.45ironic/drivers/modules/network/neutron.py:174, ironic/drivers/modules/network/neutron.py:189, ironic/drivers/modules/network/flat.py:85
IncompleteLookup (ironic/common/exception.py:683)Invalid400At least one of 'addresses' and 'node_uuid' parameters is required1ironic/api/controllers/v1/ramdisk.py:171
NotificationSchemaObjectError (ironic/common/exception.py:688)IronicException500Expected object %(obj)s when populating notification payload but got object %(source)s1ironic/objects/notification.py:156
NotificationSchemaKeyError (ironic/common/exception.py:693)IronicException500Object %(obj)s doesn't have the field "%(field)s" required for populating notification schema key "%(key)s"2ironic/objects/notification.py:170, ironic/objects/notification.py:174
NotificationPayloadError (ironic/common/exception.py:699)IronicException500Payload not populated when trying to send notification "%(class_name)s"1ironic/objects/notification.py:112
StorageError (ironic/common/exception.py:704)IronicException500Storage operation failure.11ironic/drivers/modules/deploy_utils.py:1777, ironic/drivers/modules/deploy_utils.py:1782, ironic/drivers/modules/storage/cinder.py:263
RedfishError (ironic/common/exception.py:708)DriverOperationError500Redfish exception occurred. Error: %(error)s60ironic/drivers/modules/redfish/firmware_utils.py:206, ironic/drivers/modules/redfish/firmware_utils.py:200, ironic/drivers/modules/redfish/firmware_utils.py:252
RedfishConnectionError (ironic/common/exception.py:712)RedfishError500Redfish connection failed for node %(node)s: %(error)s2ironic/drivers/modules/redfish/utils.py:555, ironic/drivers/modules/redfish/utils.py:636
PortgroupPhysnetInconsistent (ironic/common/exception.py:716)IronicException500Port group %(portgroup)s has member ports with inconsistent physical networks (%(physical_networks)s). All ports in a port group must have the same physical …1ironic/common/network.py:147
VifInvalidForAttach (ironic/common/exception.py:722)Conflict409Unable to attach VIF %(vif)s to node %(node)s. Reason: %(reason)s0—
AgentAPIError (ironic/common/exception.py:727)IronicException500Agent API for node %(node)s returned HTTP status code %(status)s with error: %(error)s2ironic/drivers/modules/agent_client.py:158, ironic/drivers/modules/agent_client.py:303
NodeTraitNotFound (ironic/common/exception.py:732)NotFound404Node %(node_id)s doesn't have a trait '%(trait)s'2ironic/db/sqlalchemy/api.py:2315, ironic/api/controllers/v1/node.py:1624
InstanceRescueFailure (ironic/common/exception.py:736)IronicException500Failed to rescue instance %(instance)s for node %(node)s: %(reason)s4ironic/drivers/modules/agent_base.py:729, ironic/drivers/modules/agent_base.py:719, ironic/drivers/modules/agent_client.py:875
InstanceUnrescueFailure (ironic/common/exception.py:741)IronicException500Failed to unrescue instance %(instance)s for node %(node)s: %(reason)s1ironic/conductor/manager.py:818
BIOSSettingAlreadyExists (ironic/common/exception.py:746)Conflict409A BIOS setting %(name)s for node %(node)s already exists.1ironic/db/sqlalchemy/api.py:2350
BIOSSettingNotFound (ironic/common/exception.py:750)NotFound404Node %(node)s doesn't have a BIOS setting '%(name)s'3ironic/db/sqlalchemy/api.py:2382, ironic/db/sqlalchemy/api.py:2409, ironic/api/controllers/v1/bios.py:116
BIOSSettingListNotFound (ironic/common/exception.py:754)NotFound404Node %(node)s doesn't have BIOS settings '%(names)s'1ironic/db/sqlalchemy/api.py:2398
DatabaseVersionTooOld (ironic/common/exception.py:758)IronicException500Database version is too old1ironic/db/sqlalchemy/api.py:1999
AgentConnectionFailed (ironic/common/exception.py:762)IronicException500Connection to agent failed: %(reason)s3ironic/drivers/modules/agent_client.py:120, ironic/drivers/modules/agent_client.py:442, ironic/drivers/modules/agent_client.py:370
AgentCommandTimeout (ironic/common/exception.py:766)IronicException500Timeout executing command %(command)s on node %(node)s3ironic/drivers/modules/agent_client.py:181, ironic/drivers/modules/agent_client.py:186, ironic/drivers/modules/agent_client.py:947
NodeProtected (ironic/common/exception.py:770)HTTPForbidden403Node %(node)s is protected and cannot be undeployed, rebuilt or deleted3ironic/conductor/deployments.py:55, ironic/conductor/manager.py:1089, ironic/conductor/manager.py:2352
AllocationNotFound (ironic/common/exception.py:775)NotFound404Allocation %(allocation)s could not be found.9ironic/db/sqlalchemy/api.py:2569, ironic/db/sqlalchemy/api.py:2612, ironic/db/sqlalchemy/api.py:2433
AllocationDuplicateName (ironic/common/exception.py:779)Conflict409An allocation with name %(name)s already exists.2ironic/db/sqlalchemy/api.py:2572, ironic/db/sqlalchemy/api.py:2512
AllocationAlreadyExists (ironic/common/exception.py:783)Conflict409An allocation with UUID %(uuid)s already exists.1ironic/db/sqlalchemy/api.py:2515
AllocationFailed (ironic/common/exception.py:787)IronicException500Failed to process allocation %(uuid)s: %(error)s.4ironic/conductor/allocations.py:252, ironic/conductor/allocations.py:128, ironic/conductor/allocations.py:137
IronicException (ironic/common/exception.py:79)Exception500An unknown exception occurred.13ironic/drivers/modules/agent_client.py:864, ironic/drivers/modules/agent_client.py:251, ironic/drivers/modules/agent_client.py:266
DeployTemplateDuplicateName (ironic/common/exception.py:791)Conflict409A deploy template with name %(name)s already exists.2ironic/db/sqlalchemy/api.py:2750, ironic/db/sqlalchemy/api.py:2668
DeployTemplateAlreadyExists (ironic/common/exception.py:795)Conflict409A deploy template with UUID %(uuid)s already exists.1ironic/db/sqlalchemy/api.py:2670
DeployTemplateNotFound (ironic/common/exception.py:799)NotFound404Deploy template %(template)s could not be found.3ironic/db/sqlalchemy/api.py:2755, ironic/db/sqlalchemy/api.py:2766, ironic/db/sqlalchemy/api.py:2777
InvalidDeployTemplate (ironic/common/exception.py:803)Invalid400Deploy template invalid: %(err)s.1ironic/api/controllers/v1/utils.py:1705
RunbookDuplicateName (ironic/common/exception.py:807)Conflict409A runbook with name %(name)s already exists.2ironic/db/sqlalchemy/api.py:2932, ironic/db/sqlalchemy/api.py:2846
RunbookAlreadyExists (ironic/common/exception.py:811)Conflict409A runbook with UUID %(uuid)s already exists.1ironic/db/sqlalchemy/api.py:2849
RunbookNotFound (ironic/common/exception.py:815)NotFound404Runbook %(runbook)s could not be found.5ironic/db/sqlalchemy/api.py:2997, ironic/db/sqlalchemy/api.py:2937, ironic/db/sqlalchemy/api.py:2950
RunbookTraitNotFound (ironic/common/exception.py:819)NotFound404Runbook %(runbook_id)s doesn't have a trait '%(trait)s'1ironic/db/sqlalchemy/api.py:3065
InvalidRunbook (ironic/common/exception.py:823)Invalid400Runbook invalid: %(err)s.0—
InvalidKickstartTemplate (ironic/common/exception.py:827)Invalid400The kickstart template is missing required variables2ironic/common/pxe_utils.py:1187, ironic/common/pxe_utils.py:1177
InvalidKickstartFile (ironic/common/exception.py:831)Invalid400The kickstart file is not valid.1ironic/common/pxe_utils.py:1217
ClientSideError (ironic/common/exception.py:835)RuntimeError——34ironic/api/controllers/v1/port.py:817, ironic/api/controllers/v1/portgroup.py:493, ironic/api/controllers/v1/portgroup.py:568
NodeIsRetired (ironic/common/exception.py:852)Invalid400The %(op)s operation can't be performed on node %(node)s because it is retired.1ironic/conductor/manager.py:1484
NoFreeIPMITerminalPorts (ironic/common/exception.py:857)TemporaryFailure503Unable to allocate a free port on host %(host)s for IPMI terminal, not enough free ports.1ironic/drivers/modules/console_utils.py:197
InvalidInput (ironic/common/exception.py:862)ClientSideError——2ironic/api/controllers/v1/volume_target.py:317, ironic/api/controllers/v1/volume_connector.py:275
UnknownArgument (ironic/common/exception.py:880)ClientSideError——0—
UnknownAttribute (ironic/common/exception.py:893)ClientSideError——0—
AgentInProgress (ironic/common/exception.py:921)IronicException500Node %(node)s command "%(command)s" failed. Agent is presently executing a command. Error %(error)s1ironic/drivers/modules/agent_client.py:300
InsufficientMemory (ironic/common/exception.py:926)IronicException500Available memory at %(free)s, Insufficient as %(required)s is required to proceed at this time.1ironic/common/utils.py:650
NodeHistoryNotFound (ironic/common/exception.py:931)NotFound404Node history record %(history)s could not be found.3ironic/db/sqlalchemy/api.py:3097, ironic/db/sqlalchemy/api.py:3106, ironic/db/sqlalchemy/api.py:3116
NodeInventoryNotFound (ironic/common/exception.py:935)NotFound404Node inventory record for node %(node)s could not be found.4ironic/drivers/modules/inspect_utils.py:188, ironic/drivers/modules/inspect_utils.py:186, ironic/db/sqlalchemy/api.py:3277
IncorrectConfiguration (ironic/common/exception.py:939)IronicException500Supplied configuration is incorrect and must be fixed. Error: %(error)s5ironic/common/pxe_utils.py:1393, ironic/common/pxe_utils.py:1400, ironic/common/pxe_utils.py:1414
NodeVerifyFailure (ironic/common/exception.py:944)IronicException500Failed to verify node %(node)s: %(reason)s1ironic/drivers/modules/redfish/management.py:689
ConcurrentActionLimit (ironic/common/exception.py:948)TemporaryFailure503Unable to process request at this time. The concurrent action limit for %(task_type)s has been reached. Please contact your administrator and try again later.2ironic/conductor/manager.py:4230, ironic/conductor/manager.py:4243
SwiftObjectStillExists (ironic/common/exception.py:958)IronicException500Clean up failed for swift object %(obj)s during deletion of node %(node)s.2ironic/drivers/modules/inspect_utils.py:116, ironic/drivers/modules/inspect_utils.py:126
FirmwareComponentAlreadyExists (ironic/common/exception.py:963)Conflict409A Firmware component %(name)s for node %(node)s already exists.1ironic/db/sqlalchemy/api.py:3336
FirmwareComponentNotFound (ironic/common/exception.py:968)NotFound404Node %(node)s doesn't have Firmware component %(name)s2ironic/db/sqlalchemy/api.py:3366, ironic/db/sqlalchemy/api.py:3391
InvalidNodeInventory (ironic/common/exception.py:972)Invalid400Inventory for node %(node)s is invalid: %(reason)s5ironic/drivers/modules/inspector/hooks/memory.py:40, ironic/drivers/modules/inspector/hooks/validate_interfaces.py:52, ironic/drivers/modules/inspector/hooks/validate_interfaces.py:105
UnsupportedHardwareFeature (ironic/common/exception.py:976)Invalid400Node %(node)s hardware does not support feature %(feature)s, which is required based upon the requested configuration.2ironic/drivers/modules/ipmitool.py:1124, ironic/drivers/modules/redfish/boot.py:1437
BootModeNotAllowed (ironic/common/exception.py:982)Invalid400'%(mode)s' boot mode is not allowed for %(op)s operation.2ironic/api/controllers/v1/utils.py:2283, ironic/conductor/deployments.py:64
StepNotAllowed (ironic/common/exception.py:985)Invalid400%(step_type)s step '%(step)s' is not allowed. Disallowed by operator configuration [api]disallow_%(step_type)s_steps.4ironic/api/controllers/v1/node.py:1381, ironic/api/controllers/v1/node.py:1399, ironic/api/controllers/v1/node.py:1416
InvalidImage (ironic/common/exception.py:991)ImageUnacceptable500The requested image is not valid for use.6ironic/common/images.py:1016, ironic/common/images.py:1026, ironic/common/images.py:950
ImageChecksumError (ironic/common/exception.py:995)InvalidImage500The supplied image checksum is invalid or does not match.6ironic/common/oci_registry.py:878, ironic/common/checksum_utils.py:87, ironic/common/checksum_utils.py:116

<!-- /GEN:errors-table -->

3. Situations that matter

ExceptionHTTPSituation (business terms)Raised atSeen by the client as
NodeLocked409another operation holds the node's lock (nodes.reservation is set by a conductor) for longer than node_locked_retry_attempts × node_locked_retry_interval (3 × 1 s)ironic/db/sqlalchemy/api.py:777, ironic/db/sqlalchemy/api.py:785409 faultstring "Node X is locked by host Y, please retry after the current operation is completed."; openstacksdk and ironicclient retry 409 automatically
NodeLocked (provision API)409requested transition not possible and the node is reserved: "it is busy" rather than "wrong state"ironic/api/controllers/v1/node.py:1282409
InvalidStateRequested400requested verb not allowed from the current provision state (e.g. provide on an active node)ironic/api/controllers/v1/node.py:1282, ironic/conductor/manager.py:1458400 "The requested action "provide" can not be performed on node "X" while it is in state "active"."
NotAcceptable406verb, field or parameter newer than the requested microversion (check_allow_management_verbs, allow_*)ironic/api/controllers/v1/utils.py:935406 "Request not acceptable." — python-ironicclient negotiates a new version on 406
NodeInMaintenance400deploy/rebuild/provide/clean on a node in maintenance (maintenance blocks provisioning unless [conductor]/allow_provisioning_in_maintenance)ironic/api/controllers/v1/node.py:1274, ironic/conductor/manager.py:1458400
NodeAssociated409deleting or re-associating a node that has an instance_uuidironic/conductor/manager.py:2348409
InstanceAssociated409setting instance_uuid on a node while another node has it (Nova's reservation race)ironic/db/sqlalchemy/api.py:1015409; Nova's update_node(..., retry_on_conflict=False) turns it into a failed build
NodeProtected403undeploy, rebuild or delete of a protected node (1.48+)ironic/conductor/manager.py:1089, ironic/conductor/manager.py:2352403
NoFreeConductorWorker503the conductor's worker pool ([conductor]/workers_pool_size, 300, plus a reserved 5 %) is fullironic/conductor/base_manager.py:555503 "Requested action cannot be performed due to lack of free conductor workers."; retried by SDK/ironicclient
TemporaryFailure503no live conductor (the hash ring is empty)ironic/common/hash_ring.py:108, ironic/conductor/rpcapi.py:278503
NoValidHost404/400no live conductor supports the node's hardware type in its conductor groupironic/conductor/rpcapi.py:247400 on writes/ramdisk endpoints
InvalidParameterValue400the generic validation error (217 raise sites): bad driver_info, bad steps, invalid agent token (ironic/conductor/manager.py:3554), interface not enabled…many400 with the specific text
MissingParameterValue400required driver_info field missing (e.g. redfish_address, ipmi_address) when validating an interfaceironic/drivers/modules/redfish/utils.py:168, ironic/drivers/modules/ipmitool.py:350400 on GET …/validate, deploy refused
IncompleteLookup400lookup without MAC nor UUIDironic/api/controllers/v1/ramdisk.py:171400
HTTPForbidden403ramdisk endpoints disabled ([api]/enable_ramdisk_endpoints = false)ironic/api/controllers/v1/ramdisk.py:160403
AgentConnectionFailed500the conductor cannot reach the agent's callback_url (port 9999)ironic/drivers/modules/agent_client.py:116not seen by API clients: during cleaning it moves the node to clean wait to retry on the next heartbeat (ironic/conductor/cleaning.py:301); during deploy the node fails
AgentInProgress409the agent answered 409 / "agent is busy" to a new commandironic/drivers/modules/agent_client.py:300not seen by API clients: the step is retried at the next heartbeat
AgentAPIError500the agent answered ≥ 400 to a commandironic/drivers/modules/agent_client.py:303step failure → *failed state with last_error
AgentCommandTimeout500a polled command did not finish within command_wait_attempts × command_wait_interval (100 × 6 s)ironic/drivers/modules/agent_client.py:181step failure
PowerStateFailure409the BMC did not reach the requested power state within the timeoutironic/conductor/utils.py:286async: last_error, target_power_state cleared
RedfishConnectionError, RedfishError500BMC unreachable, authentication failure, Redfish error payloadironic/drivers/modules/redfish/utils.py:285validation 400 at GET …/validate; async errors in last_error; power sync puts the node in maintenance after 3 failures
IPMIFailure500ipmitool exited non-zero after the retriesironic/drivers/modules/ipmitool.py:645as above
ImageRefValidationFailed, ImageNotFound, ImageDownloadFailed500/404the image href (Glance id, HTTP URL, OCI) cannot be resolved or downloaded by the conductorironic/common/glance_service/image_service.py:58deploy fails; last_error
StepNotAllowed400a user step is in [api]/disallow_{clean,deploy,service}_stepsironic/conductor/steps.py:582400
NotAuthorized403a step-level policy baremetal:step:execute:<iface>.<step> refuses the callerironic/conductor/steps.py:791403 "insufficient privileges to execute step …"

4. Asynchronous errors

Most provisioning failures never reach the API caller: the RPC call returned 202 long before. They are visible as:

WhereWhatSet by
node.provision_statedeploy failed, clean failed, inspect failed, rescue failed, unrescue failed, adopt failed, service failed, or error (failed tear-down)fail events from the error handlers: ironic/conductor/utils.py:488 (provisioning_error_handler), ironic/conductor/utils.py:544 (cleaning), ironic/conductor/utils.py:715 (deploying), ironic/conductor/utils.py:2079 (servicing), ironic/drivers/modules/deploy_utils.py:255 (set_failed_state)
node.last_errorhuman-readable cause, e.g. "Timeout reached while waiting for callback for node X" (deploy wait), "Node X failed step {...}: <error>", "By request, the clean operation was aborted…"same handlers; TaskManager._write_exception records "Async execution of <method> failed with error: …" when a spawned worker raises (ironic/conductor/task_manager.py:485)
node.maintenance + maintenance_reason + faultpower failure (power sync failed power_state_sync_max_retries times), clean failure (orphaned cleaning), rescue abort failure, service failureironic/conductor/manager.py:4524, ironic/conductor/manager.py:1950
node history (GET …/history)every error event with its type (provisioning, takeover, conductor, console…)ironic/conductor/utils.py:1914
allocation state: error, last_error"no available nodes match the resource class X", "could not reserve any of N suitable nodes"ironic/conductor/allocations.py:85
notificationsbaremetal.node.provision_set.error, baremetal.node.power_set.error… (priority ERROR)ironic/conductor/task_manager.py:508

Timeouts that produce these failures (all in 05): [conductor]/deploy_callback_timeout, clean_callback_timeout, inspect_wait_timeout, rescue_callback_timeout, service_callback_timeout (1800 s each).

5. Key log messages

LevelMessageSituationSource
ERRORNode %(node)s moved to provision state "%(state)s" from state "%(previous)s"; target provision state is "%(target)s"every transition into a *failed or error state (INFO otherwise)ironic/conductor/task_manager.py:615
WARNINGWe have exceeded the normal maximum time window to complete a node lock attempting to reserve node %(node)s for purpose %(purpose)s.lock contentionironic/conductor/task_manager.py:368
ERRORInvalid or missing agent_token received for node %(node)sheartbeat with a wrong token: a stale ramdisk, or an attacker on the provisioning networkironic/conductor/manager.py:3599
ERRORReceived heartbeat for node %(node)s with callback URL %(url)s. This is not expected, and the heartbeat will not be processed.callback URL changed: two ramdisks claiming the same nodeironic/api/controllers/v1/ramdisk.py:289
ERRORLookup is not allowed for node %(node)s in the provision state %(state)sramdisk booted while the node is not waiting for itironic/api/controllers/v1/ramdisk.py:188
WARNINGDuring sync_power_state, could not get power state for node %(node)s, attempt %(attempt)s of %(retries)s. Error: %(err)s.BMC unreachableironic/conductor/manager.py:4624
ERRORServer-side error: "%s". Detail: …any 5xx produced by the APIironic/api/method.py:114
CRITICALFailed to start keepaliveconductor cannot run its DB heartbeat; it exitsironic/conductor/base_manager.py:308

Source: reverse-spec-ironic/02-errors_stable-2026.2.md. The _rewrite/ and _inventory/ files are not published on the site.