From 4d505e63902bd31e40904a0c9045b9b07d5bdb5a Mon Sep 17 00:00:00 2001 From: Henry Nash Date: Tue, 25 Feb 2014 17:51:43 +0000 Subject: [PATCH] Fix issue with DB upgrade to assignment table There are two changes: - Commit changes to the grant tables after each update to ensure MySQL doesn't get confused when there are multiple assignments for a given actor/target (Postgresql doesn't have this issue) - Close any sessions in test_sql_upgarde before we call the migrations, to ensure table dropping won't be blocked Fixes bug 1284700 Change-Id: I81704b17ea9c11be926018df125fcfdb79ee6271 --- .../sql/migrate_repo/versions/039_grant_to_assignment.py | 1 + keystone/tests/test_sql_upgrade.py | 8 +++++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/keystone/common/sql/migrate_repo/versions/039_grant_to_assignment.py b/keystone/common/sql/migrate_repo/versions/039_grant_to_assignment.py index df4985839e..9b43331bd8 100644 --- a/keystone/common/sql/migrate_repo/versions/039_grant_to_assignment.py +++ b/keystone/common/sql/migrate_repo/versions/039_grant_to_assignment.py @@ -205,6 +205,7 @@ def downgrade_assignment_table(meta, migrate_engine): update = build_update(meta, session, assignment) if update is not None: migrate_engine.execute(update) + session.commit() # Delete all the rows migrate_engine.execute(downgrade_table.delete()) diff --git a/keystone/tests/test_sql_upgrade.py b/keystone/tests/test_sql_upgrade.py index 3b20b7903d..8b22fdda70 100644 --- a/keystone/tests/test_sql_upgrade.py +++ b/keystone/tests/test_sql_upgrade.py @@ -1997,22 +1997,28 @@ class SqlUpgradeTests(SqlMigrateBase): check_assignment_type(refs, assignment_sql.AssignmentType.USER_DOMAIN) - session = self.Session() self.upgrade(37) + session = self.Session() self.assertTableDoesNotExist('assignment') base_data = create_base_data(session) populate_grants(session, base_data) check_grants(session, base_data) + session.commit() + session.close() self.upgrade(40) + session = self.Session() self.assertTableExists('assignment') self.assertTableDoesNotExist('user_project_metadata') self.assertTableDoesNotExist('group_project_metadata') self.assertTableDoesNotExist('user_domain_metadata') self.assertTableDoesNotExist('group_domain__metadata') check_assignments(session, base_data) + session.close() self.downgrade(37) + session = self.Session() self.assertTableDoesNotExist('assignment') check_grants(session, base_data) + session.close() def populate_user_table(self, with_pass_enab=False, with_pass_enab_domain=False):