From 9414425ffa9210da846af841ac0493a48deddc0f Mon Sep 17 00:00:00 2001 From: Brian Haley Date: Mon, 16 Oct 2017 14:35:25 -0400 Subject: [PATCH] Do not try and iterate [None] in l3-agent network_update() Since ri.ex_gw_port can be None, the l3-agent can throw an exception when looking for ports it might have in a given network. (cherry picked from 2cea213d94e3ac7675d62491cec6c85253285b92) Change-Id: I3ab3e9c012022cd7eefa5c609ca9540649079ad3 Closes-bug: #1724043 --- neutron/agent/l3/agent.py | 6 +++--- neutron/tests/unit/agent/l3/test_agent.py | 20 ++++++++++++++++++++ 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/neutron/agent/l3/agent.py b/neutron/agent/l3/agent.py index 3e20ed34aaa..c9d60273c62 100644 --- a/neutron/agent/l3/agent.py +++ b/neutron/agent/l3/agent.py @@ -13,8 +13,6 @@ # under the License. # -import itertools - import eventlet import netaddr from neutron_lib.callbacks import events @@ -441,7 +439,9 @@ class L3NATAgent(ha.AgentMixin, def network_update(self, context, **kwargs): network_id = kwargs['network']['id'] for ri in self.router_info.values(): - ports = itertools.chain(ri.internal_ports, [ri.ex_gw_port]) + ports = list(ri.internal_ports) + if ri.ex_gw_port: + ports.append(ri.ex_gw_port) port_belongs = lambda p: p['network_id'] == network_id if any(port_belongs(p) for p in ports): update = queue.RouterUpdate( diff --git a/neutron/tests/unit/agent/l3/test_agent.py b/neutron/tests/unit/agent/l3/test_agent.py index 2db6c7a73fc..20af77555d1 100644 --- a/neutron/tests/unit/agent/l3/test_agent.py +++ b/neutron/tests/unit/agent/l3/test_agent.py @@ -2302,6 +2302,26 @@ class TestBasicRouterOperations(BasicRouterOperationsFramework): agent.router_added_to_agent(None, [FAKE_ID]) self.assertEqual(1, agent._queue.add.call_count) + def test_network_update_not_called(self): + agent = l3_agent.L3NATAgent(HOSTNAME, self.conf) + agent._queue = mock.Mock() + network = {'id': _uuid()} + agent.network_update(None, network=network) + self.assertFalse(agent._queue.add.called) + + def test_network_update(self): + router = l3_test_common.prepare_router_data(num_internal_ports=2) + agent = l3_agent.L3NATAgent(HOSTNAME, self.conf) + agent._process_added_router(router) + ri = l3router.RouterInfo(agent, router['id'], + router, **self.ri_kwargs) + internal_ports = ri.router.get(lib_constants.INTERFACE_KEY, []) + network_id = internal_ports[0]['network_id'] + agent._queue = mock.Mock() + network = {'id': network_id} + agent.network_update(None, network=network) + self.assertEqual(1, agent._queue.add.call_count) + def test_create_router_namespace(self): self.mock_ip.ensure_namespace.return_value = self.mock_ip agent = l3_agent.L3NATAgent(HOSTNAME, self.conf)