models.py 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  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. storage_mappings = sqlalchemy.Column(types.Json, nullable=True)
  98. __mapper_args__ = {
  99. 'polymorphic_identity': 'base_transfer_action',
  100. 'polymorphic_on': type,
  101. }
  102. class Replica(BaseTransferAction):
  103. __tablename__ = 'replica'
  104. id = sqlalchemy.Column(
  105. sqlalchemy.String(36),
  106. sqlalchemy.ForeignKey(
  107. 'base_transfer_action.base_id'), primary_key=True)
  108. __mapper_args__ = {
  109. 'polymorphic_identity': 'replica',
  110. }
  111. class Migration(BaseTransferAction):
  112. __tablename__ = 'migration'
  113. id = sqlalchemy.Column(
  114. sqlalchemy.String(36),
  115. sqlalchemy.ForeignKey(
  116. 'base_transfer_action.base_id'), primary_key=True)
  117. replica_id = sqlalchemy.Column(
  118. sqlalchemy.String(36),
  119. sqlalchemy.ForeignKey('replica.id'), nullable=True)
  120. replica = orm.relationship(
  121. Replica, backref=orm.backref("migrations"), foreign_keys=[replica_id])
  122. __mapper_args__ = {
  123. 'polymorphic_identity': 'migration',
  124. }
  125. class Endpoint(BASE, models.TimestampMixin, models.ModelBase,
  126. models.SoftDeleteMixin):
  127. __tablename__ = 'endpoint'
  128. id = sqlalchemy.Column(sqlalchemy.String(36),
  129. default=lambda: str(uuid.uuid4()),
  130. primary_key=True)
  131. user_id = sqlalchemy.Column(sqlalchemy.String(255), nullable=False)
  132. project_id = sqlalchemy.Column(sqlalchemy.String(255), nullable=False)
  133. connection_info = sqlalchemy.Column(types.Json, nullable=False)
  134. type = sqlalchemy.Column(sqlalchemy.String(255), nullable=False)
  135. name = sqlalchemy.Column(sqlalchemy.String(255), nullable=False)
  136. description = sqlalchemy.Column(sqlalchemy.String(1024), nullable=True)
  137. origin_actions = orm.relationship(
  138. BaseTransferAction, backref=orm.backref('origin_endpoint'),
  139. primaryjoin="and_(BaseTransferAction.origin_endpoint_id==Endpoint.id, "
  140. "BaseTransferAction.deleted=='0')")
  141. destination_actions = orm.relationship(
  142. BaseTransferAction, backref=orm.backref('destination_endpoint'),
  143. primaryjoin="and_(BaseTransferAction.destination_endpoint_id=="
  144. "Endpoint.id, BaseTransferAction.deleted=='0')")
  145. class ReplicaSchedule(BASE, models.TimestampMixin, models.ModelBase,
  146. models.SoftDeleteMixin):
  147. __tablename__ = "replica_schedules"
  148. id = sqlalchemy.Column(sqlalchemy.String(36),
  149. default=lambda: str(uuid.uuid4()),
  150. primary_key=True)
  151. replica_id = sqlalchemy.Column(
  152. sqlalchemy.String(36),
  153. sqlalchemy.ForeignKey('replica.id'), nullable=False)
  154. replica = orm.relationship(
  155. Replica, backref=orm.backref("schedules"), foreign_keys=[replica_id])
  156. schedule = sqlalchemy.Column(types.Json, nullable=False)
  157. expiration_date = sqlalchemy.Column(
  158. sqlalchemy.types.DateTime, nullable=True)
  159. enabled = sqlalchemy.Column(
  160. sqlalchemy.Boolean, nullable=False, default=True)
  161. shutdown_instance = sqlalchemy.Column(
  162. sqlalchemy.Boolean, nullable=False, default=False)
  163. trust_id = sqlalchemy.Column(sqlalchemy.String(255), nullable=False)