diff --git a/karbor/cmd/manage.py b/karbor/cmd/manage.py index fbfe15c2..f7df49f8 100644 --- a/karbor/cmd/manage.py +++ b/karbor/cmd/manage.py @@ -22,6 +22,7 @@ import os import sys from oslo_config import cfg +from oslo_db import exception as db_exc from oslo_db.sqlalchemy import migration from oslo_log import log as logging @@ -54,11 +55,19 @@ def args(*args, **kwargs): class DbCommands(object): """Class for managing the database.""" - @args('version', nargs='?', default=None, + @args('version', nargs='?', default=None, type=int, help='Database version') def sync(self, version=None): """Sync the database up to the most recent version.""" - return db_migration.db_sync(version) + if version is not None and version > db.MAX_INT: + print(_('Version should be less than or equal to ' + '%(max_version)d.') % {'max_version': db.MAX_INT}) + sys.exit(1) + try: + return db_migration.db_sync(version) + except db_exc.DbMigrationError as ex: + print("Error during database migration: %s" % ex) + sys.exit(1) def version(self): """Print the current database version.""" diff --git a/karbor/tests/unit/test_cmd.py b/karbor/tests/unit/test_cmd.py index b66c2820..d615cf12 100644 --- a/karbor/tests/unit/test_cmd.py +++ b/karbor/tests/unit/test_cmd.py @@ -17,8 +17,10 @@ try: except ImportError: import mock from oslo_config import cfg +from oslo_db import exception as db_exc from karbor.cmd import api as karbor_api +from karbor.cmd import manage as karbor_manage from karbor.tests import base from karbor import version @@ -57,3 +59,28 @@ class TestKarborApiCmd(base.TestCase): launcher.launch_service.assert_called_once_with(server, workers=server.workers) launcher.wait.assert_called_once_with() + + +class TestKarborManageCmd(base.TestCase): + """Unit test cases for python modules under karbor/cmd/manage.py.""" + + def setUp(self): + super(TestKarborManageCmd, self).setUp() + sys.argv = ['karbor-manage'] + CONF(sys.argv[1:], project='karbor', version=version.version_string()) + + def tearDown(self): + super(TestKarborManageCmd, self).tearDown() + + def test_db_commands_upgrade_out_of_range(self): + version = 1111111111 + db_cmds = karbor_manage.DbCommands() + exit = self.assertRaises(SystemExit, db_cmds.sync, version + 1) + self.assertEqual(1, exit.code) + + @mock.patch("oslo_db.sqlalchemy.migration.db_sync") + def test_db_commands_script_not_present(self, db_sync): + db_sync.side_effect = db_exc.DbMigrationError + db_cmds = karbor_manage.DbCommands() + exit = self.assertRaises(SystemExit, db_cmds.sync, 101) + self.assertEqual(1, exit.code)