--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/cinder/patches/15-mysql_cluster_support.patch Thu Sep 08 13:16:06 2016 -0600
@@ -0,0 +1,715 @@
+This patchset is for bug:
+
+24394524 Mitaka Cinder should support MySQL Cluster
+
+This fixes the following aspects of Cinder:
+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/cinder/+bug/1564110
+
+
+--- cinder-8.0.0/cinder/db/sqlalchemy/migrate_repo/versions/001_cinder_init.py.orig 2016-08-25 08:57:00.626583510 -0700
++++ cinder-8.0.0/cinder/db/sqlalchemy/migrate_repo/versions/001_cinder_init.py 2016-08-25 09:53:31.239234646 -0700
+@@ -12,8 +12,17 @@
+ # License for the specific language governing permissions and limitations
+ # under the License.
+
++from oslo_config import cfg
+ from sqlalchemy import Boolean, Column, DateTime, ForeignKey
++from sqlalchemy import dialects
+ from sqlalchemy import Integer, MetaData, String, Table
++from sqlalchemy import Text
++
++CONF = cfg.CONF
++
++
++def TinyText():
++ return Text().with_variant(dialects.mysql.TINYTEXT(), 'mysql')
+
+
+ def define_tables(meta):
+@@ -31,7 +40,7 @@ def define_tables(meta):
+ Column('instance_uuid', String(length=255)),
+ Column('old_instance_type_id', Integer),
+ Column('new_instance_type_id', Integer),
+- mysql_engine='InnoDB'
++ mysql_engine=CONF.database.mysql_storage_engine
+ )
+
+ services = Table(
+@@ -47,7 +56,7 @@ def define_tables(meta):
+ Column('report_count', Integer, nullable=False),
+ Column('disabled', Boolean),
+ Column('availability_zone', String(length=255)),
+- mysql_engine='InnoDB'
++ mysql_engine=CONF.database.mysql_storage_engine
+ )
+
+ sm_flavors = Table(
+@@ -59,7 +68,7 @@ def define_tables(meta):
+ Column('id', Integer, primary_key=True, nullable=False),
+ Column('label', String(length=255)),
+ Column('description', String(length=255)),
+- mysql_engine='InnoDB'
++ mysql_engine=CONF.database.mysql_storage_engine
+ )
+
+ sm_backend_config = Table(
+@@ -74,7 +83,7 @@ def define_tables(meta):
+ Column('sr_uuid', String(length=255)),
+ Column('sr_type', String(length=255)),
+ Column('config_params', String(length=2047)),
+- mysql_engine='InnoDB'
++ mysql_engine=CONF.database.mysql_storage_engine
+ )
+
+ sm_volume = Table(
+@@ -90,7 +99,7 @@ def define_tables(meta):
+ Column('backend_id', Integer, ForeignKey('sm_backend_config.id'),
+ nullable=False),
+ Column('vdi_uuid', String(length=255)),
+- mysql_engine='InnoDB'
++ mysql_engine=CONF.database.mysql_storage_engine
+ )
+
+ snapshots = Table(
+@@ -109,7 +118,7 @@ def define_tables(meta):
+ Column('scheduled_at', DateTime),
+ Column('display_name', String(length=255)),
+ Column('display_description', String(length=255)),
+- mysql_engine='InnoDB'
++ mysql_engine=CONF.database.mysql_storage_engine
+ )
+
+ volume_types = Table(
+@@ -120,7 +129,7 @@ def define_tables(meta):
+ Column('deleted', Boolean),
+ Column('id', Integer, primary_key=True, nullable=False),
+ Column('name', String(length=255)),
+- mysql_engine='InnoDB'
++ mysql_engine=CONF.database.mysql_storage_engine
+ )
+
+ volume_metadata = Table(
+@@ -134,7 +143,7 @@ def define_tables(meta):
+ nullable=False),
+ Column('key', String(length=255)),
+ Column('value', String(length=255)),
+- mysql_engine='InnoDB'
++ mysql_engine=CONF.database.mysql_storage_engine
+ )
+
+ volume_type_extra_specs = Table(
+@@ -148,38 +157,69 @@ def define_tables(meta):
+ nullable=False),
+ Column('key', String(length=255)),
+ Column('value', String(length=255)),
+- mysql_engine='InnoDB'
++ mysql_engine=CONF.database.mysql_storage_engine
+ )
+
+- volumes = Table(
+- 'volumes', meta,
+- Column('created_at', DateTime),
+- Column('updated_at', DateTime),
+- Column('deleted_at', DateTime),
+- Column('deleted', Boolean),
+- Column('id', String(length=36), primary_key=True, nullable=False),
+- Column('ec2_id', String(length=255)),
+- Column('user_id', String(length=255)),
+- Column('project_id', String(length=255)),
+- Column('host', String(length=255)),
+- Column('size', Integer),
+- Column('availability_zone', String(length=255)),
+- Column('instance_uuid', String(length=36)),
+- Column('mountpoint', String(length=255)),
+- Column('attach_time', String(length=255)),
+- Column('status', String(length=255)),
+- Column('attach_status', String(length=255)),
+- Column('scheduled_at', DateTime),
+- Column('launched_at', DateTime),
+- Column('terminated_at', DateTime),
+- Column('display_name', String(length=255)),
+- Column('display_description', String(length=255)),
+- Column('provider_location', String(length=256)),
+- Column('provider_auth', String(length=256)),
+- Column('snapshot_id', String(length=36)),
+- Column('volume_type_id', Integer),
+- mysql_engine='InnoDB'
+- )
++ if CONF.database.mysql_storage_engine == 'NDBCLUSTER':
++ volumes = Table(
++ 'volumes', meta,
++ Column('created_at', DateTime),
++ Column('updated_at', DateTime),
++ Column('deleted_at', DateTime),
++ Column('deleted', Boolean),
++ Column('id', String(length=36), primary_key=True, nullable=False),
++ Column('ec2_id', String(length=255)),
++ Column('user_id', String(length=255)),
++ Column('project_id', String(length=255)),
++ Column('host', String(length=255)),
++ Column('size', Integer),
++ Column('availability_zone', TinyText()),
++ Column('instance_uuid', String(length=36)),
++ Column('mountpoint', TinyText()),
++ Column('attach_time', TinyText()),
++ Column('status', String(length=64)),
++ Column('attach_status', String(length=64)),
++ Column('scheduled_at', DateTime),
++ Column('launched_at', DateTime),
++ Column('terminated_at', DateTime),
++ Column('display_name', String(length=255)),
++ Column('display_description', TinyText()),
++ Column('provider_location', String(length=256)),
++ Column('provider_auth', String(length=256)),
++ Column('snapshot_id', String(length=36)),
++ Column('volume_type_id', Integer),
++ mysql_engine=CONF.database.mysql_storage_engine
++ )
++ else:
++ volumes = Table(
++ 'volumes', meta,
++ Column('created_at', DateTime),
++ Column('updated_at', DateTime),
++ Column('deleted_at', DateTime),
++ Column('deleted', Boolean),
++ Column('id', String(length=36), primary_key=True, nullable=False),
++ Column('ec2_id', String(length=255)),
++ Column('user_id', String(length=255)),
++ Column('project_id', String(length=255)),
++ Column('host', String(length=255)),
++ Column('size', Integer),
++ Column('availability_zone', String(length=255)),
++ Column('instance_uuid', String(length=36)),
++ Column('mountpoint', String(length=255)),
++ Column('attach_time', String(length=255)),
++ Column('status', String(length=255)),
++ Column('attach_status', String(length=255)),
++ Column('scheduled_at', DateTime),
++ Column('launched_at', DateTime),
++ Column('terminated_at', DateTime),
++ Column('display_name', String(length=255)),
++ Column('display_description', String(length=255)),
++ Column('provider_location', String(length=256)),
++ Column('provider_auth', String(length=256)),
++ Column('snapshot_id', String(length=36)),
++ Column('volume_type_id', Integer),
++ mysql_engine=CONF.database.mysql_storage_engine
++ )
+
+ quotas = Table(
+ 'quotas', meta,
+@@ -191,7 +231,7 @@ def define_tables(meta):
+ Column('project_id', String(length=255)),
+ Column('resource', String(length=255), nullable=False),
+ Column('hard_limit', Integer),
+- mysql_engine='InnoDB'
++ mysql_engine=CONF.database.mysql_storage_engine
+ )
+
+ iscsi_targets = Table(
+@@ -205,7 +245,7 @@ def define_tables(meta):
+ Column('host', String(length=255)),
+ Column('volume_id', String(length=36), ForeignKey('volumes.id'),
+ nullable=True),
+- mysql_engine='InnoDB'
++ mysql_engine=CONF.database.mysql_storage_engine
+ )
+ return [sm_flavors,
+ sm_backend_config,
+@@ -255,4 +295,5 @@ def upgrade(migrate_engine):
+ migrate_engine.execute(
+ "ALTER DATABASE %s DEFAULT CHARACTER SET utf8" %
+ migrate_engine.url.database)
+- migrate_engine.execute("ALTER TABLE %s Engine=InnoDB" % table)
++ migrate_engine.execute("ALTER TABLE %(db_table)s Engine=%(mysql_storage_engine)s" %
++ dict(db_table=table, mysql_storage_engine=CONF.database.mysql_storage_engine))
+--- cinder-8.0.0/cinder/db/sqlalchemy/migrate_repo/versions/002_quota_class.py.orig 2016-08-25 08:57:08.652633578 -0700
++++ cinder-8.0.0/cinder/db/sqlalchemy/migrate_repo/versions/002_quota_class.py 2016-08-25 08:56:32.039341151 -0700
+@@ -12,9 +12,12 @@
+ # License for the specific language governing permissions and limitations
+ # under the License.
+
++from oslo_config import cfg
+ from sqlalchemy import Boolean, Column, DateTime
+ from sqlalchemy import MetaData, Integer, String, Table, ForeignKey
+
++CONF = cfg.CONF
++
+
+ def upgrade(migrate_engine):
+ meta = MetaData()
+@@ -34,7 +37,7 @@ def upgrade(migrate_engine):
+ Column('resource',
+ String(length=255)),
+ Column('hard_limit', Integer(), nullable=True),
+- mysql_engine='InnoDB',
++ mysql_engine=CONF.database.mysql_storage_engine,
+ mysql_charset='utf8',
+ )
+
+@@ -55,7 +58,7 @@ def upgrade(migrate_engine):
+ Column('in_use', Integer(), nullable=False),
+ Column('reserved', Integer(), nullable=False),
+ Column('until_refresh', Integer(), nullable=True),
+- mysql_engine='InnoDB',
++ mysql_engine=CONF.database.mysql_storage_engine,
+ mysql_charset='utf8',
+ )
+
+@@ -82,7 +85,7 @@ def upgrade(migrate_engine):
+ String(length=255)),
+ Column('delta', Integer(), nullable=False),
+ Column('expire', DateTime(timezone=False)),
+- mysql_engine='InnoDB',
++ mysql_engine=CONF.database.mysql_storage_engine,
+ mysql_charset='utf8',
+ )
+
+--- cinder-8.0.0/cinder/db/sqlalchemy/migrate_repo/versions/003_glance_metadata.py.orig 2016-08-25 08:57:16.312610448 -0700
++++ cinder-8.0.0/cinder/db/sqlalchemy/migrate_repo/versions/003_glance_metadata.py 2016-08-25 08:56:32.040239306 -0700
+@@ -12,9 +12,12 @@
+ # License for the specific language governing permissions and limitations
+ # under the License.
+
++from oslo_config import cfg
+ from sqlalchemy import Column, DateTime, Text, Boolean
+ from sqlalchemy import MetaData, Integer, String, Table, ForeignKey
+
++CONF = cfg.CONF
++
+
+ def upgrade(migrate_engine):
+ meta = MetaData()
+@@ -26,11 +29,11 @@ def upgrade(migrate_engine):
+ Table('volumes',
+ meta,
+ Column('id', Integer(), primary_key=True, nullable=False),
+- mysql_engine='InnoDB')
++ mysql_engine=CONF.database.mysql_storage_engine)
+ Table('snapshots',
+ meta,
+ Column('id', Integer(), primary_key=True, nullable=False),
+- mysql_engine='InnoDB')
++ mysql_engine=CONF.database.mysql_storage_engine)
+ # Create new table
+ volume_glance_metadata = Table(
+ 'volume_glance_metadata',
+@@ -45,7 +48,7 @@ def upgrade(migrate_engine):
+ ForeignKey('snapshots.id')),
+ Column('key', String(255)),
+ Column('value', Text),
+- mysql_engine='InnoDB'
++ mysql_engine=CONF.database.mysql_storage_engine
+ )
+
+ try:
+--- cinder-8.0.0/cinder/db/sqlalchemy/migrate_repo/versions/008_add_backup.py.orig 2016-08-25 08:57:23.692681043 -0700
++++ cinder-8.0.0/cinder/db/sqlalchemy/migrate_repo/versions/008_add_backup.py 2016-08-25 08:56:32.041089963 -0700
+@@ -13,9 +13,12 @@
+ # License for the specific language governing permissions and limitations
+ # under the License.
+
++from oslo_config import cfg
+ from sqlalchemy import Boolean, Column, DateTime
+ from sqlalchemy import MetaData, Integer, String, Table
+
++CONF = cfg.CONF
++
+
+ def upgrade(migrate_engine):
+ meta = MetaData()
+@@ -43,7 +46,7 @@ def upgrade(migrate_engine):
+ Column('service', String(length=255)),
+ Column('size', Integer()),
+ Column('object_count', Integer()),
+- mysql_engine='InnoDB'
++ mysql_engine=CONF.database.mysql_storage_engine
+ )
+
+ backups.create()
+--- cinder-8.0.0/cinder/db/sqlalchemy/migrate_repo/versions/009_add_snapshot_metadata_table.py.orig 2016-08-25 08:57:30.092571835 -0700
++++ cinder-8.0.0/cinder/db/sqlalchemy/migrate_repo/versions/009_add_snapshot_metadata_table.py 2016-08-25 08:56:32.041930428 -0700
+@@ -10,9 +10,12 @@
+ # License for the specific language governing permissions and limitations
+ # under the License.
+
++from oslo_config import cfg
+ from sqlalchemy import Boolean, Column, DateTime
+ from sqlalchemy import Integer, MetaData, String, Table, ForeignKey
+
++CONF = cfg.CONF
++
+
+ def upgrade(migrate_engine):
+ meta = MetaData()
+@@ -32,7 +35,7 @@ def upgrade(migrate_engine):
+ nullable=False),
+ Column('key', String(length=255)),
+ Column('value', String(length=255)),
+- mysql_engine='InnoDB'
++ mysql_engine=CONF.database.mysql_storage_engine
+ )
+
+ snapshot_metadata.create()
+--- cinder-8.0.0/cinder/db/sqlalchemy/migrate_repo/versions/010_add_transfers_table.py.orig 2016-08-25 08:57:36.677754626 -0700
++++ cinder-8.0.0/cinder/db/sqlalchemy/migrate_repo/versions/010_add_transfers_table.py 2016-08-25 08:56:32.042766768 -0700
+@@ -10,9 +10,12 @@
+ # License for the specific language governing permissions and limitations
+ # under the License.
+
++from oslo_config import cfg
+ from sqlalchemy import Boolean, Column, DateTime
+ from sqlalchemy import MetaData, String, Table, ForeignKey
+
++CONF = cfg.CONF
++
+
+ def upgrade(migrate_engine):
+ meta = MetaData()
+@@ -34,7 +37,7 @@ def upgrade(migrate_engine):
+ Column('salt', String(length=255)),
+ Column('crypt_hash', String(length=255)),
+ Column('expires_at', DateTime(timezone=False)),
+- mysql_engine='InnoDB',
++ mysql_engine=CONF.database.mysql_storage_engine,
+ mysql_charset='utf8'
+ )
+
+--- cinder-8.0.0/cinder/db/sqlalchemy/migrate_repo/versions/017_add_encryption_information.py.orig 2016-08-25 08:57:43.340435246 -0700
++++ cinder-8.0.0/cinder/db/sqlalchemy/migrate_repo/versions/017_add_encryption_information.py 2016-08-25 08:56:32.043630671 -0700
+@@ -13,9 +13,12 @@
+ # License for the specific language governing permissions and limitations
+ # under the License.
+
++from oslo_config import cfg
+ from sqlalchemy import Column, ForeignKey, MetaData, Table
+ from sqlalchemy import Boolean, DateTime, Integer, String
+
++CONF = cfg.CONF
++
+
+ def upgrade(migrate_engine):
+ meta = MetaData(bind=migrate_engine)
+@@ -51,9 +54,9 @@ def upgrade(migrate_engine):
+ # scheme unless each volume type is associated with at most one
+ # encryption scheme.
+ Column('volume_type_id', String(length=36),
+- ForeignKey(volume_types.c.id),
++ ForeignKey(volume_types.c.id, name='encryption_ibfk_1'),
+ primary_key=True, nullable=False),
+- mysql_engine='InnoDB',
++ mysql_engine=CONF.database.mysql_storage_engine,
+ mysql_charset='utf8'
+ )
+
+--- cinder-8.0.0/cinder/db/sqlalchemy/migrate_repo/versions/018_add_qos_specs.py.orig 2016-08-25 08:57:51.329501203 -0700
++++ cinder-8.0.0/cinder/db/sqlalchemy/migrate_repo/versions/018_add_qos_specs.py 2016-08-25 08:56:32.044466643 -0700
+@@ -14,9 +14,12 @@
+ # License for the specific language governing permissions and limitations
+ # under the License.
+
++from oslo_config import cfg
+ from sqlalchemy import Boolean, Column, DateTime
+ from sqlalchemy import ForeignKey, MetaData, String, Table
+
++CONF = cfg.CONF
++
+
+ def upgrade(migrate_engine):
+ """Add volume_type_rate_limit table."""
+@@ -34,7 +37,7 @@ def upgrade(migrate_engine):
+ ForeignKey('quality_of_service_specs.id')),
+ Column('key', String(255)),
+ Column('value', String(255)),
+- mysql_engine='InnoDB',
++ mysql_engine=CONF.database.mysql_storage_engine,
+ mysql_charset='utf8'
+ )
+
+--- cinder-8.0.0/cinder/db/sqlalchemy/migrate_repo/versions/020_add_volume_admin_metadata_table.py.orig 2016-08-25 08:58:01.270351421 -0700
++++ cinder-8.0.0/cinder/db/sqlalchemy/migrate_repo/versions/020_add_volume_admin_metadata_table.py 2016-08-25 08:56:32.045303898 -0700
+@@ -10,9 +10,12 @@
+ # License for the specific language governing permissions and limitations
+ # under the License.
+
++from oslo_config import cfg
+ from sqlalchemy import Boolean, Column, DateTime
+ from sqlalchemy import Integer, MetaData, String, Table, ForeignKey
+
++CONF = cfg.CONF
++
+
+ def upgrade(migrate_engine):
+ meta = MetaData()
+@@ -32,7 +35,7 @@ def upgrade(migrate_engine):
+ nullable=False),
+ Column('key', String(length=255)),
+ Column('value', String(length=255)),
+- mysql_engine='InnoDB',
++ mysql_engine=CONF.database.mysql_storage_engine,
+ mysql_charset='utf8'
+ )
+
+--- cinder-8.0.0/cinder/db/sqlalchemy/migrate_repo/versions/025_add_consistencygroup.py.orig 2016-08-25 08:58:07.982189985 -0700
++++ cinder-8.0.0/cinder/db/sqlalchemy/migrate_repo/versions/025_add_consistencygroup.py 2016-08-25 08:56:32.046312221 -0700
+@@ -13,9 +13,12 @@
+ # License for the specific language governing permissions and limitations
+ # under the License.
+
++from oslo_config import cfg
+ from sqlalchemy import Boolean, Column, DateTime
+ from sqlalchemy import ForeignKey, MetaData, String, Table
+
++CONF = cfg.CONF
++
+
+ def upgrade(migrate_engine):
+ meta = MetaData()
+@@ -37,7 +40,7 @@ def upgrade(migrate_engine):
+ Column('description', String(length=255)),
+ Column('volume_type_id', String(length=255)),
+ Column('status', String(length=255)),
+- mysql_engine='InnoDB',
++ mysql_engine=CONF.database.mysql_storage_engine,
+ mysql_charset='utf8',
+ )
+
+@@ -59,7 +62,7 @@ def upgrade(migrate_engine):
+ Column('name', String(length=255)),
+ Column('description', String(length=255)),
+ Column('status', String(length=255)),
+- mysql_engine='InnoDB',
++ mysql_engine=CONF.database.mysql_storage_engine,
+ mysql_charset='utf8',
+ )
+
+--- cinder-8.0.0/cinder/db/sqlalchemy/migrate_repo/versions/032_add_volume_type_projects.py.orig 2016-08-25 08:58:14.732428526 -0700
++++ cinder-8.0.0/cinder/db/sqlalchemy/migrate_repo/versions/032_add_volume_type_projects.py 2016-08-25 08:56:32.047162211 -0700
+@@ -10,9 +10,12 @@
+ # License for the specific language governing permissions and limitations
+ # under the License.
+
++from oslo_config import cfg
+ from sqlalchemy import Boolean, Column, DateTime, UniqueConstraint
+ from sqlalchemy import Integer, MetaData, String, Table, ForeignKey
+
++CONF = cfg.CONF
++
+
+ def upgrade(migrate_engine):
+ meta = MetaData()
+@@ -35,7 +38,7 @@ def upgrade(migrate_engine):
+ Column('project_id', String(length=255)),
+ Column('deleted', Boolean(create_constraint=True, name=None)),
+ UniqueConstraint('volume_type_id', 'project_id', 'deleted'),
+- mysql_engine='InnoDB',
++ mysql_engine=CONF.database.mysql_storage_engine,
+ )
+
+ volume_type_projects.create()
+--- cinder-8.0.0/cinder/db/sqlalchemy/migrate_repo/versions/038_add_driver_initiator_data_table.py.orig 2016-08-25 08:58:22.055008365 -0700
++++ cinder-8.0.0/cinder/db/sqlalchemy/migrate_repo/versions/038_add_driver_initiator_data_table.py 2016-08-25 08:56:32.048168233 -0700
+@@ -10,9 +10,12 @@
+ # License for the specific language governing permissions and limitations
+ # under the License.
+
++from oslo_config import cfg
+ from sqlalchemy import Column, DateTime, Integer
+ from sqlalchemy import MetaData, String, Table, UniqueConstraint
+
++CONF = cfg.CONF
++
+
+ def upgrade(migrate_engine):
+ meta = MetaData()
+@@ -29,7 +32,7 @@ def upgrade(migrate_engine):
+ Column('key', String(length=255), nullable=False),
+ Column('value', String(length=255)),
+ UniqueConstraint('initiator', 'namespace', 'key'),
+- mysql_engine='InnoDB',
++ mysql_engine=CONF.database.mysql_storage_engine,
+ mysql_charset='utf8'
+ )
+
+--- cinder-8.0.0/cinder/db/sqlalchemy/migrate_repo/versions/040_add_volume_attachment.py.orig 2016-08-25 08:58:30.054762283 -0700
++++ cinder-8.0.0/cinder/db/sqlalchemy/migrate_repo/versions/040_add_volume_attachment.py 2016-08-25 08:56:32.049123043 -0700
+@@ -16,11 +16,13 @@
+ import datetime
+ import uuid
+
++from oslo_config import cfg
+ import six
+ from sqlalchemy import Boolean, Column, DateTime
+ from sqlalchemy import ForeignKey, MetaData, String, Table
+
+ CREATED_AT = datetime.datetime.now() # noqa
++CONF = cfg.CONF
+
+
+ def upgrade(migrate_engine):
+@@ -51,7 +53,7 @@ def upgrade(migrate_engine):
+ Column('detach_time', DateTime),
+ Column('attach_mode', String(length=36)),
+ Column('attach_status', String(length=255)),
+- mysql_engine='InnoDB'
++ mysql_engine=CONF.database.mysql_storage_engine
+ )
+
+ volume_attachment.create()
+--- cinder-8.0.0/cinder/db/sqlalchemy/migrate_repo/versions/055_add_image_volume_cache_table.py.orig 2016-08-25 08:58:37.835313620 -0700
++++ cinder-8.0.0/cinder/db/sqlalchemy/migrate_repo/versions/055_add_image_volume_cache_table.py 2016-08-25 08:56:32.049959998 -0700
+@@ -12,9 +12,12 @@
+ # License for the specific language governing permissions and limitations
+ # under the License.
+
++from oslo_config import cfg
+ from sqlalchemy import Column, DateTime, Integer
+ from sqlalchemy import MetaData, String, Table
+
++CONF = cfg.CONF
++
+
+ def upgrade(migrate_engine):
+ meta = MetaData()
+@@ -30,7 +33,7 @@ def upgrade(migrate_engine):
+ Column('volume_id', String(length=36), nullable=False),
+ Column('size', Integer, nullable=False),
+ Column('last_used', DateTime, nullable=False),
+- mysql_engine='InnoDB',
++ mysql_engine=CONF.database.mysql_storage_engine,
+ mysql_charset='utf8'
+ )
+
+--- cinder-8.0.0/cinder/db/sqlalchemy/migrate_repo/versions/067_readd_iscsi_targets_table.py.orig 2016-08-25 08:58:44.335850305 -0700
++++ cinder-8.0.0/cinder/db/sqlalchemy/migrate_repo/versions/067_readd_iscsi_targets_table.py 2016-08-25 08:56:32.050821951 -0700
+@@ -10,9 +10,12 @@
+ # License for the specific language governing permissions and limitations
+ # under the License.
+
++from oslo_config import cfg
+ from sqlalchemy import Boolean, Column, DateTime, ForeignKey
+ from sqlalchemy import Integer, MetaData, String, Table
+
++CONF = cfg.CONF
++
+
+ def upgrade(migrate_engine):
+ meta = MetaData()
+@@ -30,7 +33,7 @@ def upgrade(migrate_engine):
+ Column('host', String(length=255)),
+ Column('volume_id', String(length=36), ForeignKey('volumes.id'),
+ nullable=True),
+- mysql_engine='InnoDB',
++ mysql_engine=CONF.database.mysql_storage_engine,
+ mysql_charset='utf8'
+ )
+
+--- cinder-8.0.0/cinder/db/sqlalchemy/models.py.orig 2016-08-25 08:58:53.030663246 -0700
++++ cinder-8.0.0/cinder/db/sqlalchemy/models.py 2016-08-25 10:02:19.406765223 -0700
+@@ -24,6 +24,7 @@ from oslo_config import cfg
+ from oslo_db.sqlalchemy import models
+ from oslo_utils import timeutils
+ from sqlalchemy import Column, Integer, String, Text, schema
++from sqlalchemy import dialects
+ from sqlalchemy.ext.declarative import declarative_base
+ from sqlalchemy import ForeignKey, DateTime, Boolean
+ from sqlalchemy.orm import relationship, backref, validates
+@@ -33,11 +34,15 @@ CONF = cfg.CONF
+ BASE = declarative_base()
+
+
++def TinyText():
++ return Text().with_variant(dialects.mysql.TINYTEXT(), 'mysql')
++
++
+ class CinderBase(models.TimestampMixin,
+ models.ModelBase):
+ """Base class for Cinder Models."""
+
+- __table_args__ = {'mysql_engine': 'InnoDB'}
++ __table_args__ = {'mysql_engine': CONF.database.mysql_storage_engine}
+
+ # TODO(rpodolyaka): reuse models.SoftDeleteMixin in the next stage
+ # of implementing of BP db-cleanup
+@@ -150,9 +155,16 @@ class Volume(BASE, CinderBase):
+
+ host = Column(String(255)) # , ForeignKey('hosts.id'))
+ size = Column(Integer)
+- availability_zone = Column(String(255)) # TODO(vish): foreign key?
+- status = Column(String(255)) # TODO(vish): enum?
+- attach_status = Column(String(255)) # TODO(vish): enum
++
++ if CONF.database.mysql_storage_engine == 'NDBCLUSTER':
++ availability_zone = Column(TinyText())
++ status = Column(String(64))
++ attach_status = Column(String(64))
++ else:
++ availability_zone = Column(String(255)) # TODO(vish): foreign key?
++ status = Column(String(255)) # TODO(vish): enum?
++ attach_status = Column(String(255)) # TODO(vish): enum
++
+ migration_status = Column(String(255))
+
+ scheduled_at = Column(DateTime)
+@@ -160,7 +172,11 @@ class Volume(BASE, CinderBase):
+ terminated_at = Column(DateTime)
+
+ display_name = Column(String(255))
+- display_description = Column(String(255))
++
++ if CONF.database.mysql_storage_engine == 'NDBCLUSTER':
++ display_description = Column(TinyText())
++ else:
++ display_description = Column(String(255))
+
+ provider_location = Column(String(255))
+ provider_auth = Column(String(255))
+@@ -592,7 +608,7 @@ class DriverInitiatorData(BASE, models.T
+ __tablename__ = 'driver_initiator_data'
+ __table_args__ = (
+ schema.UniqueConstraint("initiator", "namespace", "key"),
+- {'mysql_engine': 'InnoDB'}
++ {'mysql_engine': CONF.database.mysql_storage_engine}
+ )
+ id = Column(Integer, primary_key=True, nullable=False)
+ initiator = Column(String(255), index=True, nullable=False)
+--- cinder-8.0.0/cinder/tests/unit/test_migrations.py.orig 2016-08-25 08:59:01.630728551 -0700
++++ cinder-8.0.0/cinder/tests/unit/test_migrations.py 2016-08-25 08:56:32.054462196 -0700
+@@ -25,6 +25,7 @@ import uuid
+ import fixtures
+ from migrate.versioning import api as migration_api
+ from migrate.versioning import repository
++from oslo_config import cfg
+ from oslo_db.sqlalchemy import test_base
+ from oslo_db.sqlalchemy import test_migrations
+ from oslo_db.sqlalchemy import utils as db_utils
+@@ -33,6 +34,8 @@ import sqlalchemy
+ from cinder.db import migration
+ import cinder.db.sqlalchemy.migrate_repo
+
++CONF = cfg.CONF
++
+
+ class MigrationsMixin(test_migrations.WalkVersionsMixin):
+ """Test sqlalchemy-migrate migrations."""
+@@ -842,8 +845,9 @@ class TestMysqlMigrations(test_base.MySQ
+ "SELECT count(*) "
+ "from information_schema.TABLES "
+ "where TABLE_SCHEMA='openstack_citest' "
+- "and ENGINE!='InnoDB' "
+- "and TABLE_NAME!='migrate_version'")
++ "and ENGINE!='%(mysql_storage_engine)s' "
++ "and TABLE_NAME!='migrate_version'" %
++ dict(mysql_storage_engine=CONF.database.mysql_storage_engine))
+ count = noninnodb.scalar()
+ self.assertEqual(count, 0, "%d non InnoDB tables created" % count)
+