Errors — ovn-octavia-provider — branch stable/2026.2
Branch
stable/2026.2@c56940998594(11.0.0-2-gc569409) — repository https://opendev.org/openstack/ovn-octavia-provider — analysed on 2026-10-28
The provider never builds an HTTP response itself. Errors reach the user in two ways:
- Synchronous: a driver method raises an octavia-lib exception while the Octavia API request is still open. Octavia's
call_providerturns it into an HTTP status (§ 1). - Asynchronous: the helper thread catches every exception, logs it and reports
ERRORstatuses through the driver-agent status socket (§ 3). The client only seesprovisioning_status/operating_statuswhen it polls Octavia.
References: octavia: is Octavia stable/2026.2 @ 2900ed67cac2, octavia-lib: is octavia-lib stable/2026.2 @ a46b0ff4fa95.
1. Exception → HTTP translation (Octavia side)
call_provider (octavia:octavia/api/drivers/utils.py:38-84) wraps every driver call:
| Exception raised by the driver | Octavia exception | HTTP | Body faultstring | Where |
|---|---|---|---|---|
octavia_lib…exceptions.Conflict | VIPAddressConflict | 409 | The VIP IP address is already in use: <user_fault_string> | octavia:octavia/api/drivers/utils.py:54-57, octavia:octavia/common/exceptions.py:445-447 |
DriverError | ProviderDriverError | 500 | Provider 'ovn' reports error: <user_fault_string> | octavia:octavia/api/drivers/utils.py:58-62, octavia:octavia/common/exceptions.py:382-384 |
NotImplementedError (octavia-lib or builtin) | ProviderNotImplementedError | 501 | Provider 'ovn' does not support a requested action: … | octavia:octavia/api/drivers/utils.py:63-75, octavia:octavia/common/exceptions.py:387-390 |
UnsupportedOptionError (and IPVersionsMixingNotSupportedError) | ProviderUnsupportedOptionError | 501 | Provider 'ovn' does not support a requested option: <user_fault_string> | octavia:octavia/api/drivers/utils.py:76-80, octavia:octavia/common/exceptions.py:393-396 |
any other exception (AttributeError, OVSDB errors…) | ProviderDriverError | 500 | Provider 'ovn' reports error: <str(e)> | octavia:octavia/api/drivers/utils.py:81-84 |
"Unsupported option" is a 501, not a 400: clients that treat 4xx as user errors and 5xx as retryable must special-case it.
2. Synchronous errors (driver methods)
All are UnsupportedOptionError with user_fault_string == operator_fault_string, unless stated otherwise.
| Message | Situation | Raised at | Client sees |
|---|---|---|---|
OVN provider does not support %s protocol | listener or pool protocol not TCP/UDP/SCTP (HTTP, HTTPS, TERMINATED_HTTPS, PROXY…) | ovn_octavia_provider/driver.py:61-66 | 501 |
OVN provider does not support %s algorithm | pool algorithm not SOURCE_IP_PORT/SOURCE_IP (e.g. ROUND_ROBIN, LEAST_CONNECTIONS) on create or update | ovn_octavia_provider/driver.py:68-73 | 501 |
OVN provider does not support %s session persistence. Only SOURCE_IP type is supported. | intended for HTTP_COOKIE/APP_COOKIE persistence; **in practice the message formatting reads session.type on a dict and raises AttributeError** | ovn_octavia_provider/driver.py:75-83 | 500 Provider 'ovn' reports error: 'dict' object has no attribute 'type' **[inferred: the check uses session.get(), so session is a dict]** |
OVN provider does not support allowed_cidrs option | listener create/update with a non-empty allowed_cidrs | ovn_octavia_provider/driver.py:85-93 | 501 |
OVN provider does not support loadbalancer failover | PUT /v2/lbaas/loadbalancers/{id}/failover | ovn_octavia_provider/driver.py:223-227 | 501 |
OVN Load Balancer does not support different member monitor address or port. | member create/update with monitor_address or monitor_port | ovn_octavia_provider/driver.py:351-357 | 501 |
OVN provider does not support monitor options | same, in a member batch update; the whole batch is refused | ovn_octavia_provider/driver.py:518-522 | 501 |
OVN provider does not support mixing IPv4/IPv6 configuration within the same Load Balancer. (IPVersionsMixingNotSupportedError) | member IP family differs from the VIP's, and the LB VIPs are not themselves mixed | ovn_octavia_provider/common/exceptions.py:28-32; raised at ovn_octavia_provider/driver.py:150, ovn_octavia_provider/driver.py:390, ovn_octavia_provider/driver.py:489, ovn_octavia_provider/driver.py:524 | 501 |
Subnet is required, or Loadbalancer associated with Pool must have a subnet, for Member creation with OVN Provider Driver if it is not the same as LB VIP subnet | member without subnet_id whose address is not in the LB VIP subnet, or VIP subnet unreadable | ovn_octavia_provider/driver.py:401-407 (also ovn_octavia_provider/driver.py:159-165 for the sync path) | 501 |
… for Member deletion if it is with OVN Provider Driver … | same situation on member delete (the derived subnet was never stored in Octavia) | ovn_octavia_provider/driver.py:454-460 | 501: the member cannot be deleted until its address fits the VIP subnet |
… for Member batch update … | same in a batch update | ovn_octavia_provider/driver.py:539-545 | 501 |
OVN Load Balancer supports Health Check provider from version 2.12. Upgrade OVN in order to use it. | the NB schema has no Load_Balancer.health_check column | ovn_octavia_provider/driver.py:667-672 | 501 |
OVN provider health monitor type not specified. | HM create without type | ovn_octavia_provider/driver.py:675-680 | 501 |
OVN provider does not support %s health monitor type. Supported types: TCP, UDP-CONNECT | HM type HTTP, HTTPS, PING, SCTP | ovn_octavia_provider/driver.py:681-688 | 501 (the join order follows SUPPORTED_HEALTH_MONITOR_TYPES, ovn_octavia_provider/common/constants.py:115-116) |
Conflict(<Neutron message>) | Neutron 409 while creating the VIP port, and no same-name port to reuse | ovn_octavia_provider/driver.py:648-653, ovn_octavia_provider/helper.py:3090-3100 | 409 The VIP IP address is already in use: … |
DriverError(<Neutron message>) | any other Neutron error while creating or reading the VIP ports | ovn_octavia_provider/driver.py:654-663 | 500 |
DriverError('Cannot initialize OpenStackSDK. Exception: %s. Please verify Neutron service configuration in Octavia API configuration.') (operator string only) | [neutron]/[service_auth] credentials invalid or missing | ovn_octavia_provider/common/clients.py:141-149 | 500 with the default user string An unknown driver error occurred. (octavia-lib:octavia_lib/api/drivers/exceptions.py:33) |
same for Octavia (… service_auth configuration …) | do_sync only | ovn_octavia_provider/common/clients.py:175-183 | sync tool fails |
NotImplementedError (base class) | L7 policies and rules, flavors, availability zones, loadbalancer_failover_with_flavor | octavia-lib:octavia_lib/api/drivers/provider_base.py:388 | 501 |
AttributeError | member_batch_update on a pool that has no OVN row (ovn_lb is None) | ovn_octavia_provider/driver.py:503-505 | 500 [inferred] |
DriverAgentNotFound | the octavia driver-agent sockets (/var/run/octavia/{status,stats,get}.sock) do not exist when the driver is instantiated | octavia-lib:octavia_lib/api/drivers/driver_lib.py:40-55, called from ovn_octavia_provider/helper.py:59 | Octavia API error before call_provider [inferred: 500] |
RowNotFound → RuntimeError after 10 s of retries | NB schema helper cannot be fetched at start-up | ovn_octavia_provider/ovsdb/impl_idl_ovn.py:227-229, ovn_octavia_provider/common/utils.py:76-83 | the OvnProviderHelper constructor blocks with exponential retries up to [ovn]/ovsdb_retry_max_interval between attempts, with no stop condition **[inferred: tenacity without stop]** |
3. Asynchronous errors (helper thread)
The helper thread catches every exception of a handler (ovn_octavia_provider/helper.py:429-437): nothing is re-raised, the loop continues. Most handlers catch their own exceptions first and return an ERROR status (pattern LOG.exception(EXCEPTION_MSG, …), with EXCEPTION_MSG = "Exception occurred during %s", ovn_octavia_provider/common/constants.py:118-119).
| Handler | Trigger of the error | Reported status | Where |
|---|---|---|---|
lb_create | Neutron unreachable, VIP port not found | LB ERROR/ERROR, provider VIP ports deleted | ovn_octavia_provider/helper.py:1582-1613 |
lb_create | OVSDB failure while creating or associating the row | LB ERROR/ERROR, provider VIP ports deleted, OVN row may remain | ovn_octavia_provider/helper.py:1732-1760 |
lb_delete | VIP port deletion fails when the OVN row is already missing | LB ERROR/ERROR | ovn_octavia_provider/helper.py:1810-1832 |
lb_delete | any exception during deletion | LB ERROR/ERROR | ovn_octavia_provider/helper.py:1863-1866 |
lb_update | OVN rows not found or transaction failure | LB ERROR/ERROR | ovn_octavia_provider/helper.py:2042-2045 |
listener_create | transaction failure | listener ERROR/ERROR, LB ACTIVE | ovn_octavia_provider/helper.py:2098-2108 |
listener_create | _get_or_create_ovn_lb raises (RowNotFound when the LB has no OVN row) | not caught in the handler → logged by request_handler, no status sent: the listener stays PENDING_CREATE | ovn_octavia_provider/helper.py:2067-2070, ovn_octavia_provider/helper.py:434-437 |
pool_create | same as above | same: pool stays PENDING_CREATE | ovn_octavia_provider/helper.py:2324-2328 |
listener_update | OVN row for the protocol missing | listener ERROR, LB ERROR | ovn_octavia_provider/helper.py:2237-2242 |
listener_update | transaction failure | listener ERROR, LB ACTIVE | ovn_octavia_provider/helper.py:2312-2320 |
listener_delete, pool_delete | OVN row missing | treated as success: DELETED | ovn_octavia_provider/helper.py:2179-2181, ovn_octavia_provider/helper.py:2441-2443 |
listener_delete | transaction failure | listener ERROR/ERROR | ovn_octavia_provider/helper.py:2206-2215 |
pool_create, pool_delete, pool_update | transaction failure | pool ERROR, LB ACTIVE | ovn_octavia_provider/helper.py:2389-2402, ovn_octavia_provider/helper.py:2486-2494, ovn_octavia_provider/helper.py:2589-2597 |
pool_update | OVN row missing | pool ERROR, LB ERROR | ovn_octavia_provider/helper.py:2520-2525 |
member_create / member_delete / member_update | OVN row of the pool not found | member ERROR (NO_MONITOR for create/update) | ovn_octavia_provider/helper.py:2811-2823, ovn_octavia_provider/helper.py:2912-2923, ovn_octavia_provider/helper.py:2962-2974 |
member_create | HM enabled but member LSP or HM port missing | member ERROR operating status, pool DEGRADED/ERROR | ovn_octavia_provider/helper.py:2838-2847, ovn_octavia_provider/helper.py:3857-3878 |
member_* | when ovn_lb is None, the final _update_external_ids_member_status(ovn_lb, …) and _get_current_operating_statuses(ovn_lb) raise AttributeError | no status sent (logged by request_handler) | ovn_octavia_provider/helper.py:2853-2858 [inferred] |
hm_create | no OVN row for the pool | HM ERROR/NO_MONITOR | ovn_octavia_provider/helper.py:3948-3952 |
hm_create | pool key missing on the row | HM ERROR, pool OFFLINE | ovn_octavia_provider/helper.py:3957-3965 |
hm_create | no VIP in external_ids (Could not find VIP for HM %s, LB external_ids: %s) or transaction failure | HM ERROR/ERROR | ovn_octavia_provider/helper.py:3476-3479, ovn_octavia_provider/helper.py:3556-3558 |
hm_create | a member's HM port cannot be found or created | HM ERROR/ERROR, ip_port_mappings of the pool cleaned | ovn_octavia_provider/helper.py:3996-4001 |
hm_update | health checks not found | HM ERROR/ERROR | ovn_octavia_provider/helper.py:4061-4071 |
hm_delete | nothing in OVN | treated as success: DELETED | ovn_octavia_provider/helper.py:4116-4122 |
3.1 Status socket failures
_update_status_to_octavia retries UpdateStatusError with exponential back-off (max 75 s) for 15 attempts (ovn_octavia_provider/helper.py:448-451), i.e. up to about 15 minutes during which the single helper thread processes nothing else. UpdateStatusError is raised by octavia-lib when the socket call fails or the driver agent answers status_code != 200 (octavia-lib:octavia_lib/api/drivers/driver_lib.py:110-134); the driver agent answers 500 when a status update hits an unknown object or a database error (octavia:octavia/api/drivers/driver_agent/driver_updater.py:122-127, octavia:octavia/api/drivers/driver_agent/driver_updater.py:180-188). After the last attempt the error is logged (Error while updating the load balancer status: %s, ovn_octavia_provider/helper.py:429-431) and the resource stays in its PENDING_* status in Octavia (a TODO admits there is no clean-up, ovn_octavia_provider/helper.py:432-433).
A driver agent that does not answer within 30 s raises DriverAgentTimeout inside _send (octavia-lib:octavia_lib/api/drivers/driver_lib.py:59-94); update_loadbalancer_status wraps every exception of _send into UpdateStatusError (octavia-lib:octavia_lib/api/drivers/driver_lib.py:123-126), so timeouts and refused connections are retried like the other failures. Each attempt can therefore last up to 30 s on top of the back-off.
3.2 OVSDB-level errors
| Error | Situation | Handling | Where |
|---|---|---|---|
RowNotFound during LB ↔ LS/LR association | a switch or router disappeared between reading and committing (large topologies) | retried 3 times, then executed command by command, missing switches skipped | ovn_octavia_provider/helper.py:967-978, ovn_octavia_provider/helper.py:1209-1235 |
RowNotFound in _find_ovn_lbs_with_retry | NB not yet updated after an LB creation | retried for 10 s | ovn_octavia_provider/helper.py:458-459 |
RevisionConflict | defined but never raised by this repository; only caught in the transaction wrapper | logged Transaction aborted. Reason: %s | ovn_octavia_provider/common/exceptions.py:22-25, ovn_octavia_provider/ovsdb/impl_idl_ovn.py:172-183 |
OvsdbConnectionUnavailable | defined, never raised (dead code) | — | ovn_octavia_provider/ovsdb/impl_idl_ovn.py:82-86 |
errors in ip_port_mappings commands | lookup of the LB row fails | swallowed and logged Error adding/deleting backend %s … for LB uuid %s | ovn_octavia_provider/ovsdb/impl_idl_ovn.py:122-153 |
| transaction timeout | [ovn]/ovsdb_connection_timeout (default 180 s) | raised by ovsdbapp, caught by the handler → ERROR | ovn_octavia_provider/common/config.py:66-69 |
3.3 Neutron errors in background work
| Call | Retry | On final failure | Where |
|---|---|---|---|
ports() list, find_port() | 10 s exponential on HttpException | exception to the caller | ovn_octavia_provider/helper.py:467-477 |
delete_port() | 15 attempts, exponential max 75 s; 404 only logged | exception to the caller | ovn_octavia_provider/helper.py:3169-3176 |
create_port() for the HM port | none | partial port cleaned, None returned → HM ERROR | ovn_octavia_provider/helper.py:132-139 |
Octavia load_balancers() (sync) | 10 s exponential | sync aborted | ovn_octavia_provider/helper.py:485-486 |
4. Key log messages
| Level | Message | Meaning | Where |
|---|---|---|---|
| ERROR | Error while updating the load balancer status: %s | 15 status-socket attempts failed; Octavia keeps PENDING_* | ovn_octavia_provider/helper.py:430 |
| ERROR (exception) | Unexpected exception in request_handler | a handler raised; no status sent | ovn_octavia_provider/helper.py:437 |
| ERROR (exception) | Exception occurred during creation of loadbalancer (and deletion of …, update of …, creation of listener, creation of pool, creation of member, set of health check…) | a handler failed and reported ERROR | ovn_octavia_provider/common/constants.py:119 |
| ERROR | Cannot get info from neutron | VIP port lookup failed in lb_create | ovn_octavia_provider/helper.py:1583 |
| WARNING | Deleting the VIP port %s since LB went into ERROR state | clean-up after a failed create | ovn_octavia_provider/helper.py:1589 |
| WARNING | Loadbalancer %s not found in OVN Northbound DB. Setting the Loadbalancer status to DELETED in Octavia | delete of an LB already gone from OVN | ovn_octavia_provider/helper.py:1779 |
| WARNING | The association of loadbalancer %s to the logical router %s failed, trying step by step | concurrent topology change | ovn_octavia_provider/helper.py:1682 |
| WARNING | Cannot associate LB %(lb)s to LS %(ls)s because LS row not found in OVN NBDB. Exiting. | member or VIP network missing in OVN | ovn_octavia_provider/helper.py:1017 |
| ERROR | Member %(member)s Logical_Switch_Port not found, when creating a Health Monitor for pool %(pool)s. | HM cannot probe the member | ovn_octavia_provider/helper.py:3861 |
| ERROR | No port on network %(network)s available for health monitoring. … | HM source port could not be created | ovn_octavia_provider/helper.py:3874 |
| WARNING | Member for event not found, info: %s | Service_Monitor event for an unknown backend | ovn_octavia_provider/helper.py:4436 |
| WARNING | Maintenance task: VIP port %(port)s for LB %(lb)s has unexpected device_id %(did)s, not backfilling | the VIP port is attached to something else (possible misuse by Nova) | ovn_octavia_provider/maintenance.py:207 |
| WARNING | Floating IP not consistent between Logic Switch Port and Neutron. … | sync tool asks to run neutron-ovn-db-sync-util first | ovn_octavia_provider/driver.py:886 |
| WARNING | Octavia OVN synchronizer does not support LOG mode. … | Neutron sync plugin in log mode | ovn_octavia_provider/ovn/db_sync.py:168 |
| ERROR | Cannot find private key file for %s (and cert, CA cert) | SSL file configured but missing; the connection then fails | ovn_octavia_provider/ovsdb/ovsdb_monitor.py:100-116 |
5. Exception catalogue (classes defined in the repository)
| Class | Bases | HTTP (if it reached Octavia) | Message | Raised |
|---|---|---|---|---|
IPVersionsMixingNotSupportedError | octavia_lib UnsupportedOptionError | 501 | OVN provider does not support mixing IPv4/IPv6 configuration within the same Load Balancer. | § 2 |
RevisionConflict | neutron_lib NeutronException | — (never raised) | OVN revision number for %(resource_id)s (type: %(resource_type)s) is equal or higher than the given resource. Skipping update | never |
OvsdbConnectionUnavailable | neutron_lib ServiceUnavailable | — (never raised) | OVS database connection to %(db_schema)s failed with error: '%(error)s'. … | never |
External exceptions used: octavia_lib.api.drivers.exceptions (UnsupportedOptionError, DriverError, Conflict, UpdateStatusError, NotImplementedError), openstack.exceptions (HttpException, ConflictException, ResourceNotFound), ovsdbapp…idlutils.RowNotFound, futurist.periodics.NeverAgain.
Source: reverse-spec-ovn-octavia-provider/02-errors_stable-2026.2.md. The _rewrite/ and _inventory/ files are not published on the site.