Errors — heat — branch stable/2026.2
Branch
stable/2026.2@5872396e548c(27.0.1) — repository https://opendev.org/openstack/heat — analysed on 2026-10-29
1. Exception → HTTP translation
- Native API.
FaultWrapper(heat/api/middleware/fault.py:52-170) catches everything below it in the pipeline. It looks the exception's class name up inerror_map(heat/api/middleware/fault.py:55-98), walking up the base classes until it finds a match;Exceptionitself maps to 500 (heat/api/middleware/fault.py:100-107). Engine exceptions arrive through oslo.messaging as dynamically created<Name>_Remotesubclasses of the original class: their name is stripped of_Remoteand their bases are the real Heat classes, so the same table applies (heat/api/middleware/fault.py:124-128). Body: see 01 § 1.3;error.messageonly forsafeexceptions (allHeatExceptions). - **
webob.excraised by handlers** (400 parse errors, 403 tenant mismatch, 404, 302, 202, 204) are wrapped inHTTPExceptionDisguiseand keep their own status (heat/common/wsgi.py:355-371); non-error webob exceptions (302/202/204) are returned as responses. - **Exceptions that are not
HeatException** (oslo.messagingMessagingTimeout,RemoteErrorfor non-Heat engine errors,KeyError, database errors leaking from the engine) → 500 witherror.typeset but nomessage(heat/api/middleware/fault.py:161-162). An engine that does not answer withinrpc_response_timeout(60 s) therefore yields a 500MessagingTimeout. - Status not visible in the class name:
ResourceTypeUnavailable→ 400 butActionNotComplete,InvalidTemplateAttribute,ResourcePropertyDependency,ResourceActionRestricted→ 500, because they are absent from the map and inherit fromHeatException(heat/api/middleware/fault.py:55-98). Most of them only appear wrapped inStackValidationFailed(400) during validation; raised at runtime they are resource failures. - CFN API. No fault wrapper; handlers catch RPC errors and call
map_remote_error(heat/api/aws/exception.py:285-338): 20 class names →InvalidParameterValue(400),Forbidden/NotAuthorized→AccessDenied(403),StackExists→AlreadyExists(400),ActionInProgress→InvalidAction(400),RequestLimitExceeded→RequestLimitExceeded(400), everything else →InternalFailure(500). Body:<ErrorResponse><Error><Type>Sender</Type><Code>…</Code><Message>explanation[:detail]</Message></Error></ErrorResponse>(XML; JSON withContentType=JSON) (heat/api/aws/exception.py:42-67). Quirk:already_exists_errorsandrequest_limit_exceededare strings, not tuples, soex_type in 'StackExists'is a substring test (heat/api/aws/exception.py:315-317); no Heat class name is a substring of those two today, so the outcome is right by accident. Note also thatEntityNotFoundis a 400InvalidParameterValuein CFN but a 404 natively.
2. Catalogue
Computed by _rewrite/tools/heat_errors.py (the native status and the CFN code are obtained by running the real translation functions on each class; raise sites by git grep outside the tests). Full data with all raise sites: [_rewrite/errors_stable-2026.2.json](_rewrite/errors_stable-2026.2.json).
| Exception | Native HTTP | CFN code | Message template | Raised at (first sites) | Defined at |
|---|---|---|---|---|---|
ActionInProgress | 409 | InvalidAction | "Stack %(stack_name)s already has an action (%(action)s) in progress." | heat/engine/service.py:2049, heat/engine/service.py:2199, heat/engine/stack_lock.py:74 (+1) | heat/common/exception.py:493 |
ActionNotComplete | 500 | InternalFailure | "Stack %(stack_name)s has an action (%(action)s) in progress or failed state." | heat/engine/service.py:2495, heat/engine/service.py:2506 | heat/common/exception.py:498 |
AuthorizationFailure | 500 | InternalFailure | "Authorization failed.%(failure_reason)s" | heat/common/auth_plugin.py:55, heat/common/context.py:198, heat/common/context.py:210 (+8) | heat/common/exception.py:89 |
CircularDependencyException | 400 | InternalFailure | "Circular Dependency Found: %(cycle)s" | heat/engine/dependencies.py:161 | heat/common/exception.py:573 |
ClientNotAvailable | 500 | InternalFailure | "The client (%(client_name)s) is not available." | heat/engine/resource.py:795, heat/engine/template_files.py:149 | heat/common/exception.py:307 |
ConcurrentTransaction | 500 | InternalFailure | "Concurrent transaction for %(action)s" | heat/engine/service_software_config.py:135, heat/engine/service_software_config.py:162, heat/objects/resource.py:360 | heat/common/exception.py:543 |
ConflictingMergeStrategyForParam | 500 | InternalFailure | "Conflicting merge strategy '%(strategy)s' for parameter '%(param)s' in file '%(env_file)s'." | heat/common/environment_util.py:125 | heat/common/exception.py:151 |
DownloadLimitExceeded | 400 | InternalFailure | "Permissible download limit exceeded: %(message)s" | heat/engine/clients/os/swift.py:161 | heat/common/exception.py:485 |
EgressRuleNotAllowed | 500 | InternalFailure | "Egress rules are only allowed when Neutron is used and the 'VpcId' property is set." | — (not raised in heat/) | heat/common/exception.py:459 |
EntityNotFound | 404 | InvalidParameterValue | "The %(entity)s (%(name)s) could not be found." | heat/db/api.py:1805, heat/engine/clients/os/barbican.py:67, heat/engine/clients/os/barbican.py:83 (+36) | heat/common/exception.py:180 |
Error | 500 | InternalFailure | "%(message)s" | heat/common/config.py:462, heat/common/config.py:472, heat/db/api.py:1242 (+42) | heat/common/exception.py:464 |
EventSendFailed | 500 | InternalFailure | "Failed to send message to stack (%(stack_name)s) on other engine (%(engine_id)s)" | heat/engine/service.py:1304, heat/engine/service.py:1553 | heat/common/exception.py:508 |
Forbidden | 403 | AccessDenied | "You are not authorized to use %(action)s." | heat/engine/service.py:1943 | heat/common/exception.py:104 |
HTTPExceptionDisguise | 500 | InternalFailure | — | heat/common/wsgi.py:354, heat/common/wsgi.py:371 | heat/common/exception.py:446 |
ImmutableParameterModified | 400 | InternalFailure | "The following parameters are immutable and may not be updated: %(keys)s" | heat/engine/service.py:1053 | heat/common/exception.py:136 |
IncompatibleObjectVersion | 400 | InternalFailure | "Version %(objver)s of %(objname)s is not supported" | — (not raised in heat/) | heat/common/exception.py:531 |
InterfaceAttachFailed | 500 | InternalFailure | "Failed to attach interface (%(port)s) to server (%(server)s)" | heat/engine/resources/openstack/nova/server_network_mixin.py:686 | heat/common/exception.py:513 |
InterfaceDetachFailed | 500 | InternalFailure | "Failed to detach interface (%(port)s) from server (%(server)s)" | heat/engine/resources/openstack/nova/server_network_mixin.py:669 | heat/common/exception.py:518 |
Invalid | 400 | InternalFailure | "Data supplied was not valid: %(reason)s" | heat/db/api.py:877, heat/db/api.py:1333, heat/engine/clients/__init__.py:97 (+3) | heat/common/exception.py:116 |
InvalidBreakPointHook | 400 | InvalidParameterValue | "%(message)s" | heat/engine/environment.py:65, heat/engine/resource.py:2470, heat/engine/resource.py:2476 | heat/common/exception.py:295 |
InvalidContentType | 500 | InternalFailure | "Invalid content type %(content_type)s" | heat/common/wsgi.py:215, heat/common/wsgi.py:220 | heat/common/exception.py:477 |
InvalidEncryptionKey | 500 | InternalFailure | "Can not decrypt data with the auth_encryption_key in heat config." | heat/common/crypt.py:133, heat/common/crypt.py:152 | heat/common/exception.py:170 |
InvalidExternalResourceDependency | 500 | InternalFailure | "Invalid dependency with external %(resource_type)s resource: %(external_id)s" | heat/engine/rsrc_defn.py:265 | heat/common/exception.py:175 |
InvalidGlobalResource | 500 | InternalFailure | "There was an error loading the definition of the global resource type %(type_name)s." | heat/engine/service.py:1759, heat/engine/service.py:1821 | heat/common/exception.py:286 |
InvalidMergeStrategyForParam | 500 | InternalFailure | "Invalid merge strategy '%(strategy)s' for parameter '%(param)s'." | heat/common/environment_util.py:113 | heat/common/exception.py:146 |
InvalidRestrictedAction | 500 | InternalFailure | "%(message)s" | heat/db/api.py:1553, heat/engine/environment.py:84 | heat/common/exception.py:299 |
InvalidSchemaError | 400 | InvalidParameterValue | "%(message)s" | heat/engine/constraints.py:99, heat/engine/constraints.py:115, heat/engine/constraints.py:126 (+34) | heat/common/exception.py:272 |
InvalidServiceVersion | 500 | InternalFailure | "Invalid service %(service)s version %(version)s" | heat/engine/clients/client_plugin.py:76, heat/engine/clients/microversion_mixin.py:26 | heat/common/exception.py:560 |
InvalidTemplateAttribute | 500 | InternalFailure | "The Referenced Attribute (%(resource)s %(key)s) is incorrect." | heat/engine/hot/functions.py:243, heat/engine/resource.py:2428, heat/engine/resources/aws/cfn/stack.py:85 (+12) | heat/common/exception.py:156 |
InvalidTemplateReference | 400 | InvalidParameterValue | "The specified reference "%(resource)s" (in %(key)s) is incorrect." | heat/engine/cfn/functions.py:86, heat/engine/hot/functions.py:144, heat/engine/hot/functions.py:196 (+1) | heat/common/exception.py:161 |
InvalidTemplateSection | 400 | InvalidParameterValue | "The template section is invalid: %(section)s" | heat/engine/template.py:303 | heat/common/exception.py:132 |
InvalidTemplateVersion | 400 | InvalidParameterValue | "The template version is invalid: %(explanation)s" | heat/engine/hot/functions.py:887, heat/engine/template.py:46, heat/engine/template.py:51 (+1) | heat/common/exception.py:128 |
InvalidTemplateVersions | 500 | InternalFailure | "A template version alias %(version)s was added for a template class that has no official YYYY-MM-DD version." | heat/engine/service.py:1712 | heat/common/exception.py:564 |
InvalidTenant | 403 | InvalidParameterValue | "Searching Tenant %(target)s from Tenant %(actual)s forbidden." | heat/engine/service.py:575 | heat/common/exception.py:204 |
KeystoneServiceNameConflict | 500 | InternalFailure | "Keystone has more than one service with same name %(service)s. Please use service id instead of name" | heat/engine/clients/os/keystone/__init__.py:149 | heat/common/exception.py:551 |
MissingCredentialError | 400 | InvalidParameterValue | "Missing required credential: %(required)s" | heat/engine/clients/os/keystone/heat_keystoneclient.py:228, heat/engine/service.py:731, heat/engine/service.py:733 | heat/common/exception.py:85 |
NotAuthenticated | 500 | InternalFailure | "You are not authenticated." | — (not raised in heat/) | heat/common/exception.py:100 |
NotAuthorized | 403 | AccessDenied | "You are not authorized to complete this action." | — (not raised in heat/) | heat/common/exception.py:112 |
NotFound | 404 | InternalFailure | — | heat/common/grouputils.py:157, heat/db/api.py:189, heat/db/api.py:259 (+34) | heat/common/exception.py:471 |
NotSupported | 400 | InvalidParameterValue | "%(feature)s is not supported." | heat/engine/resource.py:687, heat/engine/resource.py:2462, heat/engine/resources/aws/autoscaling/autoscaling_group.py:393 (+16) | heat/common/exception.py:370 |
ObjectActionError | 400 | InternalFailure | "Object action %(action)s failed because: %(reason)s" | — (not raised in heat/) | heat/common/exception.py:535 |
ObjectFieldInvalid | 400 | InternalFailure | "Field %(field)s of %(objname)s is not an instance of Field" | — (not raised in heat/) | heat/common/exception.py:547 |
OrphanedObjectError | 400 | InternalFailure | "Cannot call %(method)s on orphaned %(objtype)s object" | — (not raised in heat/) | heat/common/exception.py:527 |
PhysicalResourceExists | 500 | InternalFailure | "The physical resource for (%(name)s) exists." | heat/engine/resources/openstack/neutron/extrarouteset.py:229, heat/engine/resources/openstack/neutron/neutron.py:201 | heat/common/exception.py:190 |
PhysicalResourceIDAmbiguity | 400 | InvalidParameterValue | "Multiple resources were found with the physical ID (%(phys_id)s)." | heat/engine/service.py:2070, heat/engine/service.py:2098 | heat/common/exception.py:199 |
PhysicalResourceNameAmbiguity | 400 | InternalFailure | "Multiple physical resources were found with name (%(name)s)." | heat/engine/clients/os/neutron/__init__.py:183 | heat/common/exception.py:194 |
PropertyUnspecifiedError | 400 | InvalidParameterValue | "At least one of the following properties must be specified: %(props)s." | heat/engine/resources/aws/ec2/eip.py:208, heat/engine/resources/openstack/cinder/quota.py:204, heat/engine/resources/openstack/mistral/cron_trigger.py:116 (+8) | heat/common/exception.py:401 |
ReadOnlyFieldError | 400 | InternalFailure | "Cannot modify readonly field %(field)s" | — (not raised in heat/) | heat/common/exception.py:539 |
RequestLimitExceeded | 400 | RequestLimitExceeded | "Request limit exceeded: %(message)s" | heat/common/template_format.py:101, heat/common/wsgi.py:275, heat/engine/resources/stack_resource.py:269 (+7) | heat/common/exception.py:481 |
ResourceActionNotSupported | 400 | InvalidParameterValue | "%(action)s is not supported for resource." | heat/engine/resource.py:2490, heat/engine/resources/aws/s3/s3.py:163, heat/engine/resources/openstack/neutron/subnet.py:427 (+2) | heat/common/exception.py:374 |
ResourceActionRestricted | 500 | InternalFailure | "%(action)s is restricted for resource." | heat/engine/resource.py:1527, heat/engine/resource.py:1531 | heat/common/exception.py:378 |
ResourceFailure | 500 | InternalFailure | "%(error)s%(path)s%(message)s" | heat/engine/resource.py:1185, heat/engine/resource.py:1241, heat/engine/resource.py:1643 (+9) | heat/common/exception.py:311 |
ResourceInError | 500 | InternalFailure | "Went to status %(resource_status)s due to "%(status_reason)s"" | heat/engine/clients/os/neutron/__init__.py:145, heat/engine/clients/os/neutron/__init__.py:235, heat/engine/clients/os/nova.py:252 (+26) | heat/common/exception.py:431 |
ResourceNotAvailable | 404 | InvalidParameterValue | "The Resource (%(resource_name)s) is not available." | heat/engine/resource.py:504, heat/engine/resource.py:515, heat/engine/service.py:1993 (+1) | heat/common/exception.py:303 |
ResourceNotFound | 404 | InvalidParameterValue | "The Resource (%(resource_name)s) could not be found in Stack %(stack_name)s." | heat/engine/service.py:1947, heat/engine/service.py:1990, heat/engine/service.py:2077 | heat/common/exception.py:276 |
ResourcePropertyConflict | 400 | InvalidParameterValue | "Cannot define the following properties at the same time: %(props)s." | heat/engine/resources/aws/ec2/instance.py:783, heat/engine/resources/openstack/cinder/volume.py:686, heat/engine/resources/openstack/keystone/role_assignments.py:316 (+17) | heat/common/exception.py:382 |
ResourcePropertyDependency | 500 | InternalFailure | "%(prop1)s cannot be specified without %(prop2)s." | heat/engine/resources/openstack/barbican/order.py:226, heat/engine/resources/openstack/barbican/secret.py:147, heat/engine/resources/openstack/manila/share_network.py:134 (+2) | heat/common/exception.py:392 |
ResourcePropertyValueDependency | 500 | InternalFailure | "%(prop1)s property should only be specified for %(prop2)s with value %(value)s." | heat/engine/resources/aws/autoscaling/scaling_policy.py:96, heat/engine/resources/openstack/barbican/secret.py:176, heat/engine/resources/openstack/glance/image.py:302 (+3) | heat/common/exception.py:396 |
ResourceTypeUnavailable | 400 | InternalFailure | 99001 — | heat/engine/service.py:1769, heat/engine/service.py:1775 | heat/common/exception.py:291 |
ResourceUnknownStatus | 500 | InternalFailure | "%(result)s - Unknown status %(resource_status)s due to "%(status_reason)s"" | heat/engine/clients/os/cinder.py:165, heat/engine/clients/os/cinder.py:183, heat/engine/clients/os/nova.py:259 (+19) | heat/common/exception.py:421 |
SIGHUPInterrupt | 500 | InternalFailure | "System SIGHUP signal received." | — (not raised in heat/) | heat/common/exception.py:556 |
SnapshotNotFound | 404 | InternalFailure | "The Snapshot (%(snapshot)s) for Stack (%(stack)s) could not be found." | heat/db/api.py:1684 | heat/common/exception.py:281 |
StackExists | 409 | AlreadyExists | "The Stack (%(stack_name)s) already exists." | heat/db/api.py:996, heat/engine/service.py:740 | heat/common/exception.py:209 |
StackResourceLimitExceeded | 500 | InternalFailure | "Maximum resources per stack exceeded." | — (not raised in heat/) | heat/common/exception.py:489 |
StackValidationFailed | 400 | InvalidParameterValue | "%(error)s%(path)s%(message)s" | heat/engine/cfn/template.py:126, heat/engine/cfn/template.py:137, heat/engine/clients/os/neutron/neutron_constraints.py:123 (+162) | heat/common/exception.py:242 |
StopActionFailed | 500 | InternalFailure | "Failed to stop stack (%(stack_name)s) on other engine (%(engine_id)s)" | heat/engine/service.py:1593 | heat/common/exception.py:503 |
TemplateOutputError | 500 | InternalFailure | "Error in %(resource)s output %(attribute)s: %(message)s" | heat/engine/resources/stack_resource.py:674, heat/engine/resources/template_resource.py:335 | heat/common/exception.py:166 |
UnableToAutoAllocateNetwork | 500 | InternalFailure | "Unable to automatically allocate a network: %(message)s" | heat/engine/resources/openstack/nova/server_network_mixin.py:475 | heat/common/exception.py:569 |
UnknownUserParameter | 400 | InvalidParameterValue | "The Parameter (%(key)s) was not defined in template." | heat/engine/parameters.py:572 | heat/common/exception.py:124 |
UnsupportedObjectError | 400 | InternalFailure | "Unsupported object type %(objtype)s" | — (not raised in heat/) | heat/common/exception.py:523 |
UpdateInProgress | 500 | InternalFailure | — | heat/db/api.py:303, heat/engine/resource.py:416, heat/engine/resource.py:2183 | heat/common/exception.py:440 |
UpdateReplace | 500 | InternalFailure | — | heat/engine/resource.py:693, heat/engine/resource.py:696, heat/engine/resource.py:1376 (+9) | heat/common/exception.py:414 |
UserParameterMissing | 400 | InvalidParameterValue | "The Parameter (%(key)s) was not provided." | heat/engine/hot/functions.py:101, heat/engine/parameters.py:245, heat/engine/parameters.py:261 (+3) | heat/common/exception.py:120 |
UpdateInProgress and UpdateReplace are not HeatExceptions: they are internal control flow of the convergence worker (resource locked by another engine; resource must be replaced) and never meant to reach a client (heat/common/exception.py:414-443). HEAT-E99001 is the only error code (ResourceTypeUnavailable); it prefixes the message (heat/common/exception.py:60-74) and is the only value accepted in POST /validate?ignore_errors= (heat/engine/service.py:1341-1347).
3. Situations that matter to clients
| Situation | Exception / status | Message seen | Source |
|---|---|---|---|
| Stack name already used in the project | StackExists 409 | The Stack (s) already exists. | heat/engine/service.py:739-740, heat/db/api.py:991-996 |
| Too many stacks / resources / snapshots / configs / deployments | RequestLimitExceeded 400 | Request limit exceeded: You have reached the maximum stacks per tenant, 512. Please delete some stacks. (and the other variants) | heat/engine/service.py:743-749, heat/engine/service.py:760-766, heat/engine/service.py:2203-2211, heat/engine/service.py:2378-2385, heat/engine/service.py:2425-2433 |
| JSON body too large | RequestLimitExceeded 400 | JSON body size (N bytes) exceeds maximum allowed size (1048576 bytes). | heat/common/wsgi.py:268-275 |
| No or ambiguous template version key | InvalidTemplateVersion 400 | The template version is invalid: Template version was not provided / Ambiguous versions (…) | heat/engine/template.py:40-51 |
| Unknown version value | InvalidTemplateVersion 400 | The template version is invalid: "heat_template_version: 2099-01-01". "heat_template_version" should be one of: … | heat/engine/template.py:76-89 |
| Unknown resource type | StackValidationFailed 400 (create/validate), 404 (GET resource_types/X) | The Resource Type (X) could not be found. | heat/engine/environment.py:534-535 |
| Resource type forbidden by policy | Forbidden 403 | You are not authorized to use resource_types:OS::Nova::Flavor. | heat/common/policy.py (ResourceEnforcer), heat/engine/service.py:813 |
| Service of a type not in the catalog | StackValidationFailed / ResourceTypeUnavailable 400 | HEAT-E99001 Service nova is not available for resource type OS::Nova::Server, reason: Service endpoint not in service catalog. | heat/engine/service.py:1766-1778, heat/engine/resource.py:785-828 |
| Property/parameter errors | StackValidationFailed 400 | <error>: <path>: <message>, path joined with dots and [n] for indexes, e.g. Property error: resources.a.properties.value: … | heat/common/exception.py:213-245 |
| Missing / unknown parameter | UserParameterMissing / UnknownUserParameter 400 | The Parameter (p) was not provided. / The Parameter (p) was not defined in template. | heat/engine/parameters.py:245-261, heat/engine/parameters.py:572 |
| Dependency cycle | CircularDependencyException 400 | Circular Dependency Found: … | heat/engine/dependencies.py:161 |
| Immutable parameter changed on update | ImmutableParameterModified 400 | The following parameters are immutable and may not be updated: p | heat/engine/service.py:1050-1053 |
| Update of a suspended / deleting stack | NotSupported 400 | Updating a stack when it is suspended is not supported. | heat/engine/service.py:1098-1104 |
| Cancel in the wrong state | NotSupported 400 | Cancelling update when stack is CREATE_COMPLETE is not supported. | heat/engine/service.py:1259-1263 |
| Abandon/adopt disabled | NotSupported 400 | Stack Abandon is not supported. | heat/engine/service.py:1625-1626, heat/engine/service.py:781-782 |
| Legacy stack locked by a live engine; resource locked (mark unhealthy); snapshot while in progress | ActionInProgress 409 | Stack s already has an action (UPDATE) in progress. | heat/engine/stack_lock.py:69-75, heat/engine/service.py:2048-2050, heat/engine/service.py:2194-2200 |
| Stack name/id mismatch or deleted stack | EntityNotFound 404 | The Stack (s) could not be found. | heat/engine/service.py:557, heat/engine/service.py:568-580, heat/engine/service.py:1504 |
| Resource not in stack | ResourceNotFound 404 | The Resource (r) could not be found in Stack s. | heat/engine/service.py:1946-1948 |
| Signal to a resource that cannot take it now | ResourceActionNotSupported 400 | Signal resource during CREATE is not supported. | heat/engine/resource.py:2457-2462 |
| Engine RPC timeout | MessagingTimeout 500 | no message | heat/api/middleware/fault.py:100-107 |
| Keystone trust / domain user failure | AuthorizationFailure 500, or stack CREATE_FAILED | Authorization failed. | heat/engine/clients/os/keystone/heat_keystoneclient.py:147-151, heat/engine/service.py:891-901 |
Wrong auth_encryption_key | InvalidEncryptionKey 500 | Can not decrypt data with the auth_encryption_key in heat config. | heat/common/crypt.py (cryptography_decrypt_v1) |
4. Asynchronous errors (statuses and events)
They are written to stack.status_reason / resource.status_reason and one event row each; the client sees them by polling or in GET …/events.
| Status reason | Set when | Source |
|---|---|---|
Resource CREATE failed: <ExceptionClass>: <path>: <message> (stack) and <ExceptionClass>: <message> (resource) | a plugin's handle_*/check_*_complete raised | heat/engine/resource.py:911-919, heat/engine/check_resource.py:188-194 |
Timed out | the traversal outlived timeout_mins (default stack_action_timeout, 3600 s) | heat/engine/check_resource.py:126-128, heat/engine/check_resource.py:195-198 |
Worker went down during resource <ACTION> | lock stolen from a dead engine | heat/engine/check_resource.py:82-88 |
<ACTION> aborted (user triggered cancel) | resource worker cancelled | heat/engine/resource.py:920-930, heat/engine/check_resource.py:37-43 |
Stack <ACTION> cancelled | cancel_without_rollback, or delete during an operation | heat/engine/worker.py:386-393 |
Engine went down during stack <ACTION> | legacy stack found IN_PROGRESS with a dead lock holder at engine start | heat/engine/service.py:2600-2608 |
Stack status manually reset | heat-manage reset_stack_status | heat/db/api.py:1068-1095 |
Resource CHECK failed: a: …; b: … | CHECK action with failures | heat/engine/check_resource.py:461-472 |
Unexpected exit while IN_PROGRESS. / the exception text | unhandled exception in a stack-level task | heat/engine/stack.py:106-130 |
Went to status ERROR due to "…" (ResourceInError), … Unknown status … (ResourceUnknownStatus) | the remote resource (server, volume…) reached an error state | heat/common/exception.py:421-438, raised by resource plugins (29 + 22 sites) |
Software deployment FAILED: deploy_status_code : Deployment exited with non-zero status code: N | agent signal | heat/engine/service_software_config.py:322-351 |
Rollback: with disable_rollback = false, a failed CREATE/UPDATE/ADOPT/RESTORE goes on to ROLLBACK_IN_PROGRESS; the failure reason stays in the events, the stack ends ROLLBACK_COMPLETE (heat/engine/stack.py:2348-2353). Clients that only look at the final state see ROLLBACK_COMPLETE, not the cause.
5. Key log messages
| Level | Message | Situation | Source |
|---|---|---|---|
| ERROR | Returning %(code)s to user: %(explanation)s | a 5xx webob error in a handler | heat/common/wsgi.py:366-369 |
| ERROR | Unexpected error occurred serving API: %s | non-Heat exception in a handler | heat/common/wsgi.py:439-442 |
| ERROR | Unhandled exception in %s | exception in a worker RPC method | heat/engine/worker.py:46-55 |
| WARNING | [%s] Sync point update failed for entity %s | sync point vanished during the merge | heat/engine/sync_point.py:192-196 |
| WARNING | Failed to store stack %(name)s with traversal ID %(trvsl_id)s, aborting stack %(action)s | concurrent traversal won the CAS | heat/engine/stack.py:1488-1493 |
| INFO | Stack %(name)s traversal %(trvsl_id)s no longer active; not setting state to … | late worker of an old traversal | heat/engine/stack.py:1113-1118 |
| INFO | Stale lock detected on stack %(stack)s. Engine %(engine)s will attempt to steal the lock | legacy lock of a dead engine | heat/engine/stack_lock.py:77-79 |
| ERROR | FATAL. Failed stack_lock release. Exiting | the engine exits | heat/engine/service.py:247-253 |
| ERROR | Failed to deliver deployment data to server %s: %s | metadata TempURL PUT failed | heat/engine/service_software_config.py:145-147 |
| ERROR | Domain admin client authentication failed | wrong stack_domain_admin credentials | heat/engine/clients/os/keystone/heat_keystoneclient.py:150 |
| ERROR | trust token re-scoping failed! / Trust impersonation failed | Keystone trust problems | heat/engine/clients/os/keystone/heat_keystoneclient.py:184-192 |
Source: reverse-spec-heat/02-errors_stable-2026.2.md. The _rewrite/ and _inventory/ files are not published on the site.