summaryrefslogtreecommitdiffstats
path: root/keystone/common/sql/migrate_repo/versions/027_set_engine_mysql_innodb.py
diff options
context:
space:
mode:
Diffstat (limited to 'keystone/common/sql/migrate_repo/versions/027_set_engine_mysql_innodb.py')
-rw-r--r--keystone/common/sql/migrate_repo/versions/027_set_engine_mysql_innodb.py143
1 files changed, 143 insertions, 0 deletions
diff --git a/keystone/common/sql/migrate_repo/versions/027_set_engine_mysql_innodb.py b/keystone/common/sql/migrate_repo/versions/027_set_engine_mysql_innodb.py
new file mode 100644
index 00000000..ca8ccd08
--- /dev/null
+++ b/keystone/common/sql/migrate_repo/versions/027_set_engine_mysql_innodb.py
@@ -0,0 +1,143 @@
+
+import sqlalchemy as sql
+from sqlalchemy import MetaData
+
+from keystone.common.sql import migration_helpers
+
+
+def upgrade(migrate_engine):
+ # Upgrade operations go here. Don't create your own engine;
+ # bind migrate_engine to your metadata
+
+ if migrate_engine.name != 'mysql':
+ # InnoDB / MyISAM only applies to MySQL.
+ return
+
+ # This is a list of all the tables that might have been created with MyISAM
+ # rather than InnoDB.
+ tables = [
+ 'credential',
+ 'domain',
+ 'ec2_credential',
+ 'endpoint',
+ 'group',
+ 'group_domain_metadata',
+ 'group_project_metadata',
+ 'policy',
+ 'project',
+ 'role',
+ 'service',
+ 'token',
+ 'trust',
+ 'trust_role',
+ 'user',
+ 'user_domain_metadata',
+ 'user_group_membership',
+ 'user_project_metadata',
+ ]
+
+ meta = MetaData()
+ meta.bind = migrate_engine
+
+ domain_table = sql.Table('domain', meta, autoload=True)
+ endpoint_table = sql.Table('endpoint', meta, autoload=True)
+ group_table = sql.Table('group', meta, autoload=True)
+ group_domain_metadata_table = sql.Table('group_domain_metadata', meta,
+ autoload=True)
+ group_project_metadata_table = sql.Table('group_project_metadata', meta,
+ autoload=True)
+ project_table = sql.Table('project', meta, autoload=True)
+ service_table = sql.Table('service', meta, autoload=True)
+ user_table = sql.Table('user', meta, autoload=True)
+ user_domain_metadata_table = sql.Table('user_domain_metadata', meta,
+ autoload=True)
+ user_group_membership_table = sql.Table('user_group_membership', meta,
+ autoload=True)
+
+ # Mapping of table name to the constraints on that table,
+ # so we can create them.
+ table_constraints = {
+ 'endpoint': [{'table': endpoint_table,
+ 'fk_column': 'service_id',
+ 'ref_column': service_table.c.id},
+ ],
+ 'group': [{'table': group_table,
+ 'fk_column': 'domain_id',
+ 'ref_column': domain_table.c.id},
+ ],
+ 'group_domain_metadata': [{'table': group_domain_metadata_table,
+ 'fk_column': 'domain_id',
+ 'ref_column': domain_table.c.id},
+ ],
+ 'group_project_metadata': [{'table': group_project_metadata_table,
+ 'fk_column': 'project_id',
+ 'ref_column': project_table.c.id},
+ ],
+ 'project': [{'table': project_table,
+ 'fk_column': 'domain_id',
+ 'ref_column': domain_table.c.id},
+ ],
+ 'user': [{'table': user_table,
+ 'fk_column': 'domain_id',
+ 'ref_column': domain_table.c.id},
+ ],
+ 'user_domain_metadata': [{'table': user_domain_metadata_table,
+ 'fk_column': 'domain_id',
+ 'ref_column': domain_table.c.id},
+ ],
+ 'user_group_membership': [{'table': user_group_membership_table,
+ 'fk_column': 'user_id',
+ 'ref_column': user_table.c.id},
+ {'table': user_group_membership_table,
+ 'fk_column': 'group_id',
+ 'ref_column': group_table.c.id},
+ ],
+ 'user_project_metadata': [{'table': group_project_metadata_table,
+ 'fk_column': 'project_id',
+ 'ref_column': project_table.c.id},
+ ],
+ }
+
+ # Maps a table name to the tables that reference it as a FK constraint
+ # (See the map above).
+ ref_tables_map = {
+ 'service': ['endpoint', ],
+ 'domain': ['group', 'group_domain_metadata', 'project', 'user',
+ 'user_domain_metadata', ],
+ 'project': ['group_project_metadata', 'user_project_metadata', ],
+ 'user': ['user_group_membership', ],
+ 'group': ['user_group_membership', ],
+ }
+
+ # The names of tables that need to have their FKs added.
+ fk_table_names = set()
+
+ d = migrate_engine.execute("SHOW TABLE STATUS WHERE Engine!='InnoDB';")
+ for row in d.fetchall():
+ table_name = row[0]
+
+ if table_name not in tables:
+ # Skip this table since it's not a Keystone table.
+ continue
+
+ migrate_engine.execute("ALTER TABLE `%s` Engine=InnoDB" % table_name)
+
+ # Will add the FKs to the table if any of
+ # a) the table itself was converted
+ # b) the tables that the table referenced were converted
+
+ if table_name in table_constraints:
+ fk_table_names.add(table_name)
+
+ ref_tables = ref_tables_map.get(table_name, [])
+ for other_table_name in ref_tables:
+ fk_table_names.add(other_table_name)
+
+ # Now add all the FK constraints to those tables
+ for table_name in fk_table_names:
+ constraints = table_constraints.get(table_name)
+ migration_helpers.add_constraints(constraints)
+
+
+def downgrade(migrate_engine):
+ pass