Пример #1
0
 def post(self, request):
     form, error = JsonParser(
         Argument('id', type=int, required=False),
         Argument('deploy_id', type=int, help='缺少必要参数'),
         Argument('name', help='请输申请标题'),
         Argument('extra', type=list, help='缺少必要参数'),
         Argument('host_ids',
                  type=list,
                  filter=lambda x: len(x),
                  help='请选择要部署的主机'),
         Argument('desc', required=False),
     ).parse(request.body)
     if error is None:
         deploy = Deploy.objects.filter(pk=form.deploy_id).first()
         if not deploy:
             return json_response(error='未找到该发布配置')
         form.status = '0' if deploy.is_audit else '1'
         form.extra = json.dumps(form.extra)
         form.host_ids = json.dumps(form.host_ids)
         if form.id:
             DeployRequest.objects.filter(pk=form.id).update(
                 created_by=request.user, reason=None, **form)
         else:
             DeployRequest.objects.create(created_by=request.user, **form)
     return json_response(error=error)
Пример #2
0
def post_request_ext1_rollback(request):
    form, error = JsonParser(
        Argument('request_id', type=int, help='请选择要回滚的版本'),
        Argument('name', help='请输入申请标题'),
        Argument('host_ids',
                 type=list,
                 filter=lambda x: len(x),
                 help='请选择要部署的主机'),
        Argument('desc', required=False),
    ).parse(request.body)
    if error is None:
        req = DeployRequest.objects.get(pk=form.pop('request_id'))
        requests = DeployRequest.objects.filter(deploy=req.deploy,
                                                status__in=('3', '-3'))
        versions = list({x.spug_version: 1 for x in requests}.keys())
        if req.spug_version not in versions[:req.deploy.extend_obj.versions +
                                            1]:
            return json_response(
                error='选择的版本超出了发布配置中设置的版本数量,无法快速回滚,可通过新建发布申请选择构建仓库里的该版本再次发布。')

        form.status = '0' if req.deploy.is_audit else '1'
        form.host_ids = json.dumps(sorted(form.host_ids))
        new_req = DeployRequest.objects.create(deploy_id=req.deploy_id,
                                               repository_id=req.repository_id,
                                               type='2',
                                               extra=req.extra,
                                               version=req.version,
                                               spug_version=req.spug_version,
                                               created_by=request.user,
                                               **form)
        if req.deploy.is_audit:
            Thread(target=Helper.send_deploy_notify,
                   args=(new_req, 'approve_req')).start()
    return json_response(error=error)
Пример #3
0
 def post(self, request):
     form, error = JsonParser(
         Argument('id', type=int, required=False),
         Argument('app_id', type=int, help='请选择应用'),
         Argument('env_id', type=int, help='请选择环境'),
         Argument('host_ids', type=list, filter=lambda x: len(x), help='请选择要部署的主机'),
         Argument('extend', filter=lambda x: x in dict(Deploy.EXTENDS), help='请选择发布类型'),
         Argument('is_audit', type=bool, default=False)
     ).parse(request.body)
     if error is None:
         deploy = Deploy.objects.filter(app_id=form.app_id, env_id=form.env_id).first()
         if deploy and deploy.id != form.id:
             return json_response(error='应用在该环境下已经存在发布配置')
         form.host_ids = json.dumps(form.host_ids)
         if form.extend == '1':
             extend_form, error = JsonParser(
                 Argument('git_repo', handler=str.strip, help='请输入git仓库地址'),
                 Argument('dst_dir', handler=str.strip, help='请输入发布目标路径'),
                 Argument('dst_repo', handler=str.strip, help='请输入目标仓库路径'),
                 Argument('versions', type=int, help='请输入保留历史版本数量'),
                 Argument('filter_rule', type=dict, help='参数错误'),
                 Argument('custom_envs', handler=str.strip, required=False),
                 Argument('hook_pre_server', handler=str.strip, default=''),
                 Argument('hook_post_server', handler=str.strip, default=''),
                 Argument('hook_pre_host', handler=str.strip, default=''),
                 Argument('hook_post_host', handler=str.strip, default='')
             ).parse(request.body)
             if error:
                 return json_response(error=error)
             extend_form.filter_rule = json.dumps(extend_form.filter_rule)
             extend_form.custom_envs = json.dumps(parse_envs(extend_form.custom_envs))
             if form.id:
                 Deploy.objects.filter(pk=form.id).update(**form)
                 DeployExtend1.objects.filter(deploy_id=form.id).update(**extend_form)
             else:
                 deploy = Deploy.objects.create(created_by=request.user, **form)
                 DeployExtend1.objects.create(deploy=deploy, **extend_form)
         elif form.extend == '2':
             extend_form, error = JsonParser(
                 Argument('server_actions', type=list, help='请输入执行动作'),
                 Argument('host_actions', type=list, help='请输入执行动作')
             ).parse(request.body)
             if error:
                 return json_response(error=error)
             if len(extend_form.server_actions) + len(extend_form.host_actions) == 0:
                 return json_response(error='请至少设置一个执行的动作')
             extend_form.server_actions = json.dumps(extend_form.server_actions)
             extend_form.host_actions = json.dumps(extend_form.host_actions)
             if form.id:
                 Deploy.objects.filter(pk=form.id).update(**form)
                 DeployExtend2.objects.filter(deploy_id=form.id).update(**extend_form)
             else:
                 deploy = Deploy.objects.create(created_by=request.user, **form)
                 DeployExtend2.objects.create(deploy=deploy, **extend_form)
     return json_response(error=error)
Пример #4
0
 def post(self, request):
     form, error = JsonParser(
         Argument('id', type=int, required=False),
         Argument('deploy_id', type=int, help='缺少必要参数'),
         Argument('name', help='请输申请标题'),
         Argument('extra', type=list, help='缺少必要参数'),
         Argument('host_ids',
                  type=list,
                  filter=lambda x: len(x),
                  help='请选择要部署的主机'),
         Argument('desc', required=False),
     ).parse(request.body)
     req_id = None
     if error is None:
         deploy = Deploy.objects.filter(pk=form.deploy_id).first()
         if not deploy:
             return json_response(error='未找到该发布配置')
         if form.extra[0] == 'tag' and not form.extra[1]:
             return json_response(error='请选择要发布的Tag')
         if form.extra[0] == 'branch' and not form.extra[2]:
             return json_response(error='请选择要发布的分支及Commit ID')
         if deploy.extend == '2':
             if form.extra[0]:
                 form.extra[0] = form.extra[0].replace("'", '')
             if DeployExtend2.objects.filter(
                     deploy=deploy,
                     host_actions__contains='"src_mode": "1"').exists():
                 if len(form.extra) < 2:
                     return json_response(
                         error='该应用的发布配置中使用了数据传输动作且设置为发布时上传,请上传要传输的数据')
                 form.version = form.extra[1].get('path')
         form.name = form.name.replace("'", '')
         form.status = '0' if deploy.is_audit else '1'
         form.extra = json.dumps(form.extra)
         form.host_ids = json.dumps(form.host_ids)
         if form.id:
             req = DeployRequest.objects.get(pk=form.id)
             is_required_notify = deploy.is_audit and req.status == '-1'
             DeployRequest.objects.filter(pk=form.id).update(
                 created_by=request.user, reason=None, **form)
         else:
             req = DeployRequest.objects.create(created_by=request.user,
                                                **form)
             req_id = req.id
             is_required_notify = deploy.is_audit
         if is_required_notify:
             Thread(target=Helper.send_deploy_notify,
                    args=(req, 'approve_req')).start()
     if req_id is None:
         return json_response(error=error)
     else:
         return json_response({'id': req_id})
Пример #5
0
def post_request_ext1(request):
    form, error = JsonParser(
        Argument('id', type=int, required=False),
        Argument('deploy_id', type=int, help='参数错误'),
        Argument('name', help='请输入申请标题'),
        Argument('extra', type=list, help='请选择发布版本'),
        Argument('host_ids',
                 type=list,
                 filter=lambda x: len(x),
                 help='请选择要部署的主机'),
        Argument('type', default='1'),
        Argument('plan', required=False),
        Argument('desc', required=False),
    ).parse(request.body)
    if error is None:
        deploy = Deploy.objects.get(pk=form.deploy_id)
        form.spug_version = Repository.make_spug_version(deploy.id)
        if form.extra[0] == 'tag':
            if not form.extra[1]:
                return json_response(error='请选择要发布的版本')
            form.version = form.extra[1]
        elif form.extra[0] == 'branch':
            if not form.extra[2]:
                return json_response(error='请选择要发布的分支及Commit ID')
            form.version = f'{form.extra[1]}#{form.extra[2][:6]}'
        elif form.extra[0] == 'repository':
            if not form.extra[1]:
                return json_response(error='请选择要发布的版本')
            repository = Repository.objects.get(pk=form.extra[1])
            form.repository_id = repository.id
            form.version = repository.version
            form.spug_version = repository.spug_version
            form.extra = ['repository'] + json.loads(repository.extra)
        else:
            return json_response(error='参数错误')

        form.extra = json.dumps(form.extra)
        form.status = '0' if deploy.is_audit else '1'
        form.host_ids = json.dumps(sorted(form.host_ids))
        if form.id:
            req = DeployRequest.objects.get(pk=form.id)
            is_required_notify = deploy.is_audit and req.status == '-1'
            DeployRequest.objects.filter(pk=form.id).update(
                created_by=request.user, reason=None, **form)
        else:
            req = DeployRequest.objects.create(created_by=request.user, **form)
            is_required_notify = deploy.is_audit
        if is_required_notify:
            Thread(target=Helper.send_deploy_notify,
                   args=(req, 'approve_req')).start()
    return json_response(error=error)
Пример #6
0
def post_request_ext2(request):
    form, error = JsonParser(
        Argument('id', type=int, required=False),
        Argument('deploy_id', type=int, help='缺少必要参数'),
        Argument('name', help='请输申请标题'),
        Argument('host_ids',
                 type=list,
                 filter=lambda x: len(x),
                 help='请选择要部署的主机'),
        Argument('extra', type=dict, required=False),
        Argument('version', default=''),
        Argument('type', default='1'),
        Argument('plan', required=False),
        Argument('desc', required=False),
    ).parse(request.body)
    if error is None:
        deploy = Deploy.objects.filter(pk=form.deploy_id).first()
        if not deploy:
            return json_response(error='未找到该发布配置')
        extra = form.pop('extra')
        if DeployExtend2.objects.filter(
                deploy=deploy,
                host_actions__contains='"src_mode": "1"').exists():
            if not extra:
                return json_response(
                    error='该应用的发布配置中使用了数据传输动作且设置为发布时上传,请上传要传输的数据')
            form.spug_version = extra['path']
            form.extra = json.dumps(extra)
        else:
            form.spug_version = Repository.make_spug_version(deploy.id)
        form.name = form.name.replace("'", '')
        form.status = '0' if deploy.is_audit else '1'
        form.host_ids = json.dumps(form.host_ids)
        if form.id:
            req = DeployRequest.objects.get(pk=form.id)
            is_required_notify = deploy.is_audit and req.status == '-1'
            DeployRequest.objects.filter(pk=form.id).update(
                created_by=request.user, reason=None, **form)
        else:
            req = DeployRequest.objects.create(created_by=request.user, **form)
            is_required_notify = deploy.is_audit
        if is_required_notify:
            Thread(target=Helper.send_deploy_notify,
                   args=(req, 'approve_req')).start()
    return json_response(error=error)
Пример #7
0
 def post(self, request):
     form, error = JsonParser(
         Argument('id', type=int, required=False),
         Argument('deploy_id', type=int, help='缺少必要参数'),
         Argument('name', help='请输申请标题'),
         Argument('extra', type=list, help='缺少必要参数'),
         Argument('host_ids',
                  type=list,
                  filter=lambda x: len(x),
                  help='请选择要部署的主机'),
         Argument('desc', required=False),
     ).parse(request.body)
     if error is None:
         deploy = Deploy.objects.filter(pk=form.deploy_id).first()
         if not deploy:
             return json_response(error='未找到该发布配置')
         if form.extra[0] == 'tag' and not form.extra[1]:
             return json_response(error='请选择要发布的Tag')
         if form.extra[0] == 'branch' and not form.extra[2]:
             return json_response(error='请选择要发布的分支及Commit ID')
         form.status = '0' if deploy.is_audit else '1'
         form.extra = json.dumps(form.extra)
         form.host_ids = json.dumps(form.host_ids)
         if form.id:
             req = DeployRequest.objects.get(pk=form.id)
             is_required_notify = deploy.is_audit and req.status == '-1'
             DeployRequest.objects.filter(pk=form.id).update(
                 created_by=request.user, reason=None, **form)
         else:
             req = DeployRequest.objects.create(created_by=request.user,
                                                **form)
             is_required_notify = deploy.is_audit
         if is_required_notify:
             Thread(target=Helper.send_deploy_notify,
                    args=(req, 'approve_req')).start()
     return json_response(error=error)
Пример #8
0
 def post(self, request):
     form, error = JsonParser(
         Argument('id', type=int, required=False),
         Argument('app_id', type=int, help='请选择应用'),
         Argument('env_id', type=int, help='请选择环境'),
         Argument('host_ids', type=list, filter=lambda x: len(x), help='请选择要部署的主机'),
         Argument('rst_notify', type=dict, help='请选择发布结果通知方式'),
         Argument('extend', filter=lambda x: x in dict(Deploy.EXTENDS), help='请选择发布类型'),
         Argument('is_parallel', type=bool, default=True),
         Argument('is_audit', type=bool, default=False)
     ).parse(request.body)
     if error is None:
         deploy = Deploy.objects.filter(app_id=form.app_id, env_id=form.env_id).first()
         if deploy and deploy.id != form.id:
             return json_response(error='应用在该环境下已经存在发布配置')
         form.host_ids = json.dumps(form.host_ids)
         form.rst_notify = json.dumps(form.rst_notify)
         if form.extend == '1':
             extend_form, error = JsonParser(
                 Argument('git_repo', handler=str.strip, help='请输入git仓库地址'),
                 Argument('dst_dir', handler=str.strip, help='请输入发布部署路径'),
                 Argument('dst_repo', handler=str.strip, help='请输入发布存储路径'),
                 Argument('versions', type=int, filter=lambda x: x > 0, help='请输入发布保留版本数量'),
                 Argument('filter_rule', type=dict, help='参数错误'),
                 Argument('hook_pre_server', handler=str.strip, default=''),
                 Argument('hook_post_server', handler=str.strip, default=''),
                 Argument('hook_pre_host', handler=str.strip, default=''),
                 Argument('hook_post_host', handler=str.strip, default='')
             ).parse(request.body)
             if error:
                 return json_response(error=error)
             extend_form.dst_dir = extend_form.dst_dir.rstrip('/')
             extend_form.filter_rule = json.dumps(extend_form.filter_rule)
             if form.id:
                 extend = DeployExtend1.objects.filter(deploy_id=form.id).first()
                 if extend.git_repo != extend_form.git_repo:
                     remove_repo(form.id)
                 Deploy.objects.filter(pk=form.id).update(**form)
                 DeployExtend1.objects.filter(deploy_id=form.id).update(**extend_form)
             else:
                 deploy = Deploy.objects.create(created_by=request.user, **form)
                 DeployExtend1.objects.create(deploy=deploy, **extend_form)
         elif form.extend == '2':
             extend_form, error = JsonParser(
                 Argument('server_actions', type=list, help='请输入执行动作'),
                 Argument('host_actions', type=list, help='请输入执行动作')
             ).parse(request.body)
             if error:
                 return json_response(error=error)
             if len(extend_form.server_actions) + len(extend_form.host_actions) == 0:
                 return json_response(error='请至少设置一个执行的动作')
             extend_form.require_upload = any(x.get('src_mode') == '1' for x in extend_form.host_actions)
             extend_form.server_actions = json.dumps(extend_form.server_actions)
             extend_form.host_actions = json.dumps(extend_form.host_actions)
             if form.id:
                 Deploy.objects.filter(pk=form.id).update(**form)
                 DeployExtend2.objects.filter(deploy_id=form.id).update(**extend_form)
             else:
                 deploy = Deploy.objects.create(created_by=request.user, **form)
                 DeployExtend2.objects.create(deploy=deploy, **extend_form)
     return json_response(error=error)