models.py 5.3 KB

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