diff --git a/neutron/scheduler/l3_agent_scheduler.py b/neutron/scheduler/l3_agent_scheduler.py index c9b1efafb0..e86a9c2fcc 100644 --- a/neutron/scheduler/l3_agent_scheduler.py +++ b/neutron/scheduler/l3_agent_scheduler.py @@ -220,6 +220,10 @@ class L3Scheduler(object): {'agent_id': chosen_agent.id, 'router_id': router_id}) return + except db_exc.DBReferenceError: + LOG.debug('Router %s has already been removed ' + 'by concurrent operation', router_id) + return LOG.debug('Router %(router_id)s is scheduled to L3 agent ' '%(agent_id)s', {'router_id': router_id, diff --git a/neutron/tests/unit/test_l3_schedulers.py b/neutron/tests/unit/test_l3_schedulers.py index 09346758e0..e9af85d499 100644 --- a/neutron/tests/unit/test_l3_schedulers.py +++ b/neutron/tests/unit/test_l3_schedulers.py @@ -482,6 +482,12 @@ class L3SchedulerTestBaseMixin(object): args, kwargs = flog.call_args self.assertIn('is scheduled', args[0]) + def test_bind_absent_router(self): + scheduler = l3_agent_scheduler.ChanceScheduler() + # checking that bind_router() is not throwing + # when supplied with router_id of non-existing router + scheduler.bind_router(self.adminContext, "dummyID", self.agent1) + def test_bind_existing_router(self): router = self._make_router(self.fmt, tenant_id=str(uuid.uuid4()),