components/openstack/heat/patches/08-mysql_cluster_support.patch
author Octave Orgeron <octave.orgeron@oracle.com>
Thu, 08 Sep 2016 13:16:06 -0600
changeset 6866 4c1935f5ec9a
permissions -rw-r--r--
24394524 MySQL Cluster support for Cinder must be ported to Mitaka 24394534 MySQL Cluster support for Glance must be ported to Mitaka 24394543 MySQL Cluster support for Heat must be ported to Mitaka 24394552 MySQL Cluster support for Ironic must be ported to Mitaka 24394567 MySQL Cluster support for Keystone must be ported to Mitaka 24394574 MySQL Cluster support for Neutron must be ported to Mitaka 24394587 MySQL Cluster support for Nova must be ported to Mitaka 24409419 MySQL Cluster support for oslo.db must be ported to Mitaka

This patchset is for bug:

24394543 Mitaka Heat should support MySQL Cluster

This fixes the following aspects of Heat:
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/heat/+bug/1564110


--- heat-6.0.0/heat/db/sqlalchemy/migrate_repo/versions/028_havana.py.orig	2016-08-08 13:53:36.196603218 -0700
+++ heat-6.0.0/heat/db/sqlalchemy/migrate_repo/versions/028_havana.py	2016-08-08 13:53:14.078159110 -0700
@@ -11,12 +11,15 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
+from oslo_config import cfg
 import uuid
 
 import sqlalchemy
 
 from heat.db.sqlalchemy import types
 
+CONF = cfg.CONF
+
 
 def upgrade(migrate_engine):
     meta = sqlalchemy.MetaData()
@@ -29,7 +32,7 @@ def upgrade(migrate_engine):
         sqlalchemy.Column('created_at', sqlalchemy.DateTime),
         sqlalchemy.Column('updated_at', sqlalchemy.DateTime),
         sqlalchemy.Column('template', types.LongText),
-        mysql_engine='InnoDB',
+        mysql_engine=CONF.database.mysql_storage_engine,
         mysql_charset='utf8'
     )
 
@@ -46,7 +49,7 @@ def upgrade(migrate_engine):
         sqlalchemy.Column('tenant_id', sqlalchemy.String(256)),
         sqlalchemy.Column('trust_id', sqlalchemy.String(255)),
         sqlalchemy.Column('trustor_user_id', sqlalchemy.String(64)),
-        mysql_engine='InnoDB',
+        mysql_engine=CONF.database.mysql_storage_engine,
         mysql_charset='utf8'
     )
 
@@ -75,7 +78,7 @@ def upgrade(migrate_engine):
         sqlalchemy.Column('tenant', sqlalchemy.String(256)),
         sqlalchemy.Column('disable_rollback', sqlalchemy.Boolean,
                           nullable=False),
-        mysql_engine='InnoDB',
+        mysql_engine=CONF.database.mysql_storage_engine,
         mysql_charset='utf8'
     )
 
@@ -93,7 +96,7 @@ def upgrade(migrate_engine):
         sqlalchemy.Column('stack_id', sqlalchemy.String(36),
                           sqlalchemy.ForeignKey('stack.id'), nullable=False),
         sqlalchemy.Column('rsrc_metadata', types.LongText),
-        mysql_engine='InnoDB',
+        mysql_engine=CONF.database.mysql_storage_engine,
         mysql_charset='utf8'
     )
 
@@ -110,7 +113,7 @@ def upgrade(migrate_engine):
                           sqlalchemy.String(36),
                           sqlalchemy.ForeignKey('resource.id'),
                           nullable=False),
-        mysql_engine='InnoDB',
+        mysql_engine=CONF.database.mysql_storage_engine,
         mysql_charset='utf8'
     )
 
@@ -129,7 +132,7 @@ def upgrade(migrate_engine):
         sqlalchemy.Column('resource_status_reason', sqlalchemy.String(255)),
         sqlalchemy.Column('resource_type', sqlalchemy.String(255)),
         sqlalchemy.Column('resource_properties', sqlalchemy.PickleType),
-        mysql_engine='InnoDB',
+        mysql_engine=CONF.database.mysql_storage_engine,
         mysql_charset='utf8'
     )
 
@@ -145,7 +148,7 @@ def upgrade(migrate_engine):
         sqlalchemy.Column('last_evaluated', sqlalchemy.DateTime),
         sqlalchemy.Column('stack_id', sqlalchemy.String(36),
                           sqlalchemy.ForeignKey('stack.id'), nullable=False),
-        mysql_engine='InnoDB',
+        mysql_engine=CONF.database.mysql_storage_engine,
         mysql_charset='utf8'
     )
 
@@ -159,7 +162,7 @@ def upgrade(migrate_engine):
         sqlalchemy.Column('watch_rule_id', sqlalchemy.Integer,
                           sqlalchemy.ForeignKey('watch_rule.id'),
                           nullable=False),
-        mysql_engine='InnoDB',
+        mysql_engine=CONF.database.mysql_storage_engine,
         mysql_charset='utf8'
     )
 
--- heat-6.0.0/heat/db/sqlalchemy/migrate_repo/versions/031_stack_lock.py.orig	2016-08-08 13:53:44.254365335 -0700
+++ heat-6.0.0/heat/db/sqlalchemy/migrate_repo/versions/031_stack_lock.py	2016-08-08 13:53:14.078870800 -0700
@@ -11,8 +11,11 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
+from oslo_config import cfg
 import sqlalchemy
 
+CONF = cfg.CONF
+
 
 def upgrade(migrate_engine):
     meta = sqlalchemy.MetaData()
@@ -27,7 +30,7 @@ def upgrade(migrate_engine):
         sqlalchemy.Column('created_at', sqlalchemy.DateTime),
         sqlalchemy.Column('updated_at', sqlalchemy.DateTime),
         sqlalchemy.Column('engine_id', sqlalchemy.String(length=36)),
-        mysql_engine='InnoDB',
+        mysql_engine=CONF.database.mysql_storage_engine,
         mysql_charset='utf8'
     )
     sqlalchemy.Table('stack', meta, autoload=True)
--- heat-6.0.0/heat/db/sqlalchemy/migrate_repo/versions/033_software_config.py.orig	2016-08-08 13:53:52.462462615 -0700
+++ heat-6.0.0/heat/db/sqlalchemy/migrate_repo/versions/033_software_config.py	2016-08-08 13:53:14.079526502 -0700
@@ -11,10 +11,13 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
+from oslo_config import cfg
 import sqlalchemy
 
 from heat.db.sqlalchemy import types
 
+CONF = cfg.CONF
+
 
 def upgrade(migrate_engine):
     meta = sqlalchemy.MetaData()
@@ -34,7 +37,7 @@ def upgrade(migrate_engine):
         sqlalchemy.Column('tenant', sqlalchemy.String(64),
                           nullable=False,
                           index=True),
-        mysql_engine='InnoDB',
+        mysql_engine=CONF.database.mysql_storage_engine,
         mysql_charset='utf8'
     )
     software_config.create()
@@ -63,7 +66,7 @@ def upgrade(migrate_engine):
         sqlalchemy.Column('tenant', sqlalchemy.String(64),
                           nullable=False,
                           index=True),
-        mysql_engine='InnoDB',
+        mysql_engine=CONF.database.mysql_storage_engine,
         mysql_charset='utf8'
     )
     software_deployment.create()
--- heat-6.0.0/heat/db/sqlalchemy/migrate_repo/versions/044_snapshots.py.orig	2016-08-08 13:54:01.375663605 -0700
+++ heat-6.0.0/heat/db/sqlalchemy/migrate_repo/versions/044_snapshots.py	2016-08-08 13:53:14.080116985 -0700
@@ -11,10 +11,13 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
+from oslo_config import cfg
 import sqlalchemy
 
 from heat.db.sqlalchemy import types
 
+CONF = cfg.CONF
+
 
 def upgrade(migrate_engine):
     meta = sqlalchemy.MetaData()
@@ -38,7 +41,7 @@ def upgrade(migrate_engine):
         sqlalchemy.Column('tenant', sqlalchemy.String(64),
                           nullable=False,
                           index=True),
-        mysql_engine='InnoDB',
+        mysql_engine=CONF.database.mysql_storage_engine,
         mysql_charset='utf8'
     )
     sqlalchemy.Table('stack', meta, autoload=True)
--- heat-6.0.0/heat/db/sqlalchemy/migrate_repo/versions/051_service.py.orig	2016-08-08 13:54:08.527359970 -0700
+++ heat-6.0.0/heat/db/sqlalchemy/migrate_repo/versions/051_service.py	2016-08-08 13:53:14.080700065 -0700
@@ -13,10 +13,13 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+from oslo_config import cfg
 import uuid
 
 import sqlalchemy
 
+CONF = cfg.CONF
+
 
 def upgrade(migrate_engine):
     meta = sqlalchemy.MetaData()
@@ -36,7 +39,7 @@ def upgrade(migrate_engine):
         sqlalchemy.Column('created_at', sqlalchemy.DateTime),
         sqlalchemy.Column('updated_at', sqlalchemy.DateTime),
         sqlalchemy.Column('deleted_at', sqlalchemy.DateTime),
-        mysql_engine='InnoDB',
+        mysql_engine=CONF.database.mysql_storage_engine,
         mysql_charset='utf8'
     )
     service.create()
--- heat-6.0.0/heat/db/sqlalchemy/migrate_repo/versions/054_stack_tags_table.py.orig	2016-08-08 13:54:17.198831162 -0700
+++ heat-6.0.0/heat/db/sqlalchemy/migrate_repo/versions/054_stack_tags_table.py	2016-08-08 13:53:14.081281862 -0700
@@ -11,8 +11,11 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
+from oslo_config import cfg
 import sqlalchemy
 
+CONF = cfg.CONF
+
 
 def upgrade(migrate_engine):
     meta = sqlalchemy.MetaData(bind=migrate_engine)
@@ -33,7 +36,7 @@ def upgrade(migrate_engine):
                           sqlalchemy.String(36),
                           sqlalchemy.ForeignKey('stack.id'),
                           nullable=False),
-        mysql_engine='InnoDB',
+        mysql_engine=CONF.database.mysql_storage_engine,
         mysql_charset='utf8'
     )
     stack_tag.create()
--- heat-6.0.0/heat/db/sqlalchemy/migrate_repo/versions/057_resource_uuid_to_id.py.orig	2016-08-08 13:54:24.119188110 -0700
+++ heat-6.0.0/heat/db/sqlalchemy/migrate_repo/versions/057_resource_uuid_to_id.py	2016-08-08 13:53:14.081963807 -0700
@@ -189,10 +189,11 @@ def upgrade_resource_data_post(migrate_e
         name = inspector.get_indexes('resource_data')[0]['name']
         sqlalchemy.Index(name, rd_table.c.resource_id).drop()
 
+    # Change column before it becomes a foreign key
+    rd_table.c.resource_id.alter(nullable=False)
     cons = migrate.ForeignKeyConstraint(columns=[rd_table.c.resource_id],
                                         refcolumns=[res_table.c.id])
     cons.create()
-    rd_table.c.resource_id.alter(nullable=False)
 
     rd_table.c.tmp_res_uuid.drop()
 
--- heat-6.0.0/heat/db/sqlalchemy/migrate_repo/versions/059_sync_point.py.orig	2016-08-08 13:54:31.078965167 -0700
+++ heat-6.0.0/heat/db/sqlalchemy/migrate_repo/versions/059_sync_point.py	2016-08-08 13:53:14.082544202 -0700
@@ -11,10 +11,13 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
+from oslo_config import cfg
 import sqlalchemy
 
 from heat.db.sqlalchemy import types as heat_db_types
 
+CONF = cfg.CONF
+
 
 def upgrade(migrate_engine):
     meta = sqlalchemy.MetaData()
@@ -41,7 +44,7 @@ def upgrade(migrate_engine):
         sqlalchemy.ForeignKeyConstraint(['stack_id'], ['stack.id'],
                                         name='fk_stack_id'),
 
-        mysql_engine='InnoDB',
+        mysql_engine=CONF.database.mysql_storage_engine,
         mysql_charset='utf8'
     )
     sync_point.create()
--- heat-6.0.0/heat/db/sqlalchemy/models.py.orig	2016-08-08 13:54:38.888846543 -0700
+++ heat-6.0.0/heat/db/sqlalchemy/models.py	2016-08-08 13:55:40.851731167 -0700
@@ -15,6 +15,7 @@
 
 import uuid
 
+from oslo_config import cfg
 from oslo_db.sqlalchemy import models
 from oslo_utils import timeutils
 import six
@@ -27,6 +28,7 @@ from sqlalchemy.orm import session as or
 from heat.db.sqlalchemy import types
 
 BASE = declarative.declarative_base()
+CONF = cfg.CONF
 
 
 def get_session():
@@ -36,7 +38,7 @@ def get_session():
 
 class HeatBase(models.ModelBase, models.TimestampMixin):
     """Base class for Heat Models."""
-    __table_args__ = {'mysql_engine': 'InnoDB'}
+    __table_args__ = {'mysql_engine': CONF.database.mysql_storage_engine}
 
     def expire(self, session=None, attrs=None):
         """Expire this object ()."""