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 ()."""