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
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)
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
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 []
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)
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)
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
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
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
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)
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()
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