From ea32afaf7561c35897032ae6d8531c518a865341 Mon Sep 17 00:00:00 2001 From: Rick Harris Date: Thu, 28 Feb 2013 00:24:22 +0000 Subject: [PATCH] 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 --- nova/tests/test_migrations.py | 35 +++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/nova/tests/test_migrations.py b/nova/tests/test_migrations.py index 23aef056..46a169af 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.