diff --git a/ironic/dhcp/neutron.py b/ironic/dhcp/neutron.py index 18ccae05c2..a5cb092826 100644 --- a/ironic/dhcp/neutron.py +++ b/ironic/dhcp/neutron.py @@ -80,9 +80,9 @@ class NeutronDHCPApi(base.BaseDHCP): update_opts = [] if len(fips) != 0: - for fip in fips: - ip_version = \ - ipaddress.ip_address(fip['ip_address']).version + ip_versions = {ipaddress.ip_address(fip['ip_address']).version + for fip in fips} + for ip_version in ip_versions: for option in dhcp_options: if option.get('ip_version', 4) == ip_version: update_opts.append(option) diff --git a/ironic/tests/unit/dhcp/test_neutron.py b/ironic/tests/unit/dhcp/test_neutron.py index 8d87345d28..9a1f28ddbc 100644 --- a/ironic/tests/unit/dhcp/test_neutron.py +++ b/ironic/tests/unit/dhcp/test_neutron.py @@ -165,8 +165,14 @@ class TestNeutron(db_base.DbTestCase): { "ip_address": "192.168.1.3", }, + { + "ip_address": "192.168.1.4", + }, { "ip_address": "2001:db8::201", + }, + { + "ip_address": "2001:db8::202", } ], } diff --git a/releasenotes/notes/fix-duplcate-extra-dhcp-options-4edb729cb5bcf552.yaml b/releasenotes/notes/fix-duplcate-extra-dhcp-options-4edb729cb5bcf552.yaml new file mode 100644 index 0000000000..13ce1003ff --- /dev/null +++ b/releasenotes/notes/fix-duplcate-extra-dhcp-options-4edb729cb5bcf552.yaml @@ -0,0 +1,8 @@ +--- +fixes: + - | + Fixed an issue where duplicate extra DHCP options was passed in the port + update request to the Networking service. The duplicate DHCP options + caused an error in the Networking service and node provisioning would + fail. See bug: + `2009774 `_.