From: Stephen Eilert Date: Wed, 18 Nov 2015 00:49:19 +0000 (-0800) Subject: Fix get_subnet_ids_on_router in dvr scheduler X-Git-Url: https://review.fuel-infra.org/gitweb?a=commitdiff_plain;h=d198b41def22a188f77948783e90632abb7a588a;p=openstack-build%2Fneutron-build.git 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 --- diff --git a/neutron/db/l3_dvrscheduler_db.py b/neutron/db/l3_dvrscheduler_db.py index 8d4e203d4..b5429df93 100644 --- a/neutron/db/l3_dvrscheduler_db.py +++ b/neutron/db/l3_dvrscheduler_db.py @@ -142,8 +142,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 db20311d3..039f072eb 100644 --- a/neutron/tests/unit/scheduler/test_l3_agent_scheduler.py +++ b/neutron/tests/unit/scheduler/test_l3_agent_scheduler.py @@ -1136,6 +1136,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',