예제 #1
0
 def check_service_source(self, team, team_name, group_id, region_name):
     service_list = share_repo.get_service_list_by_group_id(team=team, group_id=group_id)
     if service_list:
         can_publish_list = [
             service for service in service_list if service.service_source != "market"
         ]
         if not can_publish_list:
             data = {"code": 400, "success": False, "msg_show": "此组中的应用全部来源于云市,无法发布",
                     "list": list(), "bean": dict()}
             return data
         else:
             # 批量查询应用状态
             service_ids = [service.service_id for service in service_list]
             status_list = base_service.status_multi_service(region=region_name, tenant_name=team_name,
                                                             service_ids=service_ids, enterprise_id=team.enterprise_id)
             for status in status_list:
                 if status["status"] != "running":
                     data = {"code": 400, "success": False, "msg_show": "您有应用未在运行状态不能发布。",
                             "list": list(), "bean": dict()}
                     return data
                 else:
                     data = {"code": 200, "success": True, "msg_show": "您的应用都在运行中可以发布。",
                             "list": list(), "bean": dict()}
                     return data
     else:
         data = {"code": 400, "success": False, "msg_show": "当前组内无应用", "list": list(), "bean": dict()}
         return data
예제 #2
0
 def post(self, request, *args, **kwargs):
     """
     查看总览分页页面应用状态信息(弃)
     ---
     parameters:
         - name: team_name
           description: 团队名
           required: true
           type: string
           paramType: path
         - name: service_ids
           description: 当前页面应用ID列表 格式{"service_ids": ["1","2"]}
           required: true
           type: string
           paramType: form
     """
     code = 200
     service_ids = request.data["service_ids"]
     status_list = []
     if len(service_ids) > 0:
         status_list = base_service.status_multi_service(
             region=self.response_region,
             tenant_name=self.team_name,
             service_ids=service_ids,
             enterprise_id=self.team.enterprise_id)
     result = general_message(code, "success", "批量获取状态成功", list=status_list)
     return Response(result, status=code)
예제 #3
0
    def get_group_service_by_group_id(self, group_id, region_name, team_id, team_name, enterprise_id, query=""):
        group_services_list = base_service.get_group_services_list(team_id, region_name, group_id, query)
        if not group_services_list:
            return []
        service_ids = [service.service_id for service in group_services_list]
        status_list = base_service.status_multi_service(region_name, team_name, service_ids, enterprise_id)
        status_cache = {}
        statuscn_cache = {}
        for status in status_list:
            status_cache[status["service_id"]] = status["status"]
            statuscn_cache[status["service_id"]] = status["status_cn"]
        result = []
        for service in group_services_list:
            service_obj = TenantServiceInfo.objects.filter(service_id=service["service_id"]).first()
            if service_obj:
                service["service_source"] = service_obj.service_source
            service["status_cn"] = statuscn_cache.get(service["service_id"], "未知")
            status = status_cache.get(service["service_id"], "unknow")

            if status == "unknow" and service["create_status"] != "complete":
                service["status"] = "creating"
                service["status_cn"] = "创建中"
            else:
                service["status"] = status_cache.get(service["service_id"], "unknow")
            if service["status"] == "closed" or service["status"] == "undeploy":
                service["min_memory"] = 0
            status_map = get_status_info_map(service["status"])
            service.update(status_map)
            result.append(service)
        return result
예제 #4
0
    def get_no_group_service_status_by_group_id(self, team_name, team_id, region_name, enterprise_id):
        no_services = base_service.get_no_group_services_list(team_id=team_id, region_name=region_name)
        if no_services:
            service_ids = [service.service_id for service in no_services]
            status_list = base_service.status_multi_service(
                region=region_name, tenant_name=team_name, service_ids=service_ids, enterprise_id=enterprise_id)
            status_cache = {}
            statuscn_cache = {}
            for status in status_list:
                status_cache[status["service_id"]] = status["status"]
                statuscn_cache[status["service_id"]] = status["status_cn"]
            result = []
            for service in no_services:
                if service["group_name"] is None:
                    service["group_name"] = "未分组"
                service["status_cn"] = statuscn_cache.get(service["service_id"], "未知")
                status = status_cache.get(service["service_id"], "unknow")

                if status == "unknow" and service["create_status"] != "complete":
                    service["status"] = "creating"
                    service["status_cn"] = "创建中"
                else:
                    service["status"] = status_cache.get(service["service_id"], "unknow")
                if service["status"] == "closed" or service["status"] == "undeploy":
                    service["min_memory"] = 0
                status_map = get_status_info_map(service["status"])
                service.update(status_map)
                result.append(service)

            return result
        else:
            return []
예제 #5
0
 def delete(self, req, app_id, *args, **kwargs):
     msg_list = []
     try:
         force = int(req.GET.get("force", 0))
     except ValueError:
         raise ServiceHandleException(msg='force value error',
                                      msg_show=u"参数错误")
     service_ids = app_service.get_group_services_by_id(self.app.ID)
     services = service_repo.get_services_by_service_ids(service_ids)
     if services:
         status_list = base_service.status_multi_service(
             region=self.app.region_name,
             tenant_name=self.team.tenant_name,
             service_ids=service_ids,
             enterprise_id=self.team.enterprise_id)
         status_list = filter(lambda x: x not in ["closed", "undeploy"],
                              map(lambda x: x["status"], status_list))
         if len(status_list) > 0:
             raise ServiceHandleException(
                 msg=
                 "There are running components under the current application",
                 msg_show=u"当前应用下有运行态的组件,不可删除")
         else:
             code_status = 200
             for service in services:
                 code, msg = app_manage_service.batch_delete(self.user,
                                                             self.team,
                                                             service,
                                                             is_force=True)
                 msg_dict = dict()
                 msg_dict['status'] = code
                 msg_dict['msg'] = msg
                 msg_dict['service_id'] = service.service_id
                 msg_dict['service_cname'] = service.service_cname
                 msg_list.append(msg_dict)
                 if code != 200:
                     code_status = code
                     if force:
                         code_status = 200
                         app_manage_service.delete_again(self.user,
                                                         self.team,
                                                         service,
                                                         is_force=True)
             if code_status != 200:
                 raise ServiceHandleException(msg=msg_list,
                                              msg_show=u"请求错误")
             else:
                 code, msg, data = group_service.delete_group_no_service(
                     self.app.ID)
                 if code != 200:
                     raise ServiceHandleException(msg=msg, msg_show=u"请求错误")
                 return Response(None, status=code)
     code, msg, data = group_service.delete_group_no_service(self.app.ID)
     if code != 200:
         raise ServiceHandleException(msg=msg, msg_show=u"请求错误")
     return Response(None, status=code)
예제 #6
0
 def get(self, req, app_id, service_id, *args, **kwargs):
     status_list = base_service.status_multi_service(
         region=self.app.region_name,
         tenant_name=self.team.tenant_name,
         service_ids=[self.service.service_id],
         enterprise_id=self.team.enterprise_id)
     self.service.status = status_list[0]["status"]
     serializer = ServiceBaseInfoSerializer(data=self.service.to_dict())
     serializer.is_valid()
     return Response(serializer.data, status=status.HTTP_200_OK)
예제 #7
0
 def get_app_status(self, app):
     services = group_service.get_group_services(app.ID)
     service_ids = [service.service_id for service in services]
     team = team_services.get_team_by_team_id(app.tenant_id)
     status_list = base_service.status_multi_service(
         region=app.region_name,
         tenant_name=team.tenant_name,
         service_ids=service_ids,
         enterprise_id=team.enterprise_id)
     # As long as there is a service running, the application thinks it is running
     app_status = "closed"
     for status in status_list:
         if status["status"] == "running":
             app_status = "running"
     if not service_ids:
         app_status = "notinstall"
     return app_status, services
예제 #8
0
 def get_app_services_and_status(self, app):
     services = group_service.get_group_services(app.ID)
     service_ids = [service.service_id for service in services]
     team = team_services.get_team_by_team_id(app.tenant_id)
     status_list = base_service.status_multi_service(
         region=app.region_name,
         tenant_name=team.tenant_name,
         service_ids=service_ids,
         enterprise_id=team.enterprise_id)
     status_map = {}
     if status_list:
         for status in status_list:
             status_map[status["service_id"]] = status["status"]
     re_services = []
     for service in services:
         s = model_to_dict(service)
         s["status"] = status_map.get(service.service_id)
         re_services.append(s)
     return re_services
예제 #9
0
    def get_multi_apps_all_info(self, app_ids, region, tenant_name,
                                enterprise_id):
        app_list = group_repo.get_multi_app_info(app_ids)
        service_list = service_repo.get_services_in_multi_apps_with_app_info(
            app_ids)
        # memory info
        service_ids = [service.service_id for service in service_list]
        status_list = base_service.status_multi_service(
            region, tenant_name, service_ids, enterprise_id)
        service_status = dict()
        for status in status_list:
            service_status[status["service_id"]] = status

        for service in service_list:
            service.status = service_status[service.service_id]["status"]
            service.used_mem = service_status[service.service_id]["used_mem"]

        plugin_list = app_plugin_relation_repo.get_multi_service_plugin(
            service_ids)
        plugins = dict()
        for plugin in plugin_list:
            if not plugins.get(plugin.service_id):
                plugins[plugin.service_id] = 0
            if plugin.plugin_status:
                # if plugin is turn on means component is using this plugin
                plugins[plugin.service_id] += plugin.min_memory

        apps = dict()
        for app in app_list:
            apps[app.ID] = {
                "group_id": app.ID,
                "group_name": app.group_name,
                "group_note": app.note,
                "service_list": [],
            }
        for service in service_list:
            # memory used for plugin
            service.min_memory += plugins.get(service.service_id, 0)
            apps[service.group_id]["service_list"].append(service)

        share_list = share_repo.get_multi_app_share_records(app_ids)
        share_records = dict()
        for share_info in share_list:
            if not share_records.get(int(share_info.group_id)):
                share_records[int(share_info.group_id)] = {"share_app_num": 0}
            if share_info:
                share_records[int(share_info.group_id)]["share_app_num"] += 1

        backup_list = backup_record_repo.get_multi_apps_backup_records(app_ids)
        backup_records = dict()
        for backup_info in backup_list:
            if not backup_records.get(int(backup_info.group_id)):
                backup_records[int(backup_info.group_id)] = {
                    "backup_record_num": 0
                }
            backup_records[int(backup_info.group_id)]["backup_record_num"] += 1

        re_app_list = []
        for a in app_list:
            group_id = a.ID
            app = apps.get(a.ID)
            app["share_record_num"] = share_records[group_id][
                "share_app_num"] if share_records.get(group_id) else 0
            app["backup_record_num"] = backup_records[group_id][
                "backup_record_num"] if backup_records.get(group_id) else 0
            app["services_num"] = len(app["service_list"])
            if not app.get("run_service_num"):
                app["run_service_num"] = 0
            if not app.get("used_mem"):
                app["used_mem"] = 0
            if not app.get("allocate_mem"):
                app["allocate_mem"] = 0
            for svc in app["service_list"]:
                app["allocate_mem"] += svc.min_memory
                if svc.status in [
                        "running", "upgrade", "starting", "some_abnormal"
                ]:
                    # if is running used_mem ++
                    app["used_mem"] += svc.min_memory
                    app["run_service_num"] += 1
            app.pop("service_list")
            re_app_list.append(app)
        return re_app_list
예제 #10
0
    def get(self, request, *args, **kwargs):
        """
        总览 团队应用信息
        """
        try:
            page = int(request.GET.get("page", 1))
            page_size = int(request.GET.get("page_size", 10))
            groups = group_repo.get_tenant_region_groups(
                self.team.tenant_id, self.response_region)
            total = len(groups)
            app_num_dict = {"total": total}
            start = (page - 1) * page_size
            end = page * page_size
            app_list = []
            if groups:
                for group in groups:
                    app_dict = dict()
                    app_dict["group_name"] = group.group_name
                    app_dict["group_id"] = group.ID
                    # 分享记录和备份记录
                    share_record_num = share_repo.get_app_share_record_count_by_groupid(
                        group_id=group.ID)
                    app_dict["share_record_num"] = share_record_num
                    backup_records = backup_record_repo.get_group_backup_records(
                        self.team.tenant_id, self.response_region, group.ID)
                    backup_record_num = len(backup_records)
                    app_dict["backup_record_num"] = backup_record_num
                    # 服务数量记录
                    services = group_service_relation_repo.get_services_by_group(
                        group.ID)
                    services_num = len(services)
                    app_dict["services_num"] = services_num

                    run_service_num = 0
                    if services:
                        service_ids = []
                        for service in services:
                            service_ids.append(service.service_id)

                        status_list = base_service.status_multi_service(
                            region=self.response_region,
                            tenant_name=self.team_name,
                            service_ids=service_ids,
                            enterprise_id=self.team.enterprise_id)
                        for status in status_list:
                            if status["status"] in [
                                    "running", "upgrade", "starting",
                                    "some_abnormal"
                            ]:
                                run_service_num += 1

                    app_dict["run_service_num"] = run_service_num
                    app_list.append(app_dict)

                # 排序
                app_list.sort(key=lambda x: x['run_service_num'], reverse=True)

            apps_list = app_list[start:end]
            result = general_message(200,
                                     "success",
                                     "查询成功",
                                     list=apps_list,
                                     bean=app_num_dict)
            return Response(result, status=200)
        except Exception as e:
            logger.exception(e)
            result = error_message(e.message)
            return Response(result, status=500)
예제 #11
0
 def get(self, request, *args, **kwargs):
     """
     总览 团队应用信息 + 分页 + 排序 + 模糊查询
     ---
     parameters:
         - name: team_name
           description: 团队名
           required: true
           type: string
           paramType: path
         - name: page
           description: 页数(默认第一页)
           required: false
           type: string
           paramType: query
         - name: page_size
           description: 每页展示个数(默认10个)
           required: false
           type: string
           paramType: query
         - name: order
           description: 排序规则 desc(从大到小)或者asc(从小到大) 默认desc
           required: false
           type: string
           paramType: query
         - name: fields
           description: 排序字段 默认 update_time 可用(update_time, min_memory)
           required: false
           type: string
           paramType: query
         - name: query_key
           description: 模糊应用名 默认为空,查到所有应用
           required: false
           type: string
           paramType: query
         - name: service_status
           description: 应用状态 默认all 可用(running, closed, all)
           required: true
           type: string
           paramType: query
     """
     try:
         code = 200
         page = request.GET.get("page", 1)
         page_size = request.GET.get("page_size", 10)
         order = request.GET.get('order_type', 'desc')
         fields = request.GET.get('fields', 'update_time')
         query_key = request.GET.get("query_key", '')
         service_status = request.GET.get("service_status", 'all')
         if not self.team:
             result = general_message(400, "failed", "该团队不存在")
             return Response(result, status=400)
         services_list = base_service.get_fuzzy_services_list(
             team_id=self.team.tenant_id,
             region_name=self.response_region,
             query_key=query_key,
             fields=fields,
             order=order)
         if services_list:
             try:
                 service_ids = [
                     service["service_id"] for service in services_list
                 ]
                 status_list = base_service.status_multi_service(
                     region=self.response_region,
                     tenant_name=self.team_name,
                     service_ids=service_ids,
                     enterprise_id=self.team.enterprise_id)
                 status_cache = {}
                 statuscn_cache = {}
                 for status in status_list:
                     status_cache[status["service_id"]] = status["status"]
                     statuscn_cache[
                         status["service_id"]] = status["status_cn"]
                 result = []
                 for service in services_list:
                     if service["group_id"] is None:
                         service["group_name"] = "未分组"
                         service["group_id"] = "-1"
                     if service_status == "all":
                         service["status_cn"] = statuscn_cache.get(
                             service["service_id"], "未知")
                         status = status_cache.get(service["service_id"],
                                                   "unknow")
                         if status == "unknow" and service[
                                 "create_status"] != "complete":
                             service["status"] = "creating"
                             service["status_cn"] = "创建中"
                         else:
                             service["status"] = status_cache.get(
                                 service["service_id"], "unknow")
                             service["status_cn"] = get_status_info_map(
                                 service["status"]).get("status_cn")
                         if service["status"] == "closed" or service[
                                 "status"] == "undeploy":
                             service["min_memory"] = 0
                         result.append(service)
                     else:
                         if status_cache.get(
                                 service.service_id) == service_status:
                             service["status"] = status_cache.get(
                                 service.service_id, "unknow")
                             service["status_cn"] = get_status_info_map(
                                 service["status"]).get("status_cn")
                             if service["status"] == "closed" or service[
                                     "status"] == "undeploy":
                                 service["min_memory"] = 0
                             result.append(service)
                 paginator = Paginator(result, page_size)
                 try:
                     result = paginator.page(page).object_list
                 except PageNotAnInteger:
                     result = paginator.page(1).object_list
                 except EmptyPage:
                     result = paginator.page(
                         paginator.num_pages).object_list
                 result = general_message(200,
                                          "query user success",
                                          "查询用户成功",
                                          list=result,
                                          total=paginator.count)
             except Exception as e:
                 logger.exception(e)
                 return Response(services_list, status=200)
             return Response(result, status=code)
         else:
             result = general_message(200, "success", "当前团队没有创建应用")
             return Response(result, status=200)
     except Exception as e:
         logger.exception(e)
         result = error_message(e.message)
         return Response(result, status=500)
 def delete_tenant_on_region(self, enterprise_id, team_name, region_name,
                             user):
     tenant = team_repo.get_team_by_team_name_and_eid(
         enterprise_id, team_name)
     tenant_region = region_repo.get_team_region_by_tenant_and_region(
         tenant.tenant_id, region_name)
     if not tenant_region:
         raise ServiceHandleException(
             msg="team not open cluster, not need close",
             msg_show="该团队未开通此集群,无需关闭")
     # start delete
     region_config = region_repo.get_enterprise_region_by_region_name(
         enterprise_id, region_name)
     ignore_cluster_resource = False
     if not region_config:
         # cluster spec info not found, cluster side resources are no longer operated on
         ignore_cluster_resource = True
     else:
         info = region_api.check_region_api(enterprise_id, region_name)
         # check cluster api health
         if not info or info["rbd_version"] == "":
             ignore_cluster_resource = True
     services = service_repo.get_services_by_team_and_region(
         tenant.tenant_id, region_name)
     if not ignore_cluster_resource and services and len(services) > 0:
         # check component status
         service_ids = [service.service_id for service in services]
         status_list = base_service.status_multi_service(
             region=region_name,
             tenant_name=tenant.tenant_name,
             service_ids=service_ids,
             enterprise_id=tenant.enterprise_id)
         status_list = filter(lambda x: x not in ["closed", "undeploy"],
                              map(lambda x: x["status"], status_list))
         if len(status_list) > 0:
             raise ServiceHandleException(
                 msg=
                 "There are running components under the current application",
                 msg_show="团队在集群{0}下有运行态的组件,请关闭组件后再卸载当前集群".format(
                     region_config.region_alias))
     # Components are the key to resource utilization,
     # and removing the cluster only ensures that the component's resources are freed up.
     from console.services.app_actions import app_manage_service
     from console.services.plugin import plugin_service
     not_delete_from_cluster = False
     for service in services:
         not_delete_from_cluster = app_manage_service.really_delete_service(
             tenant, service, user, ignore_cluster_resource,
             not_delete_from_cluster)
     plugins = plugin_repo.get_tenant_plugins(tenant.tenant_id, region_name)
     if plugins:
         for plugin in plugins:
             plugin_service.delete_plugin(region_name, tenant,
                                          plugin.plugin_id,
                                          ignore_cluster_resource)
     # delete tenant
     if not ignore_cluster_resource:
         try:
             region_api.delete_tenant(region_name, team_name)
         except region_api.CallApiError as e:
             if e.status != 404:
                 logger.error("delete tenant failure {}".format(e.body))
                 raise ServiceHandleException(
                     msg="delete tenant from cluster failure",
                     msg_show="从集群删除租户失败")
         except Exception as e:
             logger.exception(e)
             raise ServiceHandleException(
                 msg="delete tenant from cluster failure",
                 msg_show="从集群删除租户失败")
     tenant_region.delete()
예제 #13
0
    def get_multi_apps_all_info(self, app_ids, region, tenant_name, enterprise_id):
        app_list = group_repo.get_multi_app_info(app_ids)
        service_list = service_repo.get_services_in_multi_apps_with_app_info(app_ids)
        # memory info
        service_ids = [service.service_id for service in service_list]
        status_list = base_service.status_multi_service(region, tenant_name, service_ids, enterprise_id)
        service_status = dict()
        if status_list is None:
            raise ServiceHandleException(msg="query status failure", msg_show="查询组件状态失败")
        for status in status_list:
            service_status[status["service_id"]] = status

        for service in service_list:
            svc_sas = service_status.get(service.service_id, {"status": "failure", "used_mem": 0})
            service.status = svc_sas["status"]
            service.used_mem = svc_sas["used_mem"]

        plugin_list = app_plugin_relation_repo.list_by_component_ids(service_ids)
        plugins = dict()
        for plugin in plugin_list:
            if not plugins.get(plugin.service_id):
                plugins[plugin.service_id] = 0
            if plugin.plugin_status:
                # if plugin is turn on means component is using this plugin
                plugins[plugin.service_id] += plugin.min_memory

        app_id_statuses = self.get_region_app_statuses(tenant_name, region, app_ids)
        apps = dict()
        for app in app_list:
            app_status = app_id_statuses.get(app.ID)
            apps[app.ID] = {
                "group_id": app.ID,
                "update_time": app.update_time,
                "create_time": app.create_time,
                "group_name": app.group_name,
                "group_note": app.note,
                "service_list": [],
                "used_mem": app_status.get("memory", 0) if app_status else 0
            }
        for service in service_list:
            apps[service.group_id]["service_list"].append(service)

        share_list = share_repo.get_multi_app_share_records(app_ids)
        share_records = dict()
        for share_info in share_list:
            if not share_records.get(int(share_info.group_id)):
                share_records[int(share_info.group_id)] = {"share_app_num": 0}
            if share_info:
                share_records[int(share_info.group_id)]["share_app_num"] += 1

        backup_list = backup_record_repo.get_multi_apps_backup_records(app_ids)
        backup_records = dict()
        for backup_info in backup_list:
            if not backup_records.get(int(backup_info.group_id)):
                backup_records[int(backup_info.group_id)] = {"backup_record_num": 0}
            backup_records[int(backup_info.group_id)]["backup_record_num"] += 1

        re_app_list = []
        for a in app_list:
            group_id = a.ID
            app = apps.get(a.ID)
            app["share_record_num"] = share_records[group_id]["share_app_num"] if share_records.get(group_id) else 0
            app["backup_record_num"] = backup_records[group_id]["backup_record_num"] if backup_records.get(group_id) else 0
            app["services_num"] = len(app["service_list"])
            if not app.get("run_service_num"):
                app["run_service_num"] = 0
            if not app.get("used_mem"):
                app["used_mem"] = 0
            if not app.get("allocate_mem"):
                app["allocate_mem"] = 0
            for svc in app["service_list"]:
                app["allocate_mem"] += svc.min_memory
                if svc.status in ["running", "upgrade", "starting", "some_abnormal"]:
                    # if is running used_mem ++
                    app["run_service_num"] += 1
            if app["used_mem"] > app["allocate_mem"]:
                app["allocate_mem"] = app["used_mem"]
            app.pop("service_list")
            re_app_list.append(app)
        return re_app_list