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:
parent
1a048e944e
commit
2ccf22e98a
@ -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
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
||||
|
@ -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()
|
||||
|
@ -1 +1 @@
|
||||
mysql-python
|
||||
SQLAlchemy
|
Loading…
Reference in New Issue
Block a user