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
This commit is contained in:
Ghe Rivero 2011-11-16 11:34:03 +01:00
parent 1a048e944e
commit 2ccf22e98a
6 changed files with 47 additions and 51 deletions

View File

@ -1,9 +1,7 @@
[DATABASE] [DATABASE]
name = ovs_quantum # This line MUST be changed to actually run the plugin.
user = root # Example: sql_connection = mysql://root:nova@127.0.0.1:3336/ovs_quantum
pass = nova sql_connection = sqlite://
host = 127.0.0.1
port = 3306
[OVS] [OVS]
integration-bridge = br-int integration-bridge = br-int

View File

@ -55,10 +55,16 @@ provider = quantum.plugins.openvswitch.ovs_quantum_plugin.OVSQuantumPlugin
# -- Database config. # -- Database config.
The Open vSwitch quantum service requires access to a mysql database in order The Open vSwitch quantum service requires access to a mysql database or any
to store configuration and mappings that will be used by the agent. Here is other database engine supported by sqlalchemy in order to store configuration
how to set up the database on the host that you will be running the quantum and mappings that will be used by the agent.
service on.
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 MySQL should be installed on the host, and all plugins and clients
must be configured with access to the database. 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 will be included in the agent distribution tarball (see below) and
the agent will use the credentials here to access the database. 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 # -- XenServer Agent configuration
- Create the agent distribution tarball - Create the agent distribution tarball

View File

@ -20,8 +20,6 @@
import ConfigParser import ConfigParser
import logging as LOG import logging as LOG
import MySQLdb
import os
import sys import sys
import time import time
import signal import signal
@ -29,6 +27,8 @@ import signal
from optparse import OptionParser from optparse import OptionParser
from subprocess import * 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' # A class to represent a VIF (i.e., a port that has 'iface-id' and 'vif-mac'
# attributes set). # attributes set).
@ -186,27 +186,28 @@ class OVSQuantumAgent:
# switch all traffic using L2 learning # switch all traffic using L2 learning
self.int_br.add_flow(priority=1, actions="normal") self.int_br.add_flow(priority=1, actions="normal")
def daemon_loop(self, conn): def daemon_loop(self, db):
self.local_vlan_map = {} self.local_vlan_map = {}
old_local_bindings = {} old_local_bindings = {}
old_vif_ports = {} old_vif_ports = {}
while True: 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() all_bindings = {}
cursor.execute("SELECT * FROM vlan_bindings") try:
rows = cursor.fetchall() ports = db.ports.all()
cursor.close() except:
ports = []
for port in ports:
all_bindings[port.interface_id] = port.network_id
vlan_bindings = {} vlan_bindings = {}
for r in rows: try:
vlan_bindings[r[1]] = r[0] 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_vif_ports = {}
new_local_bindings = {} new_local_bindings = {}
@ -276,19 +277,12 @@ if __name__ == "__main__":
integ_br = config.get("OVS", "integration-bridge") integ_br = config.get("OVS", "integration-bridge")
db_name = config.get("DATABASE", "name") options = {"sql_connection": config.get("DATABASE", "sql_connection")}
db_user = config.get("DATABASE", "user") db = SqlSoup(options["sql_connection"])
db_pass = config.get("DATABASE", "pass")
db_host = config.get("DATABASE", "host") LOG.info("Connecting to database \"%s\" on %s" %
conn = None (db.engine.url.database, db.engine.url.host))
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 = OVSQuantumAgent(integ_br)
plugin.daemon_loop(conn) plugin.daemon_loop(db)
finally:
if conn:
conn.close()
sys.exit(0) sys.exit(0)

View File

@ -7,12 +7,12 @@ if [ ! -d /etc/xapi.d/plugins ]; then
exit 1 exit 1
fi fi
# Make sure we have mysql-python # Make sure we have sqlalchemy-python
rpm -qa | grep MySQL-python >/dev/null 2>&1 rpm -qa | grep sqlalchemy-python >/dev/null 2>&1
if [ $? -ne 0 ]; then if [ $? -ne 0 ]; then
echo "MySQL-python not found" echo "sqlalchemy-python not found"
echo "Please enable the centos repositories and install mysql-python:" echo "Please enable the centos repositories and install sqlalchemy-python:"
echo "yum --enablerepo=base -y install MySQL-python" echo "yum --enablerepo=base -y install sqlalchemy-python"
exit 1 exit 1
fi fi

View File

@ -85,12 +85,7 @@ class OVSQuantumPlugin(QuantumPluginBase):
config.read(configfile) config.read(configfile)
LOG.debug("Config: %s" % config) LOG.debug("Config: %s" % config)
DB_NAME = config.get("DATABASE", "name") options = {"sql_connection": config.get("DATABASE", "sql_connection")}
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)}
db.configure_db(options) db.configure_db(options)
self.vmap = VlanMap() self.vmap = VlanMap()

View File

@ -1 +1 @@
mysql-python SQLAlchemy