[L3] Fix "NDPProxyAgentExtension.ha_state_change" call
The parameter "data" passed to the method "ha_state_change" is not a router but a dictionary with "router_id" info. The method "NDPProxyAgentExtension._process_router" requires the router ID and the "enable_ndp_proxy" value, stored in the agent router cache. Closes-Bug: #1967839 Related-Bug: #1877301 Change-Id: Iab163e69f7e3641e2e1a451374231b6ccfa74c3e
This commit is contained in:
committed by
Rodolfo Alonso
parent
3615cd85a4
commit
d73ec5000b
@@ -346,9 +346,8 @@ class NDPProxyAgentExtension(l3_extension.L3AgentExtension):
|
|||||||
'FORWARD', subnet_rule)
|
'FORWARD', subnet_rule)
|
||||||
ip_wrapper.netns.execute(sysctl_cmd, privsep_exec=True)
|
ip_wrapper.netns.execute(sysctl_cmd, privsep_exec=True)
|
||||||
|
|
||||||
def _process_router(self, context, data):
|
def _process_router(self, context, router_id, enable_ndp_proxy):
|
||||||
state = data.get('enable_ndp_proxy', False)
|
ri = self._get_router_info(router_id)
|
||||||
ri = self._get_router_info(data['id'])
|
|
||||||
if not self._check_if_ri_need_process(ri):
|
if not self._check_if_ri_need_process(ri):
|
||||||
return
|
return
|
||||||
agent_mode = ri.agent_conf.agent_mode
|
agent_mode = ri.agent_conf.agent_mode
|
||||||
@@ -362,14 +361,14 @@ class NDPProxyAgentExtension(l3_extension.L3AgentExtension):
|
|||||||
|
|
||||||
existing_ndp_proxies = self.mapping.get_ndp_proxies_by_router_id(
|
existing_ndp_proxies = self.mapping.get_ndp_proxies_by_router_id(
|
||||||
ri.router_id)
|
ri.router_id)
|
||||||
if state:
|
if enable_ndp_proxy:
|
||||||
self._init_ndp_proxy_rule(
|
self._init_ndp_proxy_rule(
|
||||||
ri, interface_name, iptables_manager,
|
ri, interface_name, iptables_manager,
|
||||||
is_distributed, ip_wrapper, namespace)
|
is_distributed, ip_wrapper, namespace)
|
||||||
|
|
||||||
ndp_proxies = self.resource_rpc.bulk_pull(
|
ndp_proxies = self.resource_rpc.bulk_pull(
|
||||||
context, resources.NDPPROXY,
|
context, resources.NDPPROXY,
|
||||||
filter_kwargs={'router_id': [data['id']]})
|
filter_kwargs={'router_id': [router_id]})
|
||||||
need_create = set(ndp_proxies) - set(existing_ndp_proxies)
|
need_create = set(ndp_proxies) - set(existing_ndp_proxies)
|
||||||
need_delete = set(existing_ndp_proxies) - set(ndp_proxies)
|
need_delete = set(existing_ndp_proxies) - set(ndp_proxies)
|
||||||
|
|
||||||
@@ -422,10 +421,12 @@ class NDPProxyAgentExtension(l3_extension.L3AgentExtension):
|
|||||||
ip_wrapper.netns.execute(sysctl_cmd, privsep_exec=True)
|
ip_wrapper.netns.execute(sysctl_cmd, privsep_exec=True)
|
||||||
|
|
||||||
def add_router(self, context, data):
|
def add_router(self, context, data):
|
||||||
self._process_router(context, data)
|
self._process_router(context, data['id'],
|
||||||
|
data.get('enable_ndp_proxy', False))
|
||||||
|
|
||||||
def update_router(self, context, data):
|
def update_router(self, context, data):
|
||||||
self._process_router(context, data)
|
self._process_router(context, data['id'],
|
||||||
|
data.get('enable_ndp_proxy', False))
|
||||||
|
|
||||||
def delete_router(self, context, data):
|
def delete_router(self, context, data):
|
||||||
# Just process dvr router, clear the fip-namespace related rules
|
# Just process dvr router, clear the fip-namespace related rules
|
||||||
@@ -445,7 +446,9 @@ class NDPProxyAgentExtension(l3_extension.L3AgentExtension):
|
|||||||
def ha_state_change(self, context, data):
|
def ha_state_change(self, context, data):
|
||||||
if data['state'] == 'backup':
|
if data['state'] == 'backup':
|
||||||
return
|
return
|
||||||
self._process_router(context, data)
|
|
||||||
|
self._process_router(context, data['router_id'],
|
||||||
|
data['enable_ndp_proxy'])
|
||||||
|
|
||||||
def update_network(self, context, data):
|
def update_network(self, context, data):
|
||||||
pass
|
pass
|
||||||
|
|||||||
@@ -182,10 +182,11 @@ class AgentMixin(object):
|
|||||||
if ri is None:
|
if ri is None:
|
||||||
return
|
return
|
||||||
|
|
||||||
state_change_data = {"router_id": router_id, "state": state,
|
state_change_data = {
|
||||||
"host": ri.agent.host}
|
"router_id": router_id, "state": state, "host": ri.agent.host,
|
||||||
|
"enable_ndp_proxy": ri.router.get("enable_ndp_proxy", False)}
|
||||||
LOG.info('Router %(router_id)s transitioned to %(state)s on '
|
LOG.info('Router %(router_id)s transitioned to %(state)s on '
|
||||||
'agent %(host)s',
|
'agent %(host)s; NDP proxy enabled: %(enable_ndp_proxy)s',
|
||||||
state_change_data)
|
state_change_data)
|
||||||
|
|
||||||
# Set external gateway port link up or down according to state
|
# Set external gateway port link up or down according to state
|
||||||
|
|||||||
@@ -301,20 +301,21 @@ class TestBasicRouterOperations(BasicRouterOperationsFramework):
|
|||||||
def test_enqueue_state_change_l3_extension(self):
|
def test_enqueue_state_change_l3_extension(self):
|
||||||
self.conf.set_override('ha_vrrp_advert_int', 1)
|
self.conf.set_override('ha_vrrp_advert_int', 1)
|
||||||
agent = l3_agent.L3NATAgent(HOSTNAME, self.conf)
|
agent = l3_agent.L3NATAgent(HOSTNAME, self.conf)
|
||||||
router = mock.Mock()
|
router_dict = {'id': 'router_id', 'enable_ndp_proxy': True}
|
||||||
router_info = mock.MagicMock()
|
router_info = mock.MagicMock()
|
||||||
router_info.agent = agent
|
router_info.agent = agent
|
||||||
agent.router_info[router.id] = router_info
|
router_info.router = router_dict
|
||||||
|
agent.router_info['router_id'] = router_info
|
||||||
agent.l3_ext_manager.ha_state_change = mock.Mock()
|
agent.l3_ext_manager.ha_state_change = mock.Mock()
|
||||||
with mock.patch('neutron.agent.linux.ip_lib.'
|
with mock.patch('neutron.agent.linux.ip_lib.'
|
||||||
'IpAddrCommand.wait_until_address_ready') as mock_wait:
|
'IpAddrCommand.wait_until_address_ready') as mock_wait:
|
||||||
mock_wait.return_value = True
|
mock_wait.return_value = True
|
||||||
agent.enqueue_state_change(router.id, 'primary')
|
agent.enqueue_state_change('router_id', 'primary')
|
||||||
eventlet.sleep(self.conf.ha_vrrp_advert_int + 2)
|
eventlet.sleep(self.conf.ha_vrrp_advert_int + 2)
|
||||||
agent.l3_ext_manager.ha_state_change.assert_called_once_with(
|
agent.l3_ext_manager.ha_state_change.assert_called_once_with(
|
||||||
agent.context,
|
agent.context,
|
||||||
{'router_id': router.id, 'state': 'primary',
|
{'router_id': 'router_id', 'state': 'primary',
|
||||||
'host': agent.host})
|
'host': agent.host, 'enable_ndp_proxy': True})
|
||||||
|
|
||||||
def test_enqueue_state_change_router_active_ha(self):
|
def test_enqueue_state_change_router_active_ha(self):
|
||||||
agent = l3_agent.L3NATAgent(HOSTNAME, self.conf)
|
agent = l3_agent.L3NATAgent(HOSTNAME, self.conf)
|
||||||
|
|||||||
Reference in New Issue
Block a user