]> review.fuel-infra Code Review - openstack-build/neutron-build.git/commitdiff
ML2 type and mech managers should use instance vars for drivers lists
authorDane LeBlanc <leblancd@cisco.com>
Tue, 3 Sep 2013 17:34:42 +0000 (13:34 -0400)
committerDane LeBlanc <leblancd@cisco.com>
Tue, 3 Sep 2013 20:26:46 +0000 (16:26 -0400)
Fixes bug 1220296

The ML2 plugin's type and mechanism managers currently maintain
dictionaries/lists of type drivers, mechanism drivers, and ordered mechanism
drivers in (static) class variables. Once a type/mechanism/ordered-mechanism
driver of any given type is added to this list, then no new drivers of that
type are allowed to be registered, and therefore no new configuration for
that driver type is accepted.

This static nature of the driver dictionaries/lists is causing ML2 mechanism
driver unit test cases to fail. For example, if a non-vendor-specific ML2
plugin test case configures a VLAN type driver with no VLAN range, and then
a vendor specific test case attempts to configure a VLAN type driver with
some test VLAN range, then the new VLAN configuration is ignored because of
the previously (staticly) registered VLAN driver.

The proposed fix is to convert these driver dictionaries/lists to instance
variables, and clear them upon each instantiation of an ML2 type manager
or ML2 mechanism manager.

Change-Id: I3b5209640de229899561e2a3ec7c6dafe9a05e64

neutron/plugins/ml2/managers.py

index 36c4ab988d06a99eb9aa5a1b3e9d54ef1a34e7ca..54321cf7267cff474e33de567e83b983cc033fbd 100644 (file)
@@ -30,14 +30,13 @@ LOG = log.getLogger(__name__)
 class TypeManager(stevedore.named.NamedExtensionManager):
     """Manage network segment types using drivers."""
 
-    # Mapping from type name to DriverManager
-    drivers = {}
-
     def __init__(self):
         # REVISIT(rkukura): Need way to make stevedore use our logging
         # configuration. Currently, nothing is logged if loading a
         # driver fails.
 
+        # Mapping from type name to DriverManager
+        self.drivers = {}
         LOG.info(_("Configured type driver names: %s"),
                  cfg.CONF.ml2.type_drivers)
         super(TypeManager, self).__init__('neutron.ml2.type_drivers',
@@ -115,17 +114,17 @@ class MechanismManager(stevedore.named.NamedExtensionManager):
 
     # TODO(apech): add calls for subnets
 
-    # Registered mechanism drivers, keyed by name.
-    mech_drivers = {}
-    # Ordered list of mechanism drivers, defining
-    # the order in which the drivers are called.
-    ordered_mech_drivers = []
-
     def __init__(self):
         # REVISIT(rkukura): Need way to make stevedore use our logging
         # configuration. Currently, nothing is logged if loading a
         # driver fails.
 
+        # Registered mechanism drivers, keyed by name.
+        self.mech_drivers = {}
+        # Ordered list of mechanism drivers, defining
+        # the order in which the drivers are called.
+        self.ordered_mech_drivers = []
+
         LOG.info(_("Configured mechanism driver names: %s"),
                  cfg.CONF.ml2.mechanism_drivers)
         super(MechanismManager, self).__init__('neutron.ml2.mechanism_drivers',
@@ -141,13 +140,8 @@ class MechanismManager(stevedore.named.NamedExtensionManager):
         constructor.
         """
         for ext in self:
-            if ext.name in self.mech_drivers:
-                LOG.error(_("Mechanism driver '%s' ignored because "
-                            "driver is already registered"),
-                          ext.name)
-            else:
-                self.mech_drivers[ext.name] = ext
-                self.ordered_mech_drivers.append(ext)
+            self.mech_drivers[ext.name] = ext
+            self.ordered_mech_drivers.append(ext)
         LOG.info(_("Registered mechanism drivers: %s"),
                  [driver.name for driver in self.ordered_mech_drivers])
 
@@ -185,7 +179,7 @@ class MechanismManager(stevedore.named.NamedExtensionManager):
             )
 
     def create_network_precommit(self, context):
-        """Notify all mechanism drivers of a network creation.
+        """Notify all mechanism drivers during network creation.
 
         :raises: neutron.plugins.ml2.common.MechanismDriverError
         if any mechanism driver create_network_precommit call fails.
@@ -198,7 +192,7 @@ class MechanismManager(stevedore.named.NamedExtensionManager):
         self._call_on_drivers("create_network_precommit", context)
 
     def create_network_postcommit(self, context):
-        """Notify all mechanism drivers of network creation.
+        """Notify all mechanism drivers after network creation.
 
         :raises: neutron.plugins.ml2.common.MechanismDriverError
         if any mechanism driver create_network_postcommit call fails.
@@ -212,7 +206,7 @@ class MechanismManager(stevedore.named.NamedExtensionManager):
         self._call_on_drivers("create_network_postcommit", context)
 
     def update_network_precommit(self, context):
-        """Notify all mechanism drivers of a network update.
+        """Notify all mechanism drivers during network update.
 
         :raises: neutron.plugins.ml2.common.MechanismDriverError
         if any mechanism driver update_network_precommit call fails.
@@ -225,7 +219,7 @@ class MechanismManager(stevedore.named.NamedExtensionManager):
         self._call_on_drivers("update_network_precommit", context)
 
     def update_network_postcommit(self, context):
-        """Notify all mechanism drivers of a network update.
+        """Notify all mechanism drivers after network update.
 
         :raises: neutron.plugins.ml2.common.MechanismDriverError
         if any mechanism driver update_network_postcommit call fails.
@@ -240,7 +234,7 @@ class MechanismManager(stevedore.named.NamedExtensionManager):
         self._call_on_drivers("update_network_postcommit", context)
 
     def delete_network_precommit(self, context):
-        """Notify all mechanism drivers of a network deletion.
+        """Notify all mechanism drivers during network deletion.
 
         :raises: neutron.plugins.ml2.common.MechanismDriverError
         if any mechanism driver delete_network_precommit call fails.
@@ -253,7 +247,7 @@ class MechanismManager(stevedore.named.NamedExtensionManager):
         self._call_on_drivers("delete_network_precommit", context)
 
     def delete_network_postcommit(self, context):
-        """Notify all mechanism drivers of a network deletion.
+        """Notify all mechanism drivers after network deletion.
 
         :raises: neutron.plugins.ml2.common.MechanismDriverError
         if any mechanism driver delete_network_postcommit call fails.
@@ -271,7 +265,7 @@ class MechanismManager(stevedore.named.NamedExtensionManager):
                               continue_on_failure=True)
 
     def create_subnet_precommit(self, context):
-        """Notify all mechanism drivers of a subnet creation.
+        """Notify all mechanism drivers during subnet creation.
 
         :raises: neutron.plugins.ml2.common.MechanismDriverError
         if any mechanism driver create_subnet_precommit call fails.
@@ -284,7 +278,7 @@ class MechanismManager(stevedore.named.NamedExtensionManager):
         self._call_on_drivers("create_subnet_precommit", context)
 
     def create_subnet_postcommit(self, context):
-        """Notify all mechanism drivers of subnet creation.
+        """Notify all mechanism drivers after subnet creation.
 
         :raises: neutron.plugins.ml2.common.MechanismDriverError
         if any mechanism driver create_subnet_postcommit call fails.
@@ -298,7 +292,7 @@ class MechanismManager(stevedore.named.NamedExtensionManager):
         self._call_on_drivers("create_subnet_postcommit", context)
 
     def update_subnet_precommit(self, context):
-        """Notify all mechanism drivers of a subnet update.
+        """Notify all mechanism drivers during subnet update.
 
         :raises: neutron.plugins.ml2.common.MechanismDriverError
         if any mechanism driver update_subnet_precommit call fails.
@@ -311,7 +305,7 @@ class MechanismManager(stevedore.named.NamedExtensionManager):
         self._call_on_drivers("update_subnet_precommit", context)
 
     def update_subnet_postcommit(self, context):
-        """Notify all mechanism drivers of a subnet update.
+        """Notify all mechanism drivers after subnet update.
 
         :raises: neutron.plugins.ml2.common.MechanismDriverError
         if any mechanism driver update_subnet_postcommit call fails.
@@ -326,7 +320,7 @@ class MechanismManager(stevedore.named.NamedExtensionManager):
         self._call_on_drivers("update_subnet_postcommit", context)
 
     def delete_subnet_precommit(self, context):
-        """Notify all mechanism drivers of a subnet deletion.
+        """Notify all mechanism drivers during subnet deletion.
 
         :raises: neutron.plugins.ml2.common.MechanismDriverError
         if any mechanism driver delete_subnet_precommit call fails.
@@ -339,7 +333,7 @@ class MechanismManager(stevedore.named.NamedExtensionManager):
         self._call_on_drivers("delete_subnet_precommit", context)
 
     def delete_subnet_postcommit(self, context):
-        """Notify all mechanism drivers of a subnet deletion.
+        """Notify all mechanism drivers after subnet deletion.
 
         :raises: neutron.plugins.ml2.common.MechanismDriverError
         if any mechanism driver delete_subnet_postcommit call fails.
@@ -357,7 +351,7 @@ class MechanismManager(stevedore.named.NamedExtensionManager):
                               continue_on_failure=True)
 
     def create_port_precommit(self, context):
-        """Notify all mechanism drivers of a port creation.
+        """Notify all mechanism drivers during port creation.
 
         :raises: neutron.plugins.ml2.common.MechanismDriverError
         if any mechanism driver create_port_precommit call fails.
@@ -384,7 +378,7 @@ class MechanismManager(stevedore.named.NamedExtensionManager):
         self._call_on_drivers("create_port_postcommit", context)
 
     def update_port_precommit(self, context):
-        """Notify all mechanism drivers of a port update.
+        """Notify all mechanism drivers during port update.
 
         :raises: neutron.plugins.ml2.common.MechanismDriverError
         if any mechanism driver update_port_precommit call fails.
@@ -397,7 +391,7 @@ class MechanismManager(stevedore.named.NamedExtensionManager):
         self._call_on_drivers("update_port_precommit", context)
 
     def update_port_postcommit(self, context):
-        """Notify all mechanism drivers of a port update.
+        """Notify all mechanism drivers after port update.
 
         :raises: neutron.plugins.ml2.common.MechanismDriverError
         if any mechanism driver update_port_postcommit call fails.
@@ -412,7 +406,7 @@ class MechanismManager(stevedore.named.NamedExtensionManager):
         self._call_on_drivers("update_port_postcommit", context)
 
     def delete_port_precommit(self, context):
-        """Notify all mechanism drivers of a port deletion.
+        """Notify all mechanism drivers during port deletion.
 
         :raises: neutron.plugins.ml2.common.MechanismDriverError
         if any mechanism driver delete_port_precommit call fails.
@@ -425,7 +419,7 @@ class MechanismManager(stevedore.named.NamedExtensionManager):
         self._call_on_drivers("delete_port_precommit", context)
 
     def delete_port_postcommit(self, context):
-        """Notify all mechanism drivers of a port deletion.
+        """Notify all mechanism drivers after port deletion.
 
         :raises: neutron.plugins.ml2.common.MechanismDriverError
         if any mechanism driver delete_port_postcommit call fails.