Merge "[L3HA] Don't update HA router's ports if router isn't active on agents" into stable/train

This commit is contained in:
Zuul 2022-10-17 14:12:15 +00:00 committed by Gerrit Code Review
commit daa7cfce7d
2 changed files with 19 additions and 10 deletions

View File

@ -218,22 +218,21 @@ class L3RpcCallback(object):
active_host = (
self.l3plugin.get_active_host_for_ha_router(
context, router_id))
if active_host:
host = active_host
# If there is currently no active router instance (For
# example it's a new router), the host that requested
# the routers (Essentially a random host) will do. The
# port binding will be corrected when an active is
# elected.
if not active_host:
LOG.debug("Router %(router)s is not active on any "
"host. Port %(port)s will not be updated "
"now.",
{'router': router_id, 'port': port['id']})
return
try:
LOG.debug("Updating router %(router)s port %(port)s "
"binding host %(host)s",
{"router": router_id, "port": port['id'],
"host": host})
"host": active_host})
self.plugin.update_port(
context,
port['id'],
{'port': {portbindings.HOST_ID: host}})
{'port': {portbindings.HOST_ID: active_host}})
except exceptions.PortNotFound:
LOG.debug("Port %(port)s not found while updating "
"agent binding for router %(router)s.",

View File

@ -1304,9 +1304,19 @@ class L3HAModeDbTestCase(L3HATestFramework):
self.plugin.list_active_sync_routers_on_active_l3_agent(
self.admin_ctx, self.agent1['host'], [router['id']]))[0]
# ensure_host_set_on_ports binds an unbound port
callback = l3_rpc.L3RpcCallback()
callback._l3plugin = self.plugin
# First ensure that port is not bound if router is not active on any
# agent
callback._ensure_host_set_on_ports(
self.admin_ctx, self.agent1['host'], [router])
port = self._get_first_interface(router['id'])
self.assertEqual('', port[portbindings.HOST_ID])
# Now update router to be active on agent1
# and ensure_host_set_on_ports binds an unbound port
self.plugin.update_routers_states(
self.admin_ctx, {router['id']: 'active'}, self.agent1['host'])
callback._ensure_host_set_on_ports(
self.admin_ctx, self.agent1['host'], [router])
port = self._get_first_interface(router['id'])