This patch ensures that, when the dhcp agent queries the server
to retrieve and delete its DHCP port, it does so by selecting
for update. This has been done by introducing a new method
that combines the get and delete in one shot.
Closes-Bug:
1197627
Change-Id: I1e8a87d7dc1a1cb9309aeefd41619e20f49f95a6
with context.session.begin(subtransactions=True):
self._delete_port(context, id)
+ def delete_ports(self, context, filters):
+ with context.session.begin(subtransactions=True):
+ ports = self._get_ports_query(
+ context, filters=filters).with_lockmode('update')
+ if ports:
+ for port in ports:
+ self.delete_port(context, port['id'])
+
def _delete_port(self, context, id):
port = self._get_port(context, id)
{'network_id': network_id, 'host': host})
plugin = manager.NeutronManager.get_plugin()
filters = dict(network_id=[network_id], device_id=[device_id])
- ports = plugin.get_ports(context, filters=filters)
-
- if ports:
- plugin.delete_port(context, ports[0]['id'])
+ plugin.delete_ports(context, filters=filters)
def release_port_fixed_ip(self, context, **kwargs):
"""Release the fixed_ip associated the subnet on a port."""
device_id='devid')
self.plugin.assert_has_calls([
- mock.call.get_ports(mock.ANY, filters=dict(network_id=['netid'],
- device_id=['devid'])),
- mock.call.delete_port(mock.ANY, 'port_id')])
+ mock.call.delete_ports(mock.ANY,
+ filters=dict(network_id=['netid'],
+ device_id=['devid']))])
def test_release_port_fixed_ip(self):
port_retval = dict(id='port_id', fixed_ips=[dict(subnet_id='a')])