From a158d62f30d056ac2ab6bb30efd7fafc2b7a3153 Mon Sep 17 00:00:00 2001 From: Assaf Muller Date: Thu, 27 Aug 2015 17:44:50 -0400 Subject: [PATCH] Fix Prefix delegation router deletion key error Change-Id: I1b7008bc6a9dd7d23a651023fd540eec3e46f072 Closes-Bug: #1489576 --- neutron/agent/linux/pd.py | 19 +++++++++----- neutron/tests/unit/agent/linux/test_pd.py | 31 +++++++++++++++++++++++ 2 files changed, 43 insertions(+), 7 deletions(-) create mode 100644 neutron/tests/unit/agent/linux/test_pd.py diff --git a/neutron/agent/linux/pd.py b/neutron/agent/linux/pd.py index b9289286fc9..cfed4936f1b 100644 --- a/neutron/agent/linux/pd.py +++ b/neutron/agent/linux/pd.py @@ -302,10 +302,17 @@ class PrefixDelegation(object): @utils.synchronized("l3-agent-pd") def remove_router(resource, event, l3_agent, **kwargs): - router = l3_agent.pd.routers.get(kwargs['router'].router_id) + router_id = kwargs['router'].router_id + router = l3_agent.pd.routers.get(router_id) l3_agent.pd.delete_router_pd(router) - del l3_agent.pd.routers[router['id']]['subnets'] - del l3_agent.pd.routers[router['id']] + del l3_agent.pd.routers[router_id]['subnets'] + del l3_agent.pd.routers[router_id] + + +def get_router_entry(ns_name): + return {'gw_interface': None, + 'ns_name': ns_name, + 'subnets': {}} @utils.synchronized("l3-agent-pd") @@ -313,10 +320,8 @@ def add_router(resource, event, l3_agent, **kwargs): added_router = kwargs['router'] router = l3_agent.pd.routers.get(added_router.router_id) if not router: - l3_agent.pd.routers[added_router.router_id] = { - 'gw_interface': None, - 'ns_name': added_router.ns_name, - 'subnets': {}} + l3_agent.pd.routers[added_router.router_id] = ( + get_router_entry(added_router.ns_name)) else: # This will happen during l3 agent restart router['ns_name'] = added_router.ns_name diff --git a/neutron/tests/unit/agent/linux/test_pd.py b/neutron/tests/unit/agent/linux/test_pd.py new file mode 100644 index 00000000000..e12106727dd --- /dev/null +++ b/neutron/tests/unit/agent/linux/test_pd.py @@ -0,0 +1,31 @@ +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +import mock + +from neutron.agent.linux import pd +from neutron.tests import base as tests_base + + +class FakeRouter(object): + def __init__(self, router_id): + self.router_id = router_id + + +class TestPrefixDelegation(tests_base.DietTestCase): + def test_remove_router(self): + l3_agent = mock.Mock() + router_id = 1 + l3_agent.pd.routers = {router_id: pd.get_router_entry(None)} + pd.remove_router(None, None, l3_agent, router=FakeRouter(router_id)) + self.assertTrue(l3_agent.pd.delete_router_pd.called) + self.assertEqual({}, l3_agent.pd.routers)