models.py 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. from public import db
  2. from libs.model import ModelMixin
  3. from apps.system.models import NotifyWay
  4. class Image(db.Model, ModelMixin):
  5. __tablename__ = 'deploy_images'
  6. id = db.Column(db.Integer, primary_key=True)
  7. name = db.Column(db.String(50), unique=True)
  8. desc = db.Column(db.String(255))
  9. @property
  10. def latest(self):
  11. tag = ImageTag.query.filter_by(image_id=self.id).order_by(ImageTag.created.desc()).first()
  12. if not tag:
  13. raise Exception('Not has valid image tag')
  14. return tag.name
  15. def __repr__(self):
  16. return '<Image %r>' % self.name
  17. class ImageConfig(db.Model, ModelMixin):
  18. __tablename__ = 'deploy_image_configs'
  19. id = db.Column(db.Integer, primary_key=True)
  20. img_id = db.Column(db.ForeignKey('deploy_images.id', ondelete='CASCADE'))
  21. name = db.Column(db.String(50))
  22. desc = db.Column(db.String(255))
  23. value = db.Column(db.String(255))
  24. def __repr__(self):
  25. return '<ImageConfig name=%r, value=%r>' % (self.name, self.value)
  26. class ImageTag(db.Model, ModelMixin):
  27. __tablename__ = 'deploy_image_tags'
  28. id = db.Column(db.Integer, primary_key=True)
  29. image_id = db.Column(db.Integer, db.ForeignKey('deploy_images.id'))
  30. name = db.Column(db.String(50))
  31. # sha256加密字符串,例如(sha256:a6647f8a2744cb8bfeff0a1b8623c8070dd92b0e6708ffa04ceb5349eaf492d6)
  32. digest = db.Column(db.String(64 + 7))
  33. created = db.Column(db.String(20))
  34. image = db.relationship(Image, backref=db.backref('tags'))
  35. def __repr__(self):
  36. return '<ImageTag %r>' % self.name
  37. class History(db.Model, ModelMixin):
  38. __tablename__ = 'deploy_history'
  39. id = db.Column(db.Integer, primary_key=True)
  40. app_id = db.Column(db.Integer, db.ForeignKey('deploy_apps.id', ondelete='CASCADE'))
  41. host_id = db.Column(db.Integer, db.ForeignKey('assets_hosts.id', ondelete='CASCADE'))
  42. env_id = db.Column(db.Integer, db.ForeignKey('configuration_environments.id', ondelete='CASCADE'))
  43. api_token = db.Column(db.String(32))
  44. deploy_message = db.Column(db.String(255))
  45. deploy_restart = db.Column(db.Boolean)
  46. deploy_success = db.Column(db.Boolean)
  47. created = db.Column(db.String(20))
  48. class App(db.Model, ModelMixin):
  49. __tablename__ = 'deploy_apps'
  50. id = db.Column(db.Integer, primary_key=True)
  51. identify = db.Column(db.String(50))
  52. name = db.Column(db.String(50))
  53. desc = db.Column(db.String(255))
  54. group = db.Column(db.String(50))
  55. image_id = db.Column(db.Integer, db.ForeignKey('deploy_images.id'))
  56. notify_way_id = db.Column(db.Integer, db.ForeignKey('notify_way.id'))
  57. image = db.relationship(Image)
  58. notify_way = db.relationship(NotifyWay)
  59. menus = db.relationship('DeployMenu', secondary='deploy_app_menu_rel')
  60. fields = db.relationship('DeployField', secondary='deploy_app_field_rel')
  61. def __repr__(self):
  62. return '<App %r>' % self.name
  63. class AppHostRel(db.Model, ModelMixin):
  64. __tablename__ = 'deploy_app_host_rel'
  65. id = db.Column(db.Integer, primary_key=True)
  66. env_id = db.Column(db.Integer, db.ForeignKey('configuration_environments.id'))
  67. app_id = db.Column(db.Integer, db.ForeignKey('deploy_apps.id'))
  68. host_id = db.Column(db.Integer, db.ForeignKey('assets_hosts.id'))
  69. def __eq__(self, other):
  70. return other.env_id == self.env_id and other.app_id == self.app_id and other.host_id == self.host_id
  71. class DeployMenu(db.Model, ModelMixin):
  72. __tablename__ = 'deploy_menus'
  73. id = db.Column(db.Integer, primary_key=True)
  74. # 属于哪个应用的菜单
  75. app_id = db.Column(db.Integer, db.ForeignKey('deploy_apps.id', ondelete='CASCADE'), nullable=True)
  76. # 菜单的显示名称
  77. name = db.Column(db.String(50))
  78. # 菜单的帮助及描述
  79. desc = db.Column(db.String(255))
  80. # 菜单展示的位置(发布: 1 / 更多: 2)
  81. position = db.Column(db.SmallInteger)
  82. # 执行结果展示方式 (页面实时输出: 1 / 仅通知成功与否: 2)
  83. display_type = db.Column(db.SmallInteger)
  84. # 执行的钩子(自定义命令)
  85. command = db.Column(db.Text)
  86. # 是否需要传入参数
  87. required_args = db.Column(db.Boolean)
  88. # 在执行前是否需要弹框确认
  89. required_confirm = db.Column(db.Boolean)
  90. apps = db.relationship('App', secondary='deploy_app_menu_rel')
  91. def __repr__(self):
  92. return '<DeployMenu %r>' % self.name
  93. class AppMenuRel(db.Model, ModelMixin):
  94. __tablename__ = 'deploy_app_menu_rel'
  95. id = db.Column(db.Integer, primary_key=True)
  96. menu_id = db.Column(db.Integer, db.ForeignKey('deploy_menus.id'))
  97. app_id = db.Column(db.Integer, db.ForeignKey('deploy_apps.id'))
  98. def __eq__(self, other):
  99. return other.menu_id == self.menu_id and other.app_id == self.app_id
  100. class DeployField(db.Model, ModelMixin):
  101. __tablename__ = 'deploy_fields'
  102. id = db.Column(db.Integer, primary_key=True)
  103. name = db.Column(db.String(50))
  104. desc = db.Column(db.String(255))
  105. command = db.Column(db.Text)
  106. apps = db.relationship('App', secondary='deploy_app_field_rel')
  107. def __repr__(self):
  108. return '<DeployField %r>' % self.name
  109. class AppFieldRel(db.Model, ModelMixin):
  110. __tablename__ = 'deploy_app_field_rel'
  111. id = db.Column(db.Integer, primary_key=True)
  112. field_id = db.Column(db.Integer, db.ForeignKey('deploy_fields.id'))
  113. app_id = db.Column(db.Integer, db.ForeignKey('deploy_apps.id'))
  114. def __eq__(self, other):
  115. return other.field_id == self.field_id and other.app_id == self.app_id