Merge "Do not re-ACTIVE ports on DHCP ready without provisioning blocks"

This commit is contained in:
Zuul authored and Gerrit Code Review committed 2026-10-02 13:38:12 +00:00
commit a6c792b9f6
2 files changed
+29 -2

No files matched your search

+7
View File
@@ -339,6 +339,13 @@ class DhcpRpcCallback:
@db_api.retry_db_errors
def dhcp_ready_on_ports(self, context, port_ids):
for port_id in port_ids:
# Skip ports with no active provisioning blocks. Otherwise
# complete method emits PROVISIONING_COMPLETE when
# no block was removed, which can set service ports, like
# ha_router_replicated_interface, to ACTIVE state.
if not provisioning_blocks.is_object_blocked(
context, port_id, resources.PORT):
continue
provisioning_blocks.provisioning_complete(
context, port_id, resources.PORT,
provisioning_blocks.DHCP_ENTITY)
@@ -410,10 +410,30 @@ class TestDhcpRpcCallback(base.BaseTestCase):
def test_dhcp_ready_on_ports(self):
context = mock.Mock()
port_ids = range(10)
with mock.patch.object(provisioning_blocks,
'provisioning_complete') as pc:
with mock.patch.object(provisioning_blocks, 'is_object_blocked',
return_value=True), \
mock.patch.object(provisioning_blocks,
'provisioning_complete') as pc:
self.callbacks.dhcp_ready_on_ports(context, port_ids)
calls = [mock.call(context, port_id, resources.PORT,
provisioning_blocks.DHCP_ENTITY)
for port_id in port_ids]
pc.assert_has_calls(calls)
def test_dhcp_ready_on_ports_skips_unblocked_ports(self):
context = mock.Mock()
port_ids = ['blocked-port', 'ha-router-port']
def _blocked(ctx, port_id, resource):
return port_id == 'blocked-port'
with mock.patch.object(provisioning_blocks, 'is_object_blocked',
side_effect=_blocked), \
mock.patch.object(provisioning_blocks,
'provisioning_complete') as pc:
self.callbacks.dhcp_ready_on_ports(context, port_ids)
pc.assert_called_once_with(
context, 'blocked-port', resources.PORT,
provisioning_blocks.DHCP_ENTITY)
for call in pc.call_args_list:
self.assertNotIn('ha-router-port', call.args)