Ejemplo n.º 1
0
    def post(self, request, *args, **kwargs):
        """
        创建第三方组件

        """

        group_id = request.data.get("group_id", -1)
        service_cname = request.data.get("service_cname", None)
        endpoints = request.data.get("endpoints", None)
        endpoints_type = request.data.get("endpoints_type", None)

        if not service_cname:
            return Response(general_message(400, "service_cname is null",
                                            "组件名未指明"),
                            status=400)
        if not endpoints and endpoints_type != "api":
            return Response(general_message(400, "end_point is null",
                                            "end_point未指明"),
                            status=400)

        code, msg_show, new_service = app_service.create_third_party_app(
            self.response_region, self.tenant, self.user, service_cname,
            endpoints, endpoints_type)
        if code != 200:
            return Response(general_message(code, "service create fail",
                                            msg_show),
                            status=code)

        # 添加组件所在组
        code, msg_show = group_service.add_service_to_group(
            self.tenant, self.response_region, group_id,
            new_service.service_id)
        if code != 200:
            logger.debug("service.create", msg_show)

        if endpoints_type == "discovery":
            # 添加username,password信息
            if "username" in endpoints and "password" in endpoints:
                if endpoints["username"] or endpoints["password"]:
                    app_service.create_service_source_info(
                        self.tenant, new_service, endpoints["username"],
                        endpoints["password"])

        bean = new_service.to_dict()
        if endpoints_type == "api":
            # 生成秘钥
            deploy = deploy_repo.get_deploy_relation_by_service_id(
                service_id=new_service.service_id)
            api_secret_key = pickle.loads(
                base64.b64decode(deploy)).get("secret_key")
            # 从环境变量中获取域名,没有在从请求中获取
            host = os.environ.get('DEFAULT_DOMAIN',
                                  "http://" + request.get_host())
            api_url = host + "/console/" + "third_party/{0}".format(
                new_service.service_id)
            bean["api_service_key"] = api_secret_key
            bean["url"] = api_url

        result = general_message(200, "success", "创建成功", bean=bean)
        return Response(result, status=result["code"])
Ejemplo n.º 2
0
    def save_compose_services(self, tenant, user, region, group_compose, data):
        # 开启保存点
        sid = transaction.savepoint()
        service_list = []
        try:
            if data["check_status"] == "success":
                if group_compose.create_status == "checking":
                    logger.debug("checking compose service install,save info into database")
                # 先删除原来创建的组件
                self.__delete_created_compose_info(tenant, group_compose.compose_id)
                # 保存compose检测结果
                if data["check_status"] == "success":
                    service_info_list = data["service_info"]
                    service_dep_map = {}
                    # 组件列表
                    name_service_map = {}
                    for service_info in service_info_list:
                        service_cname = service_info.get("cname", service_info["image_alias"])
                        image = service_info["image"]["name"] + ":" + service_info["image"]["tag"]
                        # 保存信息
                        service = self.__init_compose_service(tenant, user, service_cname, image, region)
                        # 缓存创建的组件
                        service_list.append(service)
                        name_service_map[service_cname] = service

                        group_service.add_service_to_group(tenant, region, group_compose.group_id, service.service_id)

                        code, msg = app_check_service.save_service_info(tenant, service, service_info)
                        if code != 200:
                            return code, msg, None
                        # save service info
                        service.save()
                        # 创建组件构建源信息,存储账号密码
                        envs = service_info.get("envs", [])
                        hub_user = group_compose.hub_user
                        hub_password = group_compose.hub_pass
                        for env in envs:
                            if env.get("name", "") == "HUB_USER":
                                hub_user = env.get("value")
                            if env.get("name", "") == "HUB_PASSWORD":
                                hub_password = env.get("value")
                        app_service.create_service_source_info(tenant, service, hub_user, hub_password)
                        dependencies = service_info.get("depends", None)
                        if dependencies:
                            service_dep_map[service_cname] = dependencies

                    # 保存compose-relation
                    self.__save_compose_relation(service_list, tenant.tenant_id, group_compose.compose_id)
                    # 保存依赖关系
                    self.__save_service_dep_relation(tenant, service_dep_map, name_service_map)
                group_compose.create_status = "checked"
                group_compose.save()
                transaction.savepoint_commit(sid)
        except Exception as e:
            logger.exception(e)
            if sid:
                transaction.savepoint_rollback(sid)
            return 500, "{0}".format(e.message), service_list
        return 200, "success", service_list
Ejemplo n.º 3
0
    def post(self, request, *args, **kwargs):
        """
        创建三方服务

        """

        group_id = request.data.get("group_id", -1)
        service_cname = request.data.get("service_cname", None)
        endpoints = request.data.get("endpoints", None)
        endpoints_type = request.data.get("endpoints_type", None)

        try:
            if not service_cname:
                return Response(general_message(400, "service_cname is null", "服务名未指明"), status=400)
            if not endpoints and endpoints_type != "api":
                return Response(general_message(400, "end_point is null", "end_point未指明"), status=400)

            code, msg_show, new_service = app_service.create_third_party_app(self.response_region, self.tenant,
                                                                             self.user, service_cname,
                                                                             endpoints, endpoints_type)
            if code != 200:
                return Response(general_message(code, "service create fail", msg_show), status=code)

            # 添加服务所在组
            code, msg_show = group_service.add_service_to_group(self.tenant, self.response_region, group_id,
                                                                new_service.service_id)
            if code != 200:
                logger.debug("service.create", msg_show)

            if endpoints_type == "discovery":
                # 添加username,password信息
                logger.debug('========dict=========>{0}'.format(type(endpoints)))
                if endpoints.has_key("username") and endpoints.has_key("password"):
                    if endpoints["username"] or endpoints["password"]:
                        app_service.create_service_source_info(self.tenant, new_service, endpoints["username"], endpoints["password"])

            bean = new_service.to_dict()
            if endpoints_type == "api":
                # 生成秘钥
                deploy = deploy_repo.get_deploy_relation_by_service_id(service_id=new_service.service_id)
                api_secret_key = pickle.loads(base64.b64decode(deploy)).get("secret_key")
                # 从环境变量中获取域名,没有在从请求中获取
                host = os.environ.get('DEFAULT_DOMAIN', request.get_host())
                api_url = "http://" + host + "/console/" + "third_party/{0}".format(new_service.service_id)
                bean["api_service_key"] = api_secret_key
                bean["url"] = api_url

            result = general_message(200, "success", "创建成功", bean=bean)
        except ResourceNotEnoughException as re:
            logger.exception(re)
            return Response(general_message(10406, "resource is not enough", re.message), status=412)
        except Exception as e:
            logger.exception(e)
            result = error_message(e.message)
        return Response(result, status=result["code"])
    def save_multi_services(self, region_name, tenant, group_id, service, user,
                            service_infos):
        service_source = service_source_repo.get_service_source(
            tenant.tenant_id, service.service_id)
        tx = transaction.savepoint()
        for service_info in service_infos:
            code, msg_show, new_service = app_service \
                .create_source_code_app(region_name, tenant, user,
                                        service.code_from,
                                        service_info["cname"],
                                        service.clone_url,
                                        service.git_project_id,
                                        service.code_version,
                                        service.server_type,
                                        oauth_service_id=service.oauth_service_id,
                                        git_full_name=service.git_full_name)
            if code != 200:
                logger.error(
                    "Multiple services; Service alias: {}; error creating service"
                    .format(service.service_alias))
                transaction.savepoint_rollback(tx)
                return code, msg_show
            # add username and password
            if service_source:
                git_password = service_source.password
                git_user_name = service_source.user_name
                if git_password or git_user_name:
                    app_service.create_service_source_info(
                        tenant, new_service, git_user_name, git_password)
            #  add group
            code, msg_show = group_service.add_service_to_group(
                tenant, region_name, group_id, new_service.service_id)
            if code != 200:
                logger.debug(
                    "Group ID: {0}; Service ID: {1}; error adding service to group"
                    .format(group_id, new_service.service_id))
                transaction.savepoint_rollback(tx)
                return code, msg_show
            # save service info, such as envs, ports, etc
            code, msg = app_check_service.save_service_info(
                tenant, new_service, service_info)
            if code != 200:
                logger.debug(
                    "Group ID: {0}; Service ID: {1}; error saving services".
                    format(group_id, new_service.service_id))
                transaction.savepoint_rollback(tx)
                return code, msg
            new_service = app_service.create_region_service(
                tenant, new_service, user.nick_name)
            new_service.create_status = "complete"
            new_service.save()

        transaction.savepoint_commit(tx)

        return 200, "success"
Ejemplo n.º 5
0
    def save_multi_services(self, region_name, tenant, group_id, service, user,
                            service_infos):
        service_source = service_source_repo.get_service_source(
            tenant.tenant_id, service.service_id)
        service_ids = []
        for service_info in service_infos:
            code, msg_show, new_service = app_service \
                .create_source_code_app(region_name, tenant, user,
                                        service.code_from,
                                        service_info["cname"],
                                        service.clone_url,
                                        service.git_project_id,
                                        service.code_version,
                                        service.server_type,
                                        oauth_service_id=service.oauth_service_id,
                                        git_full_name=service.git_full_name)
            if code != 200:
                raise AbortRequest(
                    "Multiple services; Service alias: {}; error creating service"
                    .format(service.service_alias), "创建多组件应用失败")
            # add username and password
            if service_source:
                git_password = service_source.password
                git_user_name = service_source.user_name
                if git_password or git_user_name:
                    app_service.create_service_source_info(
                        tenant, new_service, git_user_name, git_password)
            #  add group
            code, msg_show = group_service.add_service_to_group(
                tenant, region_name, group_id, new_service.service_id)
            if code != 200:
                logger.debug(
                    "Group ID: {0}; Service ID: {1}; error adding service to group"
                    .format(group_id, new_service.service_id))
                raise AbortRequest("app not found", "创建多组件应用失败", 404, 404)
            # save service info, such as envs, ports, etc
            code, msg = app_check_service.save_service_info(
                tenant, new_service, service_info)
            if code != 200:
                logger.debug(
                    "Group ID: {0}; Service ID: {1}; error saving services".
                    format(group_id, new_service.service_id))
                raise AbortRequest(msg, "创建多组件应用失败")
            new_service = app_service.create_region_service(
                tenant, new_service, user.nick_name)
            new_service.create_status = "complete"
            new_service.save()
            service_ids.append(new_service.service_id)

        return service_ids
Ejemplo n.º 6
0
    def post(self, request, *args, **kwargs):
        """
        源码创建组件
        ---
        parameters:
            - name: tenantName
              description: 租户名
              required: true
              type: string
              paramType: path
            - name: group_id
              description: 组id
              required: true
              type: string
              paramType: form
            - name: code_from
              description: 组件代码来源
              required: true
              type: string
              paramType: form
            - name: service_cname
              description: 组件名称
              required: true
              type: string
              paramType: form
            - name: git_url
              description: git地址
              required: false
              type: string
              paramType: form
            - name: git_project_id
              description: 代码ID
              required: false
              type: string
              paramType: form
            - name: code_version
              description: 代码版本
              required: false
              type: string
              paramType: form
            - name: username
              description: 私有云用户名称
              required: false
              type: string
              paramType: form
            - name: password
              description: 私有云账户密码
              required: false
              type: string
              paramType: form
            - name: server_type
              description: 仓库类型git或svn
              required: false
              type: string
              paramType: form

        """

        group_id = request.data.get("group_id", -1)
        service_code_from = request.data.get("code_from", None)
        service_cname = request.data.get("service_cname", None)
        service_code_clone_url = request.data.get("git_url", None)
        git_password = request.data.get("password", None)
        git_user_name = request.data.get("username", None)
        service_code_id = request.data.get("git_project_id", None)
        service_code_version = request.data.get("code_version", "master")
        server_type = request.data.get("server_type", "git")
        result = {}
        try:
            if not service_code_clone_url:
                return Response(general_message(400, "code url is null",
                                                "仓库地址未指明"),
                                status=400)
            if not service_code_from:
                return Response(general_message(400, "params error",
                                                "参数service_code_from未指明"),
                                status=400)
            if not server_type:
                return Response(general_message(400, "params error",
                                                "仓库类型未指明"),
                                status=400)
            # 创建源码组件
            if service_code_clone_url:
                service_code_clone_url = service_code_clone_url.strip()
            code, msg_show, new_service = app_service.create_source_code_app(
                self.response_region, self.tenant, self.user,
                service_code_from, service_cname, service_code_clone_url,
                service_code_id, service_code_version, server_type)
            if code != 200:
                return Response(general_message(code, "service create fail",
                                                msg_show),
                                status=code)
            # 添加username,password信息
            if git_password or git_user_name:
                app_service.create_service_source_info(self.tenant,
                                                       new_service,
                                                       git_user_name,
                                                       git_password)

            # 添加组件所在组
            code, msg_show = group_service.add_service_to_group(
                self.tenant, self.response_region, group_id,
                new_service.service_id)
            if code != 200:
                logger.debug("service.create", msg_show)
            result = general_message(200,
                                     "success",
                                     "创建成功",
                                     bean=new_service.to_dict())
        except ResourceNotEnoughException as re:
            raise re
        except AccountOverdueException as re:
            logger.exception(re)
            return Response(general_message(10410, "resource is not enough",
                                            re.message),
                            status=412)
        except Exception as e:
            logger.exception(e)
            result = error_message(e.message)
        return Response(result, status=result["code"])
Ejemplo n.º 7
0
    def post(self, request, *args, **kwargs):
        """
        源码创建组件
        ---
        parameters:
            - name: tenantName
              description: 租户名
              required: true
              type: string
              paramType: path
            - name: group_id
              description: 组id
              required: true
              type: string
              paramType: form
            - name: code_from
              description: 组件代码来源
              required: true
              type: string
              paramType: form
            - name: service_cname
              description: 组件名称
              required: true
              type: string
              paramType: form
            - name: git_url
              description: git地址
              required: false
              type: string
              paramType: form
            - name: git_project_id
              description: 代码ID
              required: false
              type: string
              paramType: form
            - name: code_version
              description: 代码版本
              required: false
              type: string
              paramType: form
            - name: username
              description: 私有云用户名称
              required: false
              type: string
              paramType: form
            - name: password
              description: 私有云账户密码
              required: false
              type: string
              paramType: form
            - name: server_type
              description: 仓库类型git或svn
              required: false
              type: string
              paramType: form

        """

        group_id = request.data.get("group_id", -1)
        service_code_from = request.data.get("code_from", None)
        service_cname = request.data.get("service_cname", None)
        service_code_clone_url = request.data.get("git_url", None)
        git_password = request.data.get("password", None)
        git_user_name = request.data.get("username", None)
        service_code_id = request.data.get("git_project_id", None)
        service_code_version = request.data.get("code_version", "master")
        is_oauth = request.data.get("is_oauth", False)
        check_uuid = request.data.get("check_uuid")
        event_id = request.data.get("event_id")
        server_type = request.data.get("server_type", "git")
        user_id = request.user.user_id
        oauth_service_id = request.data.get("service_id")
        git_full_name = request.data.get("full_name")
        git_service = None
        open_webhook = False
        host = os.environ.get('DEFAULT_DOMAIN', "http://" + request.get_host())

        result = {}
        if is_oauth:
            open_webhook = request.data.get("open_webhook", False)
            try:
                oauth_service = oauth_repo.get_oauth_services_by_service_id(service_id=oauth_service_id)
                oauth_user = oauth_user_repo.get_user_oauth_by_user_id(service_id=oauth_service_id, user_id=user_id)
            except Exception as e:
                logger.debug(e)
                rst = {"data": {"bean": None}, "status": 400, "msg_show": "未找到OAuth服务, 请检查该服务是否存在且属于开启状态"}
                return Response(rst, status=200)
            try:
                git_service = get_oauth_instance(oauth_service.oauth_type, oauth_service, oauth_user)
            except Exception as e:
                logger.debug(e)
                rst = {"data": {"bean": None}, "status": 400, "msg_show": "未找到OAuth服务"}
                return Response(rst, status=200)
            if not git_service.is_git_oauth():
                rst = {"data": {"bean": None}, "status": 400, "msg_show": "该OAuth服务不是代码仓库类型"}
                return Response(rst, status=200)

            service_code_from = "oauth_" + oauth_service.oauth_type
        try:
            if not service_code_clone_url:
                return Response(general_message(400, "code url is null", "仓库地址未指明"), status=400)
            if not service_code_from:
                return Response(general_message(400, "params error", "参数service_code_from未指明"), status=400)
            if not server_type:
                return Response(general_message(400, "params error", "仓库类型未指明"), status=400)
            # 创建源码组件
            if service_code_clone_url:
                service_code_clone_url = service_code_clone_url.strip()
            code, msg_show, new_service = app_service.create_source_code_app(
                self.response_region, self.tenant, self.user, service_code_from, service_cname, service_code_clone_url,
                service_code_id, service_code_version, server_type, check_uuid, event_id, oauth_service_id, git_full_name)
            if code != 200:
                return Response(general_message(code, "service create fail", msg_show), status=code)
            # 添加username,password信息
            if git_password or git_user_name:
                app_service.create_service_source_info(self.tenant, new_service, git_user_name, git_password)

            # 自动添加hook
            if open_webhook and is_oauth and not new_service.open_webhooks:
                service_webhook = service_webhooks_repo.create_service_webhooks(new_service.service_id, "code_webhooks")
                service_webhook.state = True
                service_webhook.deploy_keyword = "deploy"
                service_webhook.save()
                try:
                    git_service.create_hook(host, git_full_name, endpoint='console/webhooks/' + new_service.service_id)
                    new_service.open_webhooks = True
                except Exception as e:
                    logger.exception(e)
                    new_service.open_webhooks = False
                new_service.save()
            # 添加组件所在组

            code, msg_show = group_service.add_service_to_group(self.tenant, self.response_region, group_id,
                                                                new_service.service_id)

            if code != 200:
                logger.debug("service.create", msg_show)
            bean = new_service.to_dict()
            result = general_message(200, "success", "创建成功", bean=bean)
        except ResourceNotEnoughException as re:
            raise re
        except AccountOverdueException as re:
            logger.exception(re)
            return Response(general_message(10410, "resource is not enough", re.message), status=412)
        return Response(result, status=result["code"])
Ejemplo n.º 8
0
    def post(self, request, *args, **kwargs):
        """
        image和docker-run创建应用
        ---
        parameters:
            - name: tenantName
              description: 租户名
              required: true
              type: string
              paramType: path
            - name: group_id
              description: 组id
              required: true
              type: string
              paramType: form
            - name: service_cname
              description: 应用名称
              required: true
              type: string
              paramType: form
            - name: docker_cmd
              description: docker运行命令
              required: true
              type: string
              paramType: form
            - name: image_type
              description: 创建方式 docker_run或docker_image
              required: true
              type: string
              paramType: form

        """
        image_type = request.data.get("image_type", None)
        group_id = request.data.get("group_id", -1)
        service_cname = request.data.get("service_cname", None)
        docker_cmd = request.data.get("docker_cmd", "")

        # 私有docker仓库地址
        docker_password = request.data.get("password", None)
        docker_user_name = request.data.get("user_name", None)

        try:
            if not image_type:
                return Response(general_message(400, "image_type cannot be null", "参数错误"), status=400)
            if not docker_cmd:
                return Response(general_message(400, "docker_cmd cannot be null", "参数错误"), status=400)

            code, msg_show, new_service = app_service.create_docker_run_app(self.response_region, self.tenant,
                                                                            self.user, service_cname, docker_cmd,
                                                                            image_type)
            if code != 200:
                return Response(general_message(code, "service create fail", msg_show), status=code)

            # 添加username,password信息
            if docker_password or docker_user_name:
                app_service.create_service_source_info(self.tenant, new_service, docker_user_name, docker_password)

            code, msg_show = group_service.add_service_to_group(self.tenant, self.response_region, group_id,
                                                                new_service.service_id)
            if code != 200:
                logger.debug("service.create", msg_show)
            result = general_message(200, "success", "创建成功", bean=new_service.to_dict())
        except ResourceNotEnoughException as re:
            logger.exception(re)
            return Response(general_message(10406, "resource is not enough", re.message), status=412)
        except Exception as e:
            logger.exception(e)
            result = error_message()
        return Response(result, status=result["code"])