components/openstack/keystone/patches/mysql_cluster_support.patch
changeset 6530 c9012715dd1d
parent 5705 1dd01efcbd26
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/keystone/patches/mysql_cluster_support.patch	Fri Jul 29 14:41:14 2016 -0600
@@ -0,0 +1,348 @@
+This patchset is for bug:
+
+22725754 - Keystone needs to support MySQL Cluster
+
+This fixes the following aspects of Keystone:
+1. Implementation of an oslo.db configuration parameter to specify the MySQL 
+   storage engine (mysql_storage_engine).
+2. Replacement of hardcoded SQL statements that set the engine to "InnoDB" 
+   to the above configuration value.
+3. Logic to handle SQL differences between MySQL InnoDB and MySQL Cluster (NDB). 
+   This includes column lengths, constraints, foreign keys, and indexes.
+
+This has not been committed upstream, but has been filed in launchpad:
+
+https://bugs.launchpad.net/keystone/+bug/1564110
+
+
+--- keystone-2015.1.2/keystone/contrib/endpoint_policy/migrate_repo/versions/001_add_endpoint_policy_table.py.orig	2016-02-17 11:31:28.370731100 -0700
++++ keystone-2015.1.2/keystone/contrib/endpoint_policy/migrate_repo/versions/001_add_endpoint_policy_table.py	2016-02-19 13:15:20.604166480 -0700
+@@ -13,7 +13,9 @@
+ # under the License.
+ 
+ import sqlalchemy as sql
++from oslo_config import cfg
+ 
++CONF = cfg.CONF
+ 
+ def upgrade(migrate_engine):
+     # Upgrade operations go here. Don't create your own engine; bind
+@@ -34,7 +36,7 @@ def upgrade(migrate_engine):
+         sql.Column('region_id', sql.String(64),
+                    nullable=True),
+         sql.UniqueConstraint('endpoint_id', 'service_id', 'region_id'),
+-        mysql_engine='InnoDB',
++        mysql_engine=CONF.database.mysql_storage_engine,
+         mysql_charset='utf8')
+ 
+     endpoint_policy_table.create(migrate_engine, checkfirst=True)
+--- keystone-2015.1.2/keystone/contrib/federation/migrate_repo/versions/001_add_identity_provider_table.py.orig	2016-02-17 11:31:28.364528948 -0700
++++ keystone-2015.1.2/keystone/contrib/federation/migrate_repo/versions/001_add_identity_provider_table.py	2016-02-19 13:14:23.091304897 -0700
+@@ -11,7 +11,9 @@
+ # under the License.
+ 
+ import sqlalchemy as sql
++from oslo_config import cfg
+ 
++CONF = cfg.CONF
+ 
+ def upgrade(migrate_engine):
+     meta = sql.MetaData()
+@@ -23,7 +25,7 @@ def upgrade(migrate_engine):
+         sql.Column('id', sql.String(64), primary_key=True),
+         sql.Column('enabled', sql.Boolean, nullable=False),
+         sql.Column('description', sql.Text(), nullable=True),
+-        mysql_engine='InnoDB',
++        mysql_engine=CONF.database.mysql_storage_engine,
+         mysql_charset='utf8')
+ 
+     idp_table.create(migrate_engine, checkfirst=True)
+@@ -36,7 +38,7 @@ def upgrade(migrate_engine):
+                    sql.ForeignKey('identity_provider.id', ondelete='CASCADE'),
+                    primary_key=True),
+         sql.Column('mapping_id', sql.String(64), nullable=True),
+-        mysql_engine='InnoDB',
++        mysql_engine=CONF.database.mysql_storage_engine,
+         mysql_charset='utf8')
+ 
+     federation_protocol_table.create(migrate_engine, checkfirst=True)
+--- keystone-2015.1.2/keystone/contrib/federation/migrate_repo/versions/007_add_remote_id_table.py.orig	2016-02-17 11:31:28.369152519 -0700
++++ keystone-2015.1.2/keystone/contrib/federation/migrate_repo/versions/007_add_remote_id_table.py	2016-02-19 13:14:36.794647452 -0700
+@@ -11,7 +11,9 @@
+ # under the License.
+ 
+ import sqlalchemy as orm
++from oslo_config import cfg
+ 
++CONF = cfg.CONF
+ 
+ def upgrade(migrate_engine):
+     meta = orm.MetaData()
+@@ -27,7 +29,7 @@ def upgrade(migrate_engine):
+         orm.Column('remote_id',
+                    orm.String(255),
+                    primary_key=True),
+-        mysql_engine='InnoDB',
++        mysql_engine=CONF.database.mysql_storage_engine,
+         mysql_charset='utf8')
+ 
+     remote_id_table.create(migrate_engine, checkfirst=True)
+--- keystone-2015.1.2/keystone/contrib/federation/migrate_repo/versions/005_add_service_provider_table.py.orig	2016-02-17 11:31:28.366074588 -0700
++++ keystone-2015.1.2/keystone/contrib/federation/migrate_repo/versions/005_add_service_provider_table.py	2016-02-19 13:16:25.569156414 -0700
+@@ -11,7 +11,9 @@
+ # under the License.
+ 
+ import sqlalchemy as sql
++from oslo_config import cfg
+ 
++CONF = cfg.CONF
+ 
+ def upgrade(migrate_engine):
+     meta = sql.MetaData()
+@@ -25,7 +27,7 @@ def upgrade(migrate_engine):
+         sql.Column('enabled', sql.Boolean, nullable=False),
+         sql.Column('description', sql.Text(), nullable=True),
+         sql.Column('sp_url', sql.String(256), nullable=True),
+-        mysql_engine='InnoDB',
++        mysql_engine=CONF.database.mysql_storage_engine,
+         mysql_charset='utf8')
+ 
+     sp_table.create(migrate_engine, checkfirst=True)
+--- keystone-2015.1.2/keystone/contrib/federation/migrate_repo/versions/002_add_mapping_tables.py.orig	2016-02-17 11:31:28.367627604 -0700
++++ keystone-2015.1.2/keystone/contrib/federation/migrate_repo/versions/002_add_mapping_tables.py	2016-02-19 13:14:46.042762324 -0700
+@@ -11,7 +11,9 @@
+ # under the License.
+ 
+ import sqlalchemy as sql
++from oslo_config import cfg
+ 
++CONF = cfg.CONF
+ 
+ def upgrade(migrate_engine):
+     meta = sql.MetaData()
+@@ -22,6 +24,6 @@ def upgrade(migrate_engine):
+         meta,
+         sql.Column('id', sql.String(64), primary_key=True),
+         sql.Column('rules', sql.Text(), nullable=False),
+-        mysql_engine='InnoDB',
++        mysql_engine=CONF.database.mysql_storage_engine ,
+         mysql_charset='utf8')
+     mapping_table.create(migrate_engine, checkfirst=True)
+--- keystone-2015.1.2/keystone/common/sql/migration_helpers.py.orig	2016-02-17 11:31:28.355333466 -0700
++++ keystone-2015.1.2/keystone/common/sql/migration_helpers.py	2016-02-19 10:15:36.520071425 -0700
+@@ -164,9 +164,9 @@ def _fix_federation_tables(engine):
+         # alter table to execute
+         engine.execute("SET foreign_key_checks = 0")
+         # * Make the tables using InnoDB engine
+-        engine.execute("ALTER TABLE identity_provider Engine=InnoDB")
+-        engine.execute("ALTER TABLE federation_protocol Engine=InnoDB")
+-        engine.execute("ALTER TABLE mapping Engine=InnoDB")
++        engine.execute("ALTER TABLE identity_provider Engine=%s" % CONF.database.mysql_storage_engine)
++        engine.execute("ALTER TABLE federation_protocol Engine=%s" % CONF.database.mysql_storage_engine)
++        engine.execute("ALTER TABLE mapping Engine=%s" % CONF.database.mysql_storage_engine)
+         # * Make the tables using utf8 encoding
+         engine.execute("ALTER TABLE identity_provider "
+                        "CONVERT TO CHARACTER SET utf8")
+--- keystone-2015.1.2/keystone/common/sql/migrate_repo/versions/051_add_id_mapping.py.orig	2016-02-17 11:31:28.357606093 -0700
++++ keystone-2015.1.2/keystone/common/sql/migrate_repo/versions/051_add_id_mapping.py	2016-02-19 13:10:31.212704447 -0700
+@@ -13,9 +13,10 @@
+ # under the License.
+ 
+ import sqlalchemy as sql
+-
+ from keystone.identity.mapping_backends import mapping
++from oslo_config import cfg
+ 
++CONF = cfg.CONF
+ 
+ MAPPING_TABLE = 'id_mapping'
+ 
+@@ -36,6 +37,6 @@ def upgrade(migrate_engine):
+             name='entity_type'),
+             nullable=False),
+         sql.UniqueConstraint('domain_id', 'local_id', 'entity_type'),
+-        mysql_engine='InnoDB',
++        mysql_engine=CONF.database.mysql_storage_engine,
+         mysql_charset='utf8')
+     mapping_table.create(migrate_engine, checkfirst=True)
+--- keystone-2015.1.2/keystone/common/sql/migrate_repo/versions/044_icehouse.py.orig	2016-02-17 11:31:28.359732657 -0700
++++ keystone-2015.1.2/keystone/common/sql/migrate_repo/versions/044_icehouse.py	2016-02-19 13:12:49.670971345 -0700
+@@ -47,7 +47,7 @@ def upgrade(migrate_engine):
+         sql.Column('blob', ks_sql.JsonBlob, nullable=False),
+         sql.Column('type', sql.String(length=255), nullable=False),
+         sql.Column('extra', ks_sql.JsonBlob.impl),
+-        mysql_engine='InnoDB',
++        mysql_engine=CONF.database.mysql_storage_engine,
+         mysql_charset='utf8')
+ 
+     domain = sql.Table(
+@@ -56,7 +56,7 @@ def upgrade(migrate_engine):
+         sql.Column('name', sql.String(length=64), nullable=False),
+         sql.Column('enabled', sql.Boolean, default=True, nullable=False),
+         sql.Column('extra', ks_sql.JsonBlob.impl),
+-        mysql_engine='InnoDB',
++        mysql_engine=CONF.database.mysql_storage_engine,
+         mysql_charset='utf8')
+ 
+     endpoint = sql.Table(
+@@ -70,7 +70,7 @@ def upgrade(migrate_engine):
+         sql.Column('extra', ks_sql.JsonBlob.impl),
+         sql.Column('enabled', sql.Boolean, nullable=False, default=True,
+                    server_default='1'),
+-        mysql_engine='InnoDB',
++        mysql_engine=CONF.database.mysql_storage_engine,
+         mysql_charset='utf8')
+ 
+     group = sql.Table(
+@@ -80,7 +80,7 @@ def upgrade(migrate_engine):
+         sql.Column('name', sql.String(length=64), nullable=False),
+         sql.Column('description', sql.Text),
+         sql.Column('extra', ks_sql.JsonBlob.impl),
+-        mysql_engine='InnoDB',
++        mysql_engine=CONF.database.mysql_storage_engine,
+         mysql_charset='utf8')
+ 
+     policy = sql.Table(
+@@ -89,7 +89,7 @@ def upgrade(migrate_engine):
+         sql.Column('type', sql.String(length=255), nullable=False),
+         sql.Column('blob', ks_sql.JsonBlob, nullable=False),
+         sql.Column('extra', ks_sql.JsonBlob.impl),
+-        mysql_engine='InnoDB',
++        mysql_engine=CONF.database.mysql_storage_engine,
+         mysql_charset='utf8')
+ 
+     project = sql.Table(
+@@ -100,7 +100,7 @@ def upgrade(migrate_engine):
+         sql.Column('description', sql.Text),
+         sql.Column('enabled', sql.Boolean),
+         sql.Column('domain_id', sql.String(length=64), nullable=False),
+-        mysql_engine='InnoDB',
++        mysql_engine=CONF.database.mysql_storage_engine,
+         mysql_charset='utf8')
+ 
+     role = sql.Table(
+@@ -108,7 +108,7 @@ def upgrade(migrate_engine):
+         sql.Column('id', sql.String(length=64), primary_key=True),
+         sql.Column('name', sql.String(length=255), nullable=False),
+         sql.Column('extra', ks_sql.JsonBlob.impl),
+-        mysql_engine='InnoDB',
++        mysql_engine=CONF.database.mysql_storage_engine,
+         mysql_charset='utf8')
+ 
+     service = sql.Table(
+@@ -118,7 +118,7 @@ def upgrade(migrate_engine):
+         sql.Column('enabled', sql.Boolean, nullable=False, default=True,
+                    server_default='1'),
+         sql.Column('extra', ks_sql.JsonBlob.impl),
+-        mysql_engine='InnoDB',
++        mysql_engine=CONF.database.mysql_storage_engine,
+         mysql_charset='utf8')
+ 
+     token = sql.Table(
+@@ -129,7 +129,7 @@ def upgrade(migrate_engine):
+         sql.Column('valid', sql.Boolean, default=True, nullable=False),
+         sql.Column('trust_id', sql.String(length=64)),
+         sql.Column('user_id', sql.String(length=64)),
+-        mysql_engine='InnoDB',
++        mysql_engine=CONF.database.mysql_storage_engine,
+         mysql_charset='utf8')
+ 
+     trust = sql.Table(
+@@ -143,7 +143,7 @@ def upgrade(migrate_engine):
+         sql.Column('expires_at', sql.DateTime),
+         sql.Column('remaining_uses', sql.Integer, nullable=True),
+         sql.Column('extra', ks_sql.JsonBlob.impl),
+-        mysql_engine='InnoDB',
++        mysql_engine=CONF.database.mysql_storage_engine,
+         mysql_charset='utf8')
+ 
+     trust_role = sql.Table(
+@@ -152,7 +152,7 @@ def upgrade(migrate_engine):
+                    nullable=False),
+         sql.Column('role_id', sql.String(length=64), primary_key=True,
+                    nullable=False),
+-        mysql_engine='InnoDB',
++        mysql_engine=CONF.database.mysql_storage_engine,
+         mysql_charset='utf8')
+ 
+     user = sql.Table(
+@@ -164,14 +164,14 @@ def upgrade(migrate_engine):
+         sql.Column('enabled', sql.Boolean),
+         sql.Column('domain_id', sql.String(length=64), nullable=False),
+         sql.Column('default_project_id', sql.String(length=64)),
+-        mysql_engine='InnoDB',
++        mysql_engine=CONF.database.mysql_storage_engine,
+         mysql_charset='utf8')
+ 
+     user_group_membership = sql.Table(
+         'user_group_membership', meta,
+         sql.Column('user_id', sql.String(length=64), primary_key=True),
+         sql.Column('group_id', sql.String(length=64), primary_key=True),
+-        mysql_engine='InnoDB',
++        mysql_engine=CONF.database.mysql_storage_engine,
+         mysql_charset='utf8')
+ 
+     region = sql.Table(
+@@ -181,7 +181,7 @@ def upgrade(migrate_engine):
+         sql.Column('description', sql.String(255), nullable=False),
+         sql.Column('parent_region_id', sql.String(64), nullable=True),
+         sql.Column('extra', sql.Text()),
+-        mysql_engine='InnoDB',
++        mysql_engine=CONF.database.mysql_storage_engine,
+         mysql_charset='utf8')
+ 
+     assignment = sql.Table(
+@@ -199,7 +199,7 @@ def upgrade(migrate_engine):
+         sql.Column('role_id', sql.String(64), nullable=False),
+         sql.Column('inherited', sql.Boolean, default=False, nullable=False),
+         sql.PrimaryKeyConstraint('type', 'actor_id', 'target_id', 'role_id'),
+-        mysql_engine='InnoDB',
++        mysql_engine=CONF.database.mysql_storage_engine,
+         mysql_charset='utf8')
+ 
+     # create all tables
+--- keystone-2015.1.2/keystone/common/sql/migrate_repo/versions/065_add_domain_config.py.orig	2016-02-17 11:31:28.361388817 -0700
++++ keystone-2015.1.2/keystone/common/sql/migrate_repo/versions/065_add_domain_config.py	2016-02-19 13:10:34.283121353 -0700
+@@ -11,8 +11,10 @@
+ # under the License.
+ 
+ import sqlalchemy as sql
+-
+ from keystone.common import sql as ks_sql
++from oslo_config import cfg
++
++CONF = cfg.CONF
+ 
+ WHITELIST_TABLE = 'whitelisted_config'
+ SENSITIVE_TABLE = 'sensitive_config'
+@@ -29,7 +31,7 @@ def upgrade(migrate_engine):
+         sql.Column('group', sql.String(255), primary_key=True),
+         sql.Column('option', sql.String(255), primary_key=True),
+         sql.Column('value', ks_sql.JsonBlob.impl, nullable=False),
+-        mysql_engine='InnoDB',
++        mysql_engine=CONF.database.mysql_storage_engine,
+         mysql_charset='utf8')
+     whitelist_table.create(migrate_engine, checkfirst=True)
+ 
+@@ -40,6 +42,6 @@ def upgrade(migrate_engine):
+         sql.Column('group', sql.String(255), primary_key=True),
+         sql.Column('option', sql.String(255), primary_key=True),
+         sql.Column('value', ks_sql.JsonBlob.impl, nullable=False),
+-        mysql_engine='InnoDB',
++        mysql_engine=CONF.database.mysql_storage_engine,
+         mysql_charset='utf8')
+     sensitive_table.create(migrate_engine, checkfirst=True)
+--- keystone-2015.1.2/keystone/tests/unit/test_sql_upgrade.py.orig	2016-02-17 11:31:28.362966631 -0700
++++ keystone-2015.1.2/keystone/tests/unit/test_sql_upgrade.py	2016-02-19 10:47:11.044395387 -0700
+@@ -663,9 +663,9 @@ class SqlUpgradeTests(SqlMigrateBase):
+         noninnodb = connection.execute("SELECT table_name "
+                                        "from information_schema.TABLES "
+                                        "where TABLE_SCHEMA='%(database)s' "
+-                                       "and ENGINE!='InnoDB' "
++                                       "and ENGINE!='%(mysql_storage_engine)s' "
+                                        "and TABLE_NAME!='migrate_version'" %
+-                                       dict(database=database))
++                                       dict(database=database, mysql_storage_engine=CONF.database.mysql_storage_engine))
+         names = [x[0] for x in noninnodb]
+         self.assertEqual([], names,
+                          "Non-InnoDB tables exist")