diff --git a/neutron/db/db_base_plugin_v2.py b/neutron/db/db_base_plugin_v2.py index 8f492263007..6a4a64ef2d7 100644 --- a/neutron/db/db_base_plugin_v2.py +++ b/neutron/db/db_base_plugin_v2.py @@ -455,6 +455,11 @@ class NeutronDbPluginV2(db_base_plugin_common.DbBasePluginCommon, network = self._make_network_dict(network_db, context=context) registry.notify(resources.NETWORK, events.PRECOMMIT_DELETE, self, context=context, network_id=id) + # We expire network_db here because precommit deletion + # might have left the relationship stale, for example, + # if we deleted a segment. + context.session.expire(network_db) + network_db = self._get_network(context, id) context.session.delete(network_db) registry.notify(resources.NETWORK, events.AFTER_DELETE, self, context=context, network=network) diff --git a/neutron/services/segments/db.py b/neutron/services/segments/db.py index b71fda7c81f..ef383d03cde 100644 --- a/neutron/services/segments/db.py +++ b/neutron/services/segments/db.py @@ -314,6 +314,6 @@ def subscribe(): resources.SEGMENT, events.PRECOMMIT_CREATE) registry.subscribe(_delete_segments_for_network, resources.NETWORK, - events.BEFORE_DELETE) + events.PRECOMMIT_DELETE) subscribe() diff --git a/neutron/tests/unit/extensions/test_segment.py b/neutron/tests/unit/extensions/test_segment.py index 9c48b63ae08..fcb6d9f27b7 100644 --- a/neutron/tests/unit/extensions/test_segment.py +++ b/neutron/tests/unit/extensions/test_segment.py @@ -356,6 +356,18 @@ class TestSegment(SegmentTestCase): self._update('segments', segment['segment']['id'], segment, expected_code=webob.exc.HTTPClientError.code) + def test_segment_notification_on_delete_network(self): + with mock.patch.object(db, '_delete_segments_for_network') as dsn: + db.subscribe() + with self.network() as network: + network = network['network'] + self._delete('networks', network['id']) + dsn.assert_called_with(resources.NETWORK, + events.PRECOMMIT_DELETE, + mock.ANY, + context=mock.ANY, + network_id=mock.ANY) + class TestSegmentML2(SegmentTestCase): def setUp(self):