diff --git a/ceilometer/storage/base.py b/ceilometer/storage/base.py index e036fc6c6..67f7aecf2 100644 --- a/ceilometer/storage/base.py +++ b/ceilometer/storage/base.py @@ -65,7 +65,7 @@ class Connection(object): """Constructor.""" @abc.abstractmethod - def upgrade(self, version=None): + def upgrade(self): """Migrate the database to `version` or the most recent version.""" @abc.abstractmethod diff --git a/ceilometer/storage/impl_hbase.py b/ceilometer/storage/impl_hbase.py index a0636e768..c71f6c2d2 100644 --- a/ceilometer/storage/impl_hbase.py +++ b/ceilometer/storage/impl_hbase.py @@ -102,7 +102,7 @@ class Connection(base.Connection): self.conn = self._get_connection(opts) self.conn.open() - def upgrade(self, version=None): + def upgrade(self): self.conn.create_table(self.PROJECT_TABLE, {'f': dict()}) self.conn.create_table(self.USER_TABLE, {'f': dict()}) self.conn.create_table(self.RESOURCE_TABLE, {'f': dict()}) diff --git a/ceilometer/storage/impl_log.py b/ceilometer/storage/impl_log.py index 040f1fa3a..337940450 100644 --- a/ceilometer/storage/impl_log.py +++ b/ceilometer/storage/impl_log.py @@ -41,7 +41,7 @@ class Connection(base.Connection): def __init__(self, conf): pass - def upgrade(self, version=None): + def upgrade(self): pass def clear(self): diff --git a/ceilometer/storage/impl_mongodb.py b/ceilometer/storage/impl_mongodb.py index 1da5c5eb3..1111ef2d8 100644 --- a/ceilometer/storage/impl_mongodb.py +++ b/ceilometer/storage/impl_mongodb.py @@ -260,7 +260,7 @@ class Connection(base.Connection): # needed. self.upgrade() - def upgrade(self, version=None): + def upgrade(self): # Establish indexes # # We need variations for user_id vs. project_id because of the diff --git a/ceilometer/storage/impl_sqlalchemy.py b/ceilometer/storage/impl_sqlalchemy.py index 81469981d..f89e30552 100644 --- a/ceilometer/storage/impl_sqlalchemy.py +++ b/ceilometer/storage/impl_sqlalchemy.py @@ -147,9 +147,9 @@ class Connection(base.Connection): conf.database.connection = \ os.environ.get('CEILOMETER_TEST_SQL_URL', url) - def upgrade(self, version=None): + def upgrade(self): session = sqlalchemy_session.get_session() - migration.db_sync(session.get_bind(), version=version) + migration.db_sync(session.get_bind()) def clear(self): session = sqlalchemy_session.get_session() diff --git a/ceilometer/storage/sqlalchemy/alembic/README b/ceilometer/storage/sqlalchemy/alembic/README index 98e4f9c44..540003fb4 100644 --- a/ceilometer/storage/sqlalchemy/alembic/README +++ b/ceilometer/storage/sqlalchemy/alembic/README @@ -1 +1,9 @@ -Generic single-database configuration. \ No newline at end of file +Please see https://alembic.readthedocs.org/en/latest/index.html for general documentation + +To create alembic migrations you need to have alembic installed and available in PATH: +# pip install alembic +$ cd ./ceilometer/storage/sqlalchemy/alembic +$ alembic revision -m "migration_description" + +See Operation Reference https://alembic.readthedocs.org/en/latest/ops.html#ops +for a short list of commands diff --git a/ceilometer/storage/sqlalchemy/migrate_repo/README b/ceilometer/storage/sqlalchemy/migrate_repo/README index 6218f8cac..42bddd18a 100644 --- a/ceilometer/storage/sqlalchemy/migrate_repo/README +++ b/ceilometer/storage/sqlalchemy/migrate_repo/README @@ -1,4 +1,4 @@ -This is a database migration repository. +sqlalchemy-migrate is DEPRECATED. -More information at -http://code.google.com/p/sqlalchemy-migrate/ +All new migrations should be written using alembic. +Please see ceilometer/storage/sqlalchemy/alembic/README diff --git a/ceilometer/storage/sqlalchemy/migration.py b/ceilometer/storage/sqlalchemy/migration.py index 1a52d5a86..d7d4609ab 100644 --- a/ceilometer/storage/sqlalchemy/migration.py +++ b/ceilometer/storage/sqlalchemy/migration.py @@ -18,6 +18,9 @@ import distutils.version as dist_version import os +import alembic +from alembic import config as alembic_config + import migrate from migrate.versioning import util as migrate_util import sqlalchemy @@ -59,20 +62,17 @@ from migrate.versioning.repository import Repository _REPOSITORY = None -def db_sync(engine, version=None): - if version is not None: - try: - version = int(version) - except ValueError: - raise Exception(_("version should be an integer")) - - current_version = db_version(engine) +def db_sync(engine): + db_version(engine) # This is needed to create a version stamp in empty DB repository = _find_migrate_repo() - if version is None or version > current_version: - return versioning_api.upgrade(engine, repository, version) - else: - return versioning_api.downgrade(engine, repository, - version) + versioning_api.upgrade(engine, repository) + alembic.command.upgrade(_alembic_config(), "head") + + +def _alembic_config(): + path = os.path.join(os.path.dirname(__file__), 'alembic/alembic.ini') + config = alembic_config.Config(path) + return config def db_version(engine): diff --git a/ceilometer/tests/db.py b/ceilometer/tests/db.py index 4ed01302f..c999c25f9 100644 --- a/ceilometer/tests/db.py +++ b/ceilometer/tests/db.py @@ -35,8 +35,6 @@ class TestBase(test_base.TestCase): group='database') self.conn = storage.get_connection(cfg.CONF) self.conn.upgrade() - self.conn.clear() - self.conn.upgrade() def tearDown(self): self.conn.clear()