]> review.fuel-infra Code Review - openstack-build/neutron-build.git/commitdiff
Fix get_subnet_ids_on_router in dvr scheduler
authorStephen Eilert <stephen.eilert@hpe.com>
Wed, 18 Nov 2015 00:49:19 +0000 (16:49 -0800)
committerStephen Eilert <stephen.eilert@hpe.com>
Fri, 20 Nov 2015 19:48:01 +0000 (11:48 -0800)
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

neutron/db/l3_dvrscheduler_db.py
neutron/tests/unit/scheduler/test_l3_agent_scheduler.py

index 8d4e203d4ab60f397eb1a446cc5bb9ab21f4ebc0..b5429df93a186df3b5d0506fe3252b6e989e19a7 100644 (file)
@@ -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,
index db20311d35a6b13a146fcb26880589e35c121ebe..039f072ebd7c80504d8235fb5f07b3a75fcd1f47 100644 (file)
@@ -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',