Add openid fix migration script

Users who previously had a '%20' in their openstackids currently aren't able
to access their data on RefStack. This is because a '.' has taken the place of
'%20' in a recent openstack id update. This migration will reflect this change
in the database.

Reference: https://review.openstack.org/#/c/427889/

Change-Id: I58c595ea3467ddd94cd26a8ec7e284561a0dc02d
This commit is contained in:
Paul Van Eck 2017-03-23 12:54:45 -07:00
parent 08d28cf61a
commit 2d626519e6

View File

@ -0,0 +1,64 @@
"""Fix openids with spaces.
A change in the openstackid naming made is so IDs with spaces
are trimmed, so %20 are no longer in the openid url. This migration
will replace any '%20' with a '.' in each openid.
Revision ID: 434be17a6ec3
Revises: 59df512e82f
Create Date: 2017-03-23 12:20:08.219294
"""
# revision identifiers, used by Alembic.
revision = '434be17a6ec3'
down_revision = '59df512e82f'
MYSQL_CHARSET = 'utf8'
from alembic import op
def upgrade():
"""Upgrade DB."""
conn = op.get_bind()
# Need to disable FOREIGN_KEY_CHECKS as a lot of tables reference the
# openid in the user table.
conn.execute("SET FOREIGN_KEY_CHECKS=0")
res = conn.execute("select * from user where openid LIKE '%%\%%20%%'")
results = res.fetchall()
for user in results:
old_openid = user[5]
new_openid = user[5].replace('%20', '.')
# Remove instances of the new openid so the old one can take
# its place.
query = "delete from user where openid='%s'" % (new_openid)
conn.execute(query.replace('%', '%%'))
# Update the openid.
query = ("update user set openid='%s' where openid='%s'" %
(new_openid, old_openid))
conn.execute(query.replace('%', '%%'))
# Update all usage of %20 in all openid references using MySQL Replace.
conn.execute("update meta set value = "
"REPLACE (value, '%%20', '.')")
conn.execute("update pubkeys set openid = "
"REPLACE (openid, '%%20', '.')")
conn.execute("update organization set created_by_user = "
"REPLACE (created_by_user, '%%20', '.')")
conn.execute("update product set created_by_user = "
"REPLACE (created_by_user, '%%20', '.')")
conn.execute("update product_version set created_by_user = "
"REPLACE (created_by_user, '%%20', '.')")
conn.execute("update user_to_group set created_by_user = "
"REPLACE (created_by_user, '%%20', '.')")
conn.execute("update user_to_group set user_openid = "
"REPLACE (user_openid, '%%20', '.')")
conn.execute("SET FOREIGN_KEY_CHECKS=1")
def downgrade():
"""Downgrade DB."""
pass