Exemple #1
0
 def get(self, request, *args, **kwargs):
     """
     获取组件状态
     ---
     parameters:
         - name: tenantName
           description: 租户名
           required: true
           type: string
           paramType: path
         - name: serviceAlias
           description: 组件别名
           required: true
           type: string
           paramType: path
     """
     bean = dict()
     try:
         bean["check_uuid"] = self.service.check_uuid
         status_map = app_service.get_service_status(
             self.tenant, self.service)
         bean.update(status_map)
         result = general_message(200, "success", "查询成功", bean=bean)
     except Exception as e:
         logger.exception(e)
         result = error_message(e.message)
     return Response(result, status=result["code"])
Exemple #2
0
 def get_app_running_service_count(self, tenant, services):
     count = 0
     for service in services:
         detail = console_app_service.get_service_status(tenant, service)
         if detail["status"] == "running":
             count += 1
     return count
Exemple #3
0
 def post(self, request, service_id, *args, **kwargs):
     """自定义回调接口处发自动部署"""
     logger.debug(request.data)
     import pickle, base64
     secret_key = request.data.get("secret_key")
     # 加密
     deploy_key = deploy_repo.get_secret_key_by_service_id(
         service_id=service_id)
     deploy_key_decode = pickle.loads(
         base64.b64decode(deploy_key)).get("secret_key")
     if secret_key != deploy_key_decode:
         result = general_message(400, "failed", "密钥错误")
         return Response(result, status=400)
     service_obj = TenantServiceInfo.objects.get(service_id=service_id)
     tenant_obj = Tenants.objects.get(tenant_id=service_obj.tenant_id)
     status_map = app_service.get_service_status(tenant_obj, service_obj)
     user_obj = Users.objects.get(user_id=service_obj.creater)
     user_name = user_obj.nick_name
     status = status_map.get("status", None)
     logger.debug(status)
     if status == "running" or status == "abnormal":
         return user_services.deploy_service(tenant_obj=tenant_obj,
                                             service_obj=service_obj,
                                             user=user_obj,
                                             committer_name=user_name)
     else:
         logger.debug("应用状态异常")
         result = general_message(400, "failed", "应用状态不支持")
         return Response(result, status=400)
Exemple #4
0
 def post(self, request, service_id, *args, **kwargs):
     """自定义回调接口处发自动部署"""
     logger.debug(request.data)
     import pickle
     import base64
     secret_key = request.data.get("secret_key")
     # 加密
     deploy_key = deploy_repo.get_secret_key_by_service_id(
         service_id=service_id)
     deploy_key_decode = pickle.loads(
         base64.b64decode(deploy_key)).get("secret_key")
     if secret_key != deploy_key_decode:
         result = general_message(400, "failed", "密钥错误")
         return Response(result, status=400)
     service_obj = TenantServiceInfo.objects.get(service_id=service_id)
     tenant_obj = Tenants.objects.get(tenant_id=service_obj.tenant_id)
     status_map = app_service.get_service_status(tenant_obj, service_obj)
     user_obj = user_services.init_webhook_user(service_obj, "WebAPI")
     user_name = user_obj.nick_name
     status = status_map.get("status", None)
     logger.debug(status)
     if status != "closed":
         return user_services.deploy_service(tenant_obj=tenant_obj,
                                             service_obj=service_obj,
                                             user=user_obj,
                                             committer_name=user_name)
     else:
         result = general_message(200, "component is closed, not support",
                                  "组件状态不支持")
         return Response(result, status=400)
Exemple #5
0
    def post(self, request, service_id, *args, **kwargs):
        try:
            service_obj = TenantServiceInfo.objects.get(service_id=service_id)
            if not service_obj:
                result = general_message(400, "failed", "服务不存在")
                return Response(result, status=400)
            tenant_obj = Tenants.objects.get(tenant_id=service_obj.tenant_id)
            service_webhook = service_webhooks_repo.get_service_webhooks_by_service_id_and_type(
                service_obj.service_id, "image_webhooks")
            if not service_webhook.state:
                result = general_message(400, "failed", "服务关闭了自动构建")
                return Response(result, status=400)
            # 校验
            repository = request.data.get("repository")
            if not repository:
                logger.debug("缺少repository信息")
                result = general_message(400, "failed", "缺少repository信息")
                return Response(result, status=400)

            push_data = request.data.get("push_data")
            pusher = push_data.get("pusher")
            tag = push_data.get("tag")
            repo_name = repository.get("repo_name")
            if not repo_name:
                repo_name = repository.get("repo_full_name")
            if not repo_name:
                result = general_message(400, "failed", "缺少repository名称信息")
                return Response(result, status=400)
            ref = reference.Reference.parse(service_obj.image)
            hostname, name = ref.split_hostname()
            if repo_name != name:
                result = general_message(400, "failed", "镜像名称与服务构建源不符")
                return Response(result, status=400)
            if tag != ref['tag']:
                result = general_message(400, "failed", "镜像tag与服务构建源不符")
                return Response(result, status=400)
            # 获取应用状态
            status_map = app_service.get_service_status(
                tenant_obj, service_obj)
            status = status_map.get("status", None)
            user_obj = Users.objects.get(user_id=service_obj.creater)
            committer_name = pusher
            if status != "undeploy" and status != "closed" \
                    and status != "closed":
                return user_services.deploy_service(
                    tenant_obj=tenant_obj,
                    service_obj=service_obj,
                    user=user_obj,
                    committer_name=committer_name)
            else:
                result = general_message(400, "failed", "应用状态处于关闭中,不支持自动构建")
                return Response(result, status=400)
        except Exception as e:
            logger.exception(e)
            result = error_message(e.message)
            return Response(result, status=500)
Exemple #6
0
    def post(self, request, service_id, *args, **kwargs):
        try:
            import json
            logger.debug(
                "----------========imagewebhooks==============>{0}".format(
                    json.dumps(request.data)))
            logger.debug('--------------request.META-------->{0}'.format(
                request.META))
            service_obj = TenantServiceInfo.objects.get(service_id=service_id)
            tenant_obj = Tenants.objects.get(tenant_id=service_obj.tenant_id)
            service_webhook = service_webhooks_repo.get_service_webhooks_by_service_id_and_type(
                service_obj.service_id, "image_webhooks")
            if not service_webhook.state:
                logger.debug("没开启webhooks自动部署")
                result = general_message(400, "failed", "没有开启此功能")
                return Response(result, status=400)
            # 校验
            repository = request.data.get("repository")
            if not repository:
                logger.debug("缺少repository信息")
                result = general_message(400, "failed", "缺少repository信息")
                return Response(result, status=400)

            push_data = request.data.get("push_data")
            pusher = push_data.get("pusher")
            tag = push_data.get("tag")
            repo_name = repository.get("repo_name")
            image = repo_name + ":" + tag
            if image != service_obj.image:
                result = general_message(400, "failed", "镜像不相符")
                return Response(result, status=400)

            # 获取应用状态
            status_map = app_service.get_service_status(
                tenant_obj, service_obj)
            status = status_map.get("status", None)
            logger.debug(status)

            user_obj = Users.objects.get(user_id=service_obj.creater)
            # committer_name = commits_info.get("author").get("username")
            committer_name = pusher
            if status == "running" or status == "abnormal":
                return user_services.deploy_service(
                    tenant_obj=tenant_obj,
                    service_obj=service_obj,
                    user=user_obj,
                    committer_name=committer_name)
            else:
                logger.debug("应用状态异常")
                result = general_message(400, "failed", "应用状态不支持")
                return Response(result, status=400)
        except Exception as e:
            logger.exception(e)
            result = error_message(e.message)
            return Response(result, status=500)
Exemple #7
0
    def post(self, request, service_id, *args, **kwargs):
        """
        github,gitlab 回调接口 触发自动部署

        """
        try:

            service_obj = TenantServiceInfo.objects.get(service_id=service_id)
            tenant_obj = Tenants.objects.get(tenant_id=service_obj.tenant_id)
            service_webhook = service_webhooks_repo.get_service_webhooks_by_service_id_and_type(
                service_obj.service_id, "code_webhooks")
            if not service_webhook.state:
                logger.debug("没开启webhooks自动部署")
                result = general_message(400, "failed", "没有开启此功能")
                return Response(result, status=400)
            # github
            github_event = request.META.get("HTTP_X_GITHUB_EVENT", None)
            user_agent = request.META.get("HTTP_USER_AGENT", None)
            if user_agent:
                user_agent = user_agent.split("/")[0]
            if github_event and user_agent == "GitHub-Hookshot":

                if github_event == "ping":
                    logger.debug("支持此事件类型")
                    result = general_message(200, "success", "支持测试连接")
                    return Response(result, status=200)

                if github_event != "push" and github_event != "ping":
                    logger.debug("不支持此事件类型")
                    result = general_message(400, "failed", "不支持此事件类型")
                    return Response(result, status=400)

                commits_info = request.data.get("head_commit")
                if not commits_info:
                    logger.debug("提交信息获取失败")
                    result = general_message(400, "failed", "提交信息获取失败")
                    return Response(result, status=400)
                message = commits_info.get("message")
                keyword = "@" + service_webhook.deploy_keyword
                if keyword not in message:
                    logger.debug("提交信息无效")
                    result = general_message(200, "failed", "提交信息无效")
                    return Response(result, status=200)

                # signature = request.META.get("HTTP_X_HUB_SIGNATURE", None)

                ref = request.data.get("ref")
                if not ref:
                    logger.debug("获取分支信息失败")
                    result = general_message(200, "failed", "获取分支信息失败")
                    return Response(result, status=200)
                ref = ref.split("/")[2]
                if not service_obj.code_version == ref:
                    logger.debug("当前分支与部署分支不同")
                    result = general_message(200, "failed", "提交分支与部署分支不同")
                    return Response(result, status=200)

                repository = request.data.get("repository")
                if not repository:
                    logger.debug("却少repository信息")
                    result = general_message(200, "failed", "却少repository信息")
                    return Response(result, status=200)
                clone_url = repository.get("clone_url")
                ssh_url = repository.get("ssh_url")
                logger.debug("git_url", service_obj.git_url)
                logger.debug("clone_url", clone_url)
                logger.debug("ssh_url", ssh_url)
                if not (service_obj.git_url == clone_url
                        or service_obj.git_url == ssh_url):
                    logger.debug("github地址不相符")
                    result = general_message(200, "failed", "仓库地址不相符")
                    return Response(result, status=200)

                # 获取应用状态
                status_map = app_service.get_service_status(
                    tenant_obj, service_obj)
                status = status_map.get("status", None)
                logger.debug(status)

                user_obj = Users.objects.get(user_id=service_obj.creater)
                committer_name = commits_info.get("author").get("username")
                if status == "running" or status == "abnormal":
                    return user_services.deploy_service(
                        tenant_obj=tenant_obj,
                        service_obj=service_obj,
                        user=user_obj,
                        committer_name=committer_name)
                else:
                    logger.debug("应用状态异常")
                    result = general_message(400, "failed", "应用状态不支持")
                    return Response(result, status=400)
            # gitlab
            elif request.META.get("HTTP_X_GITLAB_EVENT", None):

                logger.debug(request.data)

                commits_info = request.data.get("commits")
                if not commits_info:
                    logger.debug("提交信息获取失败")
                    result = general_message(400, "failed", "提交信息获取失败")
                    return Response(result, status=400)
                message = commits_info[-1].get("message")
                keyword = "@" + service_webhook.deploy_keyword
                if keyword not in message:
                    logger.debug("提交信息无效")
                    result = general_message(200, "failed", "提交信息无效")
                    return Response(result, status=200)

                event_name = request.data.get("object_kind", None)
                logger.debug("kind", event_name)

                if event_name == "ping":
                    logger.debug("支持此事件类型")
                    result = general_message(200, "success", "支持测试连接")
                    return Response(result, status=200)

                if event_name != "push" and event_name != "ping":
                    logger.debug("不支持此事件类型")
                    result = general_message(200, "failed", "不支持此事件类型")
                    return Response(result, status=200)

                ref = request.data.get("ref")
                if not ref:
                    logger.debug("获取分支信息失败")
                    result = general_message(200, "failed", "获取分支信息失败")
                    return Response(result, status=200)
                ref = ref.split("/")[2]
                if not service_obj.code_version == ref:
                    logger.debug("当前分支与部署分支不同")
                    result = general_message(200, "failed", "提交分支与部署分支不同")
                    return Response(result, status=200)

                repository = request.data.get("repository")
                if not repository:
                    logger.debug("却少repository信息")
                    result = general_message(200, "failed", "却少repository信息")
                    return Response(result, status=200)

                git_http_url = repository.get("git_http_url")
                gitlab_ssh_url = repository.get("git_ssh_url")
                git_ssh_url = gitlab_ssh_url.split("//", 1)[-1]

                logger.debug("service_url", service_obj.git_url)
                logger.debug("git_ssh_url", git_ssh_url)
                logger.debug("http_url", git_http_url)

                if not (service_obj.git_url == git_http_url
                        or service_obj.git_url == git_ssh_url):
                    logger.debug("github地址不相符")
                    result = general_message(200, "failed", "仓库地址不相符")
                    return Response(result, status=200)

                # 获取应用状态
                status_map = app_service.get_service_status(
                    tenant_obj, service_obj)
                status = status_map.get("status", None)
                user = Users.objects.get(user_id=service_obj.creater)
                committer_name = commits_info[-1].get("author").get("name")
                logger.debug("status", status_map)
                if status == "running" or status == "abnormal":
                    return user_services.deploy_service(
                        tenant_obj=tenant_obj,
                        service_obj=service_obj,
                        user=user,
                        committer_name=committer_name)
                else:
                    logger.debug("应用状态异常")
                    result = general_message(200, "failed", "应用状态不支持")
                    return Response(result, status=200)
            # gitee
            elif request.META.get("HTTP_X_GITEE_EVENT",
                                  None) or request.META.get(
                                      "HTTP_X_GIT_OSCHINA_EVENT", None):
                logger.debug(request.data)

                commits_info = request.data.get("head_commit")
                if not commits_info:
                    logger.debug("提交信息获取失败")
                    result = general_message(400, "failed", "提交信息获取失败")
                    return Response(result, status=400)
                message = commits_info.get("message")
                keyword = "@" + service_webhook.deploy_keyword
                if keyword not in message:
                    logger.debug("提交信息无效")
                    result = general_message(200, "failed", "提交信息无效")
                    return Response(result, status=200)
                ref = request.data.get("ref")
                if not ref:
                    logger.debug("获取分支信息失败")
                    result = general_message(200, "failed", "获取分支信息失败")
                    return Response(result, status=200)
                ref = ref.split("/")[2]
                if not service_obj.code_version == ref:
                    logger.debug("当前分支与部署分支不同")
                    result = general_message(200, "failed", "提交分支与部署分支不同")
                    return Response(result, status=200)

                repository = request.data.get("repository")
                if not repository:
                    logger.debug("却少repository信息")
                    result = general_message(200, "failed", "却少repository信息")
                    return Response(result, status=200)
                clone_url = repository.get("clone_url")
                ssh_url = repository.get("ssh_url")
                logger.debug("git_url", service_obj.git_url)
                logger.debug("clone_url", clone_url)
                logger.debug("ssh_url", ssh_url)
                if not (service_obj.git_url == clone_url
                        or service_obj.git_url == ssh_url):
                    logger.debug("gitee地址不相符")
                    result = general_message(200, "failed", "仓库地址不相符")
                    return Response(result, status=200)

                # 获取应用状态
                status_map = app_service.get_service_status(
                    tenant_obj, service_obj)
                status = status_map.get("status", None)
                logger.debug(status)

                user_obj = Users.objects.get(user_id=service_obj.creater)
                committer_name = commits_info.get("author").get("username")
                if status == "running" or status == "abnormal":
                    return user_services.deploy_service(
                        tenant_obj=tenant_obj,
                        service_obj=service_obj,
                        user=user_obj,
                        committer_name=committer_name)
                else:
                    logger.debug("应用状态异常")
                    result = general_message(200, "failed", "应用状态不支持")
                    return Response(result, status=200)
            # gogs
            elif request.META.get("HTTP_X_GOGS_EVENT", None):
                logger.debug(request.data)

                commits_info = request.data.get("commits")
                if not commits_info:
                    logger.debug("提交信息获取失败")
                    result = general_message(400, "failed", "提交信息获取失败")
                    return Response(result, status=400)
                message = commits_info[0].get("message")
                keyword = "@" + service_webhook.deploy_keyword
                if keyword not in message:
                    logger.debug("提交信息无效")
                    result = general_message(200, "failed", "提交信息无效")
                    return Response(result, status=200)
                ref = request.data.get("ref")
                if not ref:
                    logger.debug("获取分支信息失败")
                    result = general_message(200, "failed", "获取分支信息失败")
                    return Response(result, status=200)
                ref = ref.split("/")[2]
                if not service_obj.code_version == ref:
                    logger.debug("当前分支与部署分支不同")
                    result = general_message(200, "failed", "提交分支与部署分支不同")
                    return Response(result, status=200)

                repository = request.data.get("repository")
                if not repository:
                    logger.debug("却少repository信息")
                    result = general_message(200, "failed", "却少repository信息")
                    return Response(result, status=200)
                clone_url = repository.get("clone_url")
                ssh_url = repository.get("ssh_url")
                logger.debug("git_url", service_obj.git_url)
                logger.debug("clone_url", clone_url)
                logger.debug("ssh_url", ssh_url)
                if not (service_obj.git_url == clone_url
                        or service_obj.git_url == ssh_url):
                    logger.debug("gogs地址不相符")
                    result = general_message(200, "failed", "仓库地址不相符")
                    return Response(result, status=200)

                # 获取应用状态
                status_map = app_service.get_service_status(
                    tenant_obj, service_obj)
                status = status_map.get("status", None)
                logger.debug(status)

                user_obj = Users.objects.get(user_id=service_obj.creater)
                committer_name = commits_info[0].get("author").get("username")
                if status == "running" or status == "abnormal":
                    return user_services.deploy_service(
                        tenant_obj=tenant_obj,
                        service_obj=service_obj,
                        user=user_obj,
                        committer_name=committer_name)
                else:
                    logger.debug("应用状态异常")
                    result = general_message(200, "failed", "应用状态不支持")
                    return Response(result, status=200)

            else:
                logger.debug("暂时仅支持github与gitlab")
                result = general_message(400, "failed", "暂时仅支持github与gitlab哦~")
                return Response(result, status=400)

        except Tenants.DoesNotExist as e:
            logger.exception(e)
            logger.error(e)
            return Response(e.message, status=400)
        except TenantServiceInfo.DoesNotExist as e:
            logger.exception(e)
            logger.error(e)
            return Response(e.message, status=400)
        except Exception as e:
            logger.exception(e)
            logger.error(e)
            return Response(e.message, status=500)
Exemple #8
0
    def post(self, request, service_id, *args, **kwargs):
        try:
            service_obj = TenantServiceInfo.objects.get(service_id=service_id)
            if not service_obj:
                result = general_message(400, "failed", "组件不存在")
                return Response(result, status=400)
            tenant_obj = Tenants.objects.get(tenant_id=service_obj.tenant_id)
            service_webhook = service_webhooks_repo.get_service_webhooks_by_service_id_and_type(
                service_obj.service_id, "image_webhooks")
            if not service_webhook.state:
                result = general_message(400, "failed", "组件关闭了自动构建")
                return Response(result, status=400)
            # 校验
            repository = request.data.get("repository")
            if not repository:
                logger.debug("缺少repository信息")
                result = general_message(400, "failed", "缺少repository信息")
                return Response(result, status=400)

            push_data = request.data.get("push_data")
            pusher = push_data.get("pusher")
            tag = push_data.get("tag")
            repo_name = repository.get("repo_name")
            if not repo_name:
                repository_namespace = repository.get("namespace")
                repository_name = repository.get("name")
                if repository_namespace and repository_name:
                    # maybe aliyun repo add fake host
                    repo_name = "fake.repo.aliyun.com/" + repository_namespace + "/" + repository_name
                else:
                    repo_name = repository.get("repo_full_name")
            if not repo_name:
                result = general_message(400, "failed", "缺少repository名称信息")
                return Response(result, status=400)

            repo_ref = reference.Reference.parse(repo_name)
            _, repo_name = repo_ref.split_hostname()
            ref = reference.Reference.parse(service_obj.image)
            hostname, name = ref.split_hostname()
            if repo_name != name:
                result = general_message(400, "failed", "镜像名称与组件构建源不符")
                return Response(result, status=400)

            # 标签匹配
            if service_webhook.trigger:
                # 如果有正则表达式根据正则触发
                if not re.match(service_webhook.trigger, tag):
                    result = general_message(400, "failed", "镜像tag与正则表达式不匹配")
                    return Response(result, status=400)
                service_repo.change_service_image_tag(service_obj, tag)
            else:
                # 如果没有根据标签触发
                if tag != ref['tag']:
                    result = general_message(400, "failed", "镜像tag与组件构建源不符")
                    return Response(result, status=400)

            # 获取组件状态
            status_map = app_service.get_service_status(
                tenant_obj, service_obj)
            status = status_map.get("status", None)
            user_obj = user_services.init_webhook_user(service_obj,
                                                       "ImageWebhook", pusher)
            committer_name = pusher
            if status != "closed":
                return user_services.deploy_service(
                    tenant_obj=tenant_obj,
                    service_obj=service_obj,
                    user=user_obj,
                    committer_name=committer_name)
            else:
                result = general_message(400, "failed", "组件状态处于关闭中,不支持自动构建")
                return Response(result, status=400)
        except Exception as e:
            logger.exception(e)
            result = error_message(e.message)
            return Response(result, status=500)
Exemple #9
0
    def post(self, request, service_id, *args, **kwargs):
        """
        github,gitlab 回调接口 触发自动部署

        """
        try:

            service_obj = TenantServiceInfo.objects.get(service_id=service_id)
            tenant_obj = Tenants.objects.get(tenant_id=service_obj.tenant_id)
            service_webhook = service_webhooks_repo.get_service_webhooks_by_service_id_and_type(
                service_obj.service_id, "code_webhooks")
            if not service_webhook.state:
                logger.debug("没开启webhooks自动部署")
                result = general_message(400, "failed", "没有开启此功能")
                return Response(result, status=400)
            # github
            github_event = request.META.get("HTTP_X_GITHUB_EVENT", None)
            user_agent = request.META.get("HTTP_USER_AGENT", None)
            if user_agent:
                user_agent = user_agent.split("/")[0]
            if github_event and user_agent == "GitHub-Hookshot":

                if github_event == "ping":
                    logger.debug("支持此事件类型")
                    result = general_message(200, "success", "支持测试连接")
                    return Response(result, status=200)

                if github_event != "push" and github_event != "ping":
                    logger.debug("不支持此事件类型")
                    result = general_message(400, "failed", "不支持此事件类型")
                    return Response(result, status=400)

                commits_info = request.data.get("head_commit")
                if not commits_info:
                    result = general_message(400, "can not get commit info",
                                             "提交信息获取失败")
                    return Response(result, status=400)
                message = commits_info.get("message")
                keyword = "@" + service_webhook.deploy_keyword
                if keyword not in message:
                    result = general_message(
                        200, "commit message not include {0}".format(
                            service_webhook.deploy_keyword), "提交信息无效")
                    return Response(result, status=200)
                ref = request.data.get("ref")
                if not ref:
                    result = general_message(200, "can not read branch info",
                                             "获取分支信息失败")
                    return Response(result, status=200)
                ref = ref.split("/")[2]
                if not service_obj.code_version == ref:
                    result = general_message(
                        200, "current branch is different event branch",
                        "提交分支与部署分支不同")
                    return Response(result, status=200)

                repository = request.data.get("repository")
                if not repository:
                    result = general_message(200,
                                             "can not read repository info",
                                             "却少repository信息")
                    return Response(result, status=200)
                clone_url = repository.get("clone_url")
                ssh_url = repository.get("ssh_url")
                code, msg, msg_show = self._check_warehouse(
                    service_obj.git_url, clone_url, ssh_url)
                if code != 200:
                    return Response(general_message(200, msg, msg_show),
                                    status=200)

                # 获取组件状态
                status_map = app_service.get_service_status(
                    tenant_obj, service_obj)
                status = status_map.get("status", None)
                logger.debug(status)
                committer_name = commits_info.get("author").get("username")
                user_obj = user_services.init_webhook_user(
                    service_obj, "Webhook", committer_name)
                if status != "closed":
                    return user_services.deploy_service(
                        tenant_obj=tenant_obj,
                        service_obj=service_obj,
                        user=user_obj,
                        committer_name=committer_name)
                else:
                    result = general_message(
                        200, "component is closed, not support", "组件状态不支持")
                    return Response(result, status=400)
            # gitlab
            elif request.META.get("HTTP_X_GITLAB_EVENT", None):

                logger.debug(request.data)

                commits_info = request.data.get("commits")
                if not commits_info:
                    result = general_message(400, "can not get commit info",
                                             "提交信息获取失败")
                    return Response(result, status=400)
                message = commits_info[-1].get("message")
                keyword = "@" + service_webhook.deploy_keyword
                if keyword not in message:
                    result = general_message(
                        200, "commit message not include {0}".format(
                            service_webhook.deploy_keyword), "提交信息无效")
                    return Response(result, status=200)

                event_name = request.data.get("object_kind", None)
                logger.debug("kind", event_name)

                if event_name == "ping":
                    logger.debug("支持此事件类型")
                    result = general_message(200, "success", "支持测试连接")
                    return Response(result, status=200)

                if event_name != "push" and event_name != "ping":
                    result = general_message(200, "event type not support",
                                             "不支持此事件类型")
                    return Response(result, status=200)

                ref = request.data.get("ref")
                if not ref:
                    result = general_message(200, "can not read branch info",
                                             "获取分支信息失败")
                    return Response(result, status=200)
                ref = ref.split("/")[2]
                if not service_obj.code_version == ref:
                    result = general_message(
                        200, "current branch is different event branch",
                        "提交分支与部署分支不同")
                    return Response(result, status=200)

                repository = request.data.get("repository")
                if not repository:
                    result = general_message(200,
                                             "can not read repository info",
                                             "却少repository信息")
                    return Response(result, status=200)

                git_http_url = repository.get("git_http_url")
                gitlab_ssh_url = repository.get("git_ssh_url")

                code, msg, msg_show = self._check_warehouse(
                    service_obj.git_url, git_http_url, gitlab_ssh_url)
                if code != 200:
                    return Response(general_message(200, msg, msg_show),
                                    status=200)

                # 获取组件状态
                status_map = app_service.get_service_status(
                    tenant_obj, service_obj)
                status = status_map.get("status", None)
                committer_name = commits_info[-1].get("author").get("name")
                user = user_services.init_webhook_user(service_obj, "Webhook",
                                                       committer_name)
                logger.debug("status", status_map)
                if status != "closed":
                    return user_services.deploy_service(
                        tenant_obj=tenant_obj,
                        service_obj=service_obj,
                        user=user,
                        committer_name=committer_name)
                else:
                    result = general_message(
                        200, "component is closed, not support", "组件状态不支持")
                    return Response(result, status=200)
            # gitee
            elif request.META.get("HTTP_X_GITEE_EVENT", None) or \
                    request.META.get("HTTP_X_GIT_OSCHINA_EVENT", None):
                logger.debug(request.data)

                commits_info = request.data.get("head_commit")
                if not commits_info:
                    result = general_message(400, "can not get commit info",
                                             "提交信息获取失败")
                    return Response(result, status=400)
                message = commits_info.get("message")
                keyword = "@" + service_webhook.deploy_keyword
                if keyword not in message:
                    result = general_message(
                        200, "commit message not include {0}".format(
                            service_webhook.deploy_keyword), "提交信息无效")
                    return Response(result, status=200)
                ref = request.data.get("ref")
                if not ref:
                    result = general_message(200, "can not read branch info",
                                             "获取分支信息失败")
                    return Response(result, status=200)
                ref = ref.split("/")[-1]
                if not service_obj.code_version == ref:
                    result = general_message(
                        200, "current branch is different event branch",
                        "提交分支与部署分支不同")
                    return Response(result, status=200)

                repository = request.data.get("repository")
                if not repository:
                    result = general_message(200,
                                             "can not read repository info",
                                             "却少repository信息")
                    return Response(result, status=200)
                clone_url = repository.get("clone_url")
                ssh_url = repository.get("ssh_url")

                code, msg, msg_show = self._check_warehouse(
                    service_obj.git_url, clone_url, ssh_url)
                if code != 200:
                    return Response(general_message(200, msg, msg_show),
                                    status=200)

                # 获取组件状态
                status_map = app_service.get_service_status(
                    tenant_obj, service_obj)
                status = status_map.get("status", None)
                logger.debug(status)
                committer_name = commits_info.get("author").get("username")
                user_obj = user_services.init_webhook_user(
                    service_obj, "Webhook", committer_name)
                if status != "closed":

                    return user_services.deploy_service(
                        tenant_obj=tenant_obj,
                        service_obj=service_obj,
                        user=user_obj,
                        committer_name=committer_name)
                else:
                    result = general_message(
                        200, "component is closed, not support", "组件状态不支持")
                    return Response(result, status=200)
            # gogs
            elif request.META.get("HTTP_X_GOGS_EVENT", None):
                logger.debug(request.data)

                commits_info = request.data.get("commits")
                if not commits_info:
                    result = general_message(400, "can not get commit info",
                                             "提交信息获取失败")
                    return Response(result, status=400)
                message = commits_info[0].get("message")
                keyword = "@" + service_webhook.deploy_keyword
                if keyword not in message:
                    result = general_message(
                        200, "commit message not include {0}".format(
                            service_webhook.deploy_keyword), "提交信息无效")
                    return Response(result, status=200)
                ref = request.data.get("ref")
                if not ref:
                    result = general_message(200, "can not read branch info",
                                             "获取分支信息失败")
                    return Response(result, status=200)
                ref = ref.split("/")[2]
                if not service_obj.code_version == ref:
                    result = general_message(
                        200, "current branch is different event branch",
                        "提交分支与部署分支不同")
                    return Response(result, status=200)

                repository = request.data.get("repository")
                if not repository:
                    result = general_message(200,
                                             "can not read repository info",
                                             "却少repository信息")
                    return Response(result, status=200)
                clone_url = repository.get("clone_url")
                ssh_url = repository.get("ssh_url")

                code, msg, msg_show = self._check_warehouse(
                    service_obj.git_url, clone_url, ssh_url)
                if code != 200:
                    return Response(general_message(200, msg, msg_show),
                                    status=200)

                # 获取组件状态
                status_map = app_service.get_service_status(
                    tenant_obj, service_obj)
                status = status_map.get("status", None)
                logger.debug(status)
                committer_name = commits_info[0].get("author").get("username")
                user_obj = user_services.init_webhook_user(
                    service_obj, "Webhook", committer_name)
                if status != "closed":
                    return user_services.deploy_service(
                        tenant_obj=tenant_obj,
                        service_obj=service_obj,
                        user=user_obj,
                        committer_name=committer_name)
                else:
                    result = general_message(
                        200, "component is closed, not support", "组件状态不支持")
                    return Response(result, status=200)
            # coding
            elif request.META.get("HTTP_X_CODING_EVENT", None):
                coding_event = request.META.get("HTTP_X_CODING_EVENT", None)
                if coding_event == "ping":
                    logger.debug("支持此事件类型")
                    result = general_message(200, "success", "支持测试连接")
                    return Response(result, status=200)

                if coding_event != "push" and coding_event != "ping":
                    logger.debug("不支持此事件类型")
                    result = general_message(400, "failed", "不支持此事件类型")
                    return Response(result, status=400)

                commits_info = request.data.get("head_commit")
                if not commits_info:
                    result = general_message(400, "can not get commit info",
                                             "提交信息获取失败")
                    return Response(result, status=400)
                message = commits_info.get("message")
                keyword = "@" + service_webhook.deploy_keyword
                if keyword not in message:
                    result = general_message(
                        200, "commit message not include {0}".format(
                            service_webhook.deploy_keyword), "提交信息无效")
                    return Response(result, status=200)

                ref = request.data.get("ref")
                if not ref:
                    result = general_message(200, "can not read branch info",
                                             "获取分支信息失败")
                    return Response(result, status=200)
                ref = ref.split("/")[2]
                if not service_obj.code_version == ref:
                    result = general_message(
                        200, "current branch is different event branch",
                        "提交分支与部署分支不同")
                    return Response(result, status=200)

                repository = request.data.get("repository")
                if not repository:
                    result = general_message(200,
                                             "can not read repository info",
                                             "却少repository信息")
                    return Response(result, status=200)
                clone_url = repository.get("clone_url")
                ssh_url = repository.get("ssh_url")
                code, msg, msg_show = self._check_warehouse(
                    service_obj.git_url, clone_url, ssh_url)
                if code != 200:
                    return Response(general_message(200, msg, msg_show),
                                    status=200)

                # 获取组件状态
                status_map = app_service.get_service_status(
                    tenant_obj, service_obj)
                status = status_map.get("status", None)
                logger.debug(status)
                committer_name = commits_info.get("author").get("username")
                user_obj = user_services.init_webhook_user(
                    service_obj, "Webhook", committer_name)
                if status != "closed":
                    return user_services.deploy_service(
                        tenant_obj=tenant_obj,
                        service_obj=service_obj,
                        user=user_obj,
                        committer_name=committer_name)
                else:
                    result = general_message(
                        200, "component is closed, not support", "组件状态不支持")
                    return Response(result, status=400)
            else:
                logger.debug("暂时仅支持github与gitlab")
                result = general_message(400, "failed", "暂时仅支持github与gitlab哦~")
                return Response(result, status=400)

        except Tenants.DoesNotExist as e:
            logger.exception(e)
            logger.error(e)
            return Response(e.message, status=400)
        except TenantServiceInfo.DoesNotExist as e:
            logger.exception(e)
            logger.error(e)
            return Response(e.message, status=400)
        except Exception as e:
            logger.exception(e)
            logger.error(e)
            return Response(e.message, status=500)