diff --git a/neutron/db/db_base_plugin_v2.py b/neutron/db/db_base_plugin_v2.py index 230294e4313..b77a2f70f96 100644 --- a/neutron/db/db_base_plugin_v2.py +++ b/neutron/db/db_base_plugin_v2.py @@ -1507,13 +1507,6 @@ class NeutronDbPluginV2(db_base_plugin_common.DbBasePluginCommon, old_port_db=db_port, old_port=self._make_port_dict(db_port), new_port=new_port) - except ipam_exc.IpAddressAllocationNotFound as e: - # If a port update and a subnet delete interleave, there is a - # chance that the IPAM update operation raises this exception. - # Rather than throwing that up to the user under some sort of - # conflict, bubble up a retry instead that should bring things - # back to sanity. - raise os_db_exc.RetryRequest(e) except ipam_exc.IPAddressChangeNotAllowed as e: raise exc.BadRequest(resource='ports', msg=e) return self._make_port_dict(db_port) diff --git a/neutron/ipam/drivers/neutrondb_ipam/driver.py b/neutron/ipam/drivers/neutrondb_ipam/driver.py index 6969ef564a3..9123149bb51 100644 --- a/neutron/ipam/drivers/neutrondb_ipam/driver.py +++ b/neutron/ipam/drivers/neutrondb_ipam/driver.py @@ -287,14 +287,8 @@ class NeutronDbSubnet(ipam_base.Subnet): def deallocate(self, address): # This is almost a no-op because the Neutron DB IPAM driver does not # delete IPAllocation objects at every deallocation. The only - # operation it performs is to delete an IPRequest entry. - count = self.subnet_manager.delete_allocation( - self._context, address) - # count can hardly be greater than 1, but it can be 0... - if not count: - raise ipam_exc.IpAddressAllocationNotFound( - subnet_id=self.subnet_manager.neutron_id, - ip_address=address) + # operation it performs is to delete an IPAMAllocation entry. + self.subnet_manager.delete_allocation(self._context, address) def _no_pool_changes(self, context, pools): """Check if pool updates in db are required.""" diff --git a/neutron/ipam/exceptions.py b/neutron/ipam/exceptions.py index badeef82b4e..1bbc7a47bd8 100644 --- a/neutron/ipam/exceptions.py +++ b/neutron/ipam/exceptions.py @@ -31,6 +31,8 @@ class InvalidAddressType(exceptions.NeutronException): message = _("Unknown address type %(address_type)s") +# NOTE(ralonsoh): this exception is used in VMware NSX plugin but is removed +# in Zed release. class IpAddressAllocationNotFound(exceptions.NeutronException): message = _("Unable to find IP address %(ip_address)s on subnet " "%(subnet_id)s") diff --git a/neutron/tests/unit/db/test_db_base_plugin_v2.py b/neutron/tests/unit/db/test_db_base_plugin_v2.py index 51faa21a907..07c3f5995f2 100644 --- a/neutron/tests/unit/db/test_db_base_plugin_v2.py +++ b/neutron/tests/unit/db/test_db_base_plugin_v2.py @@ -1427,22 +1427,6 @@ fixed_ips=ip_address%%3D%s&fixed_ips=ip_address%%3D%s&fixed_ips=subnet_id%%3D%s res = req.get_response(self.api) self.assertEqual(webob.exc.HTTPNotFound.code, res.status_int) - def test_port_update_with_ipam_error(self): - with self.network() as network,\ - self.subnet(), self.subnet(),\ - self.port(network=network) as port,\ - mock.patch('neutron.ipam.drivers.neutrondb_ipam.' - 'driver.NeutronDbSubnet.deallocate') as f: - f.side_effect = [ - ipam_exc.IpAddressAllocationNotFound( - ip_address='foo_i', subnet_id='foo_s'), - None, - ] - data = {'port': {'name': 'fool-me'}} - req = self.new_update_request('ports', data, port['port']['id']) - res = self.deserialize(self.fmt, req.get_response(self.api)) - self.assertEqual('fool-me', res['port']['name']) - def test_update_port(self): with self.port() as port: data = {'port': {'admin_state_up': False}} diff --git a/neutron/tests/unit/ipam/drivers/neutrondb_ipam/test_driver.py b/neutron/tests/unit/ipam/drivers/neutrondb_ipam/test_driver.py index 79c90fe7153..cb584bcb346 100644 --- a/neutron/tests/unit/ipam/drivers/neutrondb_ipam/test_driver.py +++ b/neutron/tests/unit/ipam/drivers/neutrondb_ipam/test_driver.py @@ -422,12 +422,6 @@ class TestNeutronDbIpamSubnet(testlib_api.SqlTestCase, # future proofing in case v6-specific logic will be added. self._test_deallocate_address('fde3:abcd:4321:1::/64', 6) - def test_allocate_unallocated_address_fails(self): - ipam_subnet = self._create_and_allocate_ipam_subnet( - '10.0.0.0/24', ip_version=constants.IP_VERSION_4)[0] - self.assertRaises(ipam_exc.IpAddressAllocationNotFound, - ipam_subnet.deallocate, '10.0.0.2') - def test_allocate_all_pool_addresses_triggers_range_recalculation(self): # This test instead might be made to pass, but for the wrong reasons! pass