use payloads for SEGMENT BEFORE_DELETE callbacks

This patch switches over to the payload style of callbacks for SEGMENT
BEFORE_DELETE events. It does so by using the publish callback function
with DBEventPayload payloads. Corresponding listener callbacks are
updated where necessary.

NeutronLibImpact

Change-Id: I64031129ad458d4468a316a9385288ced091d333
This commit is contained in:
Boden R 2018-08-27 17:24:52 -06:00
parent 1e0a5b901a
commit ddc72ebd41
4 changed files with 21 additions and 17 deletions

View File

@ -333,23 +333,23 @@ def is_dhcp_active_on_any_subnet(context, subnet_ids):
def _prevent_segment_delete_with_port_bound(resource, event, trigger,
context, segment,
for_net_delete=False):
payload=None):
"""Raise exception if there are any ports bound with segment_id."""
if for_net_delete:
if payload.metadata.get('for_net_delete'):
# don't check for network deletes
return
with db_api.CONTEXT_READER.using(context):
with db_api.CONTEXT_READER.using(payload.context):
port_ids = port_obj.Port.get_port_ids_filter_by_segment_id(
context, segment_id=segment['id'])
payload.context, segment_id=payload.resource_id)
# There are still some ports in the segment, segment should not be deleted
# TODO(xiaohhui): Should we delete the dhcp port automatically here?
if port_ids:
reason = _("The segment is still bound with port(s) "
"%s") % ", ".join(port_ids)
raise seg_exc.SegmentInUse(segment_id=segment['id'], reason=reason)
raise seg_exc.SegmentInUse(segment_id=payload.resource_id,
reason=reason)
def subscribe():

View File

@ -165,9 +165,13 @@ class SegmentDbMixin(common_db_mixin.CommonDbMixin):
"""Delete an existing segment."""
segment_dict = 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_dict, for_net_delete=for_net_delete)
registry.publish(resources.SEGMENT, events.BEFORE_DELETE,
self.delete_segment,
payload=events.DBEventPayload(
context, metadata={
'for_net_delete': for_net_delete},
states=(segment_dict,),
resource_id=uuid))
# Delete segment in DB
with db_api.CONTEXT_WRITER.using(context):

View File

@ -110,14 +110,13 @@ class Plugin(db.SegmentDbMixin, segment.SegmentPluginBase):
@registry.receives(resources.SEGMENT, [events.BEFORE_DELETE])
def _prevent_segment_delete_with_subnet_associated(
self, resource, event, trigger, context, segment,
for_net_delete=False):
self, resource, event, trigger, payload=None):
"""Raise exception if there are any subnets associated with segment."""
if for_net_delete:
if payload.metadata.get('for_net_delete'):
# don't check if this is a part of a network delete operation
return
segment_id = segment['id']
subnets = subnet_obj.Subnet.get_objects(context,
segment_id = payload.resource_id
subnets = subnet_obj.Subnet.get_objects(payload.context,
segment_id=segment_id)
subnet_ids = [s.id for s in subnets]

View File

@ -3092,9 +3092,10 @@ class TestML2Segments(Ml2PluginV2TestCase):
segment = segments_db.get_network_segments(
self.context, port['port']['network_id'])[0]
segment['network_id'] = port['port']['network_id']
self.assertRaises(c_exc.CallbackFailure, registry.notify,
self.assertRaises(c_exc.CallbackFailure, registry.publish,
resources.SEGMENT, events.BEFORE_DELETE,
mock.ANY,
context=self.context, segment=segment)
mock.ANY, payload=events.DBEventPayload(
self.context, states=(segment,),
resource_id=segment['id']))
exist_port = self._show('ports', port['port']['id'])
self.assertEqual(port['port']['id'], exist_port['port']['id'])