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',