components/openstack/keystone/patches/mysql_cluster_support.patch
changeset 6866 4c1935f5ec9a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/keystone/patches/mysql_cluster_support.patch	Thu Sep 08 13:16:06 2016 -0600
@@ -0,0 +1,337 @@
+This patchset is for bug:
+
+24394567 Mitaka Keystone should 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-9.1.0/keystone/common/sql/migrate_repo/versions/067_kilo.py.orig	2016-08-04 10:10:34.947867201 -0700
++++ keystone-9.1.0/keystone/common/sql/migrate_repo/versions/067_kilo.py	2016-08-04 10:16:37.481333376 -0700
+@@ -12,6 +12,7 @@
+ 
+ 
+ import migrate
++from oslo_config import cfg
+ from oslo_log import log
+ import sqlalchemy as sql
+ 
+@@ -21,6 +22,7 @@ from keystone.identity.mapping_backends
+ 
+ 
+ LOG = log.getLogger(__name__)
++CONF = cfg.CONF
+ 
+ 
+ def upgrade(migrate_engine):
+@@ -44,7 +46,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(
+@@ -53,7 +55,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(
+@@ -67,7 +69,7 @@ def upgrade(migrate_engine):
+         sql.Column('enabled', sql.Boolean, nullable=False, default=True,
+                    server_default='1'),
+         sql.Column('region_id', sql.String(length=255), nullable=True),
+-        mysql_engine='InnoDB',
++        mysql_engine=CONF.database.mysql_storage_engine,
+         mysql_charset='utf8')
+ 
+     group = sql.Table(
+@@ -77,7 +79,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(
+@@ -86,7 +88,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(
+@@ -98,7 +100,7 @@ def upgrade(migrate_engine):
+         sql.Column('enabled', sql.Boolean),
+         sql.Column('domain_id', sql.String(length=64), nullable=False),
+         sql.Column('parent_id', sql.String(64), nullable=True),
+-        mysql_engine='InnoDB',
++        mysql_engine=CONF.database.mysql_storage_engine,
+         mysql_charset='utf8')
+ 
+     role = sql.Table(
+@@ -106,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(
+@@ -116,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(
+@@ -127,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(
+@@ -141,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(
+@@ -150,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(
+@@ -162,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(
+@@ -179,7 +181,7 @@ def upgrade(migrate_engine):
+         sql.Column('description', sql.String(255), nullable=False),
+         sql.Column('parent_region_id', sql.String(255), nullable=True),
+         sql.Column('extra', sql.Text()),
+-        mysql_engine='InnoDB',
++        mysql_engine=CONF.database.mysql_storage_engine,
+         mysql_charset='utf8')
+ 
+     assignment = sql.Table(
+@@ -197,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')
+ 
+     mapping = sql.Table(
+@@ -211,7 +213,7 @@ def upgrade(migrate_engine):
+             mapping_backend.EntityType.GROUP,
+             name='entity_type'),
+             nullable=False),
+-        mysql_engine='InnoDB',
++        mysql_engine=CONF.database.mysql_storage_engine,
+         mysql_charset='utf8')
+ 
+     domain_config_whitelist = sql.Table(
+@@ -221,7 +223,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')
+ 
+     domain_config_sensitive = sql.Table(
+@@ -231,7 +233,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')
+ 
+     # create all tables
+--- keystone-9.1.0/keystone/common/sql/migrate_repo/versions/073_insert_assignment_inherited_pk.py.orig	2016-08-04 10:10:40.619013471 -0700
++++ keystone-9.1.0/keystone/common/sql/migrate_repo/versions/073_insert_assignment_inherited_pk.py	2016-08-04 10:18:06.349087340 -0700
+@@ -11,11 +11,13 @@
+ # under the License.
+ 
+ import migrate
++from oslo_config import cfg
+ import sqlalchemy as sql
+ from sqlalchemy.orm import sessionmaker
+ 
+ from keystone.assignment.backends import sql as assignment_sql
+ 
++CONF = cfg.CONF
+ 
+ def upgrade(migrate_engine):
+     """Inserts inherited column to assignment table PK constraints.
+@@ -57,7 +59,7 @@ def upgrade(migrate_engine):
+                        nullable=False),
+             sql.PrimaryKeyConstraint('type', 'actor_id', 'target_id',
+                                      'role_id', 'inherited'),
+-            mysql_engine='InnoDB',
++            mysql_engine=CONF.database.mysql_storage_engine,
+             mysql_charset='utf8')
+ 
+         # Create the new assignment table
+--- keystone-9.1.0/keystone/common/sql/migrate_repo/versions/075_confirm_config_registration.py.orig	2016-08-04 10:10:47.746776861 -0700
++++ keystone-9.1.0/keystone/common/sql/migrate_repo/versions/075_confirm_config_registration.py	2016-08-04 10:19:03.802564813 -0700
+@@ -10,9 +10,11 @@
+ #    License for the specific language governing permissions and limitations
+ #    under the License.
+ 
++from oslo_config import cfg
+ import sqlalchemy as sql
+ 
+ REGISTRATION_TABLE = 'config_register'
++CONF = cfg.CONF
+ 
+ 
+ def upgrade(migrate_engine):
+@@ -24,6 +26,6 @@ def upgrade(migrate_engine):
+         meta,
+         sql.Column('type', sql.String(64), primary_key=True),
+         sql.Column('domain_id', sql.String(64), nullable=False),
+-        mysql_engine='InnoDB',
++        mysql_engine=CONF.database.mysql_storage_engine,
+         mysql_charset='utf8')
+     registration_table.create(migrate_engine, checkfirst=True)
+--- keystone-9.1.0/keystone/common/sql/migrate_repo/versions/081_add_endpoint_policy_table.py.orig	2016-08-04 10:10:53.258335033 -0700
++++ keystone-9.1.0/keystone/common/sql/migrate_repo/versions/081_add_endpoint_policy_table.py	2016-08-04 10:20:06.575865756 -0700
+@@ -12,10 +12,12 @@
+ # License for the specific language governing permissions and limitations
+ # under the License.
+ 
++from oslo_config import cfg
+ import sqlalchemy as sql
+ 
+ from keystone.common.sql import migration_helpers
+ 
++CONF = cfg.CONF
+ 
+ def upgrade(migrate_engine):
+     try:
+@@ -48,7 +50,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-9.1.0/keystone/common/sql/migrate_repo/versions/082_add_federation_tables.py.orig	2016-08-04 10:10:59.098720956 -0700
++++ keystone-9.1.0/keystone/common/sql/migrate_repo/versions/082_add_federation_tables.py	2016-08-04 10:22:41.994100588 -0700
+@@ -45,7 +45,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)
+ 
+@@ -57,7 +57,7 @@ def upgrade(migrate_engine):
+                    sql.ForeignKey('identity_provider.id', ondelete='CASCADE'),
+                    primary_key=True),
+         sql.Column('mapping_id', sql.String(64), nullable=False),
+-        mysql_engine='InnoDB',
++        mysql_engine=CONF.database.mysql_storage_engine,
+         mysql_charset='utf8')
+     federation_protocol_table.create(migrate_engine, checkfirst=True)
+ 
+@@ -66,7 +66,7 @@ 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)
+ 
+@@ -81,7 +81,7 @@ def upgrade(migrate_engine):
+         sql.Column('sp_url', sql.String(256), nullable=False),
+         sql.Column(_RELAY_STATE_PREFIX, sql.String(256), nullable=False,
+                    server_default=relay_state_prefix_default),
+-        mysql_engine='InnoDB',
++        mysql_engine=CONF.database.mysql_storage_engine,
+         mysql_charset='utf8')
+     sp_table.create(migrate_engine, checkfirst=True)
+ 
+@@ -92,6 +92,6 @@ def upgrade(migrate_engine):
+         sql.Column('idp_id', sql.String(64),
+                    sql.ForeignKey('identity_provider.id', ondelete='CASCADE')),
+         sql.Column('remote_id', sql.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-9.1.0/keystone/common/sql/migrate_repo/versions/087_implied_roles.py.orig	2016-08-04 10:11:04.322293468 -0700
++++ keystone-9.1.0/keystone/common/sql/migrate_repo/versions/087_implied_roles.py	2016-08-04 10:23:34.919749416 -0700
+@@ -12,10 +12,12 @@
+ 
+ 
+ import migrate
++from oslo_config import cfg
+ import sqlalchemy as sql
+ 
+ 
+ ROLE_TABLE = 'role'
++CONF = cfg.CONF
+ 
+ 
+ def upgrade(migrate_engine):
+@@ -27,7 +29,7 @@ def upgrade(migrate_engine):
+         sql.Column('prior_role_id', sql.String(length=64), primary_key=True),
+         sql.Column(
+             'implied_role_id', sql.String(length=64), primary_key=True),
+-        mysql_engine='InnoDB',
++        mysql_engine=CONF.database.mysql_storage_engine,
+         mysql_charset='utf8')
+     implied_role.create()
+     role = sql.Table(ROLE_TABLE, meta, autoload=True)