Example #1
0
    def delete(self, request, *args, **kwargs):
        """
        应用数据删除
        ---
        parameters:
            - name: tenantName
              description: 团队名称
              required: true
              type: string
              paramType: path
            - name: group_id
              description: 组ID
              required: true
              type: string
              paramType: path
            - name: new_group_id
              description: 组ID
              required: true
              type: string
              paramType: query

        """
        try:
            group_id = int(kwargs.get("group_id", None))
            if not group_id:
                return Response(general_message(400, "group id is null", "请确认需要删除的组"), status=400)
            new_group_id = request.data.get("new_group_id", None)
            if not new_group_id:
                return Response(general_message(400, "new group id is null", "请确认新恢复的组"), status=400)
            if group_id == new_group_id:
                return Response(general_message(200, "success", "恢复到当前组无需删除"), status=200)
            group = group_repo.get_group_by_id(group_id)
            if not group:
                return Response(general_message(400, "group is delete", "该备份组已删除"), status=400)

            if group.is_default:
                return Response(general_message(400, "default app", "默认应用不允许删除"), status=400)

            new_group = group_repo.get_group_by_id(new_group_id)
            if not new_group:
                return Response(
                    general_message(400, "new group not exist", "组ID {0} 不存在".format(new_group_id)),
                    status=400)
            services = group_service.get_group_services(group_id)
            for service in services:
                try:
                    app_manage_service.truncate_service(self.tenant, service)
                except Exception as le:
                    logger.exception(le)

            group.delete()

            result = general_message(200, "success", "操作成功")
        except Exception as e:
            logger.exception(e)
            result = error_message(e.message)
        return Response(result, status=result["code"])
Example #2
0
    def __delete_created_compose_info(self, tenant, compose_id):
        services = self.get_compose_services(compose_id)
        for s in services:
            # 彻底删除组件
            code, msg = app_manage_service.truncate_service(tenant, s)
            if code != 200:
                logger.error("delete compose services error {0}".format(msg))

        compose_relation_repo.delete_compose_service_relation_by_compose_id(compose_id)
    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
Example #4
0
    def install_service(self, tenant, region, user, group_id, market_app):
        service_list = []
        service_key_dep_key_map = {}
        key_service_map = {}
        tenant_service_group = None
        service_probe_map = {}
        try:
            app_templates = json.loads(market_app.app_template)
            apps = app_templates["apps"]
            tenant_service_group = self.__create_tenant_service_group(
                region, tenant.tenant_id, group_id, market_app.group_key,
                market_app.version, market_app.group_name)
            for app in apps:
                ts = self.__init_market_app(tenant.tenant_id, region, user,
                                            app, tenant_service_group.ID)
                group_service.add_service_to_group(tenant, region, group_id,
                                                   ts.service_id)
                service_list.append(ts)

                # 先保存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:
                    service_probe_map[ts.service_id] = probe_infos

                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
            # 保存依赖关系
            self.__save_service_deps(tenant, service_key_dep_key_map,
                                     key_service_map)
            # 构建应用
            self.__build_services(tenant, user, service_list,
                                  service_probe_map)
        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)
            for service in service_list:
                try:
                    app_manage_service.truncate_service(tenant, service)
                except Exception as le:
                    logger.exception(le)
            raise e
Example #5
0
    def install_service(self, tenant, region, user, group_id, market_app,
                        is_deploy):
        service_list = []
        service_key_dep_key_map = {}
        key_service_map = {}
        tenant_service_group = None
        service_probe_map = {}
        app_plugin_map = {}  # 新装服务对应的安装的插件映射
        old_new_id_map = {}  # 新旧服务映射关系
        try:
            app_templates = json.loads(market_app.app_template)
            apps = app_templates["apps"]
            tenant_service_group = self.__create_tenant_service_group(
                region, tenant.tenant_id, group_id, market_app.group_key,
                market_app.version, market_app.group_name)

            status, msg = self.__create_plugin_for_tenant(
                region, user, tenant, app_templates.get("plugins", []))
            if status != 200:
                raise Exception(msg)

            for app in apps:
                ts = self.__init_market_app(tenant, region, user, app,
                                            tenant_service_group.ID)
                group_service.add_service_to_group(tenant, region, group_id,
                                                   ts.service_id)
                service_list.append(ts)
                old_new_id_map[app["service_id"]] = ts

                # 先保存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:
                    service_probe_map[ts.service_id] = probe_infos

                self.__save_extend_info(ts, app["extend_method_map"])
                if app.get("service_share_uuid", None):
                    dep_apps_key = app.get("dep_service_map_list", None)
                    if dep_apps_key:
                        service_key_dep_key_map[app.get(
                            "service_share_uuid")] = dep_apps_key
                    key_service_map[app.get("service_share_uuid")] = ts
                else:
                    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
                app_plugin_map[ts.service_id] = app.get(
                    "service_related_plugin_config")

            # 保存依赖关系
            self.__save_service_deps(tenant, service_key_dep_key_map,
                                     key_service_map)

            # 数据中心创建应用
            new_service_list = self.__create_region_services(
                tenant, user, service_list, service_probe_map)
            # 创建应用插件
            self.__create_service_plugins(region, tenant, service_list,
                                          app_plugin_map, old_new_id_map)
            if is_deploy:
                # 部署所有应用
                self.__deploy_services(tenant, user, new_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)
            for service in service_list:
                try:
                    app_manage_service.truncate_service(tenant, service)
                except Exception as le:
                    logger.exception(le)
            raise e