From 2ccf22e98a74987ca2ddab88139a0e5f1d9d45af Mon Sep 17 00:00:00 2001 From: Ghe Rivero Date: Wed, 16 Nov 2011 11:34:03 +0100 Subject: [PATCH] Adds sqlalchemy support for ovs_quantum_plugin. Fixes bug 890672 Allow to use any database as backend (supported by sqlalchemy). Need to change ovs_quantum_plugin.ini and add variable sql_connection under DATABASE entry using specific sqlalchemy url schema (same as nova confs) Change-Id: Ic490b09aad84c7f24d68064c18a8c1b33774cb05 --- .../openvswitch/ovs_quantum_plugin.ini | 8 ++- quantum/plugins/openvswitch/README | 17 ++++-- .../openvswitch/agent/ovs_quantum_agent.py | 54 +++++++++---------- .../openvswitch/agent/xenserver_install.sh | 10 ++-- .../plugins/openvswitch/ovs_quantum_plugin.py | 7 +-- quantum/plugins/openvswitch/pip-requires | 2 +- 6 files changed, 47 insertions(+), 51 deletions(-) diff --git a/etc/quantum/plugins/openvswitch/ovs_quantum_plugin.ini b/etc/quantum/plugins/openvswitch/ovs_quantum_plugin.ini index e6dc431e09e..42cebb78d77 100644 --- a/etc/quantum/plugins/openvswitch/ovs_quantum_plugin.ini +++ b/etc/quantum/plugins/openvswitch/ovs_quantum_plugin.ini @@ -1,9 +1,7 @@ [DATABASE] -name = ovs_quantum -user = root -pass = nova -host = 127.0.0.1 -port = 3306 +# This line MUST be changed to actually run the plugin. +# Example: sql_connection = mysql://root:nova@127.0.0.1:3336/ovs_quantum +sql_connection = sqlite:// [OVS] integration-bridge = br-int diff --git a/quantum/plugins/openvswitch/README b/quantum/plugins/openvswitch/README index be18063c8fa..9ffdc76bafd 100644 --- a/quantum/plugins/openvswitch/README +++ b/quantum/plugins/openvswitch/README @@ -55,10 +55,16 @@ provider = quantum.plugins.openvswitch.ovs_quantum_plugin.OVSQuantumPlugin # -- Database config. -The Open vSwitch quantum service requires access to a mysql database in order -to store configuration and mappings that will be used by the agent. Here is -how to set up the database on the host that you will be running the quantum -service on. +The Open vSwitch quantum service requires access to a mysql database or any +other database engine supported by sqlalchemy in order to store configuration +and mappings that will be used by the agent. + +A new database, "ovs_quantum", should be created, and servers running the +ovs quantum agent must be able to communicate with the host running the +quantum service. + +Here is how to set up the database using MySQL on the host that you will be +running the quantum service on. MySQL should be installed on the host, and all plugins and clients must be configured with access to the database. @@ -86,6 +92,9 @@ mysql> FLUSH PRIVILEGES; will be included in the agent distribution tarball (see below) and the agent will use the credentials here to access the database. + The credentials must be specified using sqlalchemy url as + sql_connection = mysql://user:pass@127.0.0.1/ovs_quantum + # -- XenServer Agent configuration - Create the agent distribution tarball diff --git a/quantum/plugins/openvswitch/agent/ovs_quantum_agent.py b/quantum/plugins/openvswitch/agent/ovs_quantum_agent.py index afeb6b40464..de39ad9bda8 100755 --- a/quantum/plugins/openvswitch/agent/ovs_quantum_agent.py +++ b/quantum/plugins/openvswitch/agent/ovs_quantum_agent.py @@ -20,8 +20,6 @@ import ConfigParser import logging as LOG -import MySQLdb -import os import sys import time import signal @@ -29,6 +27,8 @@ import signal from optparse import OptionParser from subprocess import * +from sqlalchemy.ext.sqlsoup import SqlSoup + # A class to represent a VIF (i.e., a port that has 'iface-id' and 'vif-mac' # attributes set). @@ -186,27 +186,28 @@ class OVSQuantumAgent: # switch all traffic using L2 learning self.int_br.add_flow(priority=1, actions="normal") - def daemon_loop(self, conn): + def daemon_loop(self, db): self.local_vlan_map = {} old_local_bindings = {} old_vif_ports = {} while True: - cursor = conn.cursor() - cursor.execute("SELECT * FROM ports where state = 'ACTIVE'") - rows = cursor.fetchall() - cursor.close() - all_bindings = {} - for r in rows: - all_bindings[r[2]] = r[1] - cursor = conn.cursor() - cursor.execute("SELECT * FROM vlan_bindings") - rows = cursor.fetchall() - cursor.close() + all_bindings = {} + try: + ports = db.ports.all() + except: + ports = [] + for port in ports: + all_bindings[port.interface_id] = port.network_id + vlan_bindings = {} - for r in rows: - vlan_bindings[r[1]] = r[0] + try: + vlan_binds = db.vlan_bindings.all() + except: + vlan_binds = [] + for bind in vlan_binds: + vlan_bindings[bind.network_id] = bind.vlan_id new_vif_ports = {} new_local_bindings = {} @@ -276,19 +277,12 @@ if __name__ == "__main__": integ_br = config.get("OVS", "integration-bridge") - db_name = config.get("DATABASE", "name") - db_user = config.get("DATABASE", "user") - db_pass = config.get("DATABASE", "pass") - db_host = config.get("DATABASE", "host") - conn = None - try: - LOG.info("Connecting to database \"%s\" on %s" % (db_name, db_host)) - conn = MySQLdb.connect(host=db_host, user=db_user, - passwd=db_pass, db=db_name) - plugin = OVSQuantumAgent(integ_br) - plugin.daemon_loop(conn) - finally: - if conn: - conn.close() + options = {"sql_connection": config.get("DATABASE", "sql_connection")} + db = SqlSoup(options["sql_connection"]) + + LOG.info("Connecting to database \"%s\" on %s" % + (db.engine.url.database, db.engine.url.host)) + plugin = OVSQuantumAgent(integ_br) + plugin.daemon_loop(db) sys.exit(0) diff --git a/quantum/plugins/openvswitch/agent/xenserver_install.sh b/quantum/plugins/openvswitch/agent/xenserver_install.sh index e0820d26f98..e49c47503f0 100755 --- a/quantum/plugins/openvswitch/agent/xenserver_install.sh +++ b/quantum/plugins/openvswitch/agent/xenserver_install.sh @@ -7,12 +7,12 @@ if [ ! -d /etc/xapi.d/plugins ]; then exit 1 fi -# Make sure we have mysql-python -rpm -qa | grep MySQL-python >/dev/null 2>&1 +# Make sure we have sqlalchemy-python +rpm -qa | grep sqlalchemy-python >/dev/null 2>&1 if [ $? -ne 0 ]; then - echo "MySQL-python not found" - echo "Please enable the centos repositories and install mysql-python:" - echo "yum --enablerepo=base -y install MySQL-python" + echo "sqlalchemy-python not found" + echo "Please enable the centos repositories and install sqlalchemy-python:" + echo "yum --enablerepo=base -y install sqlalchemy-python" exit 1 fi diff --git a/quantum/plugins/openvswitch/ovs_quantum_plugin.py b/quantum/plugins/openvswitch/ovs_quantum_plugin.py index d823d9ef3db..3b882e5f956 100644 --- a/quantum/plugins/openvswitch/ovs_quantum_plugin.py +++ b/quantum/plugins/openvswitch/ovs_quantum_plugin.py @@ -85,12 +85,7 @@ class OVSQuantumPlugin(QuantumPluginBase): config.read(configfile) LOG.debug("Config: %s" % config) - DB_NAME = config.get("DATABASE", "name") - DB_USER = config.get("DATABASE", "user") - DB_PASS = config.get("DATABASE", "pass") - DB_HOST = config.get("DATABASE", "host") - options = {"sql_connection": "mysql://%s:%s@%s/%s" % (DB_USER, - DB_PASS, DB_HOST, DB_NAME)} + options = {"sql_connection": config.get("DATABASE", "sql_connection")} db.configure_db(options) self.vmap = VlanMap() diff --git a/quantum/plugins/openvswitch/pip-requires b/quantum/plugins/openvswitch/pip-requires index e93bda8ef91..e35201d56af 100644 --- a/quantum/plugins/openvswitch/pip-requires +++ b/quantum/plugins/openvswitch/pip-requires @@ -1 +1 @@ -mysql-python +SQLAlchemy \ No newline at end of file