import functools
import unittest.case
+from oslo_db.sqlalchemy import provision
+from oslo_db.sqlalchemy import test_base
import testtools.testcase
from neutron.common import constants as n_const
'is enabled, skip reason: %s' % (wrapped.__name__, e))
raise
return wrapper
+
+
+# NOTE(cbrandily): Define mysql+pymysql backend implementation
+@provision.BackendImpl.impl.dispatch_for("mysql+pymysql")
+class PyMySQLBackendImpl(provision.BackendImpl):
+
+ default_engine_kwargs = {'mysql_sql_mode': 'TRADITIONAL'}
+
+ def create_opportunistic_driver_url(self):
+ return "mysql+pymysql://openstack_citest:openstack_citest@localhost/"
+
+ def create_named_database(self, engine, ident, conditional=False):
+ with engine.connect() as conn:
+ if not conditional or not self.database_exists(conn, ident):
+ conn.execute("CREATE DATABASE %s" % ident)
+
+ def drop_named_database(self, engine, ident, conditional=False):
+ with engine.connect() as conn:
+ if not conditional or self.database_exists(conn, ident):
+ conn.execute("DROP DATABASE %s" % ident)
+
+ def database_exists(self, engine, ident):
+ return bool(engine.scalar("SHOW DATABASES LIKE '%s'" % ident))
+
+
+impl = provision.BackendImpl.impl("mysql+pymysql")
+url = impl.create_opportunistic_driver_url()
+# NOTE(cbrandily): Declare mysql+pymysql backend implementation
+provision.Backend("mysql+pymysql", url)
+
+
+# NOTE(cbrandily): Define mysql+pymysql db fixture
+class PyMySQLFixture(test_base.DbFixture):
+ DRIVER = 'mysql+pymysql'
+
+
+# NOTE(cbrandily): Define mysql+pymysql base testcase
+class MySQLTestCase(test_base.DbTestCase):
+ """Base test class for MySQL tests.
+
+ Enforce the supported driver, which is PyMySQL.
+ """
+ FIXTURE = PyMySQLFixture
from neutron.db.migration.models import head # noqa
from neutron.db import model_base
+from neutron.tests.common import base
-class BaseFullStackTestCase(test_base.MySQLOpportunisticTestCase):
+class BaseFullStackTestCase(base.MySQLTestCase):
"""Base test class for full-stack tests."""
def __init__(self, environment, *args, **kwargs):
def create_db_tables(self):
"""Populate the new database.
- MySQLOpportunisticTestCase creates a new database for each test, but
- these need to be populated with the appropriate tables. Before we can
- do that, we must change the 'connection' option which the Neutron code
- knows to look at.
+ MySQLTestCase creates a new database for each test, but these need to
+ be populated with the appropriate tables. Before we can do that, we
+ must change the 'connection' option which the Neutron code knows to
+ look at.
Currently, the username and password options are hard-coded by
oslo.db and neutron/tests/functional/contrib/gate_hook.sh. Also,
from neutron.db import model_base
from neutron.db import models_v2
from neutron.tests import base
+from neutron.tests.common import base as common_base
def get_admin_test_context(db_url):
ip_avail_ranges_expected)
-class TestIpamMySql(test_base.MySQLOpportunisticTestCase, base.BaseTestCase,
+class TestIpamMySql(common_base.MySQLTestCase, base.BaseTestCase,
IpamTestCase):
def setUp(self):