diff --git a/heat/openstack/common/db/sqlalchemy/migration.py b/heat/openstack/common/db/sqlalchemy/migration.py index 42c675cd0c..c0297ea6da 100644 --- a/heat/openstack/common/db/sqlalchemy/migration.py +++ b/heat/openstack/common/db/sqlalchemy/migration.py @@ -200,7 +200,7 @@ def patch_migrate(): sqlite.SQLiteConstraintGenerator) -def db_sync(abs_path, version=None, init_version=0): +def db_sync(abs_path, version=None, init_version=0, sanity_check=True): """Upgrade or downgrade a database. Function runs the upgrade() or downgrade() functions in change scripts. @@ -210,7 +210,9 @@ def db_sync(abs_path, version=None, init_version=0): If None - database will update to the latest available version. :param init_version: Initial database version + :param sanity_check: Require schema sanity checking for all tables """ + if version is not None: try: version = int(version) @@ -220,7 +222,8 @@ def db_sync(abs_path, version=None, init_version=0): current_version = db_version(abs_path, init_version) repository = _find_migrate_repo(abs_path) - _db_schema_sanity_check() + if sanity_check: + _db_schema_sanity_check() if version is None or version > current_version: return versioning_api.upgrade(get_engine(), repository, version) else: @@ -236,8 +239,15 @@ def _db_schema_sanity_check(): 'where TABLE_SCHEMA=%s and ' 'TABLE_COLLATION NOT LIKE "%%utf8%%"') - table_names = [res[0] for res in engine.execute(onlyutf8_sql, - engine.url.database)] + # NOTE(morganfainberg): exclude the sqlalchemy-migrate and alembic + # versioning tables from the tables we need to verify utf8 status on. + # Non-standard table names are not supported. + EXCLUDED_TABLES = ['migrate_version', 'alembic_version'] + + table_names = [res[0] for res in + engine.execute(onlyutf8_sql, engine.url.database) if + res[0].lower() not in EXCLUDED_TABLES] + if len(table_names) > 0: raise ValueError(_('Tables "%s" have non utf8 collation, ' 'please make sure all tables are CHARSET=utf8'