diff --git a/nova/tests/fixtures.py b/nova/tests/fixtures.py index 70977e7935e7..2e43e3f3770b 100644 --- a/nova/tests/fixtures.py +++ b/nova/tests/fixtures.py @@ -35,7 +35,7 @@ from nova.tests.functional.api import client _TRUE_VALUES = ('True', 'true', '1', 'yes') CONF = cfg.CONF -DB_SCHEMA = "" +DB_SCHEMA = {'main': "", 'api': ""} class ServiceFixture(fixtures.Fixture): @@ -190,25 +190,34 @@ class Timeout(fixtures.Fixture): class Database(fixtures.Fixture): + def __init__(self, database='main'): + super(Database, self).__init__() + self.database = database + if database == 'main': + self.get_engine = session.get_engine + elif database == 'api': + self.get_engine = session.get_api_engine + def _cache_schema(self): global DB_SCHEMA - if not DB_SCHEMA: - engine = session.get_engine() + if not DB_SCHEMA[self.database]: + engine = self.get_engine() conn = engine.connect() - migration.db_sync() - DB_SCHEMA = "".join(line for line in conn.connection.iterdump()) + migration.db_sync(database=self.database) + DB_SCHEMA[self.database] = "".join(line for line + in conn.connection.iterdump()) engine.dispose() def cleanup(self): - engine = session.get_engine() + engine = self.get_engine() engine.dispose() def reset(self): self._cache_schema() - engine = session.get_engine() + engine = self.get_engine() engine.dispose() conn = engine.connect() - conn.connection.executescript(DB_SCHEMA) + conn.connection.executescript(DB_SCHEMA[self.database]) def setUp(self): super(Database, self).setUp() diff --git a/nova/tests/unit/conf_fixture.py b/nova/tests/unit/conf_fixture.py index 5036b4052065..e2caade90473 100644 --- a/nova/tests/unit/conf_fixture.py +++ b/nova/tests/unit/conf_fixture.py @@ -58,7 +58,10 @@ class ConfFixture(config_fixture.Config): self.conf.set_default('auth_strategy', 'noauth2') config.parse_args([], default_config_files=[]) self.conf.set_default('connection', "sqlite://", group='database') + self.conf.set_default('connection', "sqlite://", group='api_database') self.conf.set_default('sqlite_synchronous', False, group='database') + self.conf.set_default('sqlite_synchronous', False, + group='api_database') self.conf.set_default('fatal_exception_format_errors', True) self.conf.set_default('enabled', True, 'osapi_v3') self.conf.set_default('force_dhcp_release', False) diff --git a/nova/tests/unit/test_fixtures.py b/nova/tests/unit/test_fixtures.py index 49e08a2dd184..b5d9fc500002 100644 --- a/nova/tests/unit/test_fixtures.py +++ b/nova/tests/unit/test_fixtures.py @@ -19,6 +19,7 @@ import sys import fixtures as fx from oslo_config import cfg from oslo_log import log as logging +from oslo_utils import uuidutils import testtools from nova.db.sqlalchemy import api as session @@ -206,6 +207,34 @@ class TestDatabaseFixture(testtools.TestCase): rows = result.fetchall() self.assertEqual(len(rows), 5, "Rows %s" % rows) + def test_api_fixture_reset(self): + # This sets up reasonable db connection strings + self.useFixture(conf_fixture.ConfFixture()) + self.useFixture(fixtures.Database(database='api')) + engine = session.get_api_engine() + conn = engine.connect() + result = conn.execute("select * from cell_mappings") + rows = result.fetchall() + self.assertEqual(len(rows), 0, "Rows %s" % rows) + + uuid = uuidutils.generate_uuid() + conn.execute("insert into cell_mappings (uuid, name) VALUES " + "('%s', 'fake-cell')" % (uuid,)) + result = conn.execute("select * from cell_mappings") + rows = result.fetchall() + self.assertEqual(len(rows), 1, "Rows %s" % rows) + + # reset by invoking the fixture again + # + # NOTE(sdague): it's important to reestablish the db + # connection because otherwise we have a reference to the old + # in mem db. + self.useFixture(fixtures.Database(database='api')) + conn = engine.connect() + result = conn.execute("select * from cell_mappings") + rows = result.fetchall() + self.assertEqual(len(rows), 0, "Rows %s" % rows) + def test_fixture_cleanup(self): # because this sets up reasonable db connection strings self.useFixture(conf_fixture.ConfFixture()) @@ -220,3 +249,28 @@ class TestDatabaseFixture(testtools.TestCase): conn = engine.connect() schema = "".join(line for line in conn.connection.iterdump()) self.assertEqual(schema, "BEGIN TRANSACTION;COMMIT;") + + def test_api_fixture_cleanup(self): + # This sets up reasonable db connection strings + self.useFixture(conf_fixture.ConfFixture()) + fix = fixtures.Database(database='api') + self.useFixture(fix) + + # No data inserted by migrations so we need to add a row + engine = session.get_api_engine() + conn = engine.connect() + uuid = uuidutils.generate_uuid() + conn.execute("insert into cell_mappings (uuid, name) VALUES " + "('%s', 'fake-cell')" % (uuid,)) + result = conn.execute("select * from cell_mappings") + rows = result.fetchall() + self.assertEqual(len(rows), 1, "Rows %s" % rows) + + # Manually do the cleanup that addCleanup will do + fix.cleanup() + + # Ensure the db contains nothing + engine = session.get_api_engine() + conn = engine.connect() + schema = "".join(line for line in conn.connection.iterdump()) + self.assertEqual(schema, "BEGIN TRANSACTION;COMMIT;")