From 5469d753f1857a2cd88d24d44338ec956b711bb9 Mon Sep 17 00:00:00 2001 From: Stephen Eilert Date: Tue, 17 Nov 2015 16:49:19 -0800 Subject: [PATCH] Fix get_subnet_ids_on_router in dvr scheduler Added a check to verify if we do have any elements in the list of fixed_ips, before trying to retrieve the first element of the list, to get the subnet id. There were no checks in the original code, so it would crash. Change-Id: If32db500aa3a0c299a5f19c33c05237e8e407e08 Closes-Bug: 1452458 (cherry picked from commit d198b41def22a188f77948783e90632abb7a588a) --- neutron/db/l3_dvrscheduler_db.py | 8 ++++++-- .../unit/scheduler/test_l3_agent_scheduler.py | 17 +++++++++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/neutron/db/l3_dvrscheduler_db.py b/neutron/db/l3_dvrscheduler_db.py index 425f47ec5c4..c3b5c05af77 100644 --- a/neutron/db/l3_dvrscheduler_db.py +++ b/neutron/db/l3_dvrscheduler_db.py @@ -138,8 +138,12 @@ class L3_DVRsch_db_mixin(l3agent_sch_db.L3AgentSchedulerDbMixin): int_ports = self._core_plugin.get_ports(context, filters=filter_rtr) for int_port in int_ports: int_ips = int_port['fixed_ips'] - int_subnet = int_ips[0]['subnet_id'] - subnet_ids.add(int_subnet) + if int_ips: + int_subnet = int_ips[0]['subnet_id'] + subnet_ids.add(int_subnet) + else: + LOG.debug('DVR: Could not find a subnet id' + 'for router %s', router_id) return subnet_ids def check_ports_on_host_and_subnet(self, context, host, diff --git a/neutron/tests/unit/scheduler/test_l3_agent_scheduler.py b/neutron/tests/unit/scheduler/test_l3_agent_scheduler.py index db899db3a6d..090c46d29a9 100644 --- a/neutron/tests/unit/scheduler/test_l3_agent_scheduler.py +++ b/neutron/tests/unit/scheduler/test_l3_agent_scheduler.py @@ -1143,6 +1143,23 @@ class L3DvrSchedulerTestCase(testlib_api.SqlTestCase): self.assertEqual(sub_ids.pop(), dvr_port.get('fixed_ips').pop(0).get('subnet_id')) + def test_get_subnet_ids_on_router_no_subnet(self): + dvr_port = { + 'id': 'dvr_port1', + 'device_id': 'r1', + 'device_owner': 'network:router_interface_distributed', + 'fixed_ips': [] + } + r1 = { + 'id': 'r1', + 'distributed': True, + } + with mock.patch.object(db_v2.NeutronDbPluginV2, 'get_ports', + return_value=[dvr_port]): + sub_ids = self.dut.get_subnet_ids_on_router(self.adminContext, + r1['id']) + self.assertEqual(len(sub_ids), 0) + def _test_check_ports_on_host_and_subnet_base(self, port_status): dvr_port = { 'id': 'fake_id',