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"
예제 #2
0
    def post(self, request, *args, **kwargs):
        """
        服务构建
        ---
        parameters:
            - name: tenantName
              description: 租户名
              required: true
              type: string
              paramType: path
            - name: serviceAlias
              description: 服务别名
              required: true
              type: string
              paramType: path

        """
        probe = None
        try:
            is_deploy = request.data.get("is_deploy", True)
            # 数据中心创建应用
            new_service = app_service.create_region_service(self.tenant, self.service, self.user.nick_name)
            self.service = new_service
            # 为服务添加默认探针
            if self.is_need_to_add_default_probe():
                code, msg, probe = app_service.add_service_default_porbe(self.tenant, self.service)
            if is_deploy:
                # 添加服务有无状态标签
                label_service.update_service_state_label(self.tenant, self.service)
                # 部署应用
                app_manage_service.deploy(self.tenant, self.service, self.user, is_upgrade=True)

                # 添加应用部署关系
                deploy_repo.create_deploy_relation_by_service_id(service_id=self.service.service_id)

            result = general_message(200, "success", "构建成功")
        except Exception as e:
            logger.exception(e)
            result = error_message(e.message)
            # 删除probe
            # 删除region端数据
            if probe:
                probe_service.delete_service_probe(self.tenant, self.service, probe.probe_id)
            event_service.delete_service_events(self.service)
            port_service.delete_region_port(self.tenant, self.service)
            volume_service.delete_region_volumes(self.tenant, self.service)
            env_var_service.delete_region_env(self.tenant, self.service)
            dependency_service.delete_region_dependency(self.tenant, self.service)

            app_manage_service.delete_region_service(self.tenant, self.service)
            self.service.create_status = "checked"
            self.service.save()

        return Response(result, status=result["code"])
예제 #3
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
예제 #4
0
    def __create_region_services(self, tenant, user, service_list,
                                 service_probe_map):
        service_prob_id_map = {}
        new_service_list = []
        try:
            for service in service_list:
                # 数据中心创建应用
                new_service = app_service.create_region_service(
                    tenant, service, user.nick_name)
                # 为服务添加探针
                probe_data = service_probe_map.get(service.service_id)
                probe_ids = []
                if probe_data:
                    for data in probe_data:
                        code, msg, probe = probe_service.add_service_probe(
                            tenant, service, data)
                        if code == 200:
                            probe_ids.append(probe.probe_id)
                else:
                    code, msg, probe = app_service.add_service_default_porbe(
                        tenant, service)
                    if probe:
                        probe_ids.append(probe.probe_id)
                if probe_ids:
                    service_prob_id_map[service.service_id] = probe_ids

                # 添加服务有无状态标签
                label_service.update_service_state_label(tenant, new_service)
                new_service_list.append(new_service)
            return new_service_list
        except Exception as e:
            logger.exception("local market install app error {0}".format(e))
            if service_list:
                for service in service_list:
                    if service_prob_id_map:
                        probe_ids = service_prob_id_map.get(service.service_id)
                        if probe_ids:
                            for probe_id in probe_ids:
                                try:
                                    probe_service.delete_service_probe(
                                        tenant, service, probe_id)
                                except Exception as le:
                                    logger.exception(
                                        "local market install app delete service probe {0}"
                                        .format(le))
            raise e
예제 #5
0
    def build_services(self, user, tenant, region_name, group_id,
                       change_services_map):
        group_services = base_service.get_group_services_list(
            tenant.tenant_id, region_name, group_id)
        change_service_ids = [
            change_service["ServiceID"]
            for change_service in change_services_map.values()
        ]
        if not group_services:
            return []
        service_ids = [
            group_service.get("service_id") for group_service in group_services
        ]
        services = service_repo.get_service_by_service_ids(
            service_ids=service_ids)
        for service in services:
            if service.service_id in change_service_ids:
                # probe = None
                if service.service_source == "third_party":
                    # 数据中心连接创建第三方组件
                    new_service = app_service.create_third_party_service(
                        tenant, service, user.nick_name)
                else:
                    # 数据中心创建组件
                    new_service = app_service.create_region_service(
                        tenant, service, user.nick_name)

                service = new_service
                # 为组件添加默认探针
                if self.is_need_to_add_default_probe(service):
                    code, msg, probe = app_service.add_service_default_porbe(
                        tenant, service)
                    logger.debug("add default probe; code: {}; msg: {}".format(
                        code, msg))
                # 添加组件有无状态标签
                label_service.update_service_state_label(tenant, service)
                # 部署组件
                app_manage_service.deploy(tenant,
                                          service,
                                          user,
                                          group_version=None)

                # 添加组件部署关系
                deploy_repo.create_deploy_relation_by_service_id(
                    service_id=service.service_id)
예제 #6
0
    def __build_services(self, tenant, user, service_list, service_probe_map):
        service_prob_map = {}
        try:
            for service in service_list:
                # 数据中心创建应用
                new_service = app_service.create_region_service(
                    tenant, service, user.nick_name)
                # 为服务添加探针
                probe_data = service_probe_map.get(service.service_id)
                probe_ids = []
                if probe_data:
                    for data in probe_data:
                        code, msg, probe = probe_service.add_service_probe(
                            tenant, service, data)
                        if code == 200:
                            probe_ids.append(probe.probe_id)
                if probe_ids:
                    service_probe_map[service.service_id] = probe_ids

                # 添加服务有无状态标签
                label_service.update_service_state_label(tenant, new_service)
                # 部署应用
                app_manage_service.deploy(tenant, new_service, user)
        except Exception as e:
            logger.exception(e)
            if service_list:
                for service in service_list:
                    if service_prob_map:
                        probe_ids = service_prob_map.get(service.service_id)
                        if probe_ids:
                            for probe_id in probe_ids:
                                try:
                                    probe_service.delete_service_probe(
                                        tenant, service, probe_id)
                                except Exception as le:
                                    logger.exception(le)
            raise e
예제 #7
0
    def install_market_apps_directly(self, user, tenant, region_name,
                                     app_service_json_str, service_origin):
        app_templates = json.loads(app_service_json_str)
        apps = app_templates["apps"]

        service_list = []
        service_key_dep_key_map = {}
        key_service_map = {}
        tenant_service_group = None
        new_group = None
        try:
            # 生成分类
            group_name = self.__generator_group_name(
                app_templates["group_name"])
            new_group = group_repo.add_group(tenant.tenant_id, region_name,
                                             group_name)
            group_id = new_group.ID
            tenant_service_group = self.__generate_tenant_service_group(
                region_name, tenant.tenant_id, new_group.ID,
                app_templates["group_key"], app_templates["group_version"],
                app_templates["group_name"])
            for app in apps:
                ts = self.__init_market_app(tenant, region_name, user, app,
                                            tenant_service_group.ID,
                                            service_origin)
                group_service.add_service_to_group(tenant, region_name,
                                                   group_id, ts.service_id)

                # 先保存env,再保存端口,因为端口需要处理env
                code, msg = self.__save_env(
                    tenant, ts, app["service_env_map_list"],
                    app["service_connect_info_map_list"])
                if code != 200:
                    raise Exception(msg)
                code, msg = self.__save_port(tenant, ts, app["port_map_list"])
                if code != 200:
                    raise Exception(msg)
                code, msg = self.__save_volume(tenant, ts,
                                               app["service_volume_map_list"])
                if code != 200:
                    raise Exception(msg)

                # 保存应用探针信息
                probe_infos = app.get("probes", None)
                if probe_infos:
                    for prob_data in probe_infos:
                        code, msg, probe = probe_service.add_service_probe(
                            tenant, ts, prob_data)
                        if code != 200:
                            logger.exception(msg)

                self.__save_extend_info(ts, app["extend_method_map"])

                dep_apps_key = app.get("dep_service_map_list", None)
                if dep_apps_key:
                    service_key_dep_key_map[ts.service_key] = dep_apps_key
                key_service_map[ts.service_key] = ts
                service_list.append(ts)
            # 保存依赖关系,需要等应用都创建完成才能使用
            self.__save_service_deps(tenant, service_key_dep_key_map,
                                     key_service_map)
            # 数据中心创建应用
            for service in service_list:
                new_service = app_service.create_region_service(
                    tenant, service, user.nick_name)
                logger.debug("build service ===> {0}  success".format(
                    service.service_cname))
                # 为服务添加探针
                self.__create_service_probe(tenant, new_service)

                # 添加服务有无状态标签
                label_service.update_service_state_label(tenant, new_service)

            return True, "success", tenant_service_group, service_list
        except Exception as e:
            logger.exception(e)
            # 回滚数据
            if tenant_service_group:
                tenant_service_group_repo.delete_tenant_service_group_by_pk(
                    tenant_service_group.ID)
            if new_group:
                group_repo.delete_group_by_pk(new_group.ID)
            for service in service_list:
                try:
                    app_manage_service.truncate_service(tenant, service)
                except Exception as delete_error:
                    logger.exception(delete_error)
            return False, "create tenant_services from market directly failed !", None, service_list
예제 #8
0
    def post(self, request, *args, **kwargs):
        """
        组件构建
        ---
        parameters:
            - name: tenantName
              description: 租户名
              required: true
              type: string
              paramType: path
            - name: serviceAlias
              description: 组件别名
              required: true
              type: string
              paramType: path

        """
        probe = None
        is_deploy = request.data.get("is_deploy", True)
        status = 200
        try:
            if self.service.service_source == "third_party":
                is_deploy = False
                # 数据中心连接创建第三方组件
                new_service = app_service.create_third_party_service(
                    self.tenant, self.service, self.user.nick_name)
            else:
                # 数据中心创建组件
                new_service = app_service.create_region_service(
                    self.tenant, self.service, self.user.nick_name)

            self.service = new_service
            # 为组件添加默认探针
            if self.is_need_to_add_default_probe():
                code, msg, probe = app_service.add_service_default_porbe(
                    self.tenant, self.service)
                logger.debug("add default probe; code: {}; msg: {}".format(
                    code, msg))
            if is_deploy:
                # 添加组件有无状态标签
                label_service.update_service_state_label(
                    self.tenant, self.service)
                # 部署组件
                app_manage_service.deploy(self.tenant,
                                          self.service,
                                          self.user,
                                          group_version=None)

                # 添加组件部署关系
                deploy_repo.create_deploy_relation_by_service_id(
                    service_id=self.service.service_id)

            result = general_message(200, "success", "构建成功")
            return Response(result, status=result["code"])
        except HttpClient.CallApiError as e:
            logger.exception(e)
            if e.status == 403:
                result = general_message(10407, "no cloud permission",
                                         e.message)
                status = e.status
            elif e.status == 400:
                if "is exist" in e.message.get("body", ""):
                    result = general_message(400,
                                             "the service is exist in region",
                                             "该组件名称在数据中心已存在")
                else:
                    result = general_message(400, "call cloud api failure",
                                             e.message)
                status = e.status
            else:
                result = general_message(500, "call cloud api failure",
                                         e.message)
                status = 500

        # 删除probe
        # 删除region端数据
        if probe:
            probe_service.delete_service_probe(self.tenant, self.service,
                                               probe.probe_id)
        if self.service.service_source != "third_party":
            event_service.delete_service_events(self.service)
            port_service.delete_region_port(self.tenant, self.service)
            volume_service.delete_region_volumes(self.tenant, self.service)
            env_var_service.delete_region_env(self.tenant, self.service)
            dependency_service.delete_region_dependency(
                self.tenant, self.service)
            app_manage_service.delete_region_service(self.tenant, self.service)
        self.service.create_status = "checked"
        self.service.save()
        return Response(result, status=status)
예제 #9
0
    def post(self, request, *args, **kwargs):
        """
        docker-compose组件检测
        ---
        parameters:
            - name: tenantName
              description: 租户名
              required: true
              type: string
              paramType: path
            - name: group_id
              description: 组ID
              required: true
              type: string
              paramType: path
            - name: compose_id
              description: group_compose ID
              required: true
              type: string
              paramType: form
        """
        probe_map = dict()
        services = None

        try:
            compose_id = request.data.get("compose_id", None)
            if not compose_id:
                return Response(general_message(400, "params error", "参数异常"),
                                status=400)
            group_compose = compose_service.get_group_compose_by_compose_id(
                compose_id)
            services = compose_service.get_compose_services(compose_id)
            # 数据中心创建组件
            new_app_list = []
            for service in services:
                new_service = app_service.create_region_service(
                    self.tenant, service, self.user.nick_name)
                new_app_list.append(new_service)
                # 为组件添加默认探针
                code, msg, probe = app_service.add_service_default_porbe(
                    self.tenant, new_service)
                if probe:
                    probe_map[service.service_id] = probe.probe_id
                # 添加组件有无状态标签
                label_service.update_service_state_label(
                    self.tenant, new_service)

            group_compose.create_status = "complete"
            group_compose.save()
            for s in new_app_list:
                try:
                    app_manage_service.deploy(self.tenant,
                                              s,
                                              self.user,
                                              group_version=None)
                except Exception as e:
                    logger.exception(e)
                    continue

            result = general_message(200, "success", "构建成功")
        except Exception as e:
            logger.exception(e)
            result = error_message(e.message)
            # 删除probe
            # 删除region端数据
            if services:
                for service in services:
                    if probe_map:
                        probe_id = probe_map.get(service.service_id)
                        probe_service.delete_service_probe(
                            self.tenant, service, probe_id)

                    event_service.delete_service_events(service)
                    port_service.delete_region_port(self.tenant, service)
                    volume_service.delete_region_volumes(self.tenant, service)
                    env_var_service.delete_region_env(self.tenant, service)
                    dependency_service.delete_region_dependency(
                        self.tenant, service)

                    app_manage_service.delete_region_service(
                        self.tenant, service)
                    service.create_status = "checked"
                    service.save()

        return Response(result, status=result["code"])
예제 #10
0
    def build_services(self, user, tenant, region_name, group_id,
                       change_services_map):
        group_services = base_service.get_group_services_list(
            tenant.tenant_id, region_name, group_id)
        change_service_ids = [
            change_service["ServiceID"]
            for change_service in list(change_services_map.values())
        ]
        if not group_services:
            return []
        service_ids = [
            group_service.get("service_id") for group_service in group_services
        ]
        services = service_repo.get_service_by_service_ids(
            service_ids=service_ids)
        result = []
        for service in services:
            if service.service_id in change_service_ids:
                if service.service_source == "third_party":
                    # 数据中心连接创建第三方组件
                    new_service = app_service.create_third_party_service(
                        tenant, service, user.nick_name)
                else:
                    # 数据中心创建组件
                    new_service = app_service.create_region_service(
                        tenant, service, user.nick_name)

                service = new_service
                # 为组件添加默认探针
                if self.is_need_to_add_default_probe(service):
                    code, msg, probe = app_service.add_service_default_porbe(
                        tenant, service)
                    logger.debug("add default probe; code: {}; msg: {}".format(
                        code, msg))
                else:
                    probes = probe_repo.get_service_probe(service.service_id)
                    if probes:
                        for probe in probes:
                            prob_data = {
                                "service_id": service.service_id,
                                "scheme": probe.scheme,
                                "path": probe.path,
                                "port": probe.port,
                                "cmd": probe.cmd,
                                "http_header": probe.http_header,
                                "initial_delay_second":
                                probe.initial_delay_second,
                                "period_second": probe.period_second,
                                "timeout_second": probe.timeout_second,
                                "failure_threshold": probe.failure_threshold,
                                "success_threshold": probe.success_threshold,
                                "is_used": (1 if probe.is_used else 0),
                                "probe_id": probe.probe_id,
                                "mode": probe.mode,
                            }
                            try:
                                res, body = region_api.add_service_probe(
                                    service.service_region, tenant.tenant_name,
                                    service.service_alias, prob_data)
                                if res.get("status") != 200:
                                    logger.debug(body)
                                    probe.delete()
                            except Exception as e:
                                logger.debug("error", e)
                                probe.delete()
                # 添加组件有无状态标签
                label_service.update_service_state_label(tenant, service)
                # 部署组件
                app_manage_service.deploy(tenant,
                                          service,
                                          user,
                                          group_version=None)

                # 添加组件部署关系
                deploy_repo.create_deploy_relation_by_service_id(
                    service_id=service.service_id)
                result.append(service)
                # 为组件创建插件
                build_error_plugin_ids = []
                service_plugins = app_plugin_relation_repo.get_service_plugin_relation_by_service_id(
                    service.service_id)
                for service_plugin in service_plugins:
                    plugin = plugin_repo.get_by_plugin_id(
                        tenant.tenant_id, service_plugin.plugin_id)
                    plugin_version = plugin_repo.get_plugin_buildversion(
                        service_plugin.plugin_id, service_plugin.build_version)
                    # 在数据中心创建插件
                    try:
                        event_id = make_uuid()
                        plugin_version.event_id = event_id
                        image_tag = (plugin_version.image_tag
                                     if plugin_version.image_tag else "latest")
                        plugin_service.create_region_plugin(
                            region_name, tenant, plugin, image_tag=image_tag)
                        ret = plugin_service.build_plugin(
                            region_name, plugin, plugin_version, user, tenant,
                            event_id)
                        plugin_version.build_status = ret.get('bean').get(
                            'status')
                        plugin_version.save()
                    except Exception as e:
                        logger.debug(e)
                    # 为组件开通插件
                    try:
                        region_config = app_plugin_service.get_region_config_from_db(
                            service, service_plugin.plugin_id,
                            service_plugin.build_version)
                        data = dict()
                        data["plugin_id"] = service_plugin.plugin_id
                        data["switch"] = True
                        data["version_id"] = service_plugin.build_version
                        data.update(region_config)
                        region_api.install_service_plugin(
                            region_name, tenant.tenant_name,
                            service.service_alias, data)
                    except region_api.CallApiError as e:
                        logger.debug(e)
                        build_error_plugin_ids.append(service_plugin.plugin_id)
                if build_error_plugin_ids:
                    app_plugin_relation_repo.get_service_plugin_relation_by_service_id(
                        service.service_id).filter(
                            plugin_id__in=build_error_plugin_ids).delete()
                # create service_monitor in region
                service_monitors = service_monitor_repo.get_component_service_monitors(
                    tenant.tenant_id, service.service_id)
                for monitor in service_monitors:
                    req = {
                        "name": monitor.name,
                        "path": monitor.path,
                        "port": monitor.port,
                        "service_show_name": monitor.service_show_name,
                        "interval": monitor.interval
                    }
                    try:
                        region_api.create_service_monitor(
                            tenant.enterprise_id, service.service_region,
                            tenant.tenant_name, service.service_alias, req)
                    except region_api.CallApiError as e:
                        ServiceMonitor.objects.filter(
                            tenant_id=tenant.tenant_id,
                            service_id=service.service_id,
                            name=monitor.name).delete()
                        logger.debug(e)
        return result
예제 #11
0
    def build_services(self, user, tenant, region_name, group_id,
                       change_services_map):
        group_services = base_service.get_group_services_list(
            tenant.tenant_id, region_name, group_id)
        change_service_ids = [
            change_service["ServiceID"]
            for change_service in list(change_services_map.values())
        ]
        if not group_services:
            return []
        service_ids = [
            group_service.get("service_id") for group_service in group_services
        ]
        services = service_repo.list_by_component_ids(service_ids=service_ids)
        result = []
        for service in services:
            if service.service_id in change_service_ids:
                if service.service_source == "third_party":
                    # 数据中心连接创建第三方组件
                    new_service = app_service.create_third_party_service(
                        tenant, service, user.nick_name)
                else:
                    # 数据中心创建组件
                    new_service = app_service.create_region_service(
                        tenant, service, user.nick_name)
                service = new_service
                # 部署组件
                app_manage_service.deploy(tenant,
                                          service,
                                          user,
                                          group_version=None)

                # 添加组件部署关系
                deploy_repo.create_deploy_relation_by_service_id(
                    service_id=service.service_id)
                result.append(service)
                # 为组件创建插件
                build_error_plugin_ids = []
                service_plugins = app_plugin_relation_repo.get_service_plugin_relation_by_service_id(
                    service.service_id)
                for service_plugin in service_plugins:
                    plugin = plugin_repo.get_by_plugin_id(
                        tenant.tenant_id, service_plugin.plugin_id)
                    plugin_version = plugin_repo.get_plugin_buildversion(
                        service_plugin.plugin_id, service_plugin.build_version)
                    # 在数据中心创建插件
                    try:
                        event_id = make_uuid()
                        plugin_version.event_id = event_id
                        image_tag = (plugin_version.image_tag
                                     if plugin_version.image_tag else "latest")
                        plugin_service.create_region_plugin(
                            region_name, tenant, plugin, image_tag=image_tag)
                        ret = plugin_service.build_plugin(
                            region_name, plugin, plugin_version, user, tenant,
                            event_id)
                        plugin_version.build_status = ret.get('bean').get(
                            'status')
                        plugin_version.save()
                    except Exception as e:
                        logger.debug(e)
                    # 为组件开通插件
                    try:
                        region_config = app_plugin_service.get_region_config_from_db(
                            service, service_plugin.plugin_id,
                            service_plugin.build_version)
                        data = dict()
                        data["plugin_id"] = service_plugin.plugin_id
                        data["switch"] = True
                        data["version_id"] = service_plugin.build_version
                        data["plugin_cpu"] = service_plugin.min_cpu
                        data["plugin_memory"] = service_plugin.min_memory
                        data.update(region_config)
                        region_api.install_service_plugin(
                            region_name, tenant.tenant_name,
                            service.service_alias, data)
                    except region_api.CallApiError as e:
                        logger.debug(e)
                        build_error_plugin_ids.append(service_plugin.plugin_id)
                if build_error_plugin_ids:
                    app_plugin_relation_repo.get_service_plugin_relation_by_service_id(
                        service.service_id).filter(
                            plugin_id__in=build_error_plugin_ids).delete()
        return result
예제 #12
0
    def post(self, request, *args, **kwargs):
        """
        组件构建
        ---
        parameters:
            - name: tenantName
              description: 租户名
              required: true
              type: string
              paramType: path
            - name: serviceAlias
              description: 组件别名
              required: true
              type: string
              paramType: path

        """
        probe = None
        is_deploy = request.data.get("is_deploy", True)
        try:
            if not check_memory_quota(
                    self.oauth_instance, self.tenant.enterprise_id,
                    self.service.min_memory, self.service.min_node):
                raise ServiceHandleException(msg="not enough quota",
                                             error_code=20002)
            if self.service.service_source == "third_party":
                is_deploy = False
                # create third component from region
                new_service = app_service.create_third_party_service(
                    self.tenant, self.service, self.user.nick_name)
            else:
                # 数据中心创建组件
                new_service = app_service.create_region_service(
                    self.tenant, self.service, self.user.nick_name)

            self.service = new_service
            if is_deploy:
                try:
                    app_manage_service.deploy(
                        self.tenant,
                        self.service,
                        self.user,
                        group_version=None,
                        oauth_instance=self.oauth_instance)
                except ErrInsufficientResource as e:
                    result = general_message(e.error_code, e.msg, e.msg_show)
                    return Response(result, status=e.status_code)
                except Exception as e:
                    logger.exception(e)
                    err = ErrComponentBuildFailed()
                    result = general_message(err.error_code, e, err.msg_show)
                    return Response(result, status=400)
                # 添加组件部署关系
                deploy_repo.create_deploy_relation_by_service_id(
                    service_id=self.service.service_id)

            result = general_message(200, "success", "构建成功")
            return Response(result, status=result["code"])
        except HttpClient.CallApiError as e:
            logger.exception(e)
            if e.status == 403:
                result = general_message(10407, "no cloud permission",
                                         e.message)
                status = e.status
            elif e.status == 400:
                if "is exist" in e.message.get("body", ""):
                    result = general_message(400,
                                             "the service is exist in region",
                                             "该组件在数据中心已存在,你可能重复创建?")
                else:
                    result = general_message(400, "call cloud api failure",
                                             e.message)
                status = e.status
            else:
                result = general_message(400, "call cloud api failure",
                                         e.message)
                status = 400
        # 删除probe
        # 删除region端数据
        if probe:
            probe_service.delete_service_probe(self.tenant, self.service,
                                               probe.probe_id)
        if self.service.service_source != "third_party":
            event_service.delete_service_events(self.service)
            port_service.delete_region_port(self.tenant, self.service)
            volume_service.delete_region_volumes(self.tenant, self.service)
            env_var_service.delete_region_env(self.tenant, self.service)
            dependency_service.delete_region_dependency(
                self.tenant, self.service)
            app_manage_service.delete_region_service(self.tenant, self.service)
        self.service.create_status = "checked"
        self.service.save()
        return Response(result, status=status)