From 83bcc8832d98973fd4e39067b6d4c0fdd2616023 Mon Sep 17 00:00:00 2001 From: Gary Kotton Date: Tue, 11 Jul 2017 02:13:17 -0700 Subject: [PATCH] Add callback BEFORE_DELETE for delete_router Enable a callback to be bound for deletion of routers. A use case for this is in the NSX plugins, here a load balancer needs to be connected to an existing router. If one tries to delete the router then we would like to prevent that if a load balancer is attached. Change-Id: Ie0c422578acaa94e8e34c15beca9f18691a3abc6 --- neutron/db/l3_db.py | 3 ++- neutron/tests/unit/extensions/test_l3.py | 16 ++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/neutron/db/l3_db.py b/neutron/db/l3_db.py index 06779657b6a..dc3fd2dbc3a 100644 --- a/neutron/db/l3_db.py +++ b/neutron/db/l3_db.py @@ -534,7 +534,8 @@ class L3_NAT_dbonly_mixin(l3.RouterPluginBase, @db_api.retry_if_session_inactive() def delete_router(self, context, id): - + registry.notify(resources.ROUTER, events.BEFORE_DELETE, + self, context=context, router_id=id) #TODO(nati) Refactor here when we have router insertion model router = self._ensure_router_not_in_use(context, id) original = self._make_router_dict(router) diff --git a/neutron/tests/unit/extensions/test_l3.py b/neutron/tests/unit/extensions/test_l3.py index de1f134e641..fd29d7f40fb 100644 --- a/neutron/tests/unit/extensions/test_l3.py +++ b/neutron/tests/unit/extensions/test_l3.py @@ -3416,6 +3416,22 @@ class L3NatTestCaseBase(L3NatTestCaseMixin): plugin._clean_garbage() self._show('ports', port['port']['id']) + def test_router_delete_callback(self): + def prevent_router_deletion(*args, **kwargs): + # unsubscribe now that we have invoked the callback + registry.unsubscribe(prevent_router_deletion, resources.ROUTER, + events.BEFORE_DELETE) + raise exc.HTTPForbidden + + registry.subscribe(prevent_router_deletion, resources.ROUTER, + events.BEFORE_DELETE) + + with self.subnet(): + res = self._create_router(self.fmt, _uuid()) + router = self.deserialize(self.fmt, res) + self._delete('routers', router['router']['id'], + exc.HTTPForbidden.code) + class L3AgentDbTestCaseBase(L3NatTestCaseMixin):