From 40680d96302a266f2d56dcf3031ce7b27f260018 Mon Sep 17 00:00:00 2001 From: Rick Harris Date: Thu, 28 Feb 2013 00:24:22 +0000 Subject: Don't blindly skip first migration. The existing code would, no matter-what, skip the first migration when running through the migrations tests. This makes the code slightly counterintuitive (why skip the first one?), and is not very flexible. The reworked logic lets a migration raise a `NotImplementedError` to signal that it doesn't support a `downgrade`. This lets the walk-versions code treat the first-migration just like any other. Change-Id: I19fd8ebc6075392cf9e573b8b4166291584b4a83 --- .../sqlalchemy/migrate_repo/versions/133_folsom.py | 2 +- nova/tests/test_migrations.py | 35 ++++++++++++---------- .../sqlalchemy/migrate_repo/versions/001_init.py | 2 +- 3 files changed, 21 insertions(+), 18 deletions(-) (limited to 'nova') diff --git a/nova/db/sqlalchemy/migrate_repo/versions/133_folsom.py b/nova/db/sqlalchemy/migrate_repo/versions/133_folsom.py index 44eac3695..5c44ebbfc 100644 --- a/nova/db/sqlalchemy/migrate_repo/versions/133_folsom.py +++ b/nova/db/sqlalchemy/migrate_repo/versions/133_folsom.py @@ -1222,4 +1222,4 @@ def upgrade(migrate_engine): def downgrade(migrate_engine): - LOG.exception(_('Downgrade from Folsom is unsupported.')) + raise NotImplementedError('Downgrade from Folsom is unsupported.') diff --git a/nova/tests/test_migrations.py b/nova/tests/test_migrations.py index 23aef0562..46a169afc 100644 --- a/nova/tests/test_migrations.py +++ b/nova/tests/test_migrations.py @@ -363,36 +363,37 @@ class BaseMigrationTestCase(test.TestCase): self.migration_api.db_version(engine, self.REPOSITORY)) - self.migration_api.upgrade(engine, - self.REPOSITORY, - self.INIT_VERSION + 1) - LOG.debug('latest version is %s' % self.REPOSITORY.latest) + versions = range(self.INIT_VERSION + 1, self.REPOSITORY.latest + 1) - for version in xrange(self.INIT_VERSION + 2, - self.REPOSITORY.latest + 1): + for version in versions: # upgrade -> downgrade -> upgrade self._migrate_up(engine, version, with_data=True) if snake_walk: - self._migrate_down(engine, version - 1, with_data=True) - self._migrate_up(engine, version) + downgraded = self._migrate_down( + engine, version - 1, with_data=True) + if downgraded: + self._migrate_up(engine, version) if downgrade: # Now walk it back down to 0 from the latest, testing # the downgrade paths. - for version in reversed( - xrange(self.INIT_VERSION + 2, - self.REPOSITORY.latest + 1)): + for version in reversed(versions): # downgrade -> upgrade -> downgrade - self._migrate_down(engine, version - 1) - if snake_walk: + downgraded = self._migrate_down(engine, version - 1) + + if snake_walk and downgraded: self._migrate_up(engine, version) self._migrate_down(engine, version - 1) def _migrate_down(self, engine, version, with_data=False): - self.migration_api.downgrade(engine, - self.REPOSITORY, - version) + try: + self.migration_api.downgrade(engine, self.REPOSITORY, version) + except NotImplementedError: + # NOTE(sirp): some migrations, namely release-level + # migrations, don't support a downgrade. + return False + self.assertEqual(version, self.migration_api.db_version(engine, self.REPOSITORY)) @@ -406,6 +407,8 @@ class BaseMigrationTestCase(test.TestCase): if post_downgrade: post_downgrade(engine) + return True + def _migrate_up(self, engine, version, with_data=False): """migrate up to a new version of the db. diff --git a/nova/virt/baremetal/db/sqlalchemy/migrate_repo/versions/001_init.py b/nova/virt/baremetal/db/sqlalchemy/migrate_repo/versions/001_init.py index 2d899406c..fad83e21b 100644 --- a/nova/virt/baremetal/db/sqlalchemy/migrate_repo/versions/001_init.py +++ b/nova/virt/baremetal/db/sqlalchemy/migrate_repo/versions/001_init.py @@ -120,4 +120,4 @@ def upgrade(migrate_engine): def downgrade(migrate_engine): - pass + raise NotImplementedError('Downgrade from 001_init is unsupported.') -- cgit