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 2cea213d94)

Change-Id: I3ab3e9c012022cd7eefa5c609ca9540649079ad3
Closes-bug: #1724043
This commit is contained in:
Brian Haley 2017-10-16 14:35:25 -04:00 committed by Miguel Angel Ajo
parent 11254ef87b
commit 9414425ffa
2 changed files with 23 additions and 3 deletions

View File

@ -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(

View File

@ -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)