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):