From 08f49111e448b1cd81d12814ce1cb467af5a2c0b Mon Sep 17 00:00:00 2001 From: dineshbhor Date: Tue, 29 Mar 2016 10:46:22 +0000 Subject: [PATCH] Raise DbMigrationError for invalid version Caught InvalidVersionError and DatabaseAlreadyControlledError and raised oslo_db specific DbMigrationError exception if given invalid version as a argument to db_version_control() method. Related-Bug: #1546441 Change-Id: Ic2c3ab5bd83c206a14d9bacf4b477198c06a55f5 --- oslo_db/sqlalchemy/migration.py | 9 +++++++- .../tests/sqlalchemy/test_migration_common.py | 22 +++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/oslo_db/sqlalchemy/migration.py b/oslo_db/sqlalchemy/migration.py index d07ffc8..0b465e0 100644 --- a/oslo_db/sqlalchemy/migration.py +++ b/oslo_db/sqlalchemy/migration.py @@ -150,7 +150,14 @@ def db_version_control(engine, abs_path, version=None): :param version: Initial database version """ repository = _find_migrate_repo(abs_path) - versioning_api.version_control(engine, repository, version) + + try: + versioning_api.version_control(engine, repository, version) + except versioning_exceptions.InvalidVersionError as ex: + raise exception.DbMigrationError("Invalid version : %s" % ex) + except versioning_exceptions.DatabaseAlreadyControlledError: + raise exception.DbMigrationError("Database is already controlled.") + return version diff --git a/oslo_db/tests/sqlalchemy/test_migration_common.py b/oslo_db/tests/sqlalchemy/test_migration_common.py index ebdaaa9..f6f5c95 100644 --- a/oslo_db/tests/sqlalchemy/test_migration_common.py +++ b/oslo_db/tests/sqlalchemy/test_migration_common.py @@ -86,6 +86,28 @@ class TestMigrationCommon(test_base.DbTestCase): mock_version_control.assert_called_once_with( self.engine, self.return_value, self.test_version) + @mock.patch.object(migration, '_find_migrate_repo') + @mock.patch.object(versioning_api, 'version_control') + def test_db_version_control_version_less_than_actual_version( + self, mock_version_control, mock_find_repo): + mock_find_repo.return_value = self.return_value + mock_version_control.side_effect = (migrate_exception. + DatabaseAlreadyControlledError) + self.assertRaises(db_exception.DbMigrationError, + migration.db_version_control, self.engine, + self.path, self.test_version - 1) + + @mock.patch.object(migration, '_find_migrate_repo') + @mock.patch.object(versioning_api, 'version_control') + def test_db_version_control_version_greater_than_actual_version( + self, mock_version_control, mock_find_repo): + mock_find_repo.return_value = self.return_value + mock_version_control.side_effect = (migrate_exception. + InvalidVersionError) + self.assertRaises(db_exception.DbMigrationError, + migration.db_version_control, self.engine, + self.path, self.test_version + 1) + def test_db_version_return(self): ret_val = migration.db_version(self.engine, self.path, self.init_version)