From 949c29ec7fbe965483484c4192ca960bece1802a Mon Sep 17 00:00:00 2001 From: ronak Date: Fri, 8 Aug 2014 12:13:16 -0700 Subject: [PATCH] Check for ports in subnet before deleting it from Nuage VSD There could exist a port in subnet in neutron in which case subnet delete is not allowed. In the nuage's plugin code, this validation needs to be handle prior to sending delete subnet request to backend. Change-Id: Idd20d2f878a6274a012504108d01bd2237dc665a Closes-bug: #1351522 --- neutron/plugins/nuage/plugin.py | 6 ++++++ neutron/tests/unit/nuage/test_nuage_plugin.py | 14 ++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/neutron/plugins/nuage/plugin.py b/neutron/plugins/nuage/plugin.py index f0041e18e..3068ed65f 100644 --- a/neutron/plugins/nuage/plugin.py +++ b/neutron/plugins/nuage/plugin.py @@ -689,6 +689,12 @@ class NuagePlugin(db_base_plugin_v2.NeutronDbPluginV2, super(NuagePlugin, self).delete_subnet(context, id) return self._delete_nuage_sharedresource(id) + filters = {'fixed_ips': {'subnet_id': [id]}} + ports = self.get_ports(context, filters) + for port in ports: + if port['device_owner'] != os_constants.DEVICE_OWNER_DHCP: + raise n_exc.SubnetInUse(subnet_id=id) + subnet_l2dom = nuagedb.get_subnet_l2dom_by_id(context.session, id) if subnet_l2dom: try: diff --git a/neutron/tests/unit/nuage/test_nuage_plugin.py b/neutron/tests/unit/nuage/test_nuage_plugin.py index 16c049a70..c06419cab 100644 --- a/neutron/tests/unit/nuage/test_nuage_plugin.py +++ b/neutron/tests/unit/nuage/test_nuage_plugin.py @@ -344,6 +344,20 @@ class TestNuageSubnetsV2(NuagePluginV2TestCase, subnet_res = subnet_req.get_response(self.api) self.assertEqual(exc.HTTPCreated.code, subnet_res.status_int) + def test_delete_subnet_port_exists_returns_409(self): + gateway_ip = '10.0.0.1' + cidr = '10.0.0.0/24' + res = self._create_network(fmt=self.fmt, name='net', + admin_state_up=True) + network = self.deserialize(self.fmt, res) + subnet = self._make_subnet(self.fmt, network, gateway_ip, + cidr, ip_version=4) + self._create_port(self.fmt, + network['network']['id']) + req = self.new_delete_request('subnets', subnet['subnet']['id']) + res = req.get_response(self.api) + self.assertEqual(409, res.status_int) + class TestNuagePluginPortBinding(NuagePluginV2TestCase, test_bindings.PortBindingsTestCase): -- 2.45.2