class RolePermissionRel(db.Model, ModelMixin): __tablename__ = 'account_role_permission_rel' __table_args__ = (db.PrimaryKeyConstraint('role_id', 'permission_id'), ) role_id = db.Column(db.Integer, db.ForeignKey('account_roles.id', ondelete='CASCADE')) permission_id = db.Column( db.Integer, db.ForeignKey('account_permissions.id', ondelete='CASCADE'))
class AppFieldRel(db.Model, ModelMixin): __tablename__ = 'deploy_app_field_rel' id = db.Column(db.Integer, primary_key=True) field_id = db.Column(db.Integer, db.ForeignKey('deploy_fields.id')) app_id = db.Column(db.Integer, db.ForeignKey('deploy_apps.id')) def __eq__(self, other): return other.field_id == self.field_id and other.app_id == self.app_id
class ConfigValue(db.Model, ModelMixin): __tablename__ = 'configuration_values' id = db.Column(db.Integer, primary_key=True) env_id = db.Column(db.Integer, db.ForeignKey('configuration_environments.id')) key_id = db.Column( db.Integer, db.ForeignKey('configuration_keys.id', ondelete='CASCADE')) value = db.Column(db.String(255))
class AppMenuRel(db.Model, ModelMixin): __tablename__ = 'deploy_app_menu_rel' id = db.Column(db.Integer, primary_key=True) menu_id = db.Column(db.Integer, db.ForeignKey('deploy_menus.id')) app_id = db.Column(db.Integer, db.ForeignKey('deploy_apps.id')) def __eq__(self, other): return other.menu_id == self.menu_id and other.app_id == self.app_id
class AppHostRel(db.Model, ModelMixin): __tablename__ = 'deploy_app_host_rel' id = db.Column(db.Integer, primary_key=True) env_id = db.Column(db.Integer, db.ForeignKey('configuration_environments.id')) app_id = db.Column(db.Integer, db.ForeignKey('deploy_apps.id')) host_id = db.Column(db.Integer, db.ForeignKey('assets_hosts.id')) def __eq__(self, other): return other.env_id == self.env_id and other.app_id == self.app_id and other.host_id == self.host_id
class History(db.Model, ModelMixin): __tablename__ = 'deploy_history' id = db.Column(db.Integer, primary_key=True) app_id = db.Column(db.Integer, db.ForeignKey('deploy_apps.id', ondelete='CASCADE')) host_id = db.Column(db.Integer, db.ForeignKey('assets_hosts.id', ondelete='CASCADE')) env_id = db.Column(db.Integer, db.ForeignKey('configuration_environments.id', ondelete='CASCADE')) api_token = db.Column(db.String(32)) deploy_message = db.Column(db.String(255)) deploy_restart = db.Column(db.Boolean) deploy_success = db.Column(db.Boolean) created = db.Column(db.String(20))
class DeployMenu(db.Model, ModelMixin): __tablename__ = 'deploy_menus' id = db.Column(db.Integer, primary_key=True) # 属于哪个应用的菜单 app_id = db.Column(db.Integer, db.ForeignKey('deploy_apps.id', ondelete='CASCADE'), nullable=True) # 菜单的显示名称 name = db.Column(db.String(50)) # 菜单的帮助及描述 desc = db.Column(db.String(255)) # 菜单展示的位置(发布: 1 / 更多: 2) position = db.Column(db.SmallInteger) # 执行结果展示方式 (页面实时输出: 1 / 仅通知成功与否: 2) display_type = db.Column(db.SmallInteger) # 执行的钩子(自定义命令) command = db.Column(db.Text) # 是否需要传入参数 required_args = db.Column(db.Boolean) # 在执行前是否需要弹框确认 required_confirm = db.Column(db.Boolean) apps = db.relationship('App', secondary='deploy_app_menu_rel') def __repr__(self): return '<DeployMenu %r>' % self.name
class AppConfigRel(db.Model, ModelMixin): __tablename__ = 'configuration_app_rel' id = db.Column(db.Integer, primary_key=True) s_id = db.Column(db.Integer, db.ForeignKey('deploy_apps.id')) d_id = db.Column(db.Integer) d_type = db.Column(db.String(50))
class JobHistory(db.Model, ModelMixin): __tablename__ = 'schedule_jobs_history' id = db.Column(db.Integer, primary_key=True) job_id = db.Column(db.Integer, db.ForeignKey('schedule_jobs.id', ondelete='CASCADE')) target = db.Column(db.String(50)) exit_code = db.Column(db.Integer) stdout = db.Column(db.Text) stderr = db.Column(db.Text) time_cost = db.Column(db.Float) created = db.Column(db.String(20)) create_time = db.Column(db.DateTime, server_default=func.now(), comment='创建时间') # onupdate设置自动更改 update_time = db.Column( db.DateTime, server_default=text('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'), comment='修改时间') @classmethod def write(cls, job_id, start_time, target, exit_code, stdout, stderr): cls(job_id=job_id, target=target, exit_code=exit_code, stdout=stdout[:1024], stderr=stderr[:1024], time_cost=round((datetime.now() - start_time).total_seconds(), 3), created=human_time(start_time)).save() def __repr__(self): return '<schedule.JonHistory id=%r job_id=%r>' % (self.id, self.job_id)
class JobHistory(db.Model, ModelMixin): __tablename__ = 'schedule_jobs_history' id = db.Column(db.Integer, primary_key=True) job_id = db.Column(db.Integer, db.ForeignKey('schedule_jobs.id', ondelete='CASCADE')) target = db.Column(db.String(50)) exit_code = db.Column(db.Integer) stdout = db.Column(db.Text) stderr = db.Column(db.Text) time_cost = db.Column(db.Float) created = db.Column(db.String(20)) @classmethod def write(cls, job_id, start_time, target, exit_code, stdout, stderr): cls( job_id=job_id, target=target, exit_code=exit_code, stdout=stdout[:1024], stderr=stderr[:1024], time_cost=round((datetime.now() - start_time).total_seconds(), 3), created=human_time(start_time) ).save() def __repr__(self): return '<schedule.JonHistory id=%r job_id=%r>' % (self.id, self.job_id) class Meta: ordering = ('-id',)
class App(db.Model, ModelMixin): __tablename__ = 'deploy_apps' id = db.Column(db.Integer, primary_key=True) identify = db.Column(db.String(50)) name = db.Column(db.String(50)) desc = db.Column(db.String(255)) group = db.Column(db.String(50)) image_id = db.Column(db.Integer, db.ForeignKey('deploy_images.id')) notify_way_id = db.Column(db.Integer, db.ForeignKey('notify_way.id')) image = db.relationship(Image) notify_way = db.relationship(NotifyWay) menus = db.relationship('DeployMenu', secondary='deploy_app_menu_rel') fields = db.relationship('DeployField', secondary='deploy_app_field_rel') def __repr__(self): return '<App %r>' % self.name
class ImageConfig(db.Model, ModelMixin): __tablename__ = 'deploy_image_configs' id = db.Column(db.Integer, primary_key=True) img_id = db.Column(db.ForeignKey('deploy_images.id', ondelete='CASCADE')) name = db.Column(db.String(50)) desc = db.Column(db.String(255)) value = db.Column(db.String(255)) def __repr__(self): return '<ImageConfig name=%r, value=%r>' % (self.name, self.value)
class UserPriv(db.Model, ModelMixin): __tablename__ = 'user_privileges' id = db.Column(db.Integer, primary_key=True) account_id = db.Column(db.Integer, db.ForeignKey('user_accounts.id')) db_database = db.Column(db.String(128)) db_priv = db.Column(db.String(128)) __table_args__ = (db.UniqueConstraint( 'account_id', 'db_database', name='uniq_account_id_db_database'), ) def __repr__(self): return '<UserInfo %r>' % self.name
class UserInfo(db.Model, ModelMixin): __tablename__ = 'user_accounts' id = db.Column(db.Integer, primary_key=True) user_id = db.Column(db.Integer, db.ForeignKey('user_hosts.id')) db_user = db.Column(db.String(128)) db_password = db.Column(db.String(128)) desc = db.Column(db.String(255)) __table_args__ = (db.Index('idx_user_id', 'user_id'), ) def __repr__(self): return '<UserInfo %r>' % self.name
class HostExtend(db.Model, ModelMixin): __tablename__ = 'assets_hosts_extend' id = db.Column(db.Integer, primary_key=True) host_id = db.Column(db.Integer, db.ForeignKey('assets_hosts.id')) operate_system = db.Column(db.String(64)) memory = db.Column(db.SmallInteger) cpu = db.Column(db.SmallInteger) disk = db.Column(db.SmallInteger) outer_ip = db.Column(db.String(128)) inner_ip = db.Column(db.String(128)) hosts = db.relationship(Host, backref=db.backref('host'))
class ImageTag(db.Model, ModelMixin): __tablename__ = 'deploy_image_tags' id = db.Column(db.Integer, primary_key=True) image_id = db.Column(db.Integer, db.ForeignKey('deploy_images.id')) name = db.Column(db.String(50)) # sha256加密字符串,例如(sha256:a6647f8a2744cb8bfeff0a1b8623c8070dd92b0e6708ffa04ceb5349eaf492d6) digest = db.Column(db.String(64 + 7)) created = db.Column(db.String(20)) image = db.relationship(Image, backref=db.backref('tags')) def __repr__(self): return '<ImageTag %r>' % self.name
class User(db.Model, ModelMixin): __tablename__ = 'account_users' id = db.Column(db.Integer, primary_key=True) role_id = db.Column(db.Integer, db.ForeignKey('account_roles.id')) username = db.Column(db.String(50), unique=True, nullable=False) nickname = db.Column(db.String(50)) password_hash = db.Column(db.String(100), nullable=False) email = db.Column(db.String(120)) mobile = db.Column(db.String(30)) is_supper = db.Column(db.Boolean, default=False) type = db.Column(db.String(20), default='系统用户') is_active = db.Column(db.Boolean, default=True) access_token = db.Column(db.String(32)) token_expired = db.Column(db.Integer) role = db.relationship('Role') @property def password(self): raise AttributeError('password only can write') @password.setter def password(self, plain): self.password_hash = generate_password_hash(plain) @property def permissions(self): if self.is_supper: return set() return Role.get_permissions(self.role_id) def verify_password(self, password): return check_password_hash(self.password_hash, password) def check_deploy_permission(self, env_id, app_id): if self.is_supper: return True env_ids = self.role.env_ids.split(',') if self.role.env_ids else [] app_ids = self.role.app_ids.split(',') if self.role.app_ids else [] return str(env_id) in env_ids and str(app_id) in app_ids def __repr__(self): return '<User %r>' % self.username class Meta: ordering = ('-id', )
class HostExtend(db.Model, ModelMixin): __tablename__ = 'assets_hosts_extend' id = db.Column(db.Integer, primary_key=True) host_id = db.Column(db.Integer, db.ForeignKey('assets_hosts.id')) operate_system = db.Column(db.String(64)) memory = db.Column(db.SmallInteger) cpu_core = db.Column(db.SmallInteger) avaliable_mem = db.Column(db.SmallInteger) avaliable_core = db.Column(db.SmallInteger) hosts = db.relationship(Host, backref=db.backref('host')) create_time = db.Column(db.DateTime, server_default=func.now(), comment='创建时间') # onupdate设置自动更改 update_time = db.Column( db.DateTime, server_default=text('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'), comment='修改时间')