models.py 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. # Copyright 2016 Cloudbase Solutions Srl
  2. # All Rights Reserved.
  3. import uuid
  4. from oslo_db.sqlalchemy import models
  5. import sqlalchemy
  6. from sqlalchemy.ext import declarative
  7. from sqlalchemy import orm
  8. from coriolis.db.sqlalchemy import types
  9. BASE = declarative.declarative_base()
  10. class TaskEvent(BASE, models.TimestampMixin, models.SoftDeleteMixin,
  11. models.ModelBase):
  12. __tablename__ = 'task_event'
  13. id = sqlalchemy.Column(sqlalchemy.String(36),
  14. default=lambda: str(uuid.uuid4()),
  15. primary_key=True)
  16. task_id = sqlalchemy.Column(sqlalchemy.String(36),
  17. sqlalchemy.ForeignKey('task.id'),
  18. nullable=False)
  19. level = sqlalchemy.Column(sqlalchemy.String(20), nullable=False)
  20. message = sqlalchemy.Column(sqlalchemy.String(1024), nullable=False)
  21. class TaskProgressUpdate(BASE, models.TimestampMixin, models.SoftDeleteMixin,
  22. models.ModelBase):
  23. __tablename__ = 'task_progress_update'
  24. id = sqlalchemy.Column(sqlalchemy.String(36),
  25. default=lambda: str(uuid.uuid4()),
  26. primary_key=True)
  27. task_id = sqlalchemy.Column(sqlalchemy.String(36),
  28. sqlalchemy.ForeignKey('task.id'),
  29. nullable=False)
  30. current_step = sqlalchemy.Column(sqlalchemy.Integer, nullable=False)
  31. total_steps = sqlalchemy.Column(sqlalchemy.Integer, nullable=True)
  32. message = sqlalchemy.Column(sqlalchemy.String(1024), nullable=True)
  33. class Task(BASE, models.TimestampMixin, models.SoftDeleteMixin,
  34. models.ModelBase):
  35. __tablename__ = 'task'
  36. id = sqlalchemy.Column(sqlalchemy.String(36),
  37. default=lambda: str(uuid.uuid4()),
  38. primary_key=True)
  39. execution_id = sqlalchemy.Column(
  40. sqlalchemy.String(36),
  41. sqlalchemy.ForeignKey('tasks_execution.id'), nullable=False)
  42. instance = sqlalchemy.Column(sqlalchemy.String(1024), nullable=False)
  43. host = sqlalchemy.Column(sqlalchemy.String(1024), nullable=True)
  44. process_id = sqlalchemy.Column(sqlalchemy.Integer, nullable=True)
  45. status = sqlalchemy.Column(sqlalchemy.String(100), nullable=False)
  46. task_type = sqlalchemy.Column(sqlalchemy.String(100), nullable=False)
  47. exception_details = sqlalchemy.Column(sqlalchemy.Text, nullable=True)
  48. depends_on = sqlalchemy.Column(types.List, nullable=True)
  49. on_error = sqlalchemy.Column(sqlalchemy.Boolean, nullable=False)
  50. # TODO(alexpilotti): Add soft delete filter
  51. events = orm.relationship(TaskEvent, cascade="all,delete",
  52. backref=orm.backref('task'))
  53. # TODO(alexpilotti): Add soft delete filter
  54. progress_updates = orm.relationship(TaskProgressUpdate,
  55. cascade="all,delete",
  56. backref=orm.backref('task'))
  57. class TasksExecution(BASE, models.TimestampMixin, models.ModelBase,
  58. models.SoftDeleteMixin):
  59. __tablename__ = 'tasks_execution'
  60. id = sqlalchemy.Column(sqlalchemy.String(36),
  61. default=lambda: str(uuid.uuid4()),
  62. primary_key=True)
  63. action_id = sqlalchemy.Column(
  64. sqlalchemy.String(36),
  65. sqlalchemy.ForeignKey('base_transfer_action.base_id'), nullable=False)
  66. # TODO(alexpilotti): Add soft delete filter
  67. tasks = orm.relationship(Task, cascade="all,delete",
  68. backref=orm.backref('execution'))
  69. status = sqlalchemy.Column(sqlalchemy.String(100), nullable=False)
  70. number = sqlalchemy.Column(sqlalchemy.Integer, nullable=False)
  71. class BaseTransferAction(BASE, models.TimestampMixin, models.ModelBase,
  72. models.SoftDeleteMixin):
  73. __tablename__ = 'base_transfer_action'
  74. base_id = sqlalchemy.Column(sqlalchemy.String(36),
  75. default=lambda: str(uuid.uuid4()),
  76. primary_key=True)
  77. user_id = sqlalchemy.Column(sqlalchemy.String(255), nullable=False)
  78. project_id = sqlalchemy.Column(sqlalchemy.String(255), nullable=False)
  79. destination_environment = sqlalchemy.Column(types.Json, nullable=True)
  80. type = sqlalchemy.Column(sqlalchemy.String(50))
  81. executions = orm.relationship(TasksExecution, cascade="all,delete",
  82. backref=orm.backref('action'),
  83. primaryjoin="and_(BaseTransferAction."
  84. "base_id==TasksExecution.action_id, "
  85. "TasksExecution.deleted=='0')")
  86. instances = sqlalchemy.Column(types.List, nullable=False)
  87. info = sqlalchemy.Column(types.Json, nullable=False)
  88. notes = sqlalchemy.Column(sqlalchemy.Text, nullable=True)
  89. origin_endpoint_id = sqlalchemy.Column(
  90. sqlalchemy.String(36),
  91. sqlalchemy.ForeignKey('endpoint.id'), nullable=False)
  92. destination_endpoint_id = sqlalchemy.Column(
  93. sqlalchemy.String(36),
  94. sqlalchemy.ForeignKey('endpoint.id'), nullable=False)
  95. transfer_result = sqlalchemy.Column(types.Json, nullable=True)
  96. network_map = sqlalchemy.Column(types.Json, nullable=True)
  97. __mapper_args__ = {
  98. 'polymorphic_identity': 'base_transfer_action',
  99. 'polymorphic_on': type,
  100. }
  101. class Replica(BaseTransferAction):
  102. __tablename__ = 'replica'
  103. id = sqlalchemy.Column(
  104. sqlalchemy.String(36),
  105. sqlalchemy.ForeignKey(
  106. 'base_transfer_action.base_id'), primary_key=True)
  107. __mapper_args__ = {
  108. 'polymorphic_identity': 'replica',
  109. }
  110. class Migration(BaseTransferAction):
  111. __tablename__ = 'migration'
  112. id = sqlalchemy.Column(
  113. sqlalchemy.String(36),
  114. sqlalchemy.ForeignKey(
  115. 'base_transfer_action.base_id'), primary_key=True)
  116. replica_id = sqlalchemy.Column(
  117. sqlalchemy.String(36),
  118. sqlalchemy.ForeignKey('replica.id'), nullable=True)
  119. replica = orm.relationship(
  120. Replica, backref=orm.backref("migrations"), foreign_keys=[replica_id])
  121. __mapper_args__ = {
  122. 'polymorphic_identity': 'migration',
  123. }
  124. class Endpoint(BASE, models.TimestampMixin, models.ModelBase,
  125. models.SoftDeleteMixin):
  126. __tablename__ = 'endpoint'
  127. id = sqlalchemy.Column(sqlalchemy.String(36),
  128. default=lambda: str(uuid.uuid4()),
  129. primary_key=True)
  130. user_id = sqlalchemy.Column(sqlalchemy.String(255), nullable=False)
  131. project_id = sqlalchemy.Column(sqlalchemy.String(255), nullable=False)
  132. connection_info = sqlalchemy.Column(types.Json, nullable=False)
  133. type = sqlalchemy.Column(sqlalchemy.String(255), nullable=False)
  134. name = sqlalchemy.Column(sqlalchemy.String(255), nullable=False)
  135. description = sqlalchemy.Column(sqlalchemy.String(1024), nullable=True)
  136. origin_actions = orm.relationship(
  137. BaseTransferAction, backref=orm.backref('origin_endpoint'),
  138. primaryjoin="and_(BaseTransferAction.origin_endpoint_id==Endpoint.id, "
  139. "BaseTransferAction.deleted=='0')")
  140. destination_actions = orm.relationship(
  141. BaseTransferAction, backref=orm.backref('destination_endpoint'),
  142. primaryjoin="and_(BaseTransferAction.destination_endpoint_id=="
  143. "Endpoint.id, BaseTransferAction.deleted=='0')")
  144. class ReplicaSchedule(BASE, models.TimestampMixin, models.ModelBase,
  145. models.SoftDeleteMixin):
  146. __tablename__ = "replica_schedules"
  147. id = sqlalchemy.Column(sqlalchemy.String(36),
  148. default=lambda: str(uuid.uuid4()),
  149. primary_key=True)
  150. replica_id = sqlalchemy.Column(
  151. sqlalchemy.String(36),
  152. sqlalchemy.ForeignKey('replica.id'), nullable=False)
  153. replica = orm.relationship(
  154. Replica, backref=orm.backref("schedules"), foreign_keys=[replica_id])
  155. schedule = sqlalchemy.Column(types.Json, nullable=False)
  156. expiration_date = sqlalchemy.Column(
  157. sqlalchemy.types.DateTime, nullable=True)
  158. enabled = sqlalchemy.Column(
  159. sqlalchemy.Boolean, nullable=False, default=True)
  160. shutdown_instance = sqlalchemy.Column(
  161. sqlalchemy.Boolean, nullable=False, default=False)
  162. trust_id = sqlalchemy.Column(sqlalchemy.String(255), nullable=False)