components/openstack/ironic/patches/05-mysql_cluster_support.patch
author Rich Burridge <rich.burridge@oracle.com>
Tue, 02 May 2017 17:33:26 -0700
changeset 7964 d9801318ed3d
parent 6866 4c1935f5ec9a
permissions -rw-r--r--
25981468 Build ilmbase and openexr with the GNU compilers

This patchset is for bug:

24394552 Mitaka Ironic should support MySQL Cluster

This fixes the following aspects of Ironic:
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.
4. Changes the conductor table column "online" to be quoted because "online"
   is a reserved word in MySQL and other databases.

This has not been committed upstream, but has been filed in launchpad:

https://bugs.launchpad.net/ironic/+bug/1564110


--- ironic-5.1.2/ironic/db/sqlalchemy/alembic/versions/2581ebaf0cb2_initial_migration.py.orig	2016-08-05 15:02:32.138604246 -0700
+++ ironic-5.1.2/ironic/db/sqlalchemy/alembic/versions/2581ebaf0cb2_initial_migration.py	2016-08-05 15:04:47.376598798 -0700
@@ -24,8 +24,10 @@ revision = '2581ebaf0cb2'
 down_revision = None
 
 from alembic import op
+from oslo_config import cfg
 import sqlalchemy as sa
 
+CONF = cfg.CONF
 
 def upgrade():
     # commands auto generated by Alembic - please adjust!
@@ -38,7 +40,7 @@ def upgrade():
         sa.Column('drivers', sa.Text(), nullable=True),
         sa.PrimaryKeyConstraint('id'),
         sa.UniqueConstraint('hostname', name='uniq_conductors0hostname'),
-        mysql_ENGINE='InnoDB',
+        mysql_ENGINE=CONF.database.mysql_storage_engine,
         mysql_DEFAULT_CHARSET='UTF8'
     )
     op.create_table(
@@ -51,7 +53,7 @@ def upgrade():
         sa.Column('description', sa.String(length=255), nullable=True),
         sa.PrimaryKeyConstraint('id'),
         sa.UniqueConstraint('uuid', name='uniq_chassis0uuid'),
-        mysql_ENGINE='InnoDB',
+        mysql_ENGINE=CONF.database.mysql_storage_engine,
         mysql_DEFAULT_CHARSET='UTF8'
     )
     op.create_table(
@@ -77,7 +79,7 @@ def upgrade():
         sa.ForeignKeyConstraint(['chassis_id'], ['chassis.id'], ),
         sa.PrimaryKeyConstraint('id'),
         sa.UniqueConstraint('uuid', name='uniq_nodes0uuid'),
-        mysql_ENGINE='InnoDB',
+        mysql_ENGINE=CONF.database.mysql_storage_engine,
         mysql_DEFAULT_CHARSET='UTF8'
     )
     op.create_index('node_instance_uuid', 'nodes', ['instance_uuid'],
@@ -95,7 +97,7 @@ def upgrade():
         sa.PrimaryKeyConstraint('id'),
         sa.UniqueConstraint('address', name='uniq_ports0address'),
         sa.UniqueConstraint('uuid', name='uniq_ports0uuid'),
-        mysql_ENGINE='InnoDB',
+        mysql_ENGINE=CONF.database.mysql_storage_engine,
         mysql_DEFAULT_CHARSET='UTF8'
     )
     # end Alembic commands
--- ironic-5.1.2/ironic/db/sqlalchemy/alembic/versions/487deb87cc9d_add_conductor_affinity_and_online.py.orig	2016-08-05 15:01:05.339248664 -0700
+++ ironic-5.1.2/ironic/db/sqlalchemy/alembic/versions/487deb87cc9d_add_conductor_affinity_and_online.py	2016-08-05 15:01:53.896426955 -0700
@@ -29,7 +29,7 @@ import sqlalchemy as sa
 def upgrade():
     op.add_column(
         'conductors',
-        sa.Column('online', sa.Boolean(), default=True))
+        sa.Column('online', sa.Boolean(), default=True, quote=True))
     op.add_column(
         'nodes',
         sa.Column('conductor_affinity', sa.Integer(),
--- ironic-5.1.2/ironic/db/sqlalchemy/alembic/versions/48d6c242bb9b_add_node_tags.py.orig	2016-08-05 15:01:12.489520146 -0700
+++ ironic-5.1.2/ironic/db/sqlalchemy/alembic/versions/48d6c242bb9b_add_node_tags.py	2016-08-05 15:01:53.897903465 -0700
@@ -23,8 +23,10 @@ revision = '48d6c242bb9b'
 down_revision = '516faf1bb9b1'
 
 from alembic import op
+from oslo_config import cfg
 import sqlalchemy as sa
 
+CONF = cfg.CONF
 
 def upgrade():
     op.create_table(
@@ -36,7 +38,7 @@ def upgrade():
         sa.Column('tag', sa.String(length=255), nullable=False),
         sa.ForeignKeyConstraint(['node_id'], ['nodes.id'], ),
         sa.PrimaryKeyConstraint('node_id', 'tag'),
-        mysql_ENGINE='InnoDB',
+        mysql_ENGINE=CONF.database.mysql_storage_engine,
         mysql_DEFAULT_CHARSET='UTF8'
     )
     op.create_index('node_tags_idx', 'node_tags', ['tag'], unique=False)
--- ironic-5.1.2/ironic/db/sqlalchemy/alembic/versions/5ea1b0d310e_added_port_group_table_and_altered_ports.py.orig	2016-08-05 15:01:20.133426869 -0700
+++ ironic-5.1.2/ironic/db/sqlalchemy/alembic/versions/5ea1b0d310e_added_port_group_table_and_altered_ports.py	2016-08-05 15:01:53.898548390 -0700
@@ -23,8 +23,10 @@ revision = '5ea1b0d310e'
 down_revision = '48d6c242bb9b'
 
 from alembic import op
+from oslo_config import cfg
 import sqlalchemy as sa
 
+CONF = cfg.CONF
 
 def upgrade():
     op.create_table('portgroups',
@@ -42,7 +44,7 @@ def upgrade():
                     sa.UniqueConstraint('address',
                                         name='uniq_portgroups0address'),
                     sa.UniqueConstraint('name', name='uniq_portgroups0name'),
-                    mysql_ENGINE='InnoDB',
+                    mysql_ENGINE=CONF.database.mysql_storage_engine,
                     mysql_DEFAULT_CHARSET='UTF8')
     op.add_column(u'ports', sa.Column('local_link_connection', sa.Text(),
                                       nullable=True))
--- ironic-5.1.2/ironic/db/sqlalchemy/models.py.orig	2016-08-05 15:01:28.309661466 -0700
+++ ironic-5.1.2/ironic/db/sqlalchemy/models.py	2016-08-05 15:01:53.899243145 -0700
@@ -48,8 +48,12 @@ db_options.set_defaults(cfg.CONF, _DEFAU
 def table_args():
     engine_name = urlparse.urlparse(cfg.CONF.database.connection).scheme
     if engine_name == 'mysql':
-        return {'mysql_engine': cfg.CONF.database.mysql_engine,
-                'mysql_charset': "utf8"}
+        if cfg.CONF.database.mysql_storage_engine == "NDBCLUSTER":
+            return {'mysql_engine': cfg.CONF.database.mysql_storage_engine,
+                    'mysql_charset': "utf8"}
+        else:
+            return {'mysql_engine': cfg.CONF.database.mysql_engine,
+                    'mysql_charset': "utf8"}
     return None
 
 
@@ -93,7 +97,7 @@ class Conductor(Base):
     id = Column(Integer, primary_key=True)
     hostname = Column(String(255), nullable=False)
     drivers = Column(db_types.JsonEncodedList)
-    online = Column(Boolean, default=True)
+    online = Column('online', Boolean, default=True, quote=True)
 
 
 class Node(Base):