Skip to content

Synchronise master with upstream#303

Open
github-actions[bot] wants to merge 125 commits into
stackhpc/masterfrom
upstream/master-2026-06-22
Open

Synchronise master with upstream#303
github-actions[bot] wants to merge 125 commits into
stackhpc/masterfrom
upstream/master-2026-06-22

Conversation

@github-actions

Copy link
Copy Markdown

This PR contains a snapshot of master from upstream master.

pulchart and others added 30 commits September 16, 2025 10:14
When the agent restarts, the "Clean conntrack entries with mark == CT_MARK_INVALID"
routine only considers IPs from fixed_ips. Deployments that rely on
allowed_address_pairs (both single IPs and CIDRs) are skipped, leaving
stale invalid-marked entries in conntrack and causing drops (e.g., UDP DNS).

This change extends the cleanup candidate list with the port’s
allowed_address_pairs and switches to passing the full CIDR to conntrack,
so both host (/32) and network prefixes (e.g., /20) are handled natively.

Examples:
  conntrack -D -f ipv4 -m 0x1 -s 10.15.194.184/32 -w 1
  conntrack -D -f ipv4 -m 0x1 -s 10.16.192.0/20  -w 1

Closes-Bug: #2122495
Change-Id: I6ed507df845d068e13955758be9b2325e206cb6c
Signed-off-by: Jaroslav Pulchart <jaroslav.pulchart@gooddata.com>
Signed-off-by: lajoskatona <lajos.katona@est.tech>
Devstack no longer supports it after eventlet deprecation
so we can safely remove it.

TrivialFix

Change-Id: Ie69c99933d6a75771f24b144006e2e52b4aeb6f5
Signed-off-by: Brian Haley <haleyb.dev@gmail.com>
Closes-Bug: #2112446
Change-Id: I4fe91d759c430c4d64cd22a940bd1c17cfa76d5b
Signed-off-by: Dai, Dang Van <daikk115@gmail.com>
Remove it from two tests that were setting it, otherwise
it is unused in Neutron as we are already doing policy
scope enforcement.

It is safe to remove as oslo.policy is finally removing
the option in [0].

[0] https://review.opendev.org/c/openstack/oslo.policy/+/986475

Change-Id: If042296d49d731e1412858d672b2727163fde901
Signed-off-by: Brian Haley <haleyb.dev@gmail.com>
There are two distinct issues here:

- Uncommitted reads (TOCTOU): The method creates its own
  get_admin_context() instead of accepting the caller’s.
  Any changes in the caller’s transaction that have not
  been committed yet are invisible to these queries — a
  floating IP associated to the subnet’s port by the
  caller would not be seen. Change to use passed context
  object.

- Unguarded in_([]) with empty list: When the router has
  no floating IPs, fip_ids = [], and
  PortForwarding.get_objects(context, floatingip_id=[])
  generates WHERE floatingip_id IN () — invalid SQL on
  some DB engines. Change to initialize pf_objs to [] if
  there are no floating IPs.

TrivialFix

Assisted-by: Claude Sonnet 4.6
Signed-off-by: Brian Haley <haleyb.dev@gmail.com>
Change-Id: I1e68bc22b8c2d334039326b9b3aff44296abcb2d
The caller ``update_router()`` already computes
``ovn_router_ext_gw_lrps`` by filtering ``ovn_router.ports``
for gateway LRPs. Pass this list into ``_check_external_ips_changed``
so the no-subnet edge case can use the already-fetched LRP objects
instead of re-querying OVN NB via ``get_lrouter_port()``.

This eliminates one OVN NB round-trip per gateway port in the
no-subnet edge case during router update. The LRP external_ids
already contain the network name needed for the comparison.

Assisted-By: Claude Opus 4.6
Signed-off-by: Rodolfo Alonso Hernandez <ralonsoh@redhat.com>
Change-Id: Ibf5bbce04c469524ea4284b7662f599605c27943
When deleting a non-virtual port, ``_delete_port()`` fetched the
Logical_Switch via ``ls_get().execute()``, which created a separate
read transaction nested inside the existing write transaction.
This is unnecessary since the IDL maintains an in-memory replica
of the OVN NB database.

Replace ``ls_get().execute()`` with a direct ``lookup()`` call, which
performs an O(1) in-memory IDL access using the name index,
eliminating the command/transaction overhead on every port
deletion.

Assisted-By: Claude Opus 4.6
Signed-off-by: Rodolfo Alonso Hernandez <ralonsoh@redhat.com>
Change-Id: I1fd990d2d447e947ef23fdc0fe2f48aae2d4adec
``update_lsp_host_info()`` first called ``lookup()`` to check whether
the Logical_Switch_Port exists, discarding the returned row, then
called ``lsp_get_up().execute()`` which internally looked up the
same LSP again inside a separate read transaction.

Reuse the row already returned by ``lookup()`` and read the ``up``
column directly from the in-memory IDL replica, removing the
redundant ``lsp_get_up().execute()`` round-trip on every port
status change.

Assisted-By: Claude Opus 4.6
Signed-off-by: Rodolfo Alonso Hernandez <ralonsoh@redhat.com>
Change-Id: I6f825d9ff1b678d29650a0544635bacceb9b0f1c
This adds a generic RangeAllocator that uses the DB to select an
unused integer value from a gap in the existing rows. It should
work across all supported DBs.

On top of this, a VNIVLANAllocator pairs a VNI and VLAN allocation
together through a mapping table, providing a single interface for
allocating and deallocating VNI/VLAN pairs scoped by physical
network.

The EVPN plugin uses VNIVLANAllocator via EVPNDbHelper to manage
per-router VNI/VLAN assignments. The schema uses RESTRICT FKs from
the mapping to allocations and CASCADE from evpn_l3_instances to
the mapping, ensuring clean lifecycle management.

Co-Authored-By: Jakub Libosvar <jlibosva@redhat.com>
Assisted-By: Claude Opus 4.6
Change-Id: I62da7a1263aaf605b295af0c3e019754b4e4ecda
Signed-off-by: Terry Wilson <twilson@redhat.com>
The OVN maintenance worker and the BGP topology reconciler used
``not idl.is_lock_contended`` to determine whether the current process
holds the OVSDB lock. This is incorrect because ``is_lock_contended``
and ``has_lock`` are two independent boolean flags in the OVS IDL, not
complementary ones. When the lock has been requested but the server has
not yet replied, both flags are ``False``, so ``not is_lock_contended``
evaluates to ``True`` even though the lock is not held.

During neutron-server startup or OVSDB reconnection, this race window
could allow maintenance tasks (configured with ``run_immediately=True``)
or BGP topology synchronization to be processed by a worker that does
not actually own the lock, potentially causing duplicate or conflicting
operations against the OVN Northbound DB.

Replace all occurrences with ``idl.has_lock``, which is only ``True``
when the server has explicitly confirmed lock ownership. This is
consistent with the approach already used in the BGP service IDL
(``neutron/services/bgp/ovn.py``) and with the semantics documented
in the upstream OVS IDL class.

Closes-Bug: #2155155
Assisted-By: Claude Opus 4.6
Signed-off-by: Rodolfo Alonso Hernandez <ralonsoh@redhat.com>
Change-Id: I80e74a399b7c3420baf49e0cbc50ddfee0a070e0
The delete path for floating ips currently only deletes the nat entry on
the ovn side if it actually finds a nat entry for the floating ip.
When quickly associating and then disassociating a floating ip through
different neutron api instances, the nat entry may not yet have
propagated from one api instance to the other through the northbound if
load on the ovsdb is sufficiently high.
Since the ovn revision entry is deleted anyways, the maintenance task has
no chance of fixing it later on, leaving an orphaned nat entry in ovn
which causes connectivity issues when the ip address gets reused.

Keep the ovn revision entry in case we don't find a matching nat entry to
give the maintenance task a chance to retry the deletion.

Related-Bug: #1987530
Signed-off-by: Felix Moebius <felix.moebius@digits.schwarz>
Change-Id: I6c598cbbca1e449cf67314d022f101f2f73cf1bc
... to detect unsupported values early. Also use the native interface
to document available choices.

Change-Id: I43848aebddc1819101f969a452560b5b37dc839b
Signed-off-by: Takashi Kajinami <kajinamit@oss.nttdata.com>
When dependencies change in neutron, it occasionally breaks the gate.
This is a quick-and-dirty tool that will parse neutron, requiremnts,
and ovn/ovs branches and print out dependency changes that happend in
a date or neutron commit hash range. Example run for finding a recent
gate failure:

/tools/dep_version_diff.py --start 2026-06-04 --branch-commits
Dependency changes (neutron direct deps)
  start : 2026-06-04
    -> requirements bdc4e18f (2026-06-03)
  end   : HEAD
    -> requirements e4a4f7d3 (2026-06-06)
  neutron deps read from: 8e0d77da

Changed:
  webob  1.8.9 -> 1.8.10  2026-06-06  [bot] Updated from generate-constraints  (requirements@e4a4f7d3)

OVS/OVN binary branches:
  OVN_BRANCH  branch-26.03 (unchanged, branch (moving))
              6 commit(s) on branch-26.03:
                cbb71611b  northd: Clear stale LSP tags on tag_request removal.
                e43a84b21  tests: Add macro for running UDP "echo" service.
                3888f8944  northd: Ignore LRP.status write-only column in northd.
                7aa8875ca  ovn-nbctl: Display tier in "acl-list" for multi-tier ACLs.
                2a0ca98b7  ovn-nbctl: Display peer info in "show" for router ports.
                9f04b8c50  tests: Fix flaky "Loadbalancer add-route option" system test.
  OVS_BRANCH  branch-3.7 (unchanged, branch (moving))
              6 commit(s) on branch-3.7:
                ea7f21658  packets: Add support for unicast ND NS compose.
                e9082e2a6  ofproto-dpif-xlate: Track the last action through normal pipeline.
                eb0555761  ofproto-dpif-xlate: Use datapath actions for reversibility check.
                5b2f54ea0  tests: ovsdb: Fix negotiation error check with OpenSSL 4.0.
                70a73ab72  dpdk: Use DPDK 25.11.2 release for OVS 3.7.
                04b05b31a  ofproto-dpif: Fix bundle floodable flag when disabling STP/RSTP.

It can also take zuul job names as filters, e.g.
--job neutron-functional-with-pyroute2-master won't show pyroute2
requirements changes.

Assisted-By: Claude Opus 4.6
Change-Id: I7403071949b1bfbdfa78aa0fd59739c1a42a8a6e
Signed-off-by: Terry Wilson <twilson@redhat.com>
Previously, PUT responses would input the old values of pvlan,
pvlan_type and pvlan_community. The cause of this is that in plugin.py,
_make_port_dict is calling _extend_port_pvlan before the DB is actually
updated, so the old values are the ones being used. The modification of
the desired state solves this timing issue.

Closes-Bug: #2155636
Assisted-By: Claude Opus 4.6
Change-Id: I0d2b10a2ad8ece4738a4c2225dee42ad55740003
Signed-off-by: Elvira Garcia <egarciar@redhat.com>
Those base check strings were moved to neutron-lib with patch [1].

[1] https://review.opendev.org/c/openstack/neutron-lib/+/983214

Related-bug: #2143895

Change-Id: Ifaf22a010911de9c1dc7ccef6fd2aaaf73875b1d
Signed-off-by: Slawek Kaplonski <skaplons@redhat.com>
This is a followup patch to
I78fec86595fb358880b306ec1fe014adad007d87

The patch moves Netlink specific constants from
evpn to netlink module.

It moves the EVPN specific naming convention
out of the Svd class and creates a new EvpnSvd
that is used by the evpn-ovn driver.

It adds back the functional tests from the patch it
depends on, now that the Svd is generic and doesn't
use same device names, we can test its integration
because the device names can be generated and will not
collide in a parallel run.

Depends-On: https://review.opendev.org/c/openstack/neutron/+/989626
Related-Bug: #2144617
Assited-By: Claude Opus 4.6
Co-Authored-By: Helen Chen <ichen@redhat.com>

Change-Id: I95fe3a93da6a8ec353c4f8de05ab6b281f5df6ec
Signed-off-by: Jakub Libosvar <libosvar@redhat.com>
This old module was just left overs from the dark old ages before Zuul
v3 and jobs defined in its native way.
Migration to zuul v3 was done many years ago and those scripts which
were in neutron.tests.contrib are not used anymore.

The only exception is `testing.filters` file which contains rootwrap
filters to use in the CI jobs like e.g. functional tests. This file is
now moved to the `tools/rootwrap/testing.filters` location which is
"closer" to the scripts which actually are using it.

Change-Id: I9199596a06c84d6f6b84ff43bc95d04a31074685
Signed-off-by: Slawek Kaplonski <skaplons@redhat.com>
Add DevStack configuration to load the PVLAN service plugin when
neutron-pvlan is enabled. This is required for neutron-tempest-plugin
OVN jobs that exercise PVLAN scenario tests.

Assisted-By: Cursor-composer-2-fast
Related-Bug: #2138746

Change-Id: Ic6e8bbccbd6695eadb007952241c275a694f19c0
Signed-off-by: Fiorella Yanac <fyanac@redhat.com>
The patch implements resource creation for an EVPN router,
its deletion and advertise-host option for the LSP associated
with an EVPN router.

Assisted-By: Claude Opus 4.6
Related-Bug: #2144617

Change-Id: I66c59707006b4351f637a14fee38f5fd3ebfd22d
Signed-off-by: Jakub Libosvar <libosvar@redhat.com>
Change-Id: I55d86d7a86eb4e65bfef884ff8822fb241c6bce6
Signed-off-by: Winicius Silva <winiciusab12@gmail.com>
OVN Agent EVPN Extension now creates an SVD at start up.  The SVD
consists of a Linux bridge with a name based on the pattern
evpn.constants.EVPN_LB_NAME_PREFIX and a vxlan interface with a name
based on the pattern evpn.constants.EVPN_VXLAN_IFNAME.  Since the
current plan is to create only one SVD per OVN Agent, the index for the
Linux bridge and vxlan interface is the default 0.

When an EVPN instance's finite state machine advances to the
evpn.fsm.Evpn.ADVERTISING state, a vlan:vni mapping is added to the
SVD and a vlan interface with its name based on the pattern
evpn.constants.EVPN_VLAN_IFNAME_PATTERN is also created.  Similarly,
when the EVPN instance's finite state machine advances away from
evpn.fsm.Evpn.ADVERTISING, the vlan:vni mapping is removed from the SVD
and the vlan interface is deleted.

Related-Bug: #2144617
Assisted-By: Claude Opus 4.6
Change-Id: Ia9aeb47a6b06b003b2ff3c65c525603a1b760bb9
Signed-off-by: Helen Chen <ichen@redhat.com>
Add EVPN_LRP_VLAN_EXT_ID_KEY constant and pass vid to fsm.advance()
for port binding create events to support SVD vni:vlan mapping.

Change-Id: Ibd06716a98e1e4addb00a616d3d8e46ad22d1aca
Signed-off-by: Terry Wilson <twilson@redhat.com>
Provides common interface via EVPNRouterDriver class. This is so we can
implement other evpn drivers in the future. E.g. frr gRPC driver.
This patch Implements `FrrVtyshDriver` which uses python subprocess to
call into vtysh on the system to configure a evpn driver.
The configuration file is generated based on templates in templates.py.
For now, there is no way for the operator to add their own custom frr
configuration. Fortunately, FrrCommandBuilder can be extended with a
new "loader" to allow overwrite files in future.

Follow up patches:
- Hook up FrrVtyshDriver to the EVPN state machine

Assisted-By: Claude Opus 4.6
Change-Id: I746e30c2b2ab36ad706bff6f411790d27d85be1b
Signed-off-by: Miro Tomaska <mtomaska@redhat.com>
Related-Bug: #2144617
This patch adds `write memory` for each configuration it applies.
Adds restart method and exposes start+stop methods in FrrFixture
Adds tests which confirm that running config is used on reboots
or explicit stop and starts.

Related-Bug: #2144617
Change-Id: I5973492fc538946462d0fec0b1b93db73a032854
Signed-off-by: Miro Tomaska <mtomaska@redhat.com>
When a service plugin package (e.g. neutron-fwaas, neutron-vpnaas,
networking-sfc) is installed but its service plugin is not configured
in ``service_plugins``, the quota details API endpoint
(GET /v2.0/quotas/{project_id}/details) returns a 500 Server Error.

The installed package registers quota resources (e.g. firewall_group,
firewall_policy, firewall_rule) at import time via
``resource_helper.build_resource_info(register_quota=True)``. When the
quota details endpoint iterates over all registered resources to
count usage, it calls ``_count_resource()`` which looks for a plugin
that provides ``get_<collection>_count`` or ``get_<collection>``.
Since the service plugin is not loaded, no plugin supports counting
those resources, and a ``NotImplementedError`` is raised.

Catch the ``NotImplementedError`` in
``DbQuotaDriver.get_detailed_project_quotas()`` and skip the resource
instead of letting the exception propagate as a 500 error. Also
guard the project-specific limit update loop against skipped
resources.

Closes-Bug: #2155846
Assisted-By: Claude Opus 4.6
Signed-off-by: Rodolfo Alonso Hernandez <ralonsoh@redhat.com>
Change-Id: I923e90279edf3de3fa85c83fd46e1b5dec0468de
Zuul and others added 27 commits June 16, 2026 11:37
The option is validated when config files are loaded, so don't have to
be validated again in internal logic.

Change-Id: Ie334cf08159ba406d55ffbce8bf60be7de184010
Signed-off-by: Takashi Kajinami <kajinamit@oss.nttdata.com>
This patch removes the OVN Metadata agent grenade and
neutron-tempest-plugin CI jobs. Both jobs are marked for removal in
2026.2 release.

Related-Bug: #2112313
Signed-off-by: Rodolfo Alonso Hernandez <ralonsoh@redhat.com>
Change-Id: Id9994994b28ffb27670970901466e454815dee20
Removed the following CI job definitions:
* neutron-tempest-dvr
* neutron-tempest-iptables_hybrid
* neutron-grenade-multinode

Signed-off-by: Rodolfo Alonso Hernandez <ralonsoh@redhat.com>
Change-Id: I9a47b9251c408c1fd60cdcd29e249815535bd61b
Python's `requests` lib is always asking for 'gzip,deflate'
encoding by itself, and decoding those by itself too,
but does not remove the content-encoding header from response,
so don't rely on this header alone to decide if content should
be decoded or not.
Also, content-length and transfer-encoding are left untouched,
even if they correspond to originally gzip-ed content.
This all interferes when user data is itself gzip-ed and
there's a proper web server like apache2 that itself generates
proper gzip-ed response.

Clean-up erroneous headers, and let webob recalculate them as needed.

Related-Bug: #2120723
Closes-Bug: #2156587
Change-Id: Ia5d0cbdc5c715462438e38135e441ce9f5ea98c1
Signed-off-by: Pavlo Shchelokovskyy <shchelokovskyy@gmail.com>
Vtysh accepts passing different path to unix socket for
communicating with frr via `--vty_socket` argument. This patch exposes
this argument in the frr_driver. The goal is to use this argument
when frrdriver is run inside a container where the unix path might be
different than default.

Related-Bug: #2144617
Assisted-by: Opus 4.6 model
Change-Id: I34e2ecfe0f78f4cbc6326615745468761902e75e
Signed-off-by: Miro Tomaska <mtomaska@redhat.com>
Other code passes the MaintenanceWorker as the trigger to
from_server() like the ovn-db-sync-util and only the real
MaintenanceWorker itself should call set_lock() before
connecting.

Closes-Bug: #2156979

Signed-off-by: Terry Wilson <twilson@redhat.com>
Change-Id: I74145ef1407856b7ec75de87daa2270b452b6c70
Introduce a new API extension that allows configuring the default
value of the ``stateful`` attribute for new security groups, on a
per-project or system-wide basis. The new resource supports full
CRUD operations with corresponding RBAC policy rules.

The API definition ``security-groups-default-statefulness`` is
provided in [1] and was released in neutron-lib 4.0.0.

[1]https://review.opendev.org/c/openstack/neutron-lib/+/984354

Closes-Bug: #2146803
Assisted-By: Claude Opus 4.6
Signed-off-by: Rodolfo Alonso Hernandez <ralonsoh@redhat.com>
Change-Id: I1c773a445a65414dbb3df325a3a61b94d050efc6
When a VM with a floating IP is deleted, the port deletion
triggers ``disassociate_floatingips`` which calls
``_process_dns_floatingip_delete``. This method deleted the DNS
records from Designate but did not remove the ``FloatingIPDNS``
DB row (``floatingipdnses`` table). The stale row caused failures
when the same FIP was later associated with a new VM: the
external DNS cleanup attempted to delete the old name which no
longer existed in Designate, resulting in a
``DuplicateRecordSet`` error. The new VM's DNS records were then
never cleaned on its deletion.

Delete the ``FloatingIPDNS`` row after removing the records from
the external DNS service. This is safe for both callers of
``_process_dns_floatingip_delete``: on FIP deletion the row
would be cascade-deleted anyway, and on FIP disassociation it
prevents stale data from persisting.

Closes-Bug: #2130405
Signed-off-by: Rodolfo Alonso Hernandez <ralonsoh@redhat.com>
Change-Id: I0d7f722ae1ef8d474112b40c9ab78ed2d1a417b2
@github-actions github-actions Bot requested a review from a team as a code owner June 22, 2026 08:27
@github-actions github-actions Bot added automated Automated action performed by GitHub Actions synchronisation labels Jun 22, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

automated Automated action performed by GitHub Actions synchronisation

Projects

None yet

Development

Successfully merging this pull request may close these issues.