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

Reverse-spec · Services

ovn-bgp-agent — Errors

Errors — ovn-bgp-agent — branch stable/2026.2

Branch stable/2026.2 @ f770768b41dc (7.0.0-2-gf770768) — repository https://opendev.org/openstack/ovn-bgp-agent — analysed on 2026-10-28 External references: ovsdbapp: = ovsdbapp stable/2026.2 @ 0fb5a1b9a675.

The agent has no client: no error ever reaches a caller as a status code. An error shows up in exactly three ways, which this file catalogues:

  1. a log line (the only operator-visible signal; there is no status written back to OVN or Neutron);
  2. a missing or stale announcement in BGP (the IP is not, or no longer, reachable), repaired at best by the next sync;
  3. the process stopping (start-up failures, sys.exit(1)).

1. Exception catalogue

Base class OVNBGPAgentException: message % kwargs, __str__ returns it (ovn_bgp_agent/exceptions.py:18-33). The RuntimeError subclasses take an optional preformatted message (ovn_bgp_agent/exceptions.py:123-160).

ExceptionMessage templateSituationRaised atCaught at / effect
ConfOptionRequiredRequired driver conf option missing: CONF.%(option)sNB driver with exposing_method = vrf and evpn_local_ip unset, when the first EVPN bridge is builtovn_bgp_agent/drivers/openstack/utils/evpn.py:46not caught in wire → the whole sync fails, logged Unexpected exception while running the sync (ovn_bgp_agent/agent.py:54-55); repeats every reconcile_interval
UnsupportedWiringConfigNo wiring support for exposing_method %(method)s.NB driver with exposing_method l2vni or dynamic (accepted by the option's choices)ovn_bgp_agent/drivers/openstack/utils/wire.py:44sync fails every cycle, nothing is exposed by sync
InvalidPortIPOVN port with invalid IP: %(ip)s.an IP/CIDR that netaddr cannot parse when building an ip ruleovn_bgp_agent/utils/linux_net.py:693caught in wiring: LOG.exception("Invalid IP to create a rule …"), wiring returns False, the IP is not announced (ovn_bgp_agent/drivers/openstack/utils/wire.py:686-689, ovn_bgp_agent/drivers/openstack/utils/wire.py:838-841)
PortNotFoundOVN port was not found: %(port)s.(a) ovs-vsctl get Interface <port> ofport fails or returns [] — the patch port of a provider network does not exist yet on this node (no VM of that network was ever bound here); retried every 1 s for 5 s (ovn_bgp_agent/drivers/openstack/utils/ovs.py:53-70); (b) the peer of an EVPN patch port has no row (ovn_bgp_agent/drivers/openstack/utils/ovn.py:655-661)ovn_bgp_agent/drivers/openstack/utils/ovs.py:64, ovn_bgp_agent/drivers/openstack/utils/ovs.py:69, ovn_bgp_agent/drivers/openstack/utils/ovn.py:661(a) not caught by _wire_provider_port_underlay, which catches PatchPortNotFound instead (ovn_bgp_agent/drivers/openstack/utils/wire.py:699-706): it propagates to the driver's broad except Exception → LOG.exception("Unexpected exception while wiring provider port: …"), IP not announced although the rule/route were already added (§ 4)
DatapathNotFoundDatapath was not found: %(datapath)s.SB query on a datapath UUID the IDL no longer knows (ValueError from ovsdbapp): network/router deleted while events are still being processedovn_bgp_agent/drivers/openstack/utils/ovn.py:487, ovn_bgp_agent/drivers/openstack/utils/ovn.py:503, ovn_bgp_agent/drivers/openstack/utils/ovn.py:515expose paths: DEBUG … not being exposed as its datapath %s was removed, skip; withdraw of a VM: treated as a provider network to force the withdrawal (ovn_bgp_agent/drivers/openstack/ovn_bgp_driver.py:681-693); subnet withdraw: falls back to the local cr-lrp cache (ovn_bgp_agent/drivers/openstack/ovn_bgp_driver.py:1117-1139)
PatchPortNotFoundPatch port not found for localnet: %(localnet)s.never raised in this branch—caught at ovn_bgp_agent/drivers/openstack/utils/wire.py:701 (dead handler)
ExposeDeniedForAddressScopeExposing addresses %(addresses)s with address scopes %(address_scopes)s was denied, required scopes: %(configured_scopes)sNB: every CIDR of a router interface fails the address_scopes filterovn_bgp_agent/drivers/openstack/nb_ovn_bgp_driver.py:1027, ovn_bgp_agent/drivers/openstack/nb_ovn_bgp_driver.py:1103caught: DEBUG Not exposing subnet CIDR's %s: %s / Withdraw router lsp failure … (ovn_bgp_agent/drivers/openstack/nb_ovn_bgp_driver.py:897-902, ovn_bgp_agent/drivers/openstack/nb_ovn_bgp_driver.py:951-957)
WireFailureFailure with wiring for CIDR %(cidr)s: %(message)sNB: wiring a tenant subnet returned False (no bridge, EVPN device not set up) or raised; always with exposing_method = ovn (wire_lrp_port returns None, ovn_bgp_agent/drivers/openstack/utils/wire.py:820-828)ovn_bgp_agent/drivers/openstack/nb_ovn_bgp_driver.py:1053, ovn_bgp_agent/drivers/openstack/nb_ovn_bgp_driver.py:1056caught, DEBUG only: the subnet is silently not exposed
UnwireFailureFailure with removing wiring for CIDR %(cidr)s: %(message)sNB: unwiring a tenant subnet failedovn_bgp_agent/drivers/openstack/nb_ovn_bgp_driver.py:1122, ovn_bgp_agent/drivers/openstack/nb_ovn_bgp_driver.py:1124caught, DEBUG; withdrawal of tenant VM IPs continues
MacAddressNotFoundAddresses column is empty or not set for port %(lsp)sLSP with empty addressesovn_bgp_agent/drivers/openstack/utils/port.py:51not caught in event _run → Unexpected exception while running the event action
IpAddressNotFoundAddresses column has no IP addresses or is not set for port %(lsp)sLSP with a MAC but no IPovn_bgp_agent/drivers/openstack/utils/port.py:57caught in matches and sync (port skipped)
RoutingTablesFileNotFoundDefault routing tables file not found at %(path)s. Please ensure iproute2 package is properly installed.neither /etc/iproute2/rt_tables nor /usr/share/iproute2/rt_tables existsovn_bgp_agent/privileged/linux_net.py:340sync fails every cycle
NetworkInterfaceNotFoundNetwork interface %(device)s not foundnetlink ENODEV or link lookup missovn_bgp_agent/privileged/linux_net.py:353, ovn_bgp_agent/privileged/linux_net.py:440, ovn_bgp_agent/utils/linux_net.py:67expected by ensure_* (create on miss), by del_ip_route (DEBUG, routes assumed gone), by add_ip_route (creates the VLAN device); elsewhere propagates
IpAddressAlreadyExistsIP address %(ip)s already configured on %(device)s.EEXIST on address addovn_bgp_agent/privileged/linux_net.py:365ignored by callers (idempotent add) (ovn_bgp_agent/utils/linux_net.py:663-669)
InterfaceAlreadyExists, InterfaceOperationNotSupported, InvalidArgumentInterface %(device)s already exists. / Operation not supported on interface %(device)s. / Invalid parameter/value used on interface %(device)s.netlink EEXIST / EOPNOTSUPP / EINVAL on link operationsovn_bgp_agent/privileged/linux_net.py:355-359propagate (sync/event fails, logged)
nb_exceptions.NATNotFoundfree text, e.g. NAT entry for port %s not found, … does not contain network ID in its external_ids, … does not have external_mac set, Port %s has no NAT entryNB: FIP port without a usable NAT row; centralized NAT without gateway_portovn_bgp_agent/drivers/openstack/nb_ovn_bgp_driver.py:679-691, ovn_bgp_agent/drivers/openstack/utils/nat.py:23caught in FIP events/sync: DEBUG … does not have all data required in its NAT entry; in FipOnCRLRPBaseEvent.match_fn it escapes → ovsdbapp Event not matched due to this exception
nb_exceptions.ChassisNotFound("Gateway port %s has no chassis set in its status column.", <row>) (tuple: the message is not formatted)centralized NAT whose gateway port has no hosting-chassisovn_bgp_agent/drivers/openstack/utils/nat.py:31raised from match_fn → ovsdbapp logs Event not matched due to this exception
RuntimeErrorCentralized routing requires gateway_port column in the OVN_Northbound schema. Please update OVN to 23.09.0 or later.NB driver, centralized FIPs, old OVN schemaovn_bgp_agent/drivers/openstack/nb_ovn_bgp_driver.py:56at start: agent start fails; on flag change: event lost (logged by ovsdbapp)
RuntimeErrorThe exposer does not have distributed flag set yetNAT exposer used before the mode is knownovn_bgp_agent/drivers/openstack/nb_ovn_bgp_driver.py:66, ovn_bgp_agent/drivers/openstack/nb_ovn_bgp_driver.py:70not reachable in normal start order [inferred]
NotImplementedErrorDistributed NAT is not implemented yet.nat_exposer in distributed mode (events of § 3.4 centralized are unregistered then)ovn_bgp_agent/drivers/openstack/nb_ovn_bgp_driver.py:87, ovn_bgp_agent/drivers/openstack/nb_ovn_bgp_driver.py:108not reachable [inferred]
RuntimeErrorStatic MAC Binding entry for port %s and ip %s exists / … does not exist / Unexpected duplicates in database for port %s and ip %slocal NB transaction (exposing_method = ovn)ovn_bgp_agent/drivers/openstack/utils/ovn.py:194-251callers use may_exist/if_exists, so only duplicates can surface; caught by the driver's broad handler
KeyErrorCould not locate EVPN for bridge %s and/or vlan %sNB vrf: no EVPN bridge set up for the bridge/VLAN of the portovn_bgp_agent/drivers/openstack/utils/evpn.py:541caught in wire: WARNING EVPN has not been setup for bridge %s with vlan device %s …, IP not exposed (ovn_bgp_agent/drivers/openstack/utils/wire.py:713-720); not caught in bgp_utils.announce_ips for tenant IPs (ovn_bgp_agent/drivers/openstack/utils/bgp.py:35) → event error
NotImplementedError—stretched driver expose_remote_ip/withdraw_remote_ipovn_bgp_agent/drivers/openstack/ovn_stretched_l2_bgp_driver.py:535, ovn_bgp_agent/drivers/openstack/ovn_stretched_l2_bgp_driver.py:539never called
SystemExit(1)log No more routing tables available for bridge %s at %s252 routing table numbers all used in /etc/iproute2/rt_tablesovn_bgp_agent/utils/linux_net.py:265process exits from inside sync (raised in a looping-call thread: SystemExit is a BaseException, not caught by except Exception) [inferred]

Errors from libraries

OriginErrorSituationEffect
processutilsProcessExecutionErrorvtysh, sysctl, ip -6 nei, ovs-vsctl, ovs-ofctl exit code ≠ 0logged Unable to execute %s. Exception: %s / Unable to execute vtysh with %s. Exception: %s (ovn_bgp_agent/privileged/vtysh.py:31-33, ovn_bgp_agent/privileged/linux_net.py:171-177) and re-raised; ovs-ofctl is retried once with OpenFlow13 (ovn_bgp_agent/privileged/ovs_vsctl.py:40-44); ip -6 nei del proxy returning "No such file or directory" is ignored (ovn_bgp_agent/privileged/linux_net.py:228-235)
pyroute2NetlinkErrorany other errno than those translated (§ 1)propagates
pyroute2NetlinkDumpInterruptedconcurrent change during a dumpretried with backoff up to 8 s (ovn_bgp_agent/utils/linux_net.py:49-53)
ovsdbapp / ovsconnection errors, TimeoutExceptionOVN DB unreachablethe IDL reconnects by itself; SB drivers resync on the next Chassis_Private CREATE (§ 05 1.3); NB driver waits for the timer
oslo.privsepdaemon start failureroot_helper cannot run privsep-helperfirst privileged call fails; agent cannot work [inferred]

2. Asynchronous errors (no exception reaches anything)

  • Event errors: Unexpected exception while running the event action with traceback (ovn_bgp_agent/drivers/openstack/watchers/base_watcher.py:31-36); for events overriding run, ovsdbapp's Unexpected exception in notify_loop (ovsdbapp:ovsdbapp/event.py:205-208). The event is dropped.
  • Match errors: ovsdbapp's Event not matched due to this exception: (ovsdbapp:ovsdbapp/event.py:153-158). Two places hit it by construction:
    • evpn_watcher.SubnetRouterAttachedEvent.match_fn references constants.constants.OVN_EVPN_AS_EXT_ID_KEY (ovn_bgp_agent/drivers/openstack/watchers/evpn_watcher.py:97); the AttributeError is caught by the function's own except and returns False. Effect: an UPDATE that adds neutron_bgpvpn:as to a port that already had the VNI never matches; only the next sync exposes it.
    • FipOnCRLRPBaseEvent raising ChassisNotFound/NATNotFound (above).
  • Sync errors: Unexpected exception while running the sync: %s / … frr sync: %s (ovn_bgp_agent/agent.py:52-64). A failing sync stops at the failing step: the cleanup phase (end of sync) is then skipped, so leftovers stay until a sync completes.
  • Silent non-exposure (no error, DEBUG or nothing): missing EVPN annotations, address scope mismatch, require_snat_disabled_for_tenant_networks (INFO All ips (%s) were removed due to SNAT requirement …, ovn_bgp_agent/drivers/openstack/nb_ovn_bgp_driver.py:885-895), FRR router-id unknown (ERROR Unknown router-id, needed for route leaking, ovn_bgp_agent/drivers/openstack/utils/frr.py:182-186: the VRF leak is not configured and no IP announced through bgp_nic reaches the default BGP instance).

3. Key log messages

LevelMessageSituationDefined at
INFOLoaded chassis %s.startovn_bgp_agent/drivers/openstack/ovn_bgp_driver.py:82
INFORunning reconciliation loop to ensure routes/rules are in place.each syncovn_bgp_agent/agent.py:50
INFORunning reconciliation loop to ensure frr configuration is in place.each frr_sync (every 15 s)ovn_bgp_agent/agent.py:58
INFOAdd VRF leak for VRF %s on router bgp %seach frr_syncovn_bgp_agent/drivers/openstack/utils/frr.py:181
INFOConnection to OVSDB established, doing a full syncSB reconnectionovn_bgp_agent/drivers/openstack/watchers/base_watcher.py:93
WARNINGAgent did not find %s configuration in the OVN Northbound NB_Global table …NB start without neutron:fip-distributedovn_bgp_agent/drivers/openstack/utils/ovn.py:446-453
WARNINGOVN version does not include support for status information. Therefore router ports and tenant IPs cannot be exposed.NB driver on OVN < 23.09ovn_bgp_agent/drivers/openstack/utils/ovn.py:371-373
WARNINGRemoving IPs %s from %s as they are not expected to be exposed.NB sync cleanupovn_bgp_agent/drivers/openstack/utils/wire.py:544-545
WARNINGPatch port %s for bridge %s not found. …unreachable as written (§ 1 PortNotFound)ovn_bgp_agent/drivers/openstack/utils/wire.py:702-705
WARNINGEVPN has not been setup for bridge %s with vlan device %s. …NB vrf, network without EVPN annotationsovn_bgp_agent/drivers/openstack/utils/wire.py:716-719
WARNINGNIC ports (%s) not found for bridge %s. …exposing_method = ovn, external_nics not on the bridgeovn_bgp_agent/drivers/openstack/utils/wire.py:470-473
WARNINGIncorrect bridge mapping settings: %smalformed ovn-bridge-mappings entryovn_bgp_agent/utils/helpers.py:24
ERRORUnknown router-id, needed for route leakingno bgp_router_id and FRR has noneovn_bgp_agent/drivers/openstack/utils/frr.py:185
ERRORNo more routing tables available for bridge %s at %stable numbers exhausted (then exit)ovn_bgp_agent/utils/linux_net.py:263
ERRORNAT entry %(nat)s does not have %(fip_net)s set in external_idsNAT without neutron:fip_network_idovn_bgp_agent/drivers/openstack/watchers/nb_bgp_watcher.py:928, ovn_bgp_agent/drivers/openstack/watchers/base_watcher.py:141
ERROREVPN information at router port (vni: %s, as: %s) does not match with information at subnet gateway port: %sEVPN annotations inconsistentovn_bgp_agent/drivers/openstack/ovn_evpn_driver.py:406
ERROREVPN device must have an IP associated for the VXLAN local ipno VXLAN source IPovn_bgp_agent/drivers/openstack/ovn_evpn_driver.py:606, ovn_bgp_agent/drivers/openstack/utils/evpn.py:44
ERRORUnable to execute %s %san ovs-* command failedovn_bgp_agent/privileged/ovs_vsctl.py:32
EXCEPTIONUnexpected exception while wiring provider port: %sany error while wiring (port left un-announced)ovn_bgp_agent/drivers/openstack/ovn_bgp_driver.py:349-352, ovn_bgp_agent/drivers/openstack/nb_ovn_bgp_driver.py:413-416

4. Defects found while reading or running

#DefectEffectWhere
D1_wire_provider_port_underlay catches PatchPortNotFound, but get_device_port_at_ovs raises PortNotFoundthe first VM of a provider network on a node: rule and route are installed, then the exception aborts before announce_ips; the IP is announced only at a later sync once the patch port existsovn_bgp_agent/drivers/openstack/utils/wire.py:699-706, ovn_bgp_agent/drivers/openstack/utils/ovs.py:53-70
D2linux_net.set_device_status passes ndb= to the privileged set_device_state(device, state), which has no such parameterSB EVPN driver, VLAN provider network: TypeError when building the devices; the gateway is never exposedovn_bgp_agent/utils/linux_net.py:856-858, ovn_bgp_agent/privileged/linux_net.py:54-55, ovn_bgp_agent/drivers/openstack/ovn_evpn_driver.py:625
D3constants.constants.OVN_EVPN_AS_EXT_ID_KEYsee § 2ovn_bgp_agent/drivers/openstack/watchers/evpn_watcher.py:97
D4update_subnet computes the old IPs with if old.mac or len(old.mac[0]…) (or instead of and)IndexError when old.mac is empty; event lostovn_bgp_agent/drivers/openstack/ovn_stretched_l2_bgp_driver.py:235-239
D5_update_network replaces propagated_lrp_ports[...]["subnets"] with only the added subnetsafter a subnet is added to a router port, withdrawing the port forgets the earlier subnets' routes until the next syncovn_bgp_agent/drivers/openstack/ovn_stretched_l2_bgp_driver.py:458-463
D6get_lrp_ports_on_provider builds a list but returns nothingunused in this branchovn_bgp_agent/drivers/openstack/utils/ovn.py:640-648
D7get_bridge_vlans logs "deleted" when the bridge is missing but continues with link=Nonelists all links' VLAN ids instead of none [inferred]ovn_bgp_agent/privileged/linux_net.py:464-478
D8_run_vtysh_config_with_tempfile: if NamedTemporaryFile fails, the handler references the unbound fUnboundLocalError hides the I/O errorovn_bgp_agent/drivers/openstack/utils/frr.py:122-132
D9ChassisNotFound(msg, row) builds a 2-tuple messageunreadable logovn_bgp_agent/drivers/openstack/utils/nat.py:31-33
D10l2vni and dynamic are valid choices of exposing_method but rejected at syncmisconfiguration detected only at run time, every 300 sovn_bgp_agent/config.py:130-145, ovn_bgp_agent/drivers/openstack/utils/wire.py:44
D11_SYNC_STATE_LOCK read-locks are never paired with a write lockno protection; see 05 § 1.2ovn_bgp_agent/drivers/openstack/watchers/bgp_watcher.py:26
D12ovn_local_lrps != [] compared with a dictalways true; no filtering in match_fnovn_bgp_agent/drivers/openstack/watchers/bgp_watcher.py:279, ovn_bgp_agent/drivers/openstack/watchers/evpn_watcher.py:163
D13get_ovn_vip_port slices neutron:port_name without checking it existsTypeError on any unbound MAC-less port without that key; LB event lostovn_bgp_agent/drivers/openstack/utils/ovn.py:759-763
D14the node-local NB IDL does not register BFD but bfd_add is calledexposing_method = ovn with peer_ips likely fails at sync [inferred, not run]ovn_bgp_agent/drivers/openstack/nb_ovn_bgp_driver.py:47-51, ovn_bgp_agent/drivers/openstack/utils/wire.py:281-293
D15vrf_reconfigure fills local_ip from CONF.evpn_local_ip onlywithout evpn_local_ip (allowed by the SB EVPN driver, which then takes the VXLAN source from lo/evpn_nic), FRR receives rd None:<vni> — confirmed by running (scenario frr-and-evpn-renderings)ovn_bgp_agent/drivers/openstack/utils/frr.py:63-67, ovn_bgp_agent/drivers/openstack/utils/frr.py:210-214
D16ensure_base_wiring_config does routing_tables = routing_tables or {}; the NB driver passes its empty dict, which is replaced by a new one and never filled (regression of commit ccf4c29, in every tag since 5.0.0)**NB driver with underlay**: wiring a provider IP raises KeyError (swallowed: Unexpected exception while wiring provider port), nothing is announced by sync; sync itself fails in cleanup_wiring with KeyError: '<bridge>', so leftovers are never cleaned; events that wire IPs fail the same way — confirmed by running (scenario defect-d16-nb-underlay-routing-tables); the unit tests mock this functionovn_bgp_agent/drivers/openstack/utils/wire.py:34-38, ovn_bgp_agent/drivers/openstack/nb_ovn_bgp_driver.py:297-300

D1, D2, D15 and D16 were reproduced by the scenarios of _rewrite/side-effects_stable-2026.2.json (07); the others were found by reading.

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