components/openstack/heat/patches/08-mysql_cluster_support.patch
changeset 6850 f8d3bc724af7
parent 6849 f9a2279efa0d
child 6851 f984e52b96bb
equal deleted inserted replaced
6849:f9a2279efa0d 6850:f8d3bc724af7
     1 This patchset is for bug:
       
     2 
       
     3 22725887 - Heat needs to support MySQL Cluster
       
     4 
       
     5 This fixes the following aspects of Heat:
       
     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/heat/+bug/1564110
       
    16 
       
    17 
       
    18 --- heat-2015.1.2/heat/db/sqlalchemy/migrate_repo/versions/054_stack_tags_table.py.orig	2016-07-29 12:03:45.066916862 -0600
       
    19 +++ heat-2015.1.2/heat/db/sqlalchemy/migrate_repo/versions/054_stack_tags_table.py	2016-07-29 12:08:17.012890454 -0600
       
    20 @@ -11,10 +11,12 @@
       
    21  #    License for the specific language governing permissions and limitations
       
    22  #    under the License.
       
    23  
       
    24 +from oslo_config import cfg
       
    25  import sqlalchemy
       
    26  
       
    27  from heat.db.sqlalchemy import types as heat_db_types
       
    28  
       
    29 +CONF = cfg.CONF
       
    30  
       
    31  def upgrade(migrate_engine):
       
    32      meta = sqlalchemy.MetaData(bind=migrate_engine)
       
    33 @@ -35,7 +37,7 @@ def upgrade(migrate_engine):
       
    34                            sqlalchemy.String(36),
       
    35                            sqlalchemy.ForeignKey('stack.id'),
       
    36                            nullable=False),
       
    37 -        mysql_engine='InnoDB',
       
    38 +        mysql_engine=CONF.database.mysql_storage_engine,
       
    39          mysql_charset='utf8'
       
    40      )
       
    41      stack_tag.create()
       
    42 --- heat-2015.1.2/heat/db/sqlalchemy/migrate_repo/versions/015_grizzly.py.orig	2016-07-29 12:03:53.884104708 -0600
       
    43 +++ heat-2015.1.2/heat/db/sqlalchemy/migrate_repo/versions/015_grizzly.py	2016-07-29 12:08:35.264920866 -0600
       
    44 @@ -11,8 +11,10 @@
       
    45  #    License for the specific language governing permissions and limitations
       
    46  #    under the License.
       
    47  
       
    48 +from oslo_config import cfg
       
    49  import sqlalchemy
       
    50  
       
    51 +CONF = cfg.CONF
       
    52  
       
    53  def upgrade(migrate_engine):
       
    54      meta = sqlalchemy.MetaData()
       
    55 @@ -25,7 +27,7 @@ def upgrade(migrate_engine):
       
    56          sqlalchemy.Column('created_at', sqlalchemy.DateTime),
       
    57          sqlalchemy.Column('updated_at', sqlalchemy.DateTime),
       
    58          sqlalchemy.Column('template', sqlalchemy.Text),
       
    59 -        mysql_engine='InnoDB',
       
    60 +        mysql_engine=CONF.database.mysql_storage_engine,
       
    61          mysql_charset='utf8'
       
    62      )
       
    63  
       
    64 @@ -44,7 +46,7 @@ def upgrade(migrate_engine):
       
    65          sqlalchemy.Column('aws_auth_url', sqlalchemy.Text),
       
    66          sqlalchemy.Column('tenant_id', sqlalchemy.String(256)),
       
    67          sqlalchemy.Column('aws_creds', sqlalchemy.Text),
       
    68 -        mysql_engine='InnoDB',
       
    69 +        mysql_engine=CONF.database.mysql_storage_engine,
       
    70          mysql_charset='utf8'
       
    71      )
       
    72  
       
    73 @@ -71,7 +73,7 @@ def upgrade(migrate_engine):
       
    74          sqlalchemy.Column('tenant', sqlalchemy.String(256)),
       
    75          sqlalchemy.Column('disable_rollback', sqlalchemy.Boolean,
       
    76                            nullable=False),
       
    77 -        mysql_engine='InnoDB',
       
    78 +        mysql_engine=CONF.database.mysql_storage_engine,
       
    79          mysql_charset='utf8'
       
    80      )
       
    81  
       
    82 @@ -88,7 +90,7 @@ def upgrade(migrate_engine):
       
    83          sqlalchemy.Column('stack_id', sqlalchemy.String(36),
       
    84                            sqlalchemy.ForeignKey('stack.id'), nullable=False),
       
    85          sqlalchemy.Column('rsrc_metadata', sqlalchemy.Text),
       
    86 -        mysql_engine='InnoDB',
       
    87 +        mysql_engine=CONF.database.mysql_storage_engine,
       
    88          mysql_charset='utf8'
       
    89      )
       
    90  
       
    91 @@ -106,7 +108,7 @@ def upgrade(migrate_engine):
       
    92          sqlalchemy.Column('resource_status_reason', sqlalchemy.String(255)),
       
    93          sqlalchemy.Column('resource_type', sqlalchemy.String(255)),
       
    94          sqlalchemy.Column('resource_properties', sqlalchemy.PickleType),
       
    95 -        mysql_engine='InnoDB',
       
    96 +        mysql_engine=CONF.database.mysql_storage_engine,
       
    97          mysql_charset='utf8'
       
    98      )
       
    99  
       
   100 @@ -122,7 +124,7 @@ def upgrade(migrate_engine):
       
   101          sqlalchemy.Column('last_evaluated', sqlalchemy.DateTime),
       
   102          sqlalchemy.Column('stack_id', sqlalchemy.String(36),
       
   103                            sqlalchemy.ForeignKey('stack.id'), nullable=False),
       
   104 -        mysql_engine='InnoDB',
       
   105 +        mysql_engine=CONF.database.mysql_storage_engine,
       
   106          mysql_charset='utf8'
       
   107      )
       
   108  
       
   109 @@ -136,7 +138,7 @@ def upgrade(migrate_engine):
       
   110          sqlalchemy.Column('watch_rule_id', sqlalchemy.Integer,
       
   111                            sqlalchemy.ForeignKey('watch_rule.id'),
       
   112                            nullable=False),
       
   113 -        mysql_engine='InnoDB',
       
   114 +        mysql_engine=CONF.database.mysql_storage_engine,
       
   115          mysql_charset='utf8'
       
   116      )
       
   117  
       
   118 --- heat-2015.1.2/heat/db/sqlalchemy/migrate_repo/versions/059_sync_point.py.orig	2016-07-29 12:04:02.707922940 -0600
       
   119 +++ heat-2015.1.2/heat/db/sqlalchemy/migrate_repo/versions/059_sync_point.py	2016-07-29 12:09:00.649161442 -0600
       
   120 @@ -11,10 +11,12 @@
       
   121  #    License for the specific language governing permissions and limitations
       
   122  #    under the License.
       
   123  
       
   124 +from oslo_config import cfg
       
   125  import sqlalchemy
       
   126  
       
   127  from heat.db.sqlalchemy import types as heat_db_types
       
   128  
       
   129 +CONF = cfg.CONF
       
   130  
       
   131  def upgrade(migrate_engine):
       
   132      meta = sqlalchemy.MetaData()
       
   133 @@ -41,7 +43,7 @@ def upgrade(migrate_engine):
       
   134          sqlalchemy.ForeignKeyConstraint(['stack_id'], ['stack.id'],
       
   135                                          name='fk_stack_id'),
       
   136  
       
   137 -        mysql_engine='InnoDB',
       
   138 +        mysql_engine=CONF.database.mysql_storage_engine,
       
   139          mysql_charset='utf8'
       
   140      )
       
   141      sync_point.create()
       
   142 --- heat-2015.1.2/heat/db/sqlalchemy/migrate_repo/versions/033_software_config.py.orig	2016-07-29 12:04:10.260632439 -0600
       
   143 +++ heat-2015.1.2/heat/db/sqlalchemy/migrate_repo/versions/033_software_config.py	2016-07-29 12:09:20.089705318 -0600
       
   144 @@ -11,10 +11,12 @@
       
   145  #    License for the specific language governing permissions and limitations
       
   146  #    under the License.
       
   147  
       
   148 +from oslo_config import cfg
       
   149  import sqlalchemy
       
   150  
       
   151  from heat.db.sqlalchemy import types
       
   152  
       
   153 +CONF = cfg.CONF
       
   154  
       
   155  def upgrade(migrate_engine):
       
   156      meta = sqlalchemy.MetaData()
       
   157 @@ -34,7 +36,7 @@ def upgrade(migrate_engine):
       
   158          sqlalchemy.Column('tenant', sqlalchemy.String(64),
       
   159                            nullable=False,
       
   160                            index=True),
       
   161 -        mysql_engine='InnoDB',
       
   162 +        mysql_engine=CONF.database.mysql_storage_engine,
       
   163          mysql_charset='utf8'
       
   164      )
       
   165      software_config.create()
       
   166 @@ -63,7 +65,7 @@ def upgrade(migrate_engine):
       
   167          sqlalchemy.Column('tenant', sqlalchemy.String(64),
       
   168                            nullable=False,
       
   169                            index=True),
       
   170 -        mysql_engine='InnoDB',
       
   171 +        mysql_engine=CONF.database.mysql_storage_engine,
       
   172          mysql_charset='utf8'
       
   173      )
       
   174      software_deployment.create()
       
   175 --- heat-2015.1.2/heat/db/sqlalchemy/migrate_repo/versions/057_resource_uuid_to_id.py.orig	2016-07-29 12:04:19.750231791 -0600
       
   176 +++ heat-2015.1.2/heat/db/sqlalchemy/migrate_repo/versions/057_resource_uuid_to_id.py	2016-07-28 14:01:17.581307597 -0600
       
   177 @@ -194,10 +194,11 @@ def upgrade_resource_data_post(migrate_e
       
   178          name = inspector.get_indexes('resource_data')[0]['name']
       
   179          sqlalchemy.Index(name, rd_table.c.resource_id).drop()
       
   180  
       
   181 +    # Change column before it becomes a foreign key
       
   182 +    rd_table.c.resource_id.alter(nullable=False)
       
   183      cons = migrate.ForeignKeyConstraint(columns=[rd_table.c.resource_id],
       
   184                                          refcolumns=[res_table.c.id])
       
   185      cons.create()
       
   186 -    rd_table.c.resource_id.alter(nullable=False)
       
   187  
       
   188      rd_table.c.tmp_res_uuid.drop()
       
   189  
       
   190 --- heat-2015.1.2/heat/db/sqlalchemy/migrate_repo/versions/044_snapshots.py.orig	2016-07-29 12:04:27.749158504 -0600
       
   191 +++ heat-2015.1.2/heat/db/sqlalchemy/migrate_repo/versions/044_snapshots.py	2016-07-29 12:10:54.210544287 -0600
       
   192 @@ -11,10 +11,12 @@
       
   193  #    License for the specific language governing permissions and limitations
       
   194  #    under the License.
       
   195  
       
   196 +from oslo_config import cfg
       
   197  import sqlalchemy
       
   198  
       
   199  from heat.db.sqlalchemy import types
       
   200  
       
   201 +CONF = cfg.CONF
       
   202  
       
   203  def upgrade(migrate_engine):
       
   204      meta = sqlalchemy.MetaData()
       
   205 @@ -38,7 +40,7 @@ def upgrade(migrate_engine):
       
   206          sqlalchemy.Column('tenant', sqlalchemy.String(64),
       
   207                            nullable=False,
       
   208                            index=True),
       
   209 -        mysql_engine='InnoDB',
       
   210 +        mysql_engine=CONF.database.mysql_storage_engine,
       
   211          mysql_charset='utf8'
       
   212      )
       
   213      sqlalchemy.Table('stack', meta, autoload=True)
       
   214 --- heat-2015.1.2/heat/db/sqlalchemy/migrate_repo/versions/051_service.py.orig	2016-07-29 12:04:36.470596083 -0600
       
   215 +++ heat-2015.1.2/heat/db/sqlalchemy/migrate_repo/versions/051_service.py	2016-07-29 12:11:18.330506769 -0600
       
   216 @@ -15,8 +15,10 @@
       
   217  
       
   218  import uuid
       
   219  
       
   220 +from oslo_config import cfg
       
   221  import sqlalchemy
       
   222  
       
   223 +CONF = cfg.CONF
       
   224  
       
   225  def upgrade(migrate_engine):
       
   226      meta = sqlalchemy.MetaData()
       
   227 @@ -36,7 +38,7 @@ def upgrade(migrate_engine):
       
   228          sqlalchemy.Column('created_at', sqlalchemy.DateTime),
       
   229          sqlalchemy.Column('updated_at', sqlalchemy.DateTime),
       
   230          sqlalchemy.Column('deleted_at', sqlalchemy.DateTime),
       
   231 -        mysql_engine='InnoDB',
       
   232 +        mysql_engine=CONF.database.mysql_storage_engine,
       
   233          mysql_charset='utf8'
       
   234      )
       
   235      service.create()
       
   236 --- heat-2015.1.2/heat/db/sqlalchemy/migrate_repo/versions/021_resource_data.py.orig	2016-07-29 12:04:51.248485607 -0600
       
   237 +++ heat-2015.1.2/heat/db/sqlalchemy/migrate_repo/versions/021_resource_data.py	2016-07-29 12:11:47.651134656 -0600
       
   238 @@ -11,8 +11,10 @@
       
   239  #    License for the specific language governing permissions and limitations
       
   240  #    under the License.
       
   241  
       
   242 +from oslo_config import cfg
       
   243  import sqlalchemy
       
   244  
       
   245 +CONF = cfg.CONF
       
   246  
       
   247  def upgrade(migrate_engine):
       
   248      meta = sqlalchemy.MetaData()
       
   249 @@ -33,7 +35,7 @@ def upgrade(migrate_engine):
       
   250                            sqlalchemy.String(36),
       
   251                            sqlalchemy.ForeignKey('resource.id'),
       
   252                            nullable=False),
       
   253 -        mysql_engine='InnoDB',
       
   254 +        mysql_engine=CONF.database.mysql_storage_engine,
       
   255          mysql_charset='utf8'
       
   256      )
       
   257      sqlalchemy.Table('resource', meta, autoload=True)
       
   258 --- heat-2015.1.2/heat/db/sqlalchemy/migrate_repo/versions/031_stack_lock.py.orig	2016-07-29 12:04:59.100720052 -0600
       
   259 +++ heat-2015.1.2/heat/db/sqlalchemy/migrate_repo/versions/031_stack_lock.py	2016-07-29 12:12:03.834952665 -0600
       
   260 @@ -11,8 +11,10 @@
       
   261  #    License for the specific language governing permissions and limitations
       
   262  #    under the License.
       
   263  
       
   264 +from oslo_config import cfg
       
   265  import sqlalchemy
       
   266  
       
   267 +CONF = cfg.CONF
       
   268  
       
   269  def upgrade(migrate_engine):
       
   270      meta = sqlalchemy.MetaData()
       
   271 @@ -27,7 +29,7 @@ def upgrade(migrate_engine):
       
   272          sqlalchemy.Column('created_at', sqlalchemy.DateTime),
       
   273          sqlalchemy.Column('updated_at', sqlalchemy.DateTime),
       
   274          sqlalchemy.Column('engine_id', sqlalchemy.String(length=36)),
       
   275 -        mysql_engine='InnoDB',
       
   276 +        mysql_engine=CONF.database.mysql_storage_engine,
       
   277          mysql_charset='utf8'
       
   278      )
       
   279      sqlalchemy.Table('stack', meta, autoload=True)
       
   280 --- heat-2015.1.2/heat/db/sqlalchemy/models.py.orig	2016-07-29 12:05:08.842912688 -0600
       
   281 +++ heat-2015.1.2/heat/db/sqlalchemy/models.py	2016-07-29 12:15:35.087392556 -0600
       
   282 @@ -16,6 +16,7 @@ SQLAlchemy models for heat data.
       
   283  
       
   284  import uuid
       
   285  
       
   286 +from oslo_config import cfg
       
   287  from oslo_db.sqlalchemy import models
       
   288  from oslo_utils import timeutils
       
   289  import six
       
   290 @@ -27,6 +28,8 @@ from sqlalchemy.orm import session as or
       
   291  
       
   292  from heat.db.sqlalchemy import types
       
   293  
       
   294 +CONF = cfg.CONF
       
   295 +
       
   296  BASE = declarative.declarative_base()
       
   297  
       
   298  
       
   299 @@ -37,7 +40,7 @@ def get_session():
       
   300  
       
   301  class HeatBase(models.ModelBase, models.TimestampMixin):
       
   302      """Base class for Heat Models."""
       
   303 -    __table_args__ = {'mysql_engine': 'InnoDB'}
       
   304 +    __table_args__ = {'mysql_engine': CONF.database.mysql_storage_engine}
       
   305  
       
   306      def expire(self, session=None, attrs=None):
       
   307          """Expire this object ()."""