[Bug 2126923] Re: [SRU] ovn_dhcp4_global_options doesn't support keys with a list of values

Leah Goldberg 2126923 at bugs.launchpad.net
Fri Mar 20 21:29:18 UTC 2026


********** Verification for Caracal (UCA) **********

##### Before enabling -proposed #####

# current installed package

ubuntu at rs-jammy-caracal:~/regress-stack$ apt-cache policy neutron-server
neutron-server:
  Installed: 2:24.1.0-0ubuntu1~cloud0
  Candidate: 2:24.1.0-0ubuntu1~cloud0
  Version table:
 *** 2:24.1.0-0ubuntu1~cloud0 500
        500 http://ubuntu-cloud.archive.canonical.com/ubuntu jammy-updates/caracal/main amd64 Packages
        100 /var/lib/dpkg/status
     2:20.5.0-0ubuntu2.1 500
        500 http://archive.ubuntu.com/ubuntu jammy-updates/main amd64 Packages
     2:20.3.0-0ubuntu1.1 500
        500 http://security.ubuntu.com/ubuntu jammy-security/main amd64 Packages
     2:20.0.0-0ubuntu3 500
        500 http://archive.ubuntu.com/ubuntu jammy/main amd64 Packages

# Changed the value of `ovn_dhcp4_global_options` 
# to contain multiple values in the `ml2_conf.ini` file

sudo micro /etc/neutron/plugins/ml2/ml2_conf.ini
ovn_dhcp4_global_options = ntp_server:1.2.3.4,wpad:1.2.3.5;1.2.3.6

# Restart the neutron server

ubuntu at rs-jammy-caracal:~/regress-stack$ sudo systemctl restart neutron-server
ubuntu at rs-jammy-caracal:~/regress-stack$ sudo systemctl daemon-reload

# Create a new network and subnet

ubuntu at rs-jammy-caracal:~/regress-stack$ openstack network create test-network
+---------------------------+--------------------------------------+
| Field                     | Value                                |
+---------------------------+--------------------------------------+
| admin_state_up            | UP                                   |
| availability_zone_hints   |                                      |
| availability_zones        |                                      |
| created_at                | 2026-03-20T21:21:06Z                 |
| description               |                                      |
| dns_domain                |                                      |
| id                        | 9b82342a-7909-4c79-8b90-b656ea416bfd |
| ipv4_address_scope        | None                                 |
| ipv6_address_scope        | None                                 |
| is_default                | False                                |
| is_vlan_transparent       | None                                 |
| l2_adjacency              | True                                 |
| mtu                       | 1442                                 |
| name                      | test-network                         |
| port_security_enabled     | True                                 |
| project_id                | 24e5244fb4124ef889fff29861533029     |
| provider:network_type     | None                                 |
| provider:physical_network | None                                 |
| provider:segmentation_id  | None                                 |
| qos_policy_id             | None                                 |
| revision_number           | 1                                    |
| router:external           | Internal                             |
| segments                  | None                                 |
| shared                    | False                                |
| status                    | ACTIVE                               |
| subnets                   |                                      |
| tags                      |                                      |
| tenant_id                 | 24e5244fb4124ef889fff29861533029     |
| updated_at                | 2026-03-20T21:21:06Z                 |
+---------------------------+--------------------------------------+

ubuntu at rs-jammy-caracal:~/regress-stack$ openstack subnet create --network test-network --subnet-range 192.168.100.0/24 --dhcp test-subnet
+----------------------+--------------------------------------+
| Field                | Value                                |
+----------------------+--------------------------------------+
| allocation_pools     | 192.168.100.2-192.168.100.254        |
| cidr                 | 192.168.100.0/24                     |
| created_at           | 2026-03-20T21:21:10Z                 |
| description          |                                      |
| dns_nameservers      |                                      |
| dns_publish_fixed_ip | None                                 |
| enable_dhcp          | True                                 |
| gateway_ip           | 192.168.100.1                        |
| host_routes          |                                      |
| id                   | 25bca3bd-e768-456f-aed4-79b6de8ea9d3 |
| ip_version           | 4                                    |
| ipv6_address_mode    | None                                 |
| ipv6_ra_mode         | None                                 |
| name                 | test-subnet                          |
| network_id           | 9b82342a-7909-4c79-8b90-b656ea416bfd |
| project_id           | 24e5244fb4124ef889fff29861533029     |
| revision_number      | 0                                    |
| segment_id           | None                                 |
| service_types        |                                      |
| subnetpool_id        | None                                 |
| tags                 |                                      |
| updated_at           | 2026-03-20T21:21:10Z                 |
+----------------------+--------------------------------------+


# See that multiple values are parsed incorrectly

ubuntu at rs-jammy-caracal:~/regress-stack$ sudo ovn-nbctl list
DHCP_Options

_uuid               : 6808b77f-e72b-4f89-a929-06a8d85a49fc
cidr                : "192.168.100.0/24"
external_ids        : {"neutron:revision_number"="0", subnet_id="25bca3bd-e768-456f-aed4-79b6de8ea9d3"}
options             : {classless_static_route="{169.254.169.254/32,192.168.100.2, 0.0.0.0/0,192.168.100.1}", dns_server="{127.0.0.53}", lease_time="600", mtu="1442", ntp_server="1.2.3.4", router="192.168.100.1", server_id="192.168.100.1", server_mac="fa:16:3e:93:80:89", wpad="1.2.3.5;1.2.3.6"}

*** Note wpad="1.2.3.5;1.2.3.6" (semi-colon) is incorrect

# Delete the network and subnet

ubuntu at rs-jammy-caracal:~/regress-stack$ openstack subnet delete test-subnet
ubuntu at rs-jammy-caracal:~/regress-stack$ openstack network delete test-network

### Enabling -proposed #####

ubuntu at rs-jammy-caracal:~/regress-stack$ sudo add-apt-repository cloud-
archive:caracal-proposed

ubuntu at rs-jammy-caracal:~/regress-stack$ sudo apt update

ubuntu at rs-jammy-caracal: sudo apt install -y \
    neutron-server=2:24.1.0-0ubuntu1.1~cloud0 \
    neutron-common=2:24.1.0-0ubuntu1.1~cloud0 \
    neutron-plugin-ml2=2:24.1.0-0ubuntu1.1~cloud0 \
    python3-neutron=2:24.1.0-0ubuntu1.1~cloud0

##### After enabling -proposed #####

# installed package

ubuntu at rs-jammy-caracal:~/regress-stack$ apt-cache policy neutron-server
neutron-server:
  Installed: 2:24.1.0-0ubuntu1.1~cloud0
  Candidate: 2:24.1.0-0ubuntu1.1~cloud0
  Version table:
 *** 2:24.1.0-0ubuntu1.1~cloud0 500
        500 http://ubuntu-cloud.archive.canonical.com/ubuntu jammy-proposed/caracal/main amd64 Packages
        100 /var/lib/dpkg/status
     2:24.1.0-0ubuntu1~cloud0 500
        500 http://ubuntu-cloud.archive.canonical.com/ubuntu jammy-updates/caracal/main amd64 Packages
     2:20.5.0-0ubuntu2.1 500
        500 http://archive.ubuntu.com/ubuntu jammy-updates/main amd64 Packages
     2:20.3.0-0ubuntu1.1 500
        500 http://security.ubuntu.com/ubuntu jammy-security/main amd64 Packages
     2:20.0.0-0ubuntu3 500
        500 http://archive.ubuntu.com/ubuntu jammy/main amd64 Packages


# Create a new network and subnet again

ubuntu at rs-jammy-caracal:~/regress-stack$ openstack network create test-network
+---------------------------+--------------------------------------+
| Field                     | Value                                |
+---------------------------+--------------------------------------+
| admin_state_up            | UP                                   |
| availability_zone_hints   |                                      |
| availability_zones        |                                      |
| created_at                | 2026-03-20T21:27:38Z                 |
| description               |                                      |
| dns_domain                |                                      |
| id                        | 1f3b06bb-a77b-40f0-bcfc-d399a97d4933 |
| ipv4_address_scope        | None                                 |
| ipv6_address_scope        | None                                 |
| is_default                | False                                |
| is_vlan_transparent       | None                                 |
| l2_adjacency              | True                                 |
| mtu                       | 1442                                 |
| name                      | test-network                         |
| port_security_enabled     | True                                 |
| project_id                | 24e5244fb4124ef889fff29861533029     |
| provider:network_type     | None                                 |
| provider:physical_network | None                                 |
| provider:segmentation_id  | None                                 |
| qos_policy_id             | None                                 |
| revision_number           | 1                                    |
| router:external           | Internal                             |
| segments                  | None                                 |
| shared                    | False                                |
| status                    | ACTIVE                               |
| subnets                   |                                      |
| tags                      |                                      |
| tenant_id                 | 24e5244fb4124ef889fff29861533029     |
| updated_at                | 2026-03-20T21:27:38Z                 |
+---------------------------+--------------------------------------+

ubuntu at rs-jammy-caracal:~/regress-stack$ openstack subnet create --network test-network --subnet-range 192.168.100.0/24 --dhcp test-subnet
+----------------------+--------------------------------------+
| Field                | Value                                |
+----------------------+--------------------------------------+
| allocation_pools     | 192.168.100.2-192.168.100.254        |
| cidr                 | 192.168.100.0/24                     |
| created_at           | 2026-03-20T21:27:44Z                 |
| description          |                                      |
| dns_nameservers      |                                      |
| dns_publish_fixed_ip | None                                 |
| enable_dhcp          | True                                 |
| gateway_ip           | 192.168.100.1                        |
| host_routes          |                                      |
| id                   | 5201d54c-8769-4a37-94a2-945e0eaf909c |
| ip_version           | 4                                    |
| ipv6_address_mode    | None                                 |
| ipv6_ra_mode         | None                                 |
| name                 | test-subnet                          |
| network_id           | 1f3b06bb-a77b-40f0-bcfc-d399a97d4933 |
| project_id           | 24e5244fb4124ef889fff29861533029     |
| revision_number      | 0                                    |
| segment_id           | None                                 |
| service_types        |                                      |
| subnetpool_id        | None                                 |
| tags                 |                                      |
| updated_at           | 2026-03-20T21:27:44Z                 |
+----------------------+--------------------------------------+
 
# See that multiple values are parsed correctly 

ubuntu at rs-jammy-caracal:~/regress-stack$ sudo ovn-nbctl list
DHCP_Options

_uuid               : 6ecb3b97-1b81-478b-8579-40f8b1633733
cidr                : "192.168.100.0/24"
external_ids        : {"neutron:revision_number"="0", subnet_id="5201d54c-8769-4a37-94a2-945e0eaf909c"}
options             : {classless_static_route="{169.254.169.254/32,192.168.100.2, 0.0.0.0/0,192.168.100.1}", dns_server="{127.0.0.53}", lease_time="600", mtu="1442", ntp_server="1.2.3.4", router="192.168.100.1", server_id="192.168.100.1", server_mac="fa:16:3e:8e:79:55", wpad="{1.2.3.5, 1.2.3.6}"}


*** Note wpad="1.2.3.5,1.2.3.6" (comma) is now correct

# Checking neutron-server status is okay

ubuntu at rs-jammy-caracal:~/regress-stack$ sudo systemctl status neutron-server
● neutron-server.service - OpenStack Neutron Server
     Loaded: loaded (/lib/systemd/system/neutron-server.service; enabled; vendor preset: enabled)
     Active: active (running) since Fri 2026-03-20 17:27:13 EDT; 1min 19s ago
       Docs: man:neutron-server(1)
   Main PID: 32956 (/usr/bin/python)
      Tasks: 6 (limit: 19129)
     Memory: 364.6M
        CPU: 8.081s
     CGroup: /system.slice/neutron-server.service
     [...]

***********************************************

I confirm that neutron-server version  2:24.1.0-0ubuntu1~cloud0
from jammy-proposed/caracal fixes LP: #2126923 on Caracal (UCA).

** Tags removed: verification-caracal-needed
** Tags added: verification-caracal-done

-- 
You received this bug notification because you are a member of Ubuntu
OpenStack, which is subscribed to Ubuntu Cloud Archive.
https://bugs.launchpad.net/bugs/2126923

Title:
  [SRU] ovn_dhcp4_global_options doesn't support keys with a list of
  values

Status in Ubuntu Cloud Archive:
  Fix Committed
Status in Ubuntu Cloud Archive caracal series:
  Fix Committed
Status in Ubuntu Cloud Archive dalmatian series:
  Fix Committed
Status in Ubuntu Cloud Archive epoxy series:
  Fix Committed
Status in Ubuntu Cloud Archive flamingo series:
  Fix Committed
Status in neutron:
  Fix Released
Status in neutron package in Ubuntu:
  Fix Committed
Status in neutron source package in Noble:
  Fix Committed
Status in neutron source package in Questing:
  Fix Committed

Bug description:
  [ Impact ]

   * The Neutron configuration option `ovn_dhcp4_global_options` does not
     correctly support multiple values for DHCP keys. When multiple values are
     specified the neutron-server fails while parsing the configuration and does
     not start.

   * Backporting this fix would allow users to list multiple values in the
     `ovn_dhcp4_global_options` without requiring configuration workarounds.

   * The uploaded fix allows the config file, `ml2_conf.ini`, to correctly handle
     multiple values in `ovn_dhcp4_global_options`.

  [ UPDATED Test Plan ]

   * [0] The following versions of Ubuntu-OpenStack will be tested
         - UCA: jammy-caracal
         - UCA: noble-dalmatian
         - UCA: noble-epoxy
         - UCA: noble-flamingo
         - ubuntu: noble-caracal
         - ubuntu: questing-flamingo

   * [1] Deploy an OpenStack environment on the target series using regress-stack
         in a multipass VM. For Jammy/Noble, it can be set up following the
         instructions on the regress-stack README.md.
         For Questing, follow these instructions:
         https://github.com/canonical/se-wiki/wiki/Regress-Stack-How-to

   * [2] Edit the `ml2_conf.ini` file and change `ovn_dhcp4_global_options` to
         contain multiple values like
         `ovn_dhcp4_global_options = ntp_server:1.2.3.4,wpad:1.2.3.5;1.2.3.6`

   * [3] Restart the neutron server after updating the `ml2_conf.ini` file
         Jammy/Noble: sudo systemctl restart neutron-server
         Questing: sudo systemctl restart neutron-rpc-server.service

   * [4] Create a new network and a subnet on that network
         `openstack network create test-network`
         `openstack subnet create \
          --network test-network \
          --subnet-range 192.168.100.0/24 \
          --dhcp \
          test-subnet`

   * [5] Check to see that multiple values are parsed incorrectly in
         OVN Northbound database
         `sudo ovn-nbctl list DHCP_Options`
         Incorrect options will look like  wpad="1.2.3.5;1.2.3.6"
         (with a semi-colon)

   * [6] Delete the network and subnet created
         `openstack subnet delete test-subnet`
         `openstack network delete test-network`

   * [7] Apply the patch

   * [8] Create a new network and subnet again
         (using same commands from step 4)

   * [9] Check to see that multiple values are now parsed correctly in
         OVN Northbound database.
         Correct options will look like wpad="{1.2.3.5, 1.2.3.6}"
         (with a comma)

   * [10] Check the status of the neutron server to make sure it is running.
         Jammy/Noble: sudo systemctl status neutron-server
         Questing: sudo systemctl status neutron-rpc-server.service

  [ Where problems could occur ]

   * This change modifies how `ovn_dhcp4_global_options` options are parsed. A
     regression could possibly cause a failure to apply DHCP options all together
     due to an incorrect formatting in options sent to OVN.

  [ Other Info ]

   * Upstream commit to neutron (master):
     https://review.opendev.org/c/openstack/neutron/+/963944

  ===========================================================

  [ Original Bug Description ]

  When using `ovn_dhcp4_global_options` under `[ovn]` in `ml2_conf.ini`
  it will cause `neutron server` to crash when attempting to parse the
  configuration if a key provided contains a list seperated by commas.

  For example if setting `domain_search_list` with more than one domain.

  ```
  [ovn]
  ovn_dhcp4_global_options = domain_search_list:foo.bar,baz.qux
  ```

  Expected output would be that `neutron server` doesn't crash when
  attempting to parse such configuration and correctly applies these
  options within `OVN`.

  Experienced within OpenStack Epoxy.

  Not currently blocking anything as it is possible to patch
  `_get_ovn_dhcpv4_opts` in
  `neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/ovn_client.py` with
  the following

  ```
  options['domain_search_list'] = "\"foo.bar,baz.qux\""
  ```

To manage notifications about this bug go to:
https://bugs.launchpad.net/cloud-archive/+bug/2126923/+subscriptions




More information about the Ubuntu-openstack-bugs mailing list