--- /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")