Add 'dependency' table

Add a new db table for tracking action dependencies. Previously, we were
using two list fields (note that a list is ordered) for this purpose. It
has caused quite some problems:
 - Binding List datatype to sqlalchemy.Text is causing DB confusion
   about the mutable Dict data type.
 - A List column cannot be checked and/or set in a single SQL statement.
 - SqlAlchemy ORM layer has very limited support to transactions and
   even that has been compromised by the oslo.db package.

Change-Id: I4b97fcc9fcf7684adbfd48a2f908a0f864691310
Partial-Bug: #1495449
This commit is contained in:
tengqm 2015-12-18 02:51:04 -05:00
parent 9d5a90012d
commit bd5091b0d7
2 changed files with 32 additions and 4 deletions

View File

@ -222,8 +222,8 @@ def upgrade(migrate_engine):
sqlalchemy.Column('owner', sqlalchemy.String(36)),
sqlalchemy.Column('interval', sqlalchemy.Integer),
# FIXME: Don't specify fixed precision.
sqlalchemy.Column('start_time', sqlalchemy.Float('24,8')),
sqlalchemy.Column('end_time', sqlalchemy.Float('24,8')),
sqlalchemy.Column('start_time', sqlalchemy.Float(precision='24,8')),
sqlalchemy.Column('end_time', sqlalchemy.Float(precision='24,8')),
sqlalchemy.Column('timeout', sqlalchemy.Integer),
sqlalchemy.Column('control', sqlalchemy.String(255)),
sqlalchemy.Column('status', sqlalchemy.String(255)),
@ -240,6 +240,18 @@ def upgrade(migrate_engine):
mysql_charset='utf8'
)
dependency = sqlalchemy.Table(
'dependency', meta,
sqlalchemy.Column('id', sqlalchemy.String(36), nullable=False,
primary_key=True),
sqlalchemy.Column('depended', sqlalchemy.String(36),
sqlalchemy.ForeignKey('action.id'), nullable=False),
sqlalchemy.Column('dependent', sqlalchemy.String(36),
sqlalchemy.ForeignKey('action.id'), nullable=False),
mysql_engine='InnoDB',
mysql_charset='utf8'
)
event = sqlalchemy.Table(
'event', meta,
sqlalchemy.Column('id', sqlalchemy.String(36),
@ -272,6 +284,7 @@ def upgrade(migrate_engine):
webhook,
credential,
action,
dependency,
receiver,
event,
)

View File

@ -300,6 +300,21 @@ class Credential(BASE, SenlinBase):
data = sqlalchemy.Column(types.Dict)
class ActionDependency(BASE, SenlinBase):
"""A table for recording action dependencies."""
__tablename__ = 'dependency'
id = sqlalchemy.Column('id', sqlalchemy.String(36), primary_key=True,
default=lambda: str(uuid.uuid4()))
depended = sqlalchemy.Column('depended', sqlalchemy.String(36),
sqlalchemy.ForeignKey('action.id'),
nullable=False)
dependent = sqlalchemy.Column('dependent', sqlalchemy.String(36),
sqlalchemy.ForeignKey('action.id'),
nullable=False)
class Action(BASE, SenlinBase, SoftDelete):
'''An action persisted in the Senlin database.'''
@ -315,8 +330,8 @@ class Action(BASE, SenlinBase, SoftDelete):
owner = sqlalchemy.Column(sqlalchemy.String(36))
interval = sqlalchemy.Column(sqlalchemy.Integer)
# FIXME: Don't specify fixed precision.
start_time = sqlalchemy.Column(sqlalchemy.Float('24,8'))
end_time = sqlalchemy.Column(sqlalchemy.Float('24,8'))
start_time = sqlalchemy.Column(sqlalchemy.Float(precision='24,8'))
end_time = sqlalchemy.Column(sqlalchemy.Float(precision='24,8'))
timeout = sqlalchemy.Column(sqlalchemy.Integer)
status = sqlalchemy.Column(sqlalchemy.String(255))
status_reason = sqlalchemy.Column(sqlalchemy.Text)