]> review.fuel-infra Code Review - openstack-build/neutron-build.git/commitdiff
Fix for failing network operations in Cisco plugin
authorSumit Naiksatam <snaiksat@cisco.com>
Sat, 15 Sep 2012 00:50:54 +0000 (17:50 -0700)
committerSumit Naiksatam <snaiksat@cisco.com>
Sat, 15 Sep 2012 00:53:35 +0000 (17:53 -0700)
Bug #1050545

This fixes the exceptions occurring in the virtual switch mode of the
Cisco plugin for create/delete/update network operations. The exceptions
were occurring on account of the recent changes in the OVS module to the
get_vlan and get_vlans methods, which were still being invoked here.
Test configuration has been changed to increase the code coverage to
catch such issues in the future. All changes are limited to the Cisco
plugin and related tests.

Change-Id: Id18473f7a9a2a22217a59b4f8b1541b4918e07e7

etc/quantum/plugins/cisco/cisco_plugins.ini
etc/quantum/plugins/cisco/l2network_plugin.ini
quantum/plugins/cisco/db/network_db_v2.py
quantum/plugins/cisco/models/virt_phy_sw_v2.py
quantum/tests/unit/cisco/test_network_plugin.py

index d5c7e41917b497540da8ac5869d32b8015436258..d58970868669a867464e03631e1f344b59a4b1c4 100644 (file)
@@ -1,6 +1,7 @@
 [PLUGINS]
 #ucs_plugin=quantum.plugins.cisco.ucs.cisco_ucs_plugin_v2.UCSVICPlugin
 #nexus_plugin=quantum.plugins.cisco.nexus.cisco_nexus_plugin_v2.NexusPlugin
+vswitch_plugin=quantum.plugins.openvswitch.ovs_quantum_plugin.OVSQuantumPluginV2
 
 [INVENTORY]
 #ucs_plugin=quantum.plugins.cisco.ucs.cisco_ucs_inventory_v2.UCSInventory
index 218e1e37240a6f287bf9ae59ea174b35ebc55d9d..848ab21836427a59b286f93dac160270aa5d163c 100644 (file)
@@ -13,8 +13,8 @@ max_port_profiles=65568
 max_networks=65568
 
 [MODEL]
-#model_class=quantum.plugins.cisco.models.l2network_multi_blade.L2NetworkMultiBlade
-model_class=quantum.plugins.cisco.models.network_multi_blade_v2.NetworkMultiBladeV2
+#model_class=quantum.plugins.cisco.models.network_multi_blade_v2.NetworkMultiBladeV2
+model_class=quantum.plugins.cisco.models.virt_phy_sw_v2.VirtualPhysicalSwitchModelV2
 
 [SEGMENTATION]
 manager_class=quantum.plugins.cisco.segmentation.l2network_vlan_mgr_v2.L2NetworkVLANMgr
index ab0c67df558e4740b2601c0a4412c4b437c2ad93..0c3bea8ef19a6331d6cc7a0164c30d0513ec4c23 100644 (file)
@@ -28,6 +28,7 @@ from quantum.plugins.cisco.db import network_models_v2
 from quantum.plugins.cisco.db import nexus_models_v2
 from quantum.plugins.cisco.db import ucs_models_v2
 from quantum.plugins.cisco import l2network_plugin_configuration as conf
+from quantum.plugins.openvswitch import ovs_models_v2
 
 
 def initialize():
@@ -525,3 +526,14 @@ def update_credential(tenant_id, credential_id,
     except exc.NoResultFound:
         raise c_exc.CredentialNotFound(credential_id=credential_id,
                                        tenant_id=tenant_id)
+
+
+def get_ovs_vlans():
+    session = db.get_session()
+    try:
+        bindings = (session.query(ovs_models_v2.VlanAllocation).
+                    filter_by(allocated=True).
+                    all())
+    except exc.NoResultFound:
+        return []
+    return [binding.vlan_id for binding in bindings]
index 91cdddb4c58949eab04a8e9984519ca14e7937e6..60f83a5f6df02b827c24d6d9754d83a0f50ce629 100644 (file)
@@ -163,6 +163,10 @@ class VirtualPhysicalSwitchModelV2(quantum_plugin_base_v2.QuantumPluginBaseV2):
             else:
                 return func(*args)
 
+    def _get_segmentation_id(self, network_id):
+        binding_seg_id = odb.get_network_binding(None, network_id)
+        return binding_seg_id.segmentation_id
+
     def create_network(self, context, network):
         """
         Perform this operation in the context of the configured device
@@ -174,12 +178,12 @@ class VirtualPhysicalSwitchModelV2(quantum_plugin_base_v2.QuantumPluginBaseV2):
             ovs_output = self._invoke_plugin_per_device(const.VSWITCH_PLUGIN,
                                                         self._func_name(),
                                                         args)
-            vlan_id = odb.get_vlan(ovs_output[0]['id'])
+            vlan_id = self._get_segmentation_id(ovs_output[0]['id'])
             vlan_name = conf.VLAN_NAME_PREFIX + str(vlan_id)
-            vlan_ids = odb.get_vlans()
+            vlan_ids = cdb.get_ovs_vlans()
             vlanids = ''
             for v_id in vlan_ids:
-                vlanids = str(v_id[0]) + ',' + vlanids
+                vlanids = str(v_id) + ',' + vlanids
             vlanids = vlanids.strip(',')
             args = [ovs_output[0]['tenant_id'], ovs_output[0]['name'],
                     ovs_output[0]['id'], vlan_name, vlan_id,
@@ -202,7 +206,7 @@ class VirtualPhysicalSwitchModelV2(quantum_plugin_base_v2.QuantumPluginBaseV2):
             args = [context, networks]
             ovs_output = self._plugins[
                 const.VSWITCH_PLUGIN].create_network_bulk(context, networks)
-            vlan_ids = odb.get_vlans()
+            vlan_ids = cdb.get_ovs_vlans()
             vlanids = ''
             for v_id in vlan_ids:
                 vlanids = str(v_id[0]) + ',' + vlanids
@@ -210,7 +214,7 @@ class VirtualPhysicalSwitchModelV2(quantum_plugin_base_v2.QuantumPluginBaseV2):
             LOG.debug("ovs_output: %s\n " % ovs_output)
             ovs_networks = ovs_output
             for ovs_network in ovs_networks:
-                vlan_id = odb.get_vlan(ovs_network['id'])
+                vlan_id = self._get_segmentation_id(ovs_network['id'])
                 vlan_name = conf.VLAN_NAME_PREFIX + str(vlan_id)
                 args = [ovs_network['tenant_id'], ovs_network['name'],
                         ovs_network['id'], vlan_name, vlan_id,
@@ -232,8 +236,8 @@ class VirtualPhysicalSwitchModelV2(quantum_plugin_base_v2.QuantumPluginBaseV2):
         ovs_output = self._invoke_plugin_per_device(const.VSWITCH_PLUGIN,
                                                     self._func_name(),
                                                     args)
-        vlan_id = odb.get_vlan(ovs_output[0]['id'])
-        vlan_ids = ','.join(str(vlan[0]) for vlan in odb.get_vlans())
+        vlan_id = self._get_segmentation_id(ovs_output[0]['id'])
+        vlan_ids = ','.join(str(vlan[0]) for vlan in cdb.get_ovs_vlans())
         args = [ovs_output[0]['tenant_id'], id, {'vlan_id': vlan_id},
                 {'net_admin_state': ovs_output[0]['admin_state_up']},
                 {'vlan_ids': vlan_ids}]
@@ -251,7 +255,7 @@ class VirtualPhysicalSwitchModelV2(quantum_plugin_base_v2.QuantumPluginBaseV2):
             base_plugin_ref = QuantumManager.get_plugin()
             n = base_plugin_ref.get_network(context, id)
             tenant_id = n['tenant_id']
-            vlan_id = odb.get_vlan(id)
+            vlan_id = self._get_segmentation_id(id)
             output = []
             args = [tenant_id, id, {const.VLANID:vlan_id},
                     {const.CONTEXT:context},
index 87137ab803b8025f5953ae4abf180f526e9fbd78..00f7448fb4924e5e3deae382d67fad8ae96c0455 100644 (file)
@@ -22,11 +22,13 @@ from quantum.common import config
 from quantum.common.test_lib import test_config
 from quantum import context
 from quantum.db import api as db
+from quantum.db import l3_db
 from quantum.extensions import _quotav2_model as quotav2_model
 from quantum.manager import QuantumManager
 from quantum.plugins.cisco.common import cisco_constants as const
 from quantum.plugins.cisco.db import network_db_v2
 from quantum.plugins.cisco.db import network_models_v2
+from quantum.plugins.openvswitch import ovs_models_v2
 from quantum.openstack.common import cfg
 from quantum.tests.unit import test_db_plugin
 from quantum.wsgi import JSONDeserializer
@@ -39,38 +41,13 @@ class CiscoNetworkPluginV2TestCase(test_db_plugin.QuantumDbPluginV2TestCase):
     _plugin_name = 'quantum.plugins.cisco.network_plugin.PluginV2'
 
     def setUp(self):
-        super(CiscoNetworkPluginV2TestCase, self).setUp()
-        db._ENGINE = None
-        db._MAKER = None
-        QuantumManager._instance = None
-        # Update the plugin
-        cfg.CONF.set_override('core_plugin', self._plugin_name)
-
         def new_init():
             db.configure_db({'sql_connection': 'sqlite://',
                              'base': network_models_v2.model_base.BASEV2})
 
         with mock.patch.object(network_db_v2,
                                'initialize', new=new_init):
-            self.api = APIRouter()
-
-        def _is_native_bulk_supported():
-            plugin_obj = QuantumManager.get_plugin()
-            native_bulk_attr_name = ("_%s__native_bulk_support"
-                                     % plugin_obj.__class__.__name__)
-            return getattr(plugin_obj, native_bulk_attr_name, False)
-
-        self._skip_native_bulk = not _is_native_bulk_supported()
-
-        LOG.debug("%s.%s.%s done" % (__name__, self.__class__.__name__,
-                                     inspect.stack()[0][3]))
-
-    def tearDown(self):
-        db.clear_db(network_models_v2.model_base.BASEV2)
-        db._ENGINE = None
-        db._MAKER = None
-
-        cfg.CONF.reset()
+            super(CiscoNetworkPluginV2TestCase, self).setUp(self._plugin_name)
 
     def _get_plugin_ref(self):
         plugin_obj = QuantumManager.get_plugin()