components/openstack/cinder/patches/15-mysql_cluster_support.patch
changeset 6866 4c1935f5ec9a
equal deleted inserted replaced
6865:1cc50ab79b8c 6866:4c1935f5ec9a
       
     1 This patchset is for bug:
       
     2 
       
     3 24394524 Mitaka Cinder should support MySQL Cluster
       
     4 
       
     5 This fixes the following aspects of Cinder:
       
     6 1. Implementation of an oslo.db configuration parameter to specify the MySQL
       
     7    storage engine (mysql_storage_engine).
       
     8 2. Replacement of hardcoded SQL statements that set the engine to "InnoDB"
       
     9    to the above configuration value.
       
    10 3. Logic to handle SQL differences between MySQL InnoDB and MySQL Cluster (NDB).
       
    11    This includes column lengths, constraints, foreign keys, and indexes.
       
    12 
       
    13 This has not been committed upstream, but has been filed in launchpad:
       
    14 
       
    15 https://bugs.launchpad.net/cinder/+bug/1564110
       
    16 
       
    17 
       
    18 --- cinder-8.0.0/cinder/db/sqlalchemy/migrate_repo/versions/001_cinder_init.py.orig	2016-08-25 08:57:00.626583510 -0700
       
    19 +++ cinder-8.0.0/cinder/db/sqlalchemy/migrate_repo/versions/001_cinder_init.py	2016-08-25 09:53:31.239234646 -0700
       
    20 @@ -12,8 +12,17 @@
       
    21  #    License for the specific language governing permissions and limitations
       
    22  #    under the License.
       
    23  
       
    24 +from oslo_config import cfg
       
    25  from sqlalchemy import Boolean, Column, DateTime, ForeignKey
       
    26 +from sqlalchemy import dialects
       
    27  from sqlalchemy import Integer, MetaData, String, Table
       
    28 +from sqlalchemy import Text
       
    29 +
       
    30 +CONF = cfg.CONF
       
    31 +
       
    32 +
       
    33 +def TinyText():
       
    34 +    return Text().with_variant(dialects.mysql.TINYTEXT(), 'mysql')
       
    35  
       
    36  
       
    37  def define_tables(meta):
       
    38 @@ -31,7 +40,7 @@ def define_tables(meta):
       
    39          Column('instance_uuid', String(length=255)),
       
    40          Column('old_instance_type_id', Integer),
       
    41          Column('new_instance_type_id', Integer),
       
    42 -        mysql_engine='InnoDB'
       
    43 +        mysql_engine=CONF.database.mysql_storage_engine
       
    44      )
       
    45  
       
    46      services = Table(
       
    47 @@ -47,7 +56,7 @@ def define_tables(meta):
       
    48          Column('report_count', Integer, nullable=False),
       
    49          Column('disabled', Boolean),
       
    50          Column('availability_zone', String(length=255)),
       
    51 -        mysql_engine='InnoDB'
       
    52 +        mysql_engine=CONF.database.mysql_storage_engine
       
    53      )
       
    54  
       
    55      sm_flavors = Table(
       
    56 @@ -59,7 +68,7 @@ def define_tables(meta):
       
    57          Column('id', Integer, primary_key=True, nullable=False),
       
    58          Column('label', String(length=255)),
       
    59          Column('description', String(length=255)),
       
    60 -        mysql_engine='InnoDB'
       
    61 +        mysql_engine=CONF.database.mysql_storage_engine
       
    62      )
       
    63  
       
    64      sm_backend_config = Table(
       
    65 @@ -74,7 +83,7 @@ def define_tables(meta):
       
    66          Column('sr_uuid', String(length=255)),
       
    67          Column('sr_type', String(length=255)),
       
    68          Column('config_params', String(length=2047)),
       
    69 -        mysql_engine='InnoDB'
       
    70 +        mysql_engine=CONF.database.mysql_storage_engine
       
    71      )
       
    72  
       
    73      sm_volume = Table(
       
    74 @@ -90,7 +99,7 @@ def define_tables(meta):
       
    75          Column('backend_id', Integer, ForeignKey('sm_backend_config.id'),
       
    76                 nullable=False),
       
    77          Column('vdi_uuid', String(length=255)),
       
    78 -        mysql_engine='InnoDB'
       
    79 +        mysql_engine=CONF.database.mysql_storage_engine
       
    80      )
       
    81  
       
    82      snapshots = Table(
       
    83 @@ -109,7 +118,7 @@ def define_tables(meta):
       
    84          Column('scheduled_at', DateTime),
       
    85          Column('display_name', String(length=255)),
       
    86          Column('display_description', String(length=255)),
       
    87 -        mysql_engine='InnoDB'
       
    88 +        mysql_engine=CONF.database.mysql_storage_engine
       
    89      )
       
    90  
       
    91      volume_types = Table(
       
    92 @@ -120,7 +129,7 @@ def define_tables(meta):
       
    93          Column('deleted', Boolean),
       
    94          Column('id', Integer, primary_key=True, nullable=False),
       
    95          Column('name', String(length=255)),
       
    96 -        mysql_engine='InnoDB'
       
    97 +        mysql_engine=CONF.database.mysql_storage_engine
       
    98      )
       
    99  
       
   100      volume_metadata = Table(
       
   101 @@ -134,7 +143,7 @@ def define_tables(meta):
       
   102                 nullable=False),
       
   103          Column('key', String(length=255)),
       
   104          Column('value', String(length=255)),
       
   105 -        mysql_engine='InnoDB'
       
   106 +        mysql_engine=CONF.database.mysql_storage_engine
       
   107      )
       
   108  
       
   109      volume_type_extra_specs = Table(
       
   110 @@ -148,38 +157,69 @@ def define_tables(meta):
       
   111                 nullable=False),
       
   112          Column('key', String(length=255)),
       
   113          Column('value', String(length=255)),
       
   114 -        mysql_engine='InnoDB'
       
   115 +        mysql_engine=CONF.database.mysql_storage_engine
       
   116      )
       
   117  
       
   118 -    volumes = Table(
       
   119 -        'volumes', meta,
       
   120 -        Column('created_at', DateTime),
       
   121 -        Column('updated_at', DateTime),
       
   122 -        Column('deleted_at', DateTime),
       
   123 -        Column('deleted', Boolean),
       
   124 -        Column('id', String(length=36), primary_key=True, nullable=False),
       
   125 -        Column('ec2_id', String(length=255)),
       
   126 -        Column('user_id', String(length=255)),
       
   127 -        Column('project_id', String(length=255)),
       
   128 -        Column('host', String(length=255)),
       
   129 -        Column('size', Integer),
       
   130 -        Column('availability_zone', String(length=255)),
       
   131 -        Column('instance_uuid', String(length=36)),
       
   132 -        Column('mountpoint', String(length=255)),
       
   133 -        Column('attach_time', String(length=255)),
       
   134 -        Column('status', String(length=255)),
       
   135 -        Column('attach_status', String(length=255)),
       
   136 -        Column('scheduled_at', DateTime),
       
   137 -        Column('launched_at', DateTime),
       
   138 -        Column('terminated_at', DateTime),
       
   139 -        Column('display_name', String(length=255)),
       
   140 -        Column('display_description', String(length=255)),
       
   141 -        Column('provider_location', String(length=256)),
       
   142 -        Column('provider_auth', String(length=256)),
       
   143 -        Column('snapshot_id', String(length=36)),
       
   144 -        Column('volume_type_id', Integer),
       
   145 -        mysql_engine='InnoDB'
       
   146 -    )
       
   147 +    if CONF.database.mysql_storage_engine == 'NDBCLUSTER':
       
   148 +        volumes = Table(
       
   149 +            'volumes', meta,
       
   150 +            Column('created_at', DateTime),
       
   151 +            Column('updated_at', DateTime),
       
   152 +            Column('deleted_at', DateTime),
       
   153 +            Column('deleted', Boolean),
       
   154 +            Column('id', String(length=36), primary_key=True, nullable=False),
       
   155 +            Column('ec2_id', String(length=255)),
       
   156 +            Column('user_id', String(length=255)),
       
   157 +            Column('project_id', String(length=255)),
       
   158 +            Column('host', String(length=255)),
       
   159 +            Column('size', Integer),
       
   160 +            Column('availability_zone', TinyText()),
       
   161 +            Column('instance_uuid', String(length=36)),
       
   162 +            Column('mountpoint', TinyText()),
       
   163 +            Column('attach_time', TinyText()),
       
   164 +            Column('status', String(length=64)),
       
   165 +            Column('attach_status', String(length=64)),
       
   166 +            Column('scheduled_at', DateTime),
       
   167 +            Column('launched_at', DateTime),
       
   168 +            Column('terminated_at', DateTime),
       
   169 +            Column('display_name', String(length=255)),
       
   170 +            Column('display_description', TinyText()),
       
   171 +            Column('provider_location', String(length=256)),
       
   172 +            Column('provider_auth', String(length=256)),
       
   173 +            Column('snapshot_id', String(length=36)),
       
   174 +            Column('volume_type_id', Integer),
       
   175 +            mysql_engine=CONF.database.mysql_storage_engine
       
   176 +        )
       
   177 +    else:
       
   178 +        volumes = Table(
       
   179 +            'volumes', meta,
       
   180 +            Column('created_at', DateTime),
       
   181 +            Column('updated_at', DateTime),
       
   182 +            Column('deleted_at', DateTime),
       
   183 +            Column('deleted', Boolean),
       
   184 +            Column('id', String(length=36), primary_key=True, nullable=False),
       
   185 +            Column('ec2_id', String(length=255)),
       
   186 +            Column('user_id', String(length=255)),
       
   187 +            Column('project_id', String(length=255)),
       
   188 +            Column('host', String(length=255)),
       
   189 +            Column('size', Integer),
       
   190 +            Column('availability_zone', String(length=255)),
       
   191 +            Column('instance_uuid', String(length=36)),
       
   192 +            Column('mountpoint', String(length=255)),
       
   193 +            Column('attach_time', String(length=255)),
       
   194 +            Column('status', String(length=255)),
       
   195 +            Column('attach_status', String(length=255)),
       
   196 +            Column('scheduled_at', DateTime),
       
   197 +            Column('launched_at', DateTime),
       
   198 +            Column('terminated_at', DateTime),
       
   199 +            Column('display_name', String(length=255)),
       
   200 +            Column('display_description', String(length=255)),
       
   201 +            Column('provider_location', String(length=256)),
       
   202 +            Column('provider_auth', String(length=256)),
       
   203 +            Column('snapshot_id', String(length=36)),
       
   204 +            Column('volume_type_id', Integer),
       
   205 +            mysql_engine=CONF.database.mysql_storage_engine
       
   206 +        )
       
   207  
       
   208      quotas = Table(
       
   209          'quotas', meta,
       
   210 @@ -191,7 +231,7 @@ def define_tables(meta):
       
   211          Column('project_id', String(length=255)),
       
   212          Column('resource', String(length=255), nullable=False),
       
   213          Column('hard_limit', Integer),
       
   214 -        mysql_engine='InnoDB'
       
   215 +        mysql_engine=CONF.database.mysql_storage_engine
       
   216      )
       
   217  
       
   218      iscsi_targets = Table(
       
   219 @@ -205,7 +245,7 @@ def define_tables(meta):
       
   220          Column('host', String(length=255)),
       
   221          Column('volume_id', String(length=36), ForeignKey('volumes.id'),
       
   222                 nullable=True),
       
   223 -        mysql_engine='InnoDB'
       
   224 +        mysql_engine=CONF.database.mysql_storage_engine
       
   225      )
       
   226      return [sm_flavors,
       
   227              sm_backend_config,
       
   228 @@ -255,4 +295,5 @@ def upgrade(migrate_engine):
       
   229          migrate_engine.execute(
       
   230              "ALTER DATABASE %s DEFAULT CHARACTER SET utf8" %
       
   231              migrate_engine.url.database)
       
   232 -        migrate_engine.execute("ALTER TABLE %s Engine=InnoDB" % table)
       
   233 +        migrate_engine.execute("ALTER TABLE %(db_table)s Engine=%(mysql_storage_engine)s" %
       
   234 +                               dict(db_table=table, mysql_storage_engine=CONF.database.mysql_storage_engine))
       
   235 --- cinder-8.0.0/cinder/db/sqlalchemy/migrate_repo/versions/002_quota_class.py.orig	2016-08-25 08:57:08.652633578 -0700
       
   236 +++ cinder-8.0.0/cinder/db/sqlalchemy/migrate_repo/versions/002_quota_class.py	2016-08-25 08:56:32.039341151 -0700
       
   237 @@ -12,9 +12,12 @@
       
   238  #    License for the specific language governing permissions and limitations
       
   239  #    under the License.
       
   240  
       
   241 +from oslo_config import cfg
       
   242  from sqlalchemy import Boolean, Column, DateTime
       
   243  from sqlalchemy import MetaData, Integer, String, Table, ForeignKey
       
   244  
       
   245 +CONF = cfg.CONF
       
   246 +
       
   247  
       
   248  def upgrade(migrate_engine):
       
   249      meta = MetaData()
       
   250 @@ -34,7 +37,7 @@ def upgrade(migrate_engine):
       
   251                            Column('resource',
       
   252                                   String(length=255)),
       
   253                            Column('hard_limit', Integer(), nullable=True),
       
   254 -                          mysql_engine='InnoDB',
       
   255 +                          mysql_engine=CONF.database.mysql_storage_engine,
       
   256                            mysql_charset='utf8',
       
   257                            )
       
   258  
       
   259 @@ -55,7 +58,7 @@ def upgrade(migrate_engine):
       
   260                           Column('in_use', Integer(), nullable=False),
       
   261                           Column('reserved', Integer(), nullable=False),
       
   262                           Column('until_refresh', Integer(), nullable=True),
       
   263 -                         mysql_engine='InnoDB',
       
   264 +                         mysql_engine=CONF.database.mysql_storage_engine,
       
   265                           mysql_charset='utf8',
       
   266                           )
       
   267  
       
   268 @@ -82,7 +85,7 @@ def upgrade(migrate_engine):
       
   269                                  String(length=255)),
       
   270                           Column('delta', Integer(), nullable=False),
       
   271                           Column('expire', DateTime(timezone=False)),
       
   272 -                         mysql_engine='InnoDB',
       
   273 +                         mysql_engine=CONF.database.mysql_storage_engine,
       
   274                           mysql_charset='utf8',
       
   275                           )
       
   276  
       
   277 --- cinder-8.0.0/cinder/db/sqlalchemy/migrate_repo/versions/003_glance_metadata.py.orig	2016-08-25 08:57:16.312610448 -0700
       
   278 +++ cinder-8.0.0/cinder/db/sqlalchemy/migrate_repo/versions/003_glance_metadata.py	2016-08-25 08:56:32.040239306 -0700
       
   279 @@ -12,9 +12,12 @@
       
   280  #    License for the specific language governing permissions and limitations
       
   281  #    under the License.
       
   282  
       
   283 +from oslo_config import cfg
       
   284  from sqlalchemy import Column, DateTime, Text, Boolean
       
   285  from sqlalchemy import MetaData, Integer, String, Table, ForeignKey
       
   286  
       
   287 +CONF = cfg.CONF
       
   288 +
       
   289  
       
   290  def upgrade(migrate_engine):
       
   291      meta = MetaData()
       
   292 @@ -26,11 +29,11 @@ def upgrade(migrate_engine):
       
   293      Table('volumes',
       
   294            meta,
       
   295            Column('id', Integer(), primary_key=True, nullable=False),
       
   296 -          mysql_engine='InnoDB')
       
   297 +          mysql_engine=CONF.database.mysql_storage_engine)
       
   298      Table('snapshots',
       
   299            meta,
       
   300            Column('id', Integer(), primary_key=True, nullable=False),
       
   301 -          mysql_engine='InnoDB')
       
   302 +          mysql_engine=CONF.database.mysql_storage_engine)
       
   303      # Create new table
       
   304      volume_glance_metadata = Table(
       
   305          'volume_glance_metadata',
       
   306 @@ -45,7 +48,7 @@ def upgrade(migrate_engine):
       
   307                 ForeignKey('snapshots.id')),
       
   308          Column('key', String(255)),
       
   309          Column('value', Text),
       
   310 -        mysql_engine='InnoDB'
       
   311 +        mysql_engine=CONF.database.mysql_storage_engine
       
   312      )
       
   313  
       
   314      try:
       
   315 --- cinder-8.0.0/cinder/db/sqlalchemy/migrate_repo/versions/008_add_backup.py.orig	2016-08-25 08:57:23.692681043 -0700
       
   316 +++ cinder-8.0.0/cinder/db/sqlalchemy/migrate_repo/versions/008_add_backup.py	2016-08-25 08:56:32.041089963 -0700
       
   317 @@ -13,9 +13,12 @@
       
   318  #    License for the specific language governing permissions and limitations
       
   319  #    under the License.
       
   320  
       
   321 +from oslo_config import cfg
       
   322  from sqlalchemy import Boolean, Column, DateTime
       
   323  from sqlalchemy import MetaData, Integer, String, Table
       
   324  
       
   325 +CONF = cfg.CONF
       
   326 +
       
   327  
       
   328  def upgrade(migrate_engine):
       
   329      meta = MetaData()
       
   330 @@ -43,7 +46,7 @@ def upgrade(migrate_engine):
       
   331          Column('service', String(length=255)),
       
   332          Column('size', Integer()),
       
   333          Column('object_count', Integer()),
       
   334 -        mysql_engine='InnoDB'
       
   335 +        mysql_engine=CONF.database.mysql_storage_engine
       
   336      )
       
   337  
       
   338      backups.create()
       
   339 --- 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
       
   340 +++ cinder-8.0.0/cinder/db/sqlalchemy/migrate_repo/versions/009_add_snapshot_metadata_table.py	2016-08-25 08:56:32.041930428 -0700
       
   341 @@ -10,9 +10,12 @@
       
   342  #    License for the specific language governing permissions and limitations
       
   343  #    under the License.
       
   344  
       
   345 +from oslo_config import cfg
       
   346  from sqlalchemy import Boolean, Column, DateTime
       
   347  from sqlalchemy import Integer, MetaData, String, Table, ForeignKey
       
   348  
       
   349 +CONF = cfg.CONF
       
   350 +
       
   351  
       
   352  def upgrade(migrate_engine):
       
   353      meta = MetaData()
       
   354 @@ -32,7 +35,7 @@ def upgrade(migrate_engine):
       
   355                 nullable=False),
       
   356          Column('key', String(length=255)),
       
   357          Column('value', String(length=255)),
       
   358 -        mysql_engine='InnoDB'
       
   359 +        mysql_engine=CONF.database.mysql_storage_engine
       
   360      )
       
   361  
       
   362      snapshot_metadata.create()
       
   363 --- cinder-8.0.0/cinder/db/sqlalchemy/migrate_repo/versions/010_add_transfers_table.py.orig	2016-08-25 08:57:36.677754626 -0700
       
   364 +++ cinder-8.0.0/cinder/db/sqlalchemy/migrate_repo/versions/010_add_transfers_table.py	2016-08-25 08:56:32.042766768 -0700
       
   365 @@ -10,9 +10,12 @@
       
   366  #    License for the specific language governing permissions and limitations
       
   367  #    under the License.
       
   368  
       
   369 +from oslo_config import cfg
       
   370  from sqlalchemy import Boolean, Column, DateTime
       
   371  from sqlalchemy import MetaData, String, Table, ForeignKey
       
   372  
       
   373 +CONF = cfg.CONF
       
   374 +
       
   375  
       
   376  def upgrade(migrate_engine):
       
   377      meta = MetaData()
       
   378 @@ -34,7 +37,7 @@ def upgrade(migrate_engine):
       
   379          Column('salt', String(length=255)),
       
   380          Column('crypt_hash', String(length=255)),
       
   381          Column('expires_at', DateTime(timezone=False)),
       
   382 -        mysql_engine='InnoDB',
       
   383 +        mysql_engine=CONF.database.mysql_storage_engine,
       
   384          mysql_charset='utf8'
       
   385      )
       
   386  
       
   387 --- cinder-8.0.0/cinder/db/sqlalchemy/migrate_repo/versions/017_add_encryption_information.py.orig	2016-08-25 08:57:43.340435246 -0700
       
   388 +++ cinder-8.0.0/cinder/db/sqlalchemy/migrate_repo/versions/017_add_encryption_information.py	2016-08-25 08:56:32.043630671 -0700
       
   389 @@ -13,9 +13,12 @@
       
   390  #    License for the specific language governing permissions and limitations
       
   391  #    under the License.
       
   392  
       
   393 +from oslo_config import cfg
       
   394  from sqlalchemy import Column, ForeignKey, MetaData, Table
       
   395  from sqlalchemy import Boolean, DateTime, Integer, String
       
   396  
       
   397 +CONF = cfg.CONF
       
   398 +
       
   399  
       
   400  def upgrade(migrate_engine):
       
   401      meta = MetaData(bind=migrate_engine)
       
   402 @@ -51,9 +54,9 @@ def upgrade(migrate_engine):
       
   403          # scheme unless each volume type is associated with at most one
       
   404          # encryption scheme.
       
   405          Column('volume_type_id', String(length=36),
       
   406 -               ForeignKey(volume_types.c.id),
       
   407 +               ForeignKey(volume_types.c.id, name='encryption_ibfk_1'),
       
   408                 primary_key=True, nullable=False),
       
   409 -        mysql_engine='InnoDB',
       
   410 +        mysql_engine=CONF.database.mysql_storage_engine,
       
   411          mysql_charset='utf8'
       
   412      )
       
   413  
       
   414 --- cinder-8.0.0/cinder/db/sqlalchemy/migrate_repo/versions/018_add_qos_specs.py.orig	2016-08-25 08:57:51.329501203 -0700
       
   415 +++ cinder-8.0.0/cinder/db/sqlalchemy/migrate_repo/versions/018_add_qos_specs.py	2016-08-25 08:56:32.044466643 -0700
       
   416 @@ -14,9 +14,12 @@
       
   417  #    License for the specific language governing permissions and limitations
       
   418  #    under the License.
       
   419  
       
   420 +from oslo_config import cfg
       
   421  from sqlalchemy import Boolean, Column, DateTime
       
   422  from sqlalchemy import ForeignKey, MetaData, String, Table
       
   423  
       
   424 +CONF = cfg.CONF
       
   425 +
       
   426  
       
   427  def upgrade(migrate_engine):
       
   428      """Add volume_type_rate_limit table."""
       
   429 @@ -34,7 +37,7 @@ def upgrade(migrate_engine):
       
   430                 ForeignKey('quality_of_service_specs.id')),
       
   431          Column('key', String(255)),
       
   432          Column('value', String(255)),
       
   433 -        mysql_engine='InnoDB',
       
   434 +        mysql_engine=CONF.database.mysql_storage_engine,
       
   435          mysql_charset='utf8'
       
   436      )
       
   437  
       
   438 --- 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
       
   439 +++ 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
       
   440 @@ -10,9 +10,12 @@
       
   441  #    License for the specific language governing permissions and limitations
       
   442  #    under the License.
       
   443  
       
   444 +from oslo_config import cfg
       
   445  from sqlalchemy import Boolean, Column, DateTime
       
   446  from sqlalchemy import Integer, MetaData, String, Table, ForeignKey
       
   447  
       
   448 +CONF = cfg.CONF
       
   449 +
       
   450  
       
   451  def upgrade(migrate_engine):
       
   452      meta = MetaData()
       
   453 @@ -32,7 +35,7 @@ def upgrade(migrate_engine):
       
   454                 nullable=False),
       
   455          Column('key', String(length=255)),
       
   456          Column('value', String(length=255)),
       
   457 -        mysql_engine='InnoDB',
       
   458 +        mysql_engine=CONF.database.mysql_storage_engine,
       
   459          mysql_charset='utf8'
       
   460      )
       
   461  
       
   462 --- cinder-8.0.0/cinder/db/sqlalchemy/migrate_repo/versions/025_add_consistencygroup.py.orig	2016-08-25 08:58:07.982189985 -0700
       
   463 +++ cinder-8.0.0/cinder/db/sqlalchemy/migrate_repo/versions/025_add_consistencygroup.py	2016-08-25 08:56:32.046312221 -0700
       
   464 @@ -13,9 +13,12 @@
       
   465  #    License for the specific language governing permissions and limitations
       
   466  #    under the License.
       
   467  
       
   468 +from oslo_config import cfg
       
   469  from sqlalchemy import Boolean, Column, DateTime
       
   470  from sqlalchemy import ForeignKey, MetaData, String, Table
       
   471  
       
   472 +CONF = cfg.CONF
       
   473 +
       
   474  
       
   475  def upgrade(migrate_engine):
       
   476      meta = MetaData()
       
   477 @@ -37,7 +40,7 @@ def upgrade(migrate_engine):
       
   478          Column('description', String(length=255)),
       
   479          Column('volume_type_id', String(length=255)),
       
   480          Column('status', String(length=255)),
       
   481 -        mysql_engine='InnoDB',
       
   482 +        mysql_engine=CONF.database.mysql_storage_engine,
       
   483          mysql_charset='utf8',
       
   484      )
       
   485  
       
   486 @@ -59,7 +62,7 @@ def upgrade(migrate_engine):
       
   487          Column('name', String(length=255)),
       
   488          Column('description', String(length=255)),
       
   489          Column('status', String(length=255)),
       
   490 -        mysql_engine='InnoDB',
       
   491 +        mysql_engine=CONF.database.mysql_storage_engine,
       
   492          mysql_charset='utf8',
       
   493      )
       
   494  
       
   495 --- 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
       
   496 +++ cinder-8.0.0/cinder/db/sqlalchemy/migrate_repo/versions/032_add_volume_type_projects.py	2016-08-25 08:56:32.047162211 -0700
       
   497 @@ -10,9 +10,12 @@
       
   498  #    License for the specific language governing permissions and limitations
       
   499  #    under the License.
       
   500  
       
   501 +from oslo_config import cfg
       
   502  from sqlalchemy import Boolean, Column, DateTime, UniqueConstraint
       
   503  from sqlalchemy import Integer, MetaData, String, Table, ForeignKey
       
   504  
       
   505 +CONF = cfg.CONF
       
   506 +
       
   507  
       
   508  def upgrade(migrate_engine):
       
   509      meta = MetaData()
       
   510 @@ -35,7 +38,7 @@ def upgrade(migrate_engine):
       
   511          Column('project_id', String(length=255)),
       
   512          Column('deleted', Boolean(create_constraint=True, name=None)),
       
   513          UniqueConstraint('volume_type_id', 'project_id', 'deleted'),
       
   514 -        mysql_engine='InnoDB',
       
   515 +        mysql_engine=CONF.database.mysql_storage_engine,
       
   516      )
       
   517  
       
   518      volume_type_projects.create()
       
   519 --- 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
       
   520 +++ 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
       
   521 @@ -10,9 +10,12 @@
       
   522  #    License for the specific language governing permissions and limitations
       
   523  #    under the License.
       
   524  
       
   525 +from oslo_config import cfg
       
   526  from sqlalchemy import Column, DateTime, Integer
       
   527  from sqlalchemy import MetaData, String, Table, UniqueConstraint
       
   528  
       
   529 +CONF = cfg.CONF
       
   530 +
       
   531  
       
   532  def upgrade(migrate_engine):
       
   533      meta = MetaData()
       
   534 @@ -29,7 +32,7 @@ def upgrade(migrate_engine):
       
   535          Column('key', String(length=255), nullable=False),
       
   536          Column('value', String(length=255)),
       
   537          UniqueConstraint('initiator', 'namespace', 'key'),
       
   538 -        mysql_engine='InnoDB',
       
   539 +        mysql_engine=CONF.database.mysql_storage_engine,
       
   540          mysql_charset='utf8'
       
   541      )
       
   542  
       
   543 --- cinder-8.0.0/cinder/db/sqlalchemy/migrate_repo/versions/040_add_volume_attachment.py.orig	2016-08-25 08:58:30.054762283 -0700
       
   544 +++ cinder-8.0.0/cinder/db/sqlalchemy/migrate_repo/versions/040_add_volume_attachment.py	2016-08-25 08:56:32.049123043 -0700
       
   545 @@ -16,11 +16,13 @@
       
   546  import datetime
       
   547  import uuid
       
   548  
       
   549 +from oslo_config import cfg
       
   550  import six
       
   551  from sqlalchemy import Boolean, Column, DateTime
       
   552  from sqlalchemy import ForeignKey, MetaData, String, Table
       
   553  
       
   554  CREATED_AT = datetime.datetime.now()  # noqa
       
   555 +CONF = cfg.CONF
       
   556  
       
   557  
       
   558  def upgrade(migrate_engine):
       
   559 @@ -51,7 +53,7 @@ def upgrade(migrate_engine):
       
   560          Column('detach_time', DateTime),
       
   561          Column('attach_mode', String(length=36)),
       
   562          Column('attach_status', String(length=255)),
       
   563 -        mysql_engine='InnoDB'
       
   564 +        mysql_engine=CONF.database.mysql_storage_engine
       
   565      )
       
   566  
       
   567      volume_attachment.create()
       
   568 --- 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
       
   569 +++ 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
       
   570 @@ -12,9 +12,12 @@
       
   571  #    License for the specific language governing permissions and limitations
       
   572  #    under the License.
       
   573  
       
   574 +from oslo_config import cfg
       
   575  from sqlalchemy import Column, DateTime, Integer
       
   576  from sqlalchemy import MetaData, String, Table
       
   577  
       
   578 +CONF = cfg.CONF
       
   579 +
       
   580  
       
   581  def upgrade(migrate_engine):
       
   582      meta = MetaData()
       
   583 @@ -30,7 +33,7 @@ def upgrade(migrate_engine):
       
   584          Column('volume_id', String(length=36), nullable=False),
       
   585          Column('size', Integer, nullable=False),
       
   586          Column('last_used', DateTime, nullable=False),
       
   587 -        mysql_engine='InnoDB',
       
   588 +        mysql_engine=CONF.database.mysql_storage_engine,
       
   589          mysql_charset='utf8'
       
   590      )
       
   591  
       
   592 --- 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
       
   593 +++ cinder-8.0.0/cinder/db/sqlalchemy/migrate_repo/versions/067_readd_iscsi_targets_table.py	2016-08-25 08:56:32.050821951 -0700
       
   594 @@ -10,9 +10,12 @@
       
   595  #    License for the specific language governing permissions and limitations
       
   596  #    under the License.
       
   597  
       
   598 +from oslo_config import cfg
       
   599  from sqlalchemy import Boolean, Column, DateTime, ForeignKey
       
   600  from sqlalchemy import Integer, MetaData, String, Table
       
   601  
       
   602 +CONF = cfg.CONF
       
   603 +
       
   604  
       
   605  def upgrade(migrate_engine):
       
   606      meta = MetaData()
       
   607 @@ -30,7 +33,7 @@ def upgrade(migrate_engine):
       
   608          Column('host', String(length=255)),
       
   609          Column('volume_id', String(length=36), ForeignKey('volumes.id'),
       
   610                 nullable=True),
       
   611 -        mysql_engine='InnoDB',
       
   612 +        mysql_engine=CONF.database.mysql_storage_engine,
       
   613          mysql_charset='utf8'
       
   614      )
       
   615  
       
   616 --- cinder-8.0.0/cinder/db/sqlalchemy/models.py.orig	2016-08-25 08:58:53.030663246 -0700
       
   617 +++ cinder-8.0.0/cinder/db/sqlalchemy/models.py	2016-08-25 10:02:19.406765223 -0700
       
   618 @@ -24,6 +24,7 @@ from oslo_config import cfg
       
   619  from oslo_db.sqlalchemy import models
       
   620  from oslo_utils import timeutils
       
   621  from sqlalchemy import Column, Integer, String, Text, schema
       
   622 +from sqlalchemy import dialects
       
   623  from sqlalchemy.ext.declarative import declarative_base
       
   624  from sqlalchemy import ForeignKey, DateTime, Boolean
       
   625  from sqlalchemy.orm import relationship, backref, validates
       
   626 @@ -33,11 +34,15 @@ CONF = cfg.CONF
       
   627  BASE = declarative_base()
       
   628  
       
   629  
       
   630 +def TinyText():
       
   631 +            return Text().with_variant(dialects.mysql.TINYTEXT(), 'mysql')
       
   632 +
       
   633 +
       
   634  class CinderBase(models.TimestampMixin,
       
   635                   models.ModelBase):
       
   636      """Base class for Cinder Models."""
       
   637  
       
   638 -    __table_args__ = {'mysql_engine': 'InnoDB'}
       
   639 +    __table_args__ = {'mysql_engine': CONF.database.mysql_storage_engine}
       
   640  
       
   641      # TODO(rpodolyaka): reuse models.SoftDeleteMixin in the next stage
       
   642      #                   of implementing of BP db-cleanup
       
   643 @@ -150,9 +155,16 @@ class Volume(BASE, CinderBase):
       
   644  
       
   645      host = Column(String(255))  # , ForeignKey('hosts.id'))
       
   646      size = Column(Integer)
       
   647 -    availability_zone = Column(String(255))  # TODO(vish): foreign key?
       
   648 -    status = Column(String(255))  # TODO(vish): enum?
       
   649 -    attach_status = Column(String(255))  # TODO(vish): enum
       
   650 +
       
   651 +    if CONF.database.mysql_storage_engine == 'NDBCLUSTER':
       
   652 +        availability_zone = Column(TinyText())
       
   653 +        status = Column(String(64))
       
   654 +        attach_status = Column(String(64))
       
   655 +    else:
       
   656 +        availability_zone = Column(String(255))  # TODO(vish): foreign key?
       
   657 +        status = Column(String(255))  # TODO(vish): enum?
       
   658 +        attach_status = Column(String(255))  # TODO(vish): enum
       
   659 +
       
   660      migration_status = Column(String(255))
       
   661  
       
   662      scheduled_at = Column(DateTime)
       
   663 @@ -160,7 +172,11 @@ class Volume(BASE, CinderBase):
       
   664      terminated_at = Column(DateTime)
       
   665  
       
   666      display_name = Column(String(255))
       
   667 -    display_description = Column(String(255))
       
   668 +
       
   669 +    if CONF.database.mysql_storage_engine == 'NDBCLUSTER':
       
   670 +        display_description = Column(TinyText())
       
   671 +    else:
       
   672 +        display_description = Column(String(255))
       
   673  
       
   674      provider_location = Column(String(255))
       
   675      provider_auth = Column(String(255))
       
   676 @@ -592,7 +608,7 @@ class DriverInitiatorData(BASE, models.T
       
   677      __tablename__ = 'driver_initiator_data'
       
   678      __table_args__ = (
       
   679          schema.UniqueConstraint("initiator", "namespace", "key"),
       
   680 -        {'mysql_engine': 'InnoDB'}
       
   681 +        {'mysql_engine': CONF.database.mysql_storage_engine}
       
   682      )
       
   683      id = Column(Integer, primary_key=True, nullable=False)
       
   684      initiator = Column(String(255), index=True, nullable=False)
       
   685 --- cinder-8.0.0/cinder/tests/unit/test_migrations.py.orig	2016-08-25 08:59:01.630728551 -0700
       
   686 +++ cinder-8.0.0/cinder/tests/unit/test_migrations.py	2016-08-25 08:56:32.054462196 -0700
       
   687 @@ -25,6 +25,7 @@ import uuid
       
   688  import fixtures
       
   689  from migrate.versioning import api as migration_api
       
   690  from migrate.versioning import repository
       
   691 +from oslo_config import cfg
       
   692  from oslo_db.sqlalchemy import test_base
       
   693  from oslo_db.sqlalchemy import test_migrations
       
   694  from oslo_db.sqlalchemy import utils as db_utils
       
   695 @@ -33,6 +34,8 @@ import sqlalchemy
       
   696  from cinder.db import migration
       
   697  import cinder.db.sqlalchemy.migrate_repo
       
   698  
       
   699 +CONF = cfg.CONF
       
   700 +
       
   701  
       
   702  class MigrationsMixin(test_migrations.WalkVersionsMixin):
       
   703      """Test sqlalchemy-migrate migrations."""
       
   704 @@ -842,8 +845,9 @@ class TestMysqlMigrations(test_base.MySQ
       
   705              "SELECT count(*) "
       
   706              "from information_schema.TABLES "
       
   707              "where TABLE_SCHEMA='openstack_citest' "
       
   708 -            "and ENGINE!='InnoDB' "
       
   709 -            "and TABLE_NAME!='migrate_version'")
       
   710 +            "and ENGINE!='%(mysql_storage_engine)s' "
       
   711 +            "and TABLE_NAME!='migrate_version'" %
       
   712 +            dict(mysql_storage_engine=CONF.database.mysql_storage_engine))
       
   713          count = noninnodb.scalar()
       
   714          self.assertEqual(count, 0, "%d non InnoDB tables created" % count)
       
   715