From ddc72ebd41a0e7804b33a21583d3add008191229 Mon Sep 17 00:00:00 2001 From: Boden R Date: Mon, 27 Aug 2018 17:24:52 -0600 Subject: [PATCH] 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 --- neutron/plugins/ml2/db.py | 12 ++++++------ neutron/services/segments/db.py | 10 +++++++--- neutron/services/segments/plugin.py | 9 ++++----- neutron/tests/unit/plugins/ml2/test_plugin.py | 7 ++++--- 4 files changed, 21 insertions(+), 17 deletions(-) diff --git a/neutron/plugins/ml2/db.py b/neutron/plugins/ml2/db.py index 396d8fe4b43..e03d0901ce9 100644 --- a/neutron/plugins/ml2/db.py +++ b/neutron/plugins/ml2/db.py @@ -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(): diff --git a/neutron/services/segments/db.py b/neutron/services/segments/db.py index 4e54e8217c9..8c844fbcc04 100644 --- a/neutron/services/segments/db.py +++ b/neutron/services/segments/db.py @@ -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): diff --git a/neutron/services/segments/plugin.py b/neutron/services/segments/plugin.py index 79526dc8083..cc78e1ce671 100644 --- a/neutron/services/segments/plugin.py +++ b/neutron/services/segments/plugin.py @@ -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] diff --git a/neutron/tests/unit/plugins/ml2/test_plugin.py b/neutron/tests/unit/plugins/ml2/test_plugin.py index 618d2a78fba..fa9b069f8be 100644 --- a/neutron/tests/unit/plugins/ml2/test_plugin.py +++ b/neutron/tests/unit/plugins/ml2/test_plugin.py @@ -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'])