def delete_single(self, request, data, project_id, muster_id, show_version_name, res_name, muster_name): """删除单个类型""" ns_id_list = data.get("namespace_list") category = data.get("category") if not (ns_id_list and category): raise error_codes.CheckFailed(_("参数不能为空!")) project_kind = request.project.kind category = to_bcs_res_name(project_kind, category) if category not in MODULE_DICT: raise error_codes.CheckFailed(f'category: {category} does not exist') # 获取要删除的实例的信息 inst_info = self.get_instance_info(ns_id_list, [res_name], category=category) # 获取项目信息 flag, project_kind = self.get_project_kind(request, project_id) if not flag: return project_kind with client.ContextActivityLogClient( project_id=project_id, user=request.user.username, resource_type="instance", resource=res_name, resource_id=res_name, extra=json.dumps( { "muster_id": muster_id, "show_version_name": show_version_name, "res_name": res_name, "category": category, } ), description=_("删除模板集实例"), ).log_delete(): return self.delete_handler(request, inst_info, project_id, project_kind)
def get_category(self, request, kind): """获取类型""" category = request.GET.get("category") if kind == 1: if not category: raise error_codes.CheckFailed(_("应用类型不能为空")) else: if category not in CATEGORY_MAP: raise error_codes.CheckFailed(_("类型不正确,请确认")) category = [CATEGORY_MAP[category]] else: category = ["application", "deployment"] return category
def get_filter_params(self, request, project_id): """获取过滤参数 """ cluster_type = request.GET.get("cluster_type") if not cluster_type or cluster_type not in CLUSTER_TYPE: raise error_codes.CheckFailed(_("集群类型不正确,请确认")) app_status = request.GET.get("app_status") if app_status and app_status not in APP_STATUS: raise error_codes.CheckFailed(_("应用状态不正确,请确认")) app_id = self.get_app_id( request, project_id, request.GET.get("app_id"), request.GET.get("app_name")) ns_id = self.get_namespace_id( request, project_id, request.GET.get("ns_id"), request.GET.get("ns_name")) return cluster_type, app_status, app_id, ns_id
def check_ns_with_project(self, request, project_id, ns_id, cluster_type, cluster_env_map): """判断命名空间属于项目 """ resp = paas_cc.get_namespace_list(request.user.token.access_token, project_id, desire_all_data=True) if resp.get("code") != ErrorCode.NoError: raise error_codes.APIError.f(resp.get("message")) data = resp.get("data") or {} if not data.get("results"): raise error_codes.APIError(_("查询命名空间为空")) ns_list = data["results"] cluster_id = None ns_name = None for info in ns_list: if str(info["id"]) != str(ns_id): continue else: cluster_id = info["cluster_id"] ns_name = info["name"] if str( cluster_env_map.get( info["cluster_id"], {}).get("cluster_env")) != str(cluster_type): raise error_codes.CheckFailed(_("命名空间不属于当前项目或集群")) return cluster_id, ns_name
def get_inst_name(self, inst_id): """获取实例名称 """ inst_info = InstanceConfig.objects.filter(id=inst_id, is_deleted=False) if not inst_info: raise error_codes.CheckFailed(_("实例不存在,请确认!")) return inst_info[0].name
def check_project_muster(self, project_id, muster_id): """判断项目和集群 """ if not Template.objects.filter(project_id=project_id, id=muster_id).exists(): raise error_codes.CheckFailed( _("项目:{},模板集: {} 不存在!").format(project_id, muster_id))
def get_muster_name(self, muster_id): """获取模板名称 """ muster_name_list = Template.objects.filter(id=muster_id).values("name") if not muster_name_list: raise error_codes.CheckFailed(_("模板集ID: {} 不存在").format(muster_id)) return muster_name_list[0]["name"]
def delete_all(self, request, data, project_id, muster_id, show_version_name, res_name, muster_name): """删除所有类型""" ns_id_list = data.get("namespace_list") id_list = data.get("id_list") if not (ns_id_list and id_list): raise error_codes.CheckFailed(_("参数不能为空!")) # 获取项目信息 flag, project_kind = self.get_project_kind(request, project_id) if not flag: return project_kind # 获取所有模板名称 tmpl_category_name_map = {} for info in id_list: category_name = info["id"] tmpl_category_name_map[category_name] = info["category"] # 获取要删除的实例信息 inst_info = self.get_instance_info(ns_id_list, tmpl_category_name_map.keys()) # instance_version_ids = [val["info"].instance_id for key, val in inst_info.items()] with client.ContextActivityLogClient( project_id=project_id, user=request.user.username, resource_type="instance", resource=muster_name, resource_id=muster_id, extra=json.dumps( { "muster_id": muster_id, "show_version_name": show_version_name, "tmpl_category_name_map": tmpl_category_name_map, } ), description=_("删除模板集实例"), ).log_delete(): resp = self.delete_handler(request, inst_info, project_id, project_kind) return resp
def get(self, request, project_id, muster_id): """获取命名空间 """ # 获取参数 group_by = request.GET.get('group_by') or "env_type" category = request.GET.get("category") show_version_name = request.GET.get('show_version_name') res_name = request.GET.get('res_name') perm_can_use = request.GET.get('perm_can_use') if perm_can_use == '1': perm_can_use = True else: perm_can_use = False # 前端的category转换为后台需要的类型 if category != 'ALL': project_kind = request.project.kind category = to_bcs_res_name(project_kind, category) if category != 'ALL' and category not in MODULE_DICT: raise error_codes.CheckFailed( f'category: {category} does not exist') # 获取被占用的ns,没有处于删除中和已删除 ns_id_list = self.get_active_ns(muster_id, show_version_name, category, res_name) # 查询ns信息 results = self.get_ns_info(request, project_id, ns_id_list) # 解析&排序 cluster_env_map = self.get_cluster_env_map(request, project_id) results = filter(lambda x: x["id"] in ns_id_list, results) results = [{ 'name': k, 'cluster_name': cluster_env_map.get(k, {}).get('cluster_name', k), 'environment_name': "正式" if cluster_env_map.get(k, {}).get('cluster_env_str', '') == 'prod' else "测试", 'results': sorted(list(v), key=lambda x: x['id'], reverse=True) } for k, v in groupby(sorted(results, key=lambda x: x[group_by]), key=lambda x: x[group_by])] # ordering = [i.value for i in constants.EnvType] # results = sorted(results, key=lambda x: ordering.index(x['name'])) ret_data = [] for info in results: for item in (info["results"] or []): item["muster_id"] = muster_id item["environment"] = cluster_env_map.get( item["cluster_id"], {}).get("cluster_env_str") info["results"] = self.bcs_perm_handler(request, project_id, info["results"], filter_use=perm_can_use, ns_id_flag="id", ns_name_flag="name") if info["results"]: ret_data.append(info) return APIResponse({"data": ret_data})
def get_template_name(self, template_id, category): """获取模板名称 """ info = MODULE_DICT[category].objects.filter( id=template_id).values("name") if not info: raise error_codes.CheckFailed( _("模板ID: {} 不存在").format(template_id)) return info[0]["name"]
def get_namespace_id(self, request, project_id, ns_id, ns_name): if ns_id: return ns_id elif ns_name: name_id_map = self.get_namespace_name_id(request, project_id) ns_id = name_id_map.get(ns_name) if not ns_id: raise error_codes.CheckFailed(_("命名空间: {} 不存在").format(ns_name)) return ns_id else: return None
def get(self, request, project_id): """获取项目下的所有命名空间 """ # 获取过滤参数 cluster_type, app_status, app_id, ns_id = self.get_filter_params( request, project_id) exist_app = request.GET.get("exist_app") # 获取项目类型 project_kind = self.project_kind(request) # 获取项目下集群类型 cluster_list, cluster_env_map = self.get_cluster_id_env( request, project_id) if not cluster_list: return APIResponse({"data": []}) # 获取项目下面的namespace ns_list = self.get_namespace(request, project_id) if not ns_list: return APIResponse({"data": []}) # 组装命名空间数据、命名空间ID、项目下集群信息 ns_map, ns_id_list, cluster_id_list, ns_name_list = self.get_cluster_ns( ns_list, cluster_type, ns_id, cluster_env_map) # 匹配集群的环境 cluster_env = { info["cluster_id"]: { 'env_type': CLUSTER_ENV_MAP.get(info["environment"], "stag"), 'name': info['name'] } for info in cluster_list } inst_name = None if app_id: inst_name = self.get_inst_name(app_id) if project_kind == 1: category = request.GET.get("category") if not category or category not in CATEGORY_MAP.keys(): raise error_codes.CheckFailed(_("类型不正确")) client = k8s_views.GetNamespace() ns_app, ns_inst_error_count, create_error, all_ns_inst_count = client.get( request, ns_id_list, category, ns_map, project_id, project_kind, self.get_app_deploy_with_post, inst_name, ns_name_list, cluster_id_list) else: client = mesos_views.GetNamespace() ns_app, ns_inst_error_count, create_error, all_ns_inst_count = client.get( request, ns_id_list, ns_map, project_id, project_kind, self.get_app_deploy_with_post, inst_name, ns_name_list, cluster_id_list) # 匹配数据 self.compose_data(ns_map, cluster_env, ns_app, exist_app, ns_inst_error_count, create_error, app_status, all_ns_inst_count) ret_data = ns_map.values() return APIResponse({"data": ret_data})
def get_muster_id(self, project_id, muster_id, muster_name): """获取模板集ID """ if muster_id: return muster_id elif muster_name: musters = Template.objects.filter(project_id=project_id, is_deleted=False) musters = musters.filter(name=muster_name) if not musters: raise error_codes.CheckFailed(_("模板集: {} 不存在").format(muster_name)) return musters[0].id else: return None
def get(self, request, project_id, ns_id): cluster_type, app_status, app_id, filter_ns_id = self.get_filter_params( request, project_id) if filter_ns_id and str(ns_id) != str(filter_ns_id): return APIResponse({"data": {}}) # 获取项目类型 project_kind = self.project_kind(request) # 获取项目下集群类型 cluster_env_map = self.get_cluster_id_env(request, project_id) # 检查命名空间属于项目 cluster_id, ns_name = self.check_ns_with_project( request, project_id, ns_id, cluster_type, cluster_env_map) inst_name = None if app_id: inst_name = self.get_inst_name(app_id) ns_name_id = self.get_namespace_name_id(request, project_id) # 根据类型进行过滤数据 if project_kind == 1: category = request.GET.get("category") if not category or category not in CATEGORY_MAP.keys(): raise error_codes.CheckFailed(_("类型不正确")) client = k8s_views.GetInstances() ret_data = client.get(request, project_id, ns_id, category, inst_name, app_status, cluster_env_map, cluster_id, ns_name, ns_name_id) else: func_app = self.get_application_deploy_status func_deploy = self.get_application_deploy_info client = mesos_views.GetInstances() ret_data = client.get(request, project_id, ns_id, project_kind, func_app, func_deploy, inst_name, app_status, cluster_env_map, cluster_id, ns_name, ns_name_id) # 拆分需要处理权限和默认权限 auth_instance_list = [] default_auth_instance_list = [] for info in ret_data["instance_list"]: if info["from_platform"]: auth_instance_list.append(info) else: # info["permissions"] = {"create": True, "delete": True, "view": True, "edit": True, "use": True} default_auth_instance_list.append(info) # 添加权限 ret_instance_list = self.bcs_perm_handler(request, project_id, auth_instance_list) # 针对非模板集的权限解析 default_ret_instance_list = self.bcs_perm_handler( request, project_id, default_auth_instance_list, tmpl_view=False) ret_instance_list.extend(default_ret_instance_list) ret_data["instance_list"] = ret_instance_list return APIResponse({"data": ret_data})
def get_app_id(self, request, project_id, app_id, app_name): """获取应用ID """ if app_id: return app_id elif app_name: tmpl_id_list = Template.objects.filter(project_id=project_id).values_list("id", flat=True) version_inst_list = VersionInstance.objects.filter( template_id__in=tmpl_id_list).values_list("id", flat=True) insts = InstanceConfig.objects.filter(name=app_name, instance_id__in=version_inst_list) category = request.GET.get('category') if category: category_list = self.get_category(request, request.project['kind']) insts = insts.filter(category__in=category_list) if not insts: raise error_codes.CheckFailed(_("应用: {} 不存在").format(app_name)) return insts[0].id return None
def get_tmpl_name(self, instance_entity): all_tmpl_name_dict = {} for category, tmpl_id_list in instance_entity.items(): # 需要单独处理 Metric, 不需要轮询Metric 的状态 # 非标准日志采集相关的 configmap\K8sConfigMap 不需要轮询状态 # secret 相关的也不需要轮询状态 if category in [ 'metric', 'configmap', 'K8sConfigMap', 'secret', 'K8sSecret' ]: continue if category not in MODULE_DICT: raise error_codes.CheckFailed( _("类型只能为{}").format(";".join(MODULE_DICT.keys()))) tmpl_name = MODULE_DICT[category].objects.filter( id__in=tmpl_id_list).values_list("name", flat=True) if category in all_tmpl_name_dict: all_tmpl_name_dict[category].extend(list(tmpl_name)) else: all_tmpl_name_dict = {category: list(tmpl_name)} return all_tmpl_name_dict