From c71f0bbf967a9d356f1276839dd04098847e35cf Mon Sep 17 00:00:00 2001 From: Robert Kukura Date: Mon, 1 Sep 2014 07:27:10 -0400 Subject: [PATCH] ML2: Fix release of network segments to allocation pools The recent merge of https://review.openstack.org/#/c/115025/ broke the release of network segments to allocation pools on network delete, resulting in network creates eventually failing with NoNetworkAvailable exceptions. The network_delete() code is rearranged to properly release the network segments, and a unit test is updated to verify that the type drivers' release_segment() method is called. Partially implements: Blueprint ml2-type-driver-refactor Change-Id: Ica5f11b2012dedfcc097f34f1515f5f3ca208fd2 --- neutron/plugins/ml2/plugin.py | 2 +- neutron/tests/unit/ml2/test_ml2_plugin.py | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/neutron/plugins/ml2/plugin.py b/neutron/plugins/ml2/plugin.py index 85038b682..1dbf7a62f 100644 --- a/neutron/plugins/ml2/plugin.py +++ b/neutron/plugins/ml2/plugin.py @@ -612,10 +612,10 @@ class Ml2Plugin(db_base_plugin_v2.NeutronDbPluginV2, self.mechanism_manager.delete_network_precommit( mech_context) + self.type_manager.release_network_segments(session, id) record = self._get_network(context, id) LOG.debug(_("Deleting network record %s"), record) session.delete(record) - self.type_manager.release_network_segments(session, id) # The segment records are deleted via cascade from the # network record, so explicit removal is not necessary. diff --git a/neutron/tests/unit/ml2/test_ml2_plugin.py b/neutron/tests/unit/ml2/test_ml2_plugin.py index 8b61ce87d..9305f5249 100644 --- a/neutron/tests/unit/ml2/test_ml2_plugin.py +++ b/neutron/tests/unit/ml2/test_ml2_plugin.py @@ -33,6 +33,7 @@ from neutron.plugins.ml2 import config from neutron.plugins.ml2 import db as ml2_db from neutron.plugins.ml2 import driver_api from neutron.plugins.ml2 import driver_context +from neutron.plugins.ml2.drivers import type_vlan from neutron.plugins.ml2 import plugin as ml2_plugin from neutron.tests.unit import _test_extension_portbindings as test_bindings from neutron.tests.unit.ml2.drivers import mechanism_logger as mech_logger @@ -590,8 +591,11 @@ class TestMultiSegmentNetworks(Ml2PluginV2TestCase): dynamic_segment[driver_api.PHYSICAL_NETWORK]) self.assertTrue(dynamic_segment[driver_api.SEGMENTATION_ID] > 0) - req = self.new_delete_request('networks', network_id) - res = req.get_response(self.api) + with mock.patch.object(type_vlan.VlanTypeDriver, + 'release_segment') as rs: + req = self.new_delete_request('networks', network_id) + res = req.get_response(self.api) + self.assertEqual(2, rs.call_count) self.assertEqual(ml2_db.get_network_segments( self.context.session, network_id), []) self.assertIsNone(ml2_db.get_dynamic_segment( -- 2.45.2