Make sqlite in-memory-db usable to unittest

Move migrate monkey patch from nova.tests.test_migrations to
nova.db.sqlalchemy.migration

Change-Id: I018e44903558cad6311fd368787583322f962d0c
This commit is contained in:
Hengqing Hu
2012-03-08 16:43:32 +08:00
parent 07cc4d056e
commit 1f8bc92a50
4 changed files with 40 additions and 45 deletions

View File

@@ -40,6 +40,7 @@ from nova.openstack.common import cfg
from nova import utils from nova import utils
from nova import service from nova import service
from nova.testing.fake import rabbit from nova.testing.fake import rabbit
from nova.tests import reset_db
from nova.virt import fake from nova.virt import fake
@@ -129,8 +130,7 @@ class TestCase(unittest.TestCase):
# now that we have some required db setup for the system # now that we have some required db setup for the system
# to work properly. # to work properly.
self.start = utils.utcnow() self.start = utils.utcnow()
shutil.copyfile(os.path.join(FLAGS.state_path, FLAGS.sqlite_clean_db), reset_db()
os.path.join(FLAGS.state_path, FLAGS.sqlite_db))
# emulate some of the mox stuff, we can't use the metaclass # emulate some of the mox stuff, we can't use the metaclass
# because it screws with our generators # because it screws with our generators

View File

@@ -34,25 +34,44 @@
# The code below enables nosetests to work with i18n _() blocks # The code below enables nosetests to work with i18n _() blocks
import __builtin__ import __builtin__
setattr(__builtin__, '_', lambda x: x) setattr(__builtin__, '_', lambda x: x)
import os
import shutil
from nova.db.sqlalchemy.session import get_engine
from nova import flags
FLAGS = flags.FLAGS
_DB = None
def reset_db():
if FLAGS.sql_connection == "sqlite://":
engine = get_engine()
engine.dispose()
conn = engine.connect()
conn.connection.executescript(_DB)
else:
shutil.copyfile(os.path.join(FLAGS.state_path, FLAGS.sqlite_clean_db),
os.path.join(FLAGS.state_path, FLAGS.sqlite_db))
def setup(): def setup():
import mox # Fail fast if you don't have mox. Workaround for bug 810424 import mox # Fail fast if you don't have mox. Workaround for bug 810424
import os
import shutil
from nova import context from nova import context
from nova import flags
from nova import db from nova import db
from nova.db import migration from nova.db import migration
from nova.network import manager as network_manager from nova.network import manager as network_manager
from nova.tests import fake_flags from nova.tests import fake_flags
FLAGS = flags.FLAGS if FLAGS.sql_connection == "sqlite://":
if migration.db_version() > 1:
testdb = os.path.join(FLAGS.state_path, FLAGS.sqlite_db) return
if os.path.exists(testdb): else:
return testdb = os.path.join(FLAGS.state_path, FLAGS.sqlite_db)
if os.path.exists(testdb):
return
migration.db_sync() migration.db_sync()
ctxt = context.get_admin_context() ctxt = context.get_admin_context()
network = network_manager.VlanManager() network = network_manager.VlanManager()
@@ -74,5 +93,11 @@ def setup():
for net in db.network_get_all(ctxt): for net in db.network_get_all(ctxt):
network.set_network_host(ctxt, net) network.set_network_host(ctxt, net)
cleandb = os.path.join(FLAGS.state_path, FLAGS.sqlite_clean_db) if FLAGS.sql_connection == "sqlite://":
shutil.copyfile(testdb, cleandb) global _DB
engine = get_engine()
conn = engine.connect()
_DB = "".join(line for line in conn.connection.iterdump())
else:
cleandb = os.path.join(FLAGS.state_path, FLAGS.sqlite_clean_db)
shutil.copyfile(testdb, cleandb)

View File

@@ -37,7 +37,7 @@ FLAGS.set_default('image_service', 'nova.image.fake.FakeImageService')
flags.DECLARE('iscsi_num_targets', 'nova.volume.driver') flags.DECLARE('iscsi_num_targets', 'nova.volume.driver')
FLAGS.set_default('iscsi_num_targets', 8) FLAGS.set_default('iscsi_num_targets', 8)
FLAGS.set_default('verbose', True) FLAGS.set_default('verbose', True)
FLAGS.set_default('sqlite_db', "tests.sqlite") FLAGS.set_default('sql_connection', "sqlite://")
FLAGS.set_default('use_ipv6', True) FLAGS.set_default('use_ipv6', True)
FLAGS.set_default('flat_network_bridge', 'br100') FLAGS.set_default('flat_network_bridge', 'br100')
FLAGS.set_default('sqlite_synchronous', False) FLAGS.set_default('sqlite_synchronous', False)

View File

@@ -26,50 +26,20 @@ if possible.
import ConfigParser import ConfigParser
import commands import commands
import distutils.version as dist_version
import os import os
import unittest import unittest
import urlparse import urlparse
import migrate from migrate.versioning import repository
from migrate.versioning import util as migrate_util
import sqlalchemy import sqlalchemy
import nova.db.sqlalchemy.migrate_repo import nova.db.sqlalchemy.migrate_repo
from nova.db.sqlalchemy.migration import versioning_api as migration_api
from nova import log as logging from nova import log as logging
from nova import test from nova import test
LOG = logging.getLogger('nova.tests.test_migrations') LOG = logging.getLogger('nova.tests.test_migrations')
MIGRATE_PKG_VER = dist_version.StrictVersion(migrate.__version__)
USE_MIGRATE_PATCH = MIGRATE_PKG_VER < dist_version.StrictVersion('0.7.3')
@migrate_util.decorator
def patched_with_engine(f, *a, **kw):
url = a[0]
engine = migrate_util.construct_engine(url, **kw)
try:
kw['engine'] = engine
return f(*a, **kw)
finally:
if isinstance(engine, migrate_util.Engine) and engine is not url:
migrate_util.log.debug('Disposing SQLAlchemy engine %s', engine)
engine.dispose()
# TODO(jkoelker) When migrate 0.7.3 is released and nova depends
# on that version or higher, this can be removed
if USE_MIGRATE_PATCH:
migrate_util.with_engine = patched_with_engine
# NOTE(jkoelker) Delay importing migrate until we are patched
from migrate.versioning import api as migration_api
from migrate.versioning import repository
class TestMigrations(unittest.TestCase): class TestMigrations(unittest.TestCase):
"""Test sqlalchemy-migrate migrations""" """Test sqlalchemy-migrate migrations"""