diff --git a/neutron/db/db_base_plugin_v2.py b/neutron/db/db_base_plugin_v2.py index 7c50d9f128d..7d86853599a 100644 --- a/neutron/db/db_base_plugin_v2.py +++ b/neutron/db/db_base_plugin_v2.py @@ -507,7 +507,8 @@ class NeutronDbPluginV2(db_base_plugin_common.DbBasePluginCommon, network_db = self._get_network(context, id) network = self._make_network_dict(network_db, context=context) registry.notify(resources.NETWORK, events.PRECOMMIT_DELETE, - self, context=context, network_id=id) + self, context=context, network_id=id, + network=network) # We expire network_db here because precommit deletion # might have left the relationship stale, for example, # if we deleted a segment. diff --git a/neutron/plugins/ml2/plugin.py b/neutron/plugins/ml2/plugin.py index d74b293dec6..282c8230a29 100644 --- a/neutron/plugins/ml2/plugin.py +++ b/neutron/plugins/ml2/plugin.py @@ -1228,7 +1228,8 @@ class Ml2Plugin(db_base_plugin_v2.NeutronDbPluginV2, priority=0) def _network_delete_precommit_handler(self, rtype, event, trigger, context, network_id, **kwargs): - network = self.get_network(context, network_id) + network = (kwargs.get('network') or + self.get_network(context, network_id)) mech_context = driver_context.NetworkContext(self, context, network) @@ -2302,12 +2303,14 @@ class Ml2Plugin(db_base_plugin_v2.NeutronDbPluginV2, # TODO(boden); refactor into _handle_segment_change once all # event types use payloads return self._handle_segment_change( - rtype, event, trigger, payload.context, payload.latest_state) + rtype, event, trigger, payload.context, payload.latest_state, + for_net_delete=payload.metadata.get('for_net_delete')) @registry.receives(resources.SEGMENT, (events.PRECOMMIT_CREATE, events.PRECOMMIT_DELETE, events.AFTER_CREATE)) - def _handle_segment_change(self, rtype, event, trigger, context, segment): + def _handle_segment_change(self, rtype, event, trigger, context, segment, + for_net_delete=False): if (event == events.PRECOMMIT_CREATE and not isinstance(trigger, segments_plugin.Plugin)): # TODO(xiaohhui): Now, when create network, ml2 will reserve @@ -2328,6 +2331,9 @@ class Ml2Plugin(db_base_plugin_v2.NeutronDbPluginV2, elif event == events.PRECOMMIT_DELETE: self.type_manager.release_network_segment(context, segment) + if for_net_delete: + return + # change in segments could affect resulting network mtu, so let's # recalculate it network_db = self._get_network(context, network_id) diff --git a/neutron/services/segments/db.py b/neutron/services/segments/db.py index 866bca33de3..db946f5f0f6 100644 --- a/neutron/services/segments/db.py +++ b/neutron/services/segments/db.py @@ -202,12 +202,15 @@ class SegmentDbMixin(object): # Do some preliminary operations before deleting segment in db registry.notify(resources.SEGMENT, events.PRECOMMIT_DELETE, self.delete_segment, context=context, - segment=segment_dict) + segment=segment_dict, + for_net_delete=for_net_delete) registry.publish(resources.SEGMENT, events.AFTER_DELETE, self.delete_segment, payload=events.DBEventPayload( - context, states=(segment_dict,), + context, metadata={ + FOR_NET_DELETE: for_net_delete}, + states=(segment_dict,), resource_id=uuid)) @@ -333,7 +336,7 @@ def _add_segment_host_mapping_for_segment(resource, event, trigger, def _delete_segments_for_network(resource, event, trigger, - context, network_id): + context, network_id, **kwargs): admin_ctx = common_utils.get_elevated_context(context) global segments_plugin if not segments_plugin: diff --git a/neutron/tests/unit/extensions/test_segment.py b/neutron/tests/unit/extensions/test_segment.py index ab14e7c4949..7614dca59c6 100644 --- a/neutron/tests/unit/extensions/test_segment.py +++ b/neutron/tests/unit/extensions/test_segment.py @@ -420,7 +420,8 @@ class TestSegment(SegmentTestCase): events.PRECOMMIT_DELETE, mock.ANY, context=mock.ANY, - network_id=mock.ANY) + network_id=mock.ANY, + network=mock.ANY) class TestSegmentML2(SegmentTestCase):