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

Reverse-spec · Services

octavia — Errors

Errors — octavia — branch stable/2026.2

Branch stable/2026.2 @ 2900ed67cac2 — repository https://opendev.org/openstack/octavia — analysed on 2026-11-01

Every text below is exact unless a <placeholder> is shown. The (operation, status, message) combinations seen in the test run are in _rewrite/observed-errors_stable-2026.2.md, the probes in _rewrite/http-probes_stable-2026.2.json.

1. Body formats

#WhenBodySource
Aexception **inside a wsexpose handler** or its argument conversion (nearly everything){"faultcode": "Client", "faultstring": "<message>", "debuginfo": null}, Client for 4xx. Server for anything else: status = the exception's code if valid, else 500; faultstring = str(exception), including Python internals. debuginfo stays null (wsme.debug false: octavia/api/config.py:31-35)WSME 0.13 wsme/api.py format_exception, wsmeext/pecan.py callfunction
Bwebob HTTPException raised outside the handler: _lookup of pools and policies, limit/sort errors in the hook, unknown route, 405, 406{"code": 404, "title": "Bad Request", "description": "Pool <id> not found."}. title is the class's: APIException derives from HTTPClientError, so **every Octavia exception reported this way is titled Bad Request, whatever its status** (octavia/common/exceptions.py:63-69). Unknown path: {"code": 404, "description": "", "title": "Not Found"} (description is null above /v2)Pecan 1.8 core.py, used because ContentTypeHook forces Accept: application/json
Chealthcheck routes, keystonemiddlewaretext or HTML (404 Not Found\n\nThe resource could not be found.\n\n); 401 from auth_token ({"error": …}, not recorded)oslo.middleware, keystonemiddleware

utils.json_error_formatter builds an API-WG {"errors": [...]} body (octavia/api/common/utils.py:23-44), but it never reaches clients: the only exception using it is the 406 of ContentTypeHook (octavia/api/common/hooks.py:48-49), which Pecan re-renders in format B [probe accept_xml].

Which format applies is therefore a matter of where it is raised; the same exception class has two faces:

RequestFormatBody
GET /v2/lbaas/pools/{unknown}A{"debuginfo":null,"faultcode":"Client","faultstring":"Pool <id> not found."}
GET /v2/lbaas/pools/{unknown}/membersB{"code":404,"description":"Pool <id> not found.","title":"Bad Request"}
GET …?marker=bogusASupplied pagination marker 'bogus' is not valid. (raised in apply, under the handler)
GET …?limit=abcBSupplied pagination limit 'abc' is not valid. (raised in the hook)

Client expectations: python-octaviaclient and openstacksdk surface faultstring as the error message (openstacksdk:openstack/exceptions.py:200-201). x-openstack-request-id is on every response, errors included.

2. Exception → HTTP translation

There is no central table. An exception's HTTP status is its code class attribute: APIException subclasses declare one (octavia/common/exceptions.py:63), others default to 500 through WSME. Specific conversions:

FromToWhere
oslo_db DBDuplicateEntry on createDuplicateListenerEntry, DuplicateMemberEntry, DuplicateHealthMonitor, IDAlreadyExists, RecordAlreadyExistseach _validate_create_*; octavia/api/v2/controllers/listener.py:367, octavia/api/v2/controllers/member.py:137, octavia/api/v2/controllers/health_monitor.py:170, octavia/api/v2/controllers/pool.py:164, octavia/api/v2/controllers/load_balancer.py:671, octavia/api/v2/controllers/flavors.py:102
DBReferenceError on createInvalidOption(value, e.key) 400octavia/api/v2/controllers/pool.py:166, octavia/api/v2/controllers/member.py:141, octavia/api/v2/controllers/health_monitor.py:172
DBErrorAPIException 500 Something unknown went wrong; for listeners InvalidOption(protocol) 400; for HM post InvalidOption(type) 400octavia/api/v2/controllers/pool.py:169, octavia/api/v2/controllers/listener.py:371, octavia/api/v2/controllers/health_monitor.py:274
NoResultFound on LB row in test-and-setnot caught → 500 (the row was read earlier) [inferred]octavia/db/repositories.py:809-812
DBDeadlock on quota rowProjectBusyException 503octavia/db/repositories.py:620-623
network driver errors in validatorsInvalidSubresource 400 <Resource> <id> not found. for any failure, including Neutron being downoctavia/common/validate.py:333-340, octavia/common/validate.py:352-360
AllocateVIPExceptionstatus and message from orig_code, orig_msg if presentoctavia/api/v2/controllers/load_balancer.py:360-368
anything else500, faultcode: Server, text of the exceptionWSME

Provider exceptions (octavia/api/drivers/utils.py:38-84):

octavia-lib exception raised by the driverAPI exceptionStatusfaultstring
ConflictVIPAddressConflict409The VIP IP address is already in use: <user_fault_string>
DriverErrorProviderDriverError500Provider '<p>' reports error: <user_fault_string>
NotImplementedError (library or built-in)ProviderNotImplementedError501Provider '<p>' does not support a requested action: <user_fault_string, default "This feature is not implemented by the provider.">
UnsupportedOptionErrorProviderUnsupportedOptionError501Provider '<p>' does not support a requested option: <user_fault_string>
anything elseProviderDriverError500Provider '<p>' reports error: <str(e)>

The Go provider's driver API must map to these five classes (07 § 3).

3. Catalogue

Exceptions of octavia/common/exceptions.py reachable from the API scope (octavia/api/, octavia/common/validate.py, octavia/db/). Message templates use the Python % names.

ExceptionHTTPMessage templateRaised at (API scope)
APIException500Something unknown went wrongoctavia/api/v2/controllers/l7rule.py:135, octavia/api/v2/controllers/member.py:145, octavia/api/v2/controllers/health_monitor.py:176, octavia/api/v2/controllers/l7policy.py:124, octavia/api/v2/controllers/pool.py:170
CertificateRetrievalException400Could not retrieve certificate: %(ref)soctavia/api/drivers/utils.py:219, octavia/api/v2/controllers/base.py:262, octavia/api/v2/controllers/base.py:281
DisabledOption400The selected %(option)s is not allowed in this deployment: %(value)soctavia/api/v2/controllers/load_balancer.py:452, octavia/api/v2/controllers/load_balancer.py:494, octavia/api/v2/controllers/health_monitor.py:228, octavia/api/v2/controllers/listener.py:224, octavia/api/v2/controllers/listener.py:229
DuplicateHealthMonitor409This pool already has a health monitoroctavia/api/v2/controllers/health_monitor.py:171
DuplicateListenerEntry409Another Listener on this Load Balancer is already using protocol %(protocol)s and protocol_port %(port)doctavia/api/v2/controllers/listener.py:368, octavia/api/v2/controllers/listener.py:327
DuplicateMemberEntry409Another member on this pool is already using ip %(ip_address)s on protocol_port %(port)doctavia/api/v2/controllers/member.py:138
DuplicatePoolEntry409This listener already has a default pooloctavia/api/v2/controllers/pool.py:290
IDAlreadyExists409Already an entity with that specified id.octavia/api/v2/controllers/l7rule.py:130, octavia/api/v2/controllers/load_balancer.py:674, octavia/api/v2/controllers/flavor_profiles.py:122, octavia/api/v2/controllers/l7policy.py:119, octavia/api/v2/controllers/pool.py:165, octavia/api/v2/controllers/availability_zone_profiles.py:132
ImmutableObject409%(resource)s %(id)s is immutable and cannot be updated.octavia/api/v2/controllers/l7rule.py:106, octavia/api/v2/controllers/l7rule.py:114, octavia/api/v2/controllers/member.py:119, octavia/api/v2/controllers/member.py:128, octavia/api/v2/controllers/health_monitor.py:106, octavia/api/v2/controllers/health_monitor.py:114, octavia/api/v2/controllers/l7policy.py:105, octavia/api/v2/controllers/pool.py:115 +5
InputFileError500Error with file %(file_name)s. Reason: %(reason)soctavia/api/app.py:97
InvalidFilterArgument400One or more arguments are either duplicate or invalidoctavia/api/common/pagination.py:289
InvalidIPAddress400The IP Address %(ip_addr)s is invalid.not raised in the API scope
InvalidL7PolicyAction400Invalid L7 Policy action specified: %(action)soctavia/common/validate.py:325, octavia/common/validate.py:283
InvalidL7PolicyArgs400Invalid L7 Policy arguments: %(msg)soctavia/common/validate.py:287, octavia/common/validate.py:329, octavia/common/validate.py:268, octavia/common/validate.py:275, octavia/common/validate.py:280
InvalidL7Rule500Invalid L7 Rule: %(msg)soctavia/common/validate.py:132, octavia/common/validate.py:247, octavia/common/validate.py:135, octavia/common/validate.py:146, octavia/common/validate.py:151, octavia/common/validate.py:162, octavia/common/validate.py:176, octavia/common/validate.py:194 +1
InvalidLimit400Supplied pagination limit '%(key)s' is not valid.octavia/api/common/pagination.py:81
InvalidMarker400Supplied pagination marker '%(key)s' is not valid.octavia/api/common/pagination.py:339
InvalidOption400%(value)s is not a valid option for %(option)soctavia/api/v2/controllers/l7rule.py:132, octavia/api/v2/controllers/member.py:142, octavia/api/v2/controllers/health_monitor.py:126, octavia/api/v2/controllers/health_monitor.py:310, octavia/api/v2/controllers/health_monitor.py:312, octavia/api/v2/controllers/health_monitor.py:315, octavia/api/v2/controllers/health_monitor.py:123, octavia/api/v2/controllers/health_monitor.py:132 +26
InvalidRegex500Unable to parse regular expression: %(e)soctavia/common/validate.py:123
InvalidSortDirection400Supplied sort direction '%(key)s' is not valid.octavia/api/common/pagination.py:140, octavia/api/common/pagination.py:378
InvalidSortKey400Supplied sort key '%(key)s' is not valid.octavia/api/common/pagination.py:97, octavia/api/common/pagination.py:329
InvalidString500Invalid characters in %(what)soctavia/common/validate.py:97, octavia/common/validate.py:105, octavia/common/validate.py:114
InvalidSubresource400%(resource)s %(id)s not found.octavia/common/validate.py:339, octavia/common/validate.py:358, octavia/common/validate.py:370, octavia/common/validate.py:391, octavia/common/validate.py:395, octavia/common/validate.py:408
InvalidURL500Not a valid URL: %(url)soctavia/common/validate.py:54, octavia/common/validate.py:67
InvalidURLPath400Not a valid URLPath: %(url_path)soctavia/common/validate.py:87, octavia/common/validate.py:89
L7RuleValidation400Error parsing L7Rule: %(error)soctavia/api/v2/controllers/l7rule.py:207, octavia/api/v2/controllers/l7rule.py:160, octavia/api/v2/controllers/l7rule.py:244, octavia/db/prepare.py:125
LBPendingStateError409Invalid state %(state)s of loadbalancer resource %(id)soctavia/api/v2/controllers/load_balancer.py:121, octavia/api/v2/controllers/load_balancer.py:131
ListenerNoChildren400Protocol %(protocol)s listeners cannot have child objects.octavia/api/v2/controllers/l7policy.py:147, octavia/api/v2/controllers/pool.py:253, octavia/api/v2/controllers/listener.py:465, octavia/api/v2/controllers/listener.py:455, octavia/api/v2/controllers/listener.py:408, octavia/api/v2/controllers/listener.py:647
MemberSRIOVDisabled400The load balancer flavor does not allow SR-IOV member ports.octavia/api/v2/controllers/member.py:265, octavia/api/v2/controllers/member.py:210
MissingAPIProjectID400Something unknown went wrongoctavia/api/v2/controllers/quotas.py:82, octavia/api/v2/controllers/quotas.py:106, octavia/api/v2/controllers/quotas.py:140
MissingArguments500Missing arguments.octavia/db/repositories.py:1562
MissingCertSubject400No CN or DNSName(s) found in certificate. The certificate is invalid.not raised in the API scope
MissingProjectID500Missing project ID in request where one is required.octavia/db/repositories.py:460
NotFound404%(resource)s %(id)s not found.octavia/api/drivers/driver_agent/driver_updater.py:69, octavia/api/v2/controllers/amphora.py:230, octavia/api/v2/controllers/amphora.py:106, octavia/api/v2/controllers/load_balancer.py:69, octavia/api/v2/controllers/load_balancer.py:955, octavia/api/v2/controllers/load_balancer.py:986, octavia/api/v2/controllers/member.py:150, octavia/api/v2/controllers/member.py:189 +32
ObjectInUse409%(object)s %(id)s is in use and cannot be modified.octavia/api/v2/controllers/flavor_profiles.py:148, octavia/api/v2/controllers/flavor_profiles.py:230, octavia/api/v2/controllers/flavors.py:167, octavia/api/v2/controllers/availability_zones.py:194, octavia/api/v2/controllers/availability_zone_profiles.py:162, octavia/api/v2/controllers/availability_zone_profiles.py:258
PolicyForbidden403Policy does not allow this request to be performed.octavia/api/v2/controllers/base.py:217
PoolInUseByL7Policy409Pool %(id)s is in use by L7 policy %(l7policy_id)soctavia/api/v2/controllers/pool.py:538
ProjectBusyException503Project busy. Unable to lock the project. Please try again.octavia/db/repositories.py:623, octavia/db/repositories.py:733
ProviderDriverError500Provider '%(prov)s' reports error: %(user_msg)soctavia/api/drivers/utils.py:61, octavia/api/drivers/utils.py:84
ProviderFlavorMismatchError400Flavor '%(flav)s' is not compatible with provider '%(prov)s'octavia/api/v2/controllers/load_balancer.py:409
ProviderNotEnabled400Provider '%(prov)s' is not enabled.octavia/api/drivers/driver_factory.py:40
ProviderNotFound501Provider '%(prov)s' was not found.octavia/api/drivers/driver_factory.py:51
ProviderNotImplementedError501Provider '%(prov)s' does not support a requested action: %(user_msg)soctavia/api/drivers/utils.py:74, octavia/api/v2/controllers/provider.py:93, octavia/api/v2/controllers/provider.py:145, octavia/api/v2/controllers/load_balancer.py:479
ProviderUnsupportedOptionError501Provider '%(prov)s' does not support a requested option: %(user_msg)soctavia/api/drivers/utils.py:79
QuotaException403Quota has been met for resources: %(resource)soctavia/api/v2/controllers/l7rule.py:171, octavia/api/v2/controllers/load_balancer.py:747, octavia/api/v2/controllers/load_balancer.py:772, octavia/api/v2/controllers/load_balancer.py:540, octavia/api/v2/controllers/member.py:201, octavia/api/v2/controllers/member.py:477, octavia/api/v2/controllers/health_monitor.py:254, octavia/api/v2/controllers/l7policy.py:168 +4
RecordAlreadyExists409A %(field)s of %(name)s already exists.octavia/api/v2/controllers/flavors.py:104, octavia/api/v2/controllers/availability_zones.py:113
SingleCreateDetailsMissing400Missing details for %(type)s object: %(name)soctavia/api/v2/controllers/load_balancer.py:784, octavia/api/v2/controllers/listener.py:477
TooManyL7RulesOnL7Policy409Too many rules on L7 policy %(id)soctavia/api/v2/controllers/l7rule.py:122, octavia/db/prepare.py:119
UnreadablePKCS12400The PKCS12 bundle is unreadable. Please check the PKCS12 bundle validity. In addition, make sure it does not require a pass phrase. Error: %(error)snot raised in the API scope
VIPAddressConflict409The VIP IP address is already in use: %(msg)soctavia/api/drivers/utils.py:57
VIPValidationException400Validation failure: VIP must contain one of: %(objects)s.octavia/api/v2/controllers/load_balancer.py:311
ValidationException400Validation failure: %(detail)soctavia/api/drivers/utils.py:257, octavia/api/drivers/utils.py:314, octavia/api/v2/controllers/load_balancer.py:277, octavia/api/v2/controllers/load_balancer.py:297, octavia/api/v2/controllers/load_balancer.py:301, octavia/api/v2/controllers/load_balancer.py:305, octavia/api/v2/controllers/load_balancer.py:352, octavia/api/v2/controllers/load_balancer.py:509 +80

Messages for ValidationException (Validation failure: <detail>) are listed in the resource sheets of 01 § 4 with their source lines. Exceptions from octavia/network/base.py (NetworkException family) never reach the client directly except through § 2.

WSME-level errors (no Octavia class), from the probes and _rewrite/observed-errors_stable-2026.2.md:

SituationStatusfaultstring
mandatory field absent400Invalid input for field/attribute <f>. Value: 'None'. Mandatory field missing.
type or range400Invalid input for field/attribute <f>. Value: '<v>'. <reason>
unknown attribute400Unknown attribute for argument <arg>[.<root>]: <names> (several: Unknown attributes for argument …: a, b, set order)
unknown query or form argument400Unknown argument: "<name>"
missing body or URL argument400Missing argument: "<name>"
wrong media type415Unknown mimetype: <type>
malformed JSON400Request is not in valid JSON format
no root object500'UnsetType' object has no attribute '<attr>' or 'quota'
non-object body500'list' object has no attribute 'keys'

4. Asynchronous errors

These never appear in an HTTP status.

FailureWho sees itResult
provider reports provisioning_status: ERRORGET of the objectobject ERROR, parents as reported; a LB in ERROR can only be failed over or deleted
provider never reportsGETstays PENDING_*; 409 on every further write to that LB. No API-side timeout
status message with a record without idthe sender{"status_code": 500, "fault_string": "'id'", "status_object": "members", "status_object_id": null}, stops at the first bad record, earlier records of the message are already committed (octavia/api/drivers/driver_agent/driver_updater.py:122-127, octavia/api/drivers/driver_agent/driver_updater.py:180-187; _rewrite/cases-driver-seam_stable-2026.2.json)
invalid status valuethe senderFK violation on the lookup table → same reply with the SQL text in fault_string
unknown id with statusnobodyUPDATE matches nothing → status 200 OK. With DELETED: NotFound swallowed → OK
statistics record missing a keythe sender{"status_code": 500, "fault_string": "'bytes_out'", "stats_object": "listeners"} (octavia/api/drivers/driver_agent/driver_updater.py:218-222)
statistics for an unknown listenernobodyinserted: listener_statistics has no FK to listener
VIP deallocation failure on DELETEDsender (fault), LB stays as it wasoctavia/api/drivers/driver_agent/driver_updater.py:99-101, wrapped at octavia/api/drivers/driver_agent/driver_updater.py:122-127
quota decrement failurelog Failed to decrement %(name)s quota…re-raised → fault to the sender, status not applied (octavia/api/drivers/driver_agent/driver_updater.py:81-87)

5. Key log messages

LevelMessageSituationWhere
ERRORServer-side error: "<text>". Detail: <traceback>every 500 through WSMEWSME
INFOSending create Load Balancer %s to provider %s (and the same for each op)before each driver calloctavia/api/v2/controllers/load_balancer.py:664, others
INFO, EXCEPTIONProvider '%s' raised a conflict error…, … a driver error…, … a not implemented error…, … an unsupported option error…, … an unknown error…§ 2octavia/api/drivers/utils.py:55-83
INFOInvalid state %(state)s of loadbalancer resource %(id)sLB immutableoctavia/api/v2/controllers/load_balancer.py:119
INFOLoad Balancer %s is immutable. and … cannot be created or modified because the Load Balancer is in an immutable statechildrenoctavia/api/v2/controllers/listener.py:116, octavia/api/v2/controllers/pool.py:113
INFOMember batch update is a noop, rolling back and returning early.§ 01 4.4octavia/api/v2/controllers/member.py:465
WARNINGQuota project lock timed out for project: %(proj)sdeadlock on quotaoctavia/db/repositories.py:621
WARNING, ERRORRequested provider driver '%s' was not enabled…, Unable to load provider driver %s due to: %sfactoryoctavia/api/drivers/driver_factory.py:37, octavia/api/drivers/driver_factory.py:47
EXCEPTIONCannot load driver '%s', will remove from service…start-upoctavia/api/app.py:53
ERRORCould not delete VIP port %s of the failed load balancer creation, it may need to be deleted manually.cleanup after failureoctavia/api/v2/controllers/load_balancer.py:384

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