Errors — keystone — branch stable/2026.2
Branch
stable/2026.2@e6dc5ae079e6— repository https://opendev.org/openstack/keystone — analysed on 2026-10-28
1. How an exception becomes an HTTP response
Unlike Placement, Keystone has a single central translation:
- every subclass of
keystone.exception.Errorthat has an HTTPcodeis registered automatically inKEYSTONE_API_EXCEPTIONS(keystone/exception.py:27-60); - each one is attached to the Flask handler
_handle_keystone_exception(keystone/server/flask/application.py:126-173, registered atkeystone/server/flask/application.py:202-203).
The handler:
- Special cases:
InsufficientAuthMethods→ 401 with an auth receipt (keystone/receipt/handlers.py);OAuth2Error→ RFC 6749 body (keystone/oauth2/handlers.py);RedirectRequired→ 302 (WebSSO).
- Logging:
Unauthorized→WARNING "Authorization failed. <exception> from <remote_addr>", with the client address;NotFound→ DEBUG;- any other error →
LOG.exception(stack trace).
- Body (status = the exception's
code):json {"error": {"code": 404, "title": "Not Found", "message": "Could not find user: 6c3…"}}The message is translated according toAccept-Language(keystone/server/flask/application.py:113-123). ForAuthPluginException(incomplete MFA, for example),error.identitylists the methods and their data. - 401 responses add
WWW-Authenticate: Keystone uri="<public base URL>"(keystone/server/flask/application.py:170-172).
Exceptions that are not Keystone exceptions:
TypeErrorbecomes **400ValidationError** (keystone/server/flask/application.py:176-183). This is what a client sees when it calls a member method on a collection path (REST API § 1).- Any other exception (SQL error, LDAP error, bug) escapes Flask and goes to the WSGI server: a 500 without a Keystone body [inferred:
PROPAGATE_EXCEPTIONS=True,keystone/server/flask/application.py:218-221]. werkzeugexceptions (404 unknown route, 405 method not declared) get Flask's HTML body, not Keystone's JSON [inferred from Flask behaviour].
Message masking (SecurityError)
Unauthorized, Forbidden and UnexpectedError derive from SecurityError (keystone/exception.py:260-312). **The message passed at raise time is only shown if [DEFAULT]/insecure_debug = true.** Otherwise the client receives the class's generic template ("The request you have made requires authentication.", "You are not authorized to perform the requested action.", "An unexpected error prevented the server from fulfilling your request.").
Subclasses raised with named arguments (UserDisabled(user_id=…), AccountLocked(user_id=…), PasswordExpired(user_id=…), ForbiddenAction(action=…)) do show their template filled in, for example "The account is locked for user: 6c3….". Clients and operators can therefore tell the authentication failures apart, except bad credentials, which stay generic ("Invalid username or password" only with insecure_debug).
Database conflicts
@sql.handle_conflicts (34 driver methods) turns oslo.db's DBDuplicateEntry into **409 Conflict** "Duplicate entry found with name X at domain ID Y". The raw SQL is only logged at DEBUG (keystone/common/sql/core.py:567-610).
2. Statuses and situations that matter to clients
| Status | Main exceptions | Typical situations |
|---|---|---|
| 400 | ValidationError, SchemaValidationError, PasswordValidationError and its subclasses, AmbiguityError, CircularRegionHierarchyError, ApplicationCredentialValidationError | body that fails the JSON schema (keystone/*/schema.py); weak or reused password, or one changed too early; a name that exists in several domains ("use ID instead of names"); a cycle in the regions; remaining_uses ≤ 0 on a trust; a project under a disabled parent; an unknown Fernet payload version ("This is not a recognized Fernet payload version") |
| 401 | Unauthorized, AccountLocked, UserDisabled, PasswordExpired, AuthMethodNotSupported, InsufficientAuthMethods, AdditionalAuthRequired, ReceiptNotFound, ApplicationCredentialAuthError | bad password or credentials; locked account ([security_compliance]/lockout_*); disabled user; expired password (password_expires_days); unknown method in identity.methods; incomplete MFA (receipt); missing or invalid X-Auth-Token on an authenticated route (keystone/common/rbac_enforcer/enforcer.py:300-320); EC2 or S3 signature refused or expired timestamp; EC2 credential that is not a party to the trust (fix on this branch) |
| 403 | ForbiddenAction, Forbidden, ForbiddenNotSecurity and its subclasses (ResourceUpdateForbidden, ResourceDeleteForbidden, CredentialLimitExceeded, ApplicationCredentialLimitExceeded, RegionDeletionError, RegisteredLimitError), TrustUseLimitReached, InvalidImpliedRole, DomainSpecificRoleMismatch, CrossBackendNotAllowed, InvalidDomainConfig, InvalidLimit | policy refused ("You are not authorized to perform the requested action: identity:create_user."); a resource marked immutable; credential quota reached; a region that still has endpoints; trust re-delegation outside the rules; project tree too deep; a parent that cannot be disabled while its children are enabled; deleting a project that is not a leaf without cascade |
| 404 | NotFound and its 25 subclasses, notably **TokenNotFound** | unknown entity; any token that fails validation (expired, revoked, undecryptable, disabled user, access rules not supported by the middleware) is reported as TokenNotFound (keystone/token/provider.py:139-153) |
| 405 | (werkzeug), exceptions.MethodNotAllowed | GET on /v3/ec2tokens and /v3/s3tokens; methods other than POST on /v3/OS-OAUTH2/token |
| 409 | Conflict | duplicate name (user, project, role… within a domain); region ID already taken |
| 410 | Gone | OS-SIMPLE-CERT; OS-PKI/revoked when revoke_by_id = false |
| 500 | UnexpectedError and its subclasses (KeysNotFound, SAMLSigningError, LDAPServerConnectionError, LDAPSizeLimitExceeded, MalformedEndpoint, MappedGroupNotFound…) | Fernet key repository empty or unreadable (KeysNotFound, so every token issue or validation fails); xmlsec1 failure; LDAP unreachable; an endpoint URL with an unknown substitution; a mapping that points to a group that does not exist |
| 501 | NotImplemented | an operation the configured backend does not support (230 raise sites: the abstract methods of the drivers, LDAP being read-only, for example) |
Traps for a client or a rewrite:
- A token that fails validation is a 404, not a 401, while a bad
X-Auth-Tokenon any other call is a 401. keystonemiddleware relies on this distinction. - **401 with a body that has an
identityfield**: incomplete MFA. The client must send the receipt back with theOpenstack-Auth-Receiptheader. - Auth errors stay generic unless
insecure_debugis set: a rewrite must keep this masking, or it leaks whether an account exists.
3. Errors that never reach the client
| Situation | Where it shows | Source |
|---|---|---|
| Sending a notification fails (bus unreachable) | LOG.exception "Failed to send … notification"; the API call still succeeds | keystone/notifications.py:582-636, keystone/notifications.py:944-1020 |
| The notifier cannot be created | _notifier = False: no further notification is sent for the life of the process | keystone/notifications.py:487-506 |
| A message template is missing an argument | WARNING "missing exception kwargs (programmer error)"; the raw template is returned | keystone/exception.py:62-96 |
| A disabled user's token is validated | WARNING "Unable to validate token because user … is disabled", then revocation of all their tokens | keystone/token/provider.py:218-229 |
A Fernet token is longer than max_token_size | INFO "Fernet token created with length of …" | keystone/token/token_formatters.py (create_token) |
| A cache entry that cannot be deserialised | CacheDeserializationError, treated as a cache miss [inferred] | keystone/exception.py:810 |
4. Complete catalogue (109 classes)
Generated from keystone.exception (code, title and template read on the class). The raise sites are the raise exception.X lines outside tests (689 in all; the first three are shown).
| Class | Parent | HTTP | Message template | Defined at | Raise sites |
|---|---|---|---|---|---|
Error | Exception | — | — | keystone/exception.py:62 | keystone/assignment/backends/sql.py:262, keystone/common/json_home.py:87 |
ValidationError | Error | 400 | Expecting to find %(attribute)s in %(target)s. The server could not comply with the request since it is either malformed or otherwise incorrect. Th… | keystone/exception.py:98 | keystone/token/token_formatters.py:90, keystone/token/token_formatters.py:232, keystone/identity/backends/ldap/common.py:1973 (+95) |
URLValidationError | ValidationError | 400 | Cannot create an endpoint with an invalid URL: %(url)s. | keystone/exception.py:109 | keystone/common/utils.py:481 |
PasswordValidationError | ValidationError | 400 | Password validation error: %(detail)s. | keystone/exception.py:115 | keystone/common/password_hashers/scrypt.py:94, keystone/common/password_hashers/pbkdf2.py:93, keystone/common/password_hashers/bcrypt.py:124 (+2) |
PasswordRequirementsValidationError | PasswordValidationError | 400 | The password does not match the requirements: %(detail)s. | keystone/exception.py:119 | keystone/common/validation/validators.py:41 |
PasswordHistoryValidationError | PasswordValidationError | 400 | The new password cannot be identical to a previous password. The total number which includes the new password must be unique is %(unique_count)s. | keystone/exception.py:125 | keystone/identity/backends/sql.py:304 |
PasswordAgeValidationError | PasswordValidationError | 400 | You cannot change your password at this time due to the minimum password age. Once you change your password, it must be used for %(min_age_days)d d… | keystone/exception.py:134 | keystone/identity/backends/sql.py:329 |
PasswordSelfServiceDisabled | PasswordValidationError | 400 | You cannot change your password at this time due to password policy disallowing password changes. Please contact your administrator to reset your p… | keystone/exception.py:145 | keystone/identity/backends/sql.py:315 |
SchemaValidationError | ValidationError | 400 | %(detail)s | keystone/exception.py:154 | keystone/auth/schema.py:110, keystone/auth/schema.py:119, keystone/auth/schema.py:130 (+6) |
ValidationTimeStampError | Error | 400 | Timestamp not in expected format. The server could not comply with the request since it is either malformed or otherwise incorrect. The client is a… | keystone/exception.py:160 | keystone/identity/core.py:1253, keystone/common/utils.py:367 |
InvalidOperatorError | ValidationError | 400 | The given operator %(_op)s is not valid. It must be one of the following: 'eq', 'neq', 'lt', 'lte', 'gt', or 'gte'. | keystone/exception.py:171 | keystone/identity/core.py:1258 |
ValidationExpirationError | Error | 400 | The 'expires_at' must not be before now. The server could not comply with the request since it is either malformed or otherwise incorrect. The clie… | keystone/exception.py:179 | keystone/common/utils.py:369 |
StringLengthExceeded | ValidationError | 400 | String length exceeded. The length of string '%(string)s' exceeds the limit of column %(type)s(CHAR(%(length)d)). | keystone/exception.py:190 | keystone/common/sql/core.py:107 |
AmbiguityError | ValidationError | 400 | There are multiple %(resource)s entities named '%(name)s'. Please use ID instead of names to resolve the ambiguity. | keystone/exception.py:198 | keystone/assignment/core.py:1482 |
ApplicationCredentialValidationError | ValidationError | 400 | Invalid application credential: %(detail)s | keystone/exception.py:206 | keystone/api/users.py:734, keystone/api/users.py:818 |
CircularRegionHierarchyError | Error | 400 | The specified parent region %(parent_region_id)s would create a circular region hierarchy. | keystone/exception.py:210 | keystone/catalog/backends/base.py:41 |
ForbiddenNotSecurity | Error | 403 | — | keystone/exception.py:219 | keystone/application_credential/backends/sql.py:315, keystone/resource/core.py:81, keystone/resource/core.py:320 (+5) |
PasswordVerificationError | ForbiddenNotSecurity | 403 | The password length must be less than or equal to %(size)i. The server could not comply with the request because the password is invalid. | keystone/exception.py:231 | keystone/common/password_hashing.py:112 |
RegionDeletionError | ForbiddenNotSecurity | 403 | Unable to delete region %(region_id)s because it or its child regions have associated endpoints. | keystone/exception.py:239 | keystone/catalog/backends/sql.py:167 |
ApplicationCredentialLimitExceeded | ForbiddenNotSecurity | 403 | Unable to create additional application credentials, maximum of %(limit)d already exceeded for user. | keystone/exception.py:246 | keystone/application_credential/core.py:100 |
CredentialLimitExceeded | ForbiddenNotSecurity | 403 | Unable to create additional credentials, maximum of %(limit)d already exceeded for user. | keystone/exception.py:253 | keystone/credential/core.py:95 |
SecurityError | Error | — | — | keystone/exception.py:260 | — |
Unauthorized | SecurityError | 401 | The request you have made requires authentication. | keystone/exception.py:314 | keystone/auth/plugins/totp.py:127, keystone/auth/plugins/mapped.py:484, keystone/auth/plugins/mapped.py:619 (+58) |
InsufficientAuthMethods | Error | 401 | Insufficient auth methods received for %(user_id)s. Auth Methods Provided: %(methods)s. | keystone/exception.py:320 | keystone/api/_shared/authentication.py:254 |
ReceiptNotFound | Unauthorized | 401 | Could not find auth receipt: %(receipt_id)s. | keystone/exception.py:338 | keystone/receipt/provider.py:109, keystone/receipt/provider.py:119, keystone/receipt/provider.py:151 (+3) |
PasswordExpired | Unauthorized | 401 | The password is expired and needs to be changed for user: %(user_id)s. | keystone/exception.py:342 | keystone/identity/backends/sql.py:78 |
AuthPluginException | Unauthorized | 401 | Authentication plugin error. | keystone/exception.py:349 | — |
UserDisabled | Unauthorized | 401 | The account is disabled for user: %(user_id)s. | keystone/exception.py:357 | keystone/token/provider.py:249, keystone/identity/backends/sql.py:76 |
AccountLocked | Unauthorized | 401 | The account is locked for user: %(user_id)s. | keystone/exception.py:361 | keystone/identity/backends/sql.py:71 |
AuthMethodNotSupported | AuthPluginException | 401 | Attempted to authenticate with an unsupported method. | keystone/exception.py:365 | keystone/auth/core.py:63, keystone/auth/core.py:348 |
ApplicationCredentialAuthError | AuthPluginException | 401 | Error authenticating with application credential: %(detail)s | keystone/exception.py:373 | keystone/auth/core.py:282 |
AdditionalAuthRequired | AuthPluginException | 401 | Additional authentications steps required. | keystone/exception.py:379 | keystone/api/_shared/authentication.py:199 |
Forbidden | SecurityError | 403 | You are not authorized to perform the requested action. | keystone/exception.py:387 | keystone/identity/backends/ldap/core.py:159, keystone/identity/backends/ldap/core.py:170, keystone/identity/backends/ldap/core.py:173 (+25) |
ForbiddenAction | Forbidden | 403 | You are not authorized to perform the requested action: %(action)s. | keystone/exception.py:395 | keystone/identity/backends/ldap/common.py:1960, keystone/auth/plugins/token.py:74, keystone/auth/plugins/token.py:81 (+19) |
CrossBackendNotAllowed | Forbidden | 403 | Group membership across backend boundaries is not allowed. Group in question is %(group_id)s, user is %(user_id)s. | keystone/exception.py:401 | keystone/identity/core.py:1001 |
InvalidPolicyAssociation | Forbidden | 403 | Invalid mix of entities for policy association: only Endpoint, Service, or Region+Service allowed. Request was - Endpoint: %(endpoint_id)s, Service… | keystone/exception.py:409 | keystone/endpoint_policy/core.py:71 |
InvalidDomainConfig | Forbidden | 403 | Invalid domain specific configuration: %(reason)s. | keystone/exception.py:418 | keystone/resource/core.py:1240, keystone/resource/core.py:1251, keystone/resource/core.py:1296 (+7) |
InvalidLimit | Forbidden | 403 | Invalid resource limit: %(reason)s. | keystone/exception.py:422 | keystone/limit/models/strict_two_level.py:89, keystone/limit/models/strict_two_level.py:106, keystone/limit/models/strict_two_level.py:152 (+1) |
LimitTreeExceedError | Exception | — | — | keystone/exception.py:426 | keystone/resource/core.py:1142 |
NotFound | Error | 404 | Could not find: %(target)s. | keystone/exception.py:439 | keystone/identity/backends/ldap/core.py:151, keystone/identity/backends/ldap/common.py:1634, keystone/identity/backends/ldap/common.py:1648 (+11) |
MarkerNotFound | NotFound | 404 | Marker %(marker)s could not be found. | keystone/exception.py:445 | keystone/identity/backends/sql.py:199, keystone/identity/backends/sql.py:485, keystone/resource/backends/sql.py:90 |
EndpointNotFound | NotFound | 404 | Could not find endpoint: %(endpoint_id)s. | keystone/exception.py:449 | keystone/catalog/backends/sql.py:251, keystone/catalog/core.py:232, keystone/catalog/core.py:239 |
PolicyNotFound | NotFound | 404 | Could not find policy: %(policy_id)s. | keystone/exception.py:453 | keystone/policy/backends/sql.py:47 |
PolicyAssociationNotFound | NotFound | 404 | Could not find policy association. | keystone/exception.py:457 | keystone/endpoint_policy/backends/sql.py:96, keystone/endpoint_policy/backends/sql.py:128 |
RoleNotFound | NotFound | 404 | Could not find role: %(role_id)s. | keystone/exception.py:461 | keystone/auth/plugins/mapped.py:407, keystone/assignment/core.py:1476, keystone/assignment/role_backends/sql.py:64 (+3) |
ImpliedRoleNotFound | NotFound | 404 | %(prior_role_id)s does not imply %(implied_role_id)s. | keystone/exception.py:465 | keystone/assignment/role_backends/sql.py:114 |
InvalidImpliedRole | Forbidden | 403 | %(role_id)s cannot be an implied roles. | keystone/exception.py:469 | keystone/assignment/core.py:1553, keystone/assignment/core.py:1556 |
DomainSpecificRoleMismatch | Forbidden | 403 | Project %(project_id)s must be in the same domain as the role %(role_id)s being assigned. | keystone/exception.py:473 | keystone/assignment/core.py:318 |
DomainSpecificRoleNotWithinIdPDomain | Forbidden | 403 | role: %(role_name)s must be within the same domain as the identity provider: %(identity_provider)s. | keystone/exception.py:480 | keystone/auth/plugins/mapped.py:421 |
DomainIdInvalid | ValidationError | 400 | Domain ID does not conform to required UUID format. | keystone/exception.py:487 | keystone/api/domains.py:177 |
RoleAssignmentNotFound | NotFound | 404 | Could not find role assignment with role: %(role_id)s, user or group: %(actor_id)s, project, domain, or system: %(target_id)s. | keystone/exception.py:491 | keystone/assignment/backends/sql.py:140, keystone/assignment/backends/sql.py:166, keystone/assignment/backends/sql.py:400 (+2) |
RegionNotFound | NotFound | 404 | Could not find region: %(region_id)s. | keystone/exception.py:499 | keystone/catalog/backends/sql.py:116, keystone/catalog/core.py:109, keystone/catalog/core.py:120 (+1) |
ServiceNotFound | NotFound | 404 | Could not find service: %(service_id)s. | keystone/exception.py:503 | keystone/catalog/backends/sql.py:204, keystone/catalog/core.py:161, keystone/catalog/core.py:182 |
DomainNotFound | NotFound | 404 | Could not find domain: %(domain_id)s. | keystone/exception.py:507 | keystone/identity/core.py:909, keystone/models/token_model.py:489, keystone/models/token_model.py:521 (+8) |
ProjectNotFound | NotFound | 404 | Could not find project: %(project_id)s. | keystone/exception.py:511 | keystone/auth/core.py:212, keystone/models/token_model.py:480, keystone/resource/backends/sql.py:44 (+2) |
ProjectTagNotFound | NotFound | 404 | Could not find project tag: %(project_tag)s. | keystone/exception.py:515 | keystone/resource/core.py:1075, keystone/resource/core.py:1133 |
TokenNotFound | NotFound | 404 | Could not find token: %(token_id)s. | keystone/exception.py:519 | keystone/token/provider.py:143, keystone/token/provider.py:152, keystone/token/provider.py:214 (+7) |
UserNotFound | NotFound | 404 | Could not find user: %(user_id)s. | keystone/exception.py:523 | keystone/identity/shadow_backends/sql.py:160, keystone/identity/shadow_backends/sql.py:223, keystone/identity/shadow_backends/sql.py:243 (+3) |
GroupNotFound | NotFound | 404 | Could not find group: %(group_id)s. | keystone/exception.py:527 | keystone/identity/backends/sql.py:513, keystone/identity/backends/sql.py:528, keystone/identity/core.py:548 |
MappingNotFound | NotFound | 404 | Could not find mapping: %(mapping_id)s. | keystone/exception.py:531 | keystone/federation/backends/sql.py:412 |
TrustNotFound | NotFound | 404 | Could not find trust: %(trust_id)s. | keystone/exception.py:535 | keystone/trust/backends/sql.py:121, keystone/trust/backends/sql.py:166, keystone/trust/backends/sql.py:170 (+2) |
TrustUseLimitReached | Forbidden | 403 | No remaining uses for trust: %(trust_id)s. | keystone/exception.py:539 | keystone/trust/backends/sql.py:149 |
CredentialNotFound | NotFound | 404 | Could not find credential: %(credential_id)s. | keystone/exception.py:543 | keystone/credential/backends/sql.py:87 |
VersionNotFound | NotFound | 404 | Could not find version: %(version)s. | keystone/exception.py:547 | — |
EndpointGroupNotFound | NotFound | 404 | Could not find Endpoint Group: %(endpoint_group_id)s. | keystone/exception.py:551 | keystone/catalog/backends/sql.py:451 |
IdentityProviderNotFound | NotFound | 404 | Could not find Identity Provider: %(idp_id)s. | keystone/exception.py:555 | keystone/federation/backends/sql.py:313, keystone/federation/backends/sql.py:322 |
ServiceProviderNotFound | NotFound | 404 | Could not find Service Provider: %(sp_id)s. | keystone/exception.py:559 | keystone/federation/backends/sql.py:481 |
FederatedProtocolNotFound | NotFound | 404 | Could not find federated protocol %(protocol_id)s for Identity Provider: %(idp_id)s. | keystone/exception.py:563 | keystone/federation/backends/sql.py:362 |
PublicIDNotFound | NotFound | 404 | %(id)s | keystone/exception.py:570 | keystone/identity/core.py:972 |
RegisteredLimitNotFound | NotFound | 404 | Could not find registered limit for %(id)s. | keystone/exception.py:576 | keystone/limit/backends/sql.py:224 |
LimitNotFound | NotFound | 404 | Could not find limit for %(id)s. | keystone/exception.py:580 | keystone/limit/backends/sql.py:305 |
NoLimitReference | Forbidden | 403 | Unable to create a limit that has no corresponding registered limit. | keystone/exception.py:584 | keystone/limit/backends/sql.py:258, keystone/limit/backends/sql.py:282 |
RegisteredLimitError | ForbiddenNotSecurity | 403 | Unable to update or delete registered limit %(id)s because there are project limits associated with it. | keystone/exception.py:590 | keystone/limit/backends/sql.py:174, keystone/limit/backends/sql.py:207, keystone/limit/backends/sql.py:240 |
DomainConfigNotFound | NotFound | 404 | Could not find %(group_or_option)s in domain configuration for domain %(domain_id)s. | keystone/exception.py:597 | keystone/resource/config_backends/sql.py:96, keystone/resource/core.py:1450, keystone/resource/core.py:1592 (+3) |
ConfigRegistrationNotFound | Exception | — | — | keystone/exception.py:604 | keystone/resource/config_backends/sql.py:165 |
ApplicationCredentialNotFound | NotFound | 404 | Could not find Application Credential: %(application_credential_id)s. | keystone/exception.py:611 | keystone/application_credential/backends/sql.py:236, keystone/application_credential/backends/sql.py:259 |
AccessRuleNotFound | NotFound | 404 | Could not find Access Rule: %(access_rule_id)s. | keystone/exception.py:617 | keystone/application_credential/backends/sql.py:179, keystone/application_credential/backends/sql.py:288, keystone/application_credential/backends/sql.py:310 |
Conflict | Error | 409 | Conflict occurred attempting to store %(type)s - %(details)s. | keystone/exception.py:621 | keystone/cmd/idutils.py:111, keystone/identity/backends/ldap/core.py:208, keystone/identity/backends/ldap/core.py:414 (+10) |
UnexpectedError | SecurityError | 500 | An unexpected error prevented the server from fulfilling your request. | keystone/exception.py:629 | keystone/identity/core.py:313, keystone/revoke/core.py:110, keystone/assignment/core.py:931 (+6) |
TrustConsumeMaximumAttempt | UnexpectedError | 500 | An unexpected error prevented the server from fulfilling your request. | keystone/exception.py:656 | keystone/trust/backends/sql.py:157 |
MalformedEndpoint | UnexpectedError | 500 | An unexpected error prevented the server from fulfilling your request. | keystone/exception.py:662 | keystone/common/utils.py:437, keystone/common/utils.py:442, keystone/common/utils.py:451 (+1) |
MappedGroupNotFound | UnexpectedError | 500 | An unexpected error prevented the server from fulfilling your request. | keystone/exception.py:668 | keystone/federation/utils.py:378 |
MetadataFileError | UnexpectedError | 500 | An unexpected error prevented the server from fulfilling your request. | keystone/exception.py:675 | keystone/api/os_federation.py:511 |
DirectMappingError | UnexpectedError | 500 | An unexpected error prevented the server from fulfilling your request. | keystone/exception.py:679 | keystone/federation/utils.py:813 |
AssignmentTypeCalculationError | UnexpectedError | 500 | An unexpected error prevented the server from fulfilling your request. | keystone/exception.py:687 | keystone/assignment/backends/sql.py:40 |
NotImplemented | Error | 501 | The action you have requested has not been implemented. | keystone/exception.py:695 | keystone/token/providers/base.py:53, keystone/token/providers/base.py:65, keystone/credential/backends/base.py:34 (+227) |
Gone | Error | 410 | The service you have requested is no longer available on this server. | keystone/exception.py:703 | keystone/api/auth.py:270, keystone/api/os_simple_cert.py:32, keystone/api/os_simple_cert.py:43 |
ServiceUnavailable | Error | 503 | The server is currently unable to handle the request due to misconfiguration or maintenance. | keystone/exception.py:711 | — |
ConfigFileNotFound | UnexpectedError | 500 | An unexpected error prevented the server from fulfilling your request. | keystone/exception.py:720 | — |
KeysNotFound | UnexpectedError | 500 | An unexpected error prevented the server from fulfilling your request. | keystone/exception.py:726 | keystone/token/token_formatters.py:63, keystone/receipt/receipt_formatters.py:65 |
MultipleSQLDriversInConfig | UnexpectedError | 500 | An unexpected error prevented the server from fulfilling your request. | keystone/exception.py:733 | keystone/identity/core.py:127, keystone/identity/core.py:303 |
MigrationNotProvided | Exception | — | — | keystone/exception.py:741 | — |
UnsupportedTokenVersionException | UnexpectedError | 500 | An unexpected error prevented the server from fulfilling your request. | keystone/exception.py:752 | — |
SAMLSigningError | UnexpectedError | 500 | An unexpected error prevented the server from fulfilling your request. | keystone/exception.py:756 | keystone/federation/idp.py:467, keystone/federation/idp.py:552 |
OAuthHeadersMissingError | UnexpectedError | 500 | An unexpected error prevented the server from fulfilling your request. | keystone/exception.py:765 | keystone/oauth1/core.py:77 |
TokenlessAuthConfigError | ValidationError | 400 | Could not determine Identity Provider ID. The configuration option %(issuer_attribute)s was not found in the request environment. | keystone/exception.py:774 | keystone/common/tokenless_auth.py:202 |
CredentialEncryptionError | Exception | — | An unexpected error prevented the server from accessing encrypted credentials. | keystone/exception.py:782 | keystone/credential/providers/fernet/core.py:91, keystone/credential/providers/fernet/core.py:120 |
LDAPServerConnectionError | UnexpectedError | 500 | An unexpected error prevented the server from fulfilling your request. | keystone/exception.py:789 | keystone/identity/backends/ldap/common.py:1593 |
LDAPInvalidCredentialsError | UnexpectedError | 500 | Unable to authenticate against Identity backend - Invalid username or password | keystone/exception.py:795 | keystone/identity/backends/ldap/common.py:1591 |
LDAPSizeLimitExceeded | UnexpectedError | 500 | Number of User/Group entities returned by LDAP exceeded size limit. Contact your LDAP administrator. | keystone/exception.py:802 | keystone/identity/backends/ldap/common.py:1174 |
CacheDeserializationError | Exception | — | — | keystone/exception.py:810 | keystone/models/receipt_model.py:145, keystone/models/token_model.py:622 |
ResourceUpdateForbidden | ForbiddenNotSecurity | 403 | Unable to update immutable %(type)s resource: %(resource_id)s. Set resource option "immutable" to false first. |keystone/exception.py:818|keystone/common/resource_options/options/immutable.py:76,keystone/resource/core.py:1048,keystone/resource/core.py:1098` (+1) | ||
ResourceDeleteForbidden | ForbiddenNotSecurity | 403 | Unable to delete immutable %(type)s resource: %(resource_id)s. Set resource option "immutable" to false first. |keystone/exception.py:826|keystone/common/resource_options/options/immutable.py:90` | ||
OAuth2Error | Error | — | — | keystone/exception.py:834 | — |
OAuth2InvalidClient | OAuth2Error | — | — | keystone/exception.py:842 | — |
OAuth2InvalidRequest | OAuth2Error | — | — | keystone/exception.py:848 | — |
OAuth2UnsupportedGrantType | OAuth2Error | — | — | keystone/exception.py:854 | — |
OAuth2OtherError | OAuth2Error | — | — | keystone/exception.py:860 | — |
RedirectRequired | Exception | 302 | — | keystone/exception.py:866 | — |
Source: reverse-spec-keystone/02-errors_stable-2026.2.md. The _rewrite/ and _inventory/ files are not published on the site.