From: Zane Bitter Date: Fri, 15 Jun 2012 14:19:08 +0000 (+0200) Subject: Fix latest DB migration script X-Git-Tag: 2014.1~1719^2 X-Git-Url: https://review.fuel-infra.org/gitweb?a=commitdiff_plain;h=be0d7bf844c6a4b6b594e83f1e7a6d0a2d73826f;p=openstack-build%2Fheat-build.git Fix latest DB migration script Unfortunately, as long as the user_creds_id column is not nullable the script will still fail if there is data in the database. However with this patch it is at least left in a recoverable state. Also, downgrades now work. Change-Id: Ibb7b7664ad2532154fab90a50bbb95ae9ccfbb91 Signed-off-by: Zane Bitter --- diff --git a/heat/db/sqlalchemy/migrate_repo/versions/005_user_creds.py b/heat/db/sqlalchemy/migrate_repo/versions/005_user_creds.py index 5e0bfcfc..4846c19d 100644 --- a/heat/db/sqlalchemy/migrate_repo/versions/005_user_creds.py +++ b/heat/db/sqlalchemy/migrate_repo/versions/005_user_creds.py @@ -39,30 +39,41 @@ def upgrade(migrate_engine): Column('aws_creds', Text()) ) - try: - user_creds.create() - except Exception: - meta.drop_all(tables=tables) - raise + user_creds.create() stack = Table('stack', meta, autoload=True) + try: + Column('user_creds_id', Integer, ForeignKey("user_creds.id"), + nullable=False).create(stack) + except sqlalchemy.exc.IntegrityError: + stack.c.user_creds_id.drop() + user_creds.drop() + raise + Column('username', String(length=256, convert_unicode=False, assert_unicode=None, unicode_error=None, _warn_on_bytestring=False)).create(stack) - Column('user_creds_id', Integer, ForeignKey("user_creds.id"), - nullable=False).create(stack) def downgrade(migrate_engine): meta = MetaData() meta.bind = migrate_engine - watch_rule = Table('user_creds', meta, autoload=True) - watch_rule.drop() - stack = Table('stack', meta, autoload=True) + user_creds = Table('user_creds', meta, autoload=True) stack.c.username.drop() + + def fk_name(table, ref_column): + for fk in table.foreign_keys: + if fk.column == ref_column: + return fk.name + + fkc = ForeignKeyConstraint([stack.c.user_creds_id], [user_creds.c.id], + name=fk_name(stack, user_creds.c.id)) + fkc.drop() + stack.c.user_creds_id.drop() + user_creds.drop()