def post(): form, error = JsonParser('name', 'type', 'zone', 'docker_uri', 'ssh_ip', 'ssh_port', Argument('desc', nullable=True, required=False)).parse() if error is None: host = Host(**form) host.save() return json_response(host) return json_response(message=error)
def put(host_id): form, error = JsonParser('name', 'type', 'zone', 'docker_uri', 'ssh_ip', 'ssh_port', Argument('desc', nullable=True, required=False)).parse() if error is None: host = Host.query.get_or_404(host_id) host.update(**form) return json_response(host) return json_response(message=error)
def setting_password(): form, error = JsonParser(Argument('password', help='请输入原密码'), Argument('newpassword', help='请输入新密码')).parse() if error is None: if g.user.verify_password(form.password): g.user.password = form.newpassword g.user.save() else: return json_response(message='原密码错误') return json_response(message=error)
def exec_host_command(): form, error = JsonParser('hosts_id', 'command').parse() if error is None: ip_list = Host.query.filter(Host.id.in_(tuple(form.hosts_id))).all() token = uuid.uuid4().hex q = QueuePool.make_queue(token, len(ip_list)) for h in ip_list: Thread(target=hosts_exec, args=(q, h.ssh_ip, h.ssh_port, form.command)).start() return json_response(token) return json_response(message=error)
def put_image(img_id): form, error = JsonParser(args.id, args.name, args.desc, args.value).parse() if error is None: exists_config = ImageConfig.query.filter_by(img_id=img_id, name=form.name).first() if exists_config and exists_config.id != form.id: return json_response(message='已存在相同的变量名称!') config = ImageConfig.query.get_or_404(form.id) config.update(**form) return json_response() return json_response(message=error)
def put(app_id): form, error = JsonParser(*args.values()).parse() if error is None: exists_record = App.query.filter_by(identify=form.identify).first() if exists_record and exists_record.id != app_id: return json_response(message='应用标识不能重复!') app = App.query.get_or_404(app_id) app.update(**form) app.save() return json_response(app) return json_response(message=error)
def delete(ser_id): service = Service.query.get_or_404(ser_id) rel = AppConfigRel.query.filter_by(d_id=ser_id, d_type='ser').first() if rel: rel_app = App.query.get_or_404(rel.s_id) return json_response(message='应用 <%s> 引用了该服务,请解除关联后再尝试删除该服务!' % rel_app.name) if ConfigKey.query.filter_by(owner_id=ser_id, owner_type='ser').count(): return json_response(message='为了安全,请删除该服务下的所有配置后再尝试删除该服务!') service.delete() return json_response()
def item_delete(user, data): note = user.note_get(data['note_id']) if not note: return json_response(400, "Missing note") if note.item_del(data['item_id']): return json_response(200, 'Item deleted successfully') return json_response(400, "Can't delete item")
def get_db(user_id): cli = User.query.get_or_404(user_id) try: with MysqlClient(ip=cli.db_host, user=cli.db_user, password=cli.db_password, port=cli.db_port) as f: res = f.basename() return json_response(res) except Exception as e: return json_response(message='连接失败')
def item_add(user, data): note = user.note_get(data['note_id']) if not note: return json_response(400, "Missing note") item = note.item_add(data['name'], data['description']) if item: return json_response(200, 'Item added successfully', item.id) return json_response(400, "Can't create new item")
def logs(): form, error = JsonParser(*args.values()).parse() if error is None: pro = App.query.get_or_404(form.app_id) env = Environment.query.get_or_404(form.env_id) cli = Host.query.get_or_404(form.cli_id) ctr = Container(cli.docker_uri, pro.identify + '.' + env.identify) str_logs = ctr.logs(timestamps=True, tail=20, since=int(time.time() - 300)) return json_response(str_logs) return json_response(message=error)
def get_valid(host_id): cli = Host.query.get_or_404(host_id) if not Setting.has('ssh_private_key'): utils.generate_and_save_ssh_key() if ssh.ssh_ping(cli.ssh_ip, cli.ssh_port): try: sync_host_info(host_id, cli.docker_uri) except DockerException: return json_response(message='docker fail') else: return json_response(message='ssh fail') return json_response()
def post(): form, error = JsonParser('nickname', 'username', 'password', Argument('role_id', type=int, help='请选择角色'), Argument('email', nullable=True), Argument('mobile', nullable=True)).parse() if error is None: username_is_exist = User.query.filter_by(username=form.username).first() if username_is_exist: return json_response(message="用户名已存在") User(**form).save() return json_response() return json_response(message=error)
def set_trigger(job_id): form, error = JsonParser( Argument('trigger', filter=lambda x: x in ['cron', 'date', 'interval'], help='错误的调度策略!'), Argument('trigger_args') ).parse() if error is None: if not scheduler.valid_job_trigger(form.trigger, form.trigger_args): return json_response(message='数据格式校验失败!') job = Job.query.get_or_404(job_id) if job.update(**form): scheduler.update_job(job) return json_response(message=error)
def switch(job_id): job = Job.query.get_or_404(job_id) if request.method == 'POST': if job.trigger is None: return json_response(message='请在 更多-设置触发器 中配置调度策略') job.update(enabled=True) scheduler.add_job(job) elif request.method == 'DELETE': job.update(enabled=False) scheduler.remove_job(job.id) else: abort(405) return json_response()
def note_create(user, data): try: note = user.note_create(data) note.changes_add(user, user.email + " created note '" + data['name'] + "'") if note: return json_response(200, 'Note created successfully', note.id) return json_response(200, "Can't create this note") except Exception as NoteCreatingError: log(NoteCreatingError) return jsonify(400)
def post_valid(host_id): form, error = JsonParser(Argument('secret', help='请输入root用户的密码!')).parse() if error is None: cli = Host.query.get_or_404(host_id) ssh.add_public_key(cli.ssh_ip, cli.ssh_port, form.secret) if ssh.ssh_ping(cli.ssh_ip, cli.ssh_port): try: sync_host_info(host_id, cli.docker_uri) except DockerException: return json_response(message='获取扩展信息失败,请检查docker是否可以正常连接!') else: return json_response(message='验证失败!') return json_response(message=error)
def post(): form, error = JsonParser(*args.values()).parse() if error is None: if App.query.filter_by(identify=form.identify).first(): return json_response(message='应用标识不能重复!') app = App(**form) app.create_date = datetime.now() app.edit_date = datetime.now() app.save() if not g.user.is_supper: g.user.role.update(app_ids=g.user.role.app_ids + ',%d' % app.id) return json_response(app) return json_response(message=error)
def state(token): q = QueuePool.get_queue(token) if q is None: return json_response(message='No such publish task') is_finished = q.finished try: message = q.get_nowait() if is_finished else q.get(timeout=10) except Empty: if is_finished: message = {'complete': True} QueuePool.remove_queue(token) else: message = {} return json_response(message)
def delete(app_id): app = App.query.get_or_404(app_id) if AppHostRel.query.filter_by(app_id=app_id).first(): return json_response(message='请先取消与已发布主机的关联后再尝试删除应用!') rel = AppConfigRel.query.filter_by(d_id=app_id, d_type='app').first() if rel: rel_app = App.query.get_or_404(rel.s_id) return json_response(message='应用 <%s> 引用了该应用,请解除关联后再尝试删除该应用!' % rel_app.name) app_keys = ConfigKey.query.filter_by(owner_id=app_id, owner_type='app') if [x for x in app_keys.all() if x.type != 'system']: return json_response(message='为了安全,请删除该应用下的所有配置后再尝试删除该应用!') app_keys.delete() app.delete() return json_response()
def get(): form, error = JsonParser(Argument('page', type=int, default=1, required=False), Argument('pagesize', type=int, default=10, required=False), Argument('host_zone', type=str, required=False),).parse(request.args) if error is None: if form.page == -1: hosts_data = Host.query.all() return json_response({'data': [x.to_json() for x in hosts_data], 'total': -1}) elif form.host_zone: hosts = Host.query.filter_by(zone=form.host_zone) else: hosts = Host.query hosts_data = hosts.limit(form.pagesize).offset((form.page - 1) * form.pagesize).all() return json_response({'data': [x.to_json() for x in hosts_data], 'total': hosts.count()}) return json_response(message=error)
def fetch_menus(app_id): q_type = request.args.get('type') if q_type == 'built-in': menus = DeployMenu.query.filter_by(app_id=app_id).all() built_in_menus = get_built_in_menus() for item in menus: built_in_menus[item.name]['command'] = item.command return json_response(list(built_in_menus.values())) pro = App.query.get_or_404(app_id) if q_type == 'all': menus = pro.menus[:] menus.extend(DeployMenu.query.filter_by(app_id=app_id).all()[:]) else: menus = pro.menus return json_response(menus)
def add(): form, error = JsonParser('name', 'desc', 'tag').parse() if error is None: image = Image.query.filter_by(name=form.name).first() if image: return json_response(message='该镜像名字已经存在。') tag = form.pop('tag') res = Image(**form).save() if res: return json_response() return json_response(message='添加镜像失败,请稍后再试!') return json_response(message=error)
def get_instance_log(): form, error = JsonParser( Argument('task_instance_name', type=str, required=True), ).parse(request.args) if error is None: try: path = '/tensorflow/{task_instance_name}/chief.log'.format( task_instance_name=form.task_instance_name) log = open(path, 'r', encoding='UTF-8').read() # 成功获取到md文件内容啦 return json_response({'data': log}) except OSError as reason: error = '读取文件出错了T_T,出错原因是%s' % str(reason) return json_response(message=error)
def put(u_id): form, error = JsonParser('nickname', 'is_active', Argument('role_id', type=int, required=False, help='请选择角色'), Argument('email', nullable=True), Argument('password', nullable=False, required=False), Argument('mobile', nullable=True)).parse() if error is None: u_info = User.query.get_or_404(u_id) if form.password: u_info.password = form.password if not u_info.update(**form) and form.password: u_info.save() return json_response(u_info) return json_response(message=error)
def app_update(): form, error = JsonParser(Argument('app_id', type=int), Argument('env_id', type=int), Argument('deploy_message', default=''), Argument('deploy_restart', type=bool), Argument('host_ids', type=list)).parse() if error is None: if not g.user.check_deploy_permission(form.env_id, form.app_id): return json_response(message='Permission denied'), 403 token = uuid.uuid4().hex q = QueuePool.make_queue(token, len(form.host_ids)) for host_id in form.pop('host_ids'): Thread(target=do_update, args=(q, form, host_id)).start() return json_response(token) return json_response(message=error)
def get(): form, error = JsonParser(Argument('page', type=int, default=1, required=False), Argument('pagesize', type=int, default=10, required=False), Argument('host_query', type=dict, required=False), ).parse(request.args) if error is None: host_data = Host.query if form.page == -1: return json_response({'data': [x.to_json() for x in host_data.all()], 'total': -1}) if form.host_query.get('name_field'): host_data = host_data.filter(Host.name.like('%{}%'.format(form.host_query['name_field']))) if form.host_query.get('zone_field'): host_data = host_data.filter_by(zone=form.host_query['zone_field']) result = host_data.limit(form.pagesize).offset((form.page - 1) * form.pagesize).all() return json_response({'data': [x.to_json() for x in result], 'total': host_data.count()}) return json_response(message=error)
def get_self(): return json_response({ 'username': g.user.username, 'nickname': g.user.nickname, 'mobile': g.user.mobile, 'email': g.user.email, })
def post(): form, error = JsonParser('name', 'group', 'desc', 'command_user', 'command', 'targets', Argument('command_user', default='root')).parse() if error is None: Job(**form).save() return json_response(message=error)
def put(job_id): form, error = JsonParser('name', 'group', 'desc', 'command', 'targets', Argument('command_user', default='root')).parse() if error is None: job = Job.query.get_or_404(job_id) job.update(**form) return json_response(message=error)