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:
parent
1e0a5b901a
commit
ddc72ebd41
neutron
@ -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():
|
||||
|
@ -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):
|
||||
|
@ -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]
|
||||
|
||||
|
@ -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'])
|
||||
|
Loading…
x
Reference in New Issue
Block a user