Skip segment checks during network delete operations

These checks aren't necessary when triggered as part of a
network delete operation since any remaining subnets and ports
will be removed from the network. Additionally, they can race
with the auto cleanup methods for ports and subnets if segment
deletion is moved to BEFORE_DELETE where it should be.

Change-Id: I996f5b22f5179f5540760cc05c9f091bb3f3069b
This commit is contained in:
Kevin Benton 2017-02-06 01:36:31 -08:00
parent 7dfa64bf41
commit dbadf7b2ed
3 changed files with 14 additions and 5 deletions

View File

@ -285,8 +285,12 @@ def is_dhcp_active_on_any_subnet(context, subnet_ids):
def _prevent_segment_delete_with_port_bound(resource, event, trigger,
context, segment):
context, segment,
for_net_delete=False):
"""Raise exception if there are any ports bound with segment_id."""
if for_net_delete:
# don't check for network deletes
return
segment_id = segment['id']
query = context.session.query(models_v2.Port)
query = query.join(

View File

@ -169,13 +169,13 @@ class SegmentDbMixin(common_db_mixin.CommonDbMixin):
return list({mapping.segment_id for mapping in segment_host_mapping})
@log_helpers.log_method_call
def delete_segment(self, context, uuid):
def delete_segment(self, context, uuid, for_net_delete=False):
"""Delete an existing segment."""
segment = self.get_segment(context, uuid)
# Do some preliminary operations before deleting the segment
registry.notify(resources.SEGMENT, events.BEFORE_DELETE,
self.delete_segment, context=context,
segment=segment)
segment=segment, for_net_delete=for_net_delete)
# Delete segment in DB
with context.session.begin(subtransactions=True):
@ -309,7 +309,8 @@ def _delete_segments_for_network(resource, event, trigger,
segments = segments_plugin.get_segments(
admin_ctx, filters={'network_id': [network_id]})
for segment in segments:
segments_plugin.delete_segment(admin_ctx, segment['id'])
segments_plugin.delete_segment(admin_ctx, segment['id'],
for_net_delete=True)
def subscribe():

View File

@ -80,8 +80,12 @@ class Plugin(db.SegmentDbMixin, segment.SegmentPluginBase):
return cls._instance
def _prevent_segment_delete_with_subnet_associated(
self, resource, event, trigger, context, segment):
self, resource, event, trigger, context, segment,
for_net_delete=False):
"""Raise exception if there are any subnets associated with segment."""
if for_net_delete:
# don't check if this is a part of a network delete operation
return
segment_id = segment['id']
query = context.session.query(models_v2.Subnet.id)
query = query.filter(models_v2.Subnet.segment_id == segment_id)