def list_instance_by_policy(self, filter, page, **options): """ periodic_task """ expression = filter.expression if not expression: return ListResult(results=[], count=0) key_mapping = { "periodic_task.id": "id", "periodic_task.owner": "task__creator", # TODO 优化 "periodic_task._bk_iam_path_": "project__id", } converter = PathEqDjangoQuerySetConverter( key_mapping, {"project__id": periodic_task_path_value_hook}) filters = converter.convert(expression) queryset = PeriodicTask.objects.filter(filters) count = queryset.count() results = [{ "id": str(periodic_task.id), "display_name": periodic_task.name } for periodic_task in queryset[page.slice_from:page.slice_to]] return ListResult(results=results, count=count)
def list_instance_by_policy(self, filter, page, **options): """ mini_app """ expression = filter.expression if not expression: return ListResult(results=[], count=0) key_mapping = { "mini_app.id": "id", "mini_app.owner": "creator", "mini_app._bk_iam_path_": "project__id", } # TODO 优化 converter = PathEqDjangoQuerySetConverter(key_mapping, {"project__id": mini_app_path_value_hook}) filters = converter.convert(expression) queryset = AppMaker.objects.filter(filters) count = queryset.count() results = [ {"id": str(mini_app.id), "display_name": mini_app.name} for mini_app in queryset[page.slice_from : page.slice_to] ] return ListResult(results=results, count=count)
def search_instance(self, filter_obj: FancyDict, page_obj: Page, **options) -> ListResult: """支持模糊搜索项目名""" data = page_query_projects( get_system_token(), limit=page_obj.limit, offset=page_obj.offset, query_params={'search_name': filter_obj.keyword}, ) if data and data['results']: results = [{ 'id': p['project_id'], 'display_name': p['project_name'] } for p in data['results']] return ListResult(results=results, count=data['count']) return ListResult(results=[], count=0)
def fetch_instance_info(self, filter, **options): return ListResult( results=[ filter, ], count=100, )
def list_attr_value(self, filter, page, **options): """ task 属性值类型较少,不处理 keyword filter """ if filter.attr == "type": results = [ { "id": "common", "display_name": attr_value_names[options["language"]]["common"] }, { "id": "common_func", "display_name": attr_value_names[options["language"]]["common_func"] }, ] elif filter.attr == "iam_resource_owner": user_model = get_user_model() users = user_model.objects.all().values_list("username", flat=True) results = [{ "id": username, "display_name": username } for username in users] else: results = [] return ListResult(results=results, count=len(results))
def list_instance(self, filter_obj: FancyDict, page_obj: Page, **options) -> ListResult: projects = list_projects(get_system_token()) results = [{ 'id': p['project_id'], 'display_name': p['project_name'] } for p in projects[page_obj.slice_from:page_obj.slice_to]] return ListResult(results=results, count=len(projects))
def list_instance(self, filter, page, **options): """ periodic_task 上层资源为 project """ queryset = [] with_path = False if not (filter.parent or filter.search or filter.resource_type_chain): queryset = PeriodicTask.objects.all() elif filter.parent: parent_id = filter.parent["id"] if parent_id: queryset = PeriodicTask.objects.filter( project_id=str(parent_id)) else: queryset = PeriodicTask.objects.all() elif filter.search and filter.resource_type_chain: # 返回结果需要带上资源拓扑路径信息 with_path = True # 过滤 project periodic_task 名称 project_keywords = filter.search.get("project", []) periodic_task_keywords = filter.search.get("periodic_task", []) project_filter = Q() periodic_task_filter = Q() for keyword in project_keywords: project_filter |= Q(name__icontains=keyword) for keyword in periodic_task_keywords: periodic_task_filter |= Q( task__name__icontains=keyword) # TODO 优化 project_ids = Project.objects.filter(project_filter).values_list( "id", flat=True) queryset = PeriodicTask.objects.filter( project_id__in=list(project_ids)).filter(periodic_task_filter) count = queryset.count() results = [{ "id": str(periodic_task.id), "display_name": periodic_task.name } for periodic_task in queryset[page.slice_from:page.slice_to]] if with_path: results = [{ "id": str(periodic_task.id), "display_name": periodic_task.name, "path": [[{ "type": "project", "id": str(periodic_task.project_id), "display_name": periodic_task.project.name, }]], } for periodic_task in queryset[page.slice_from:page.slice_to]] return ListResult(results=results, count=count)
def list_instance_by_policy(self, filter, page, **options): """ project 资源只处理 id 即可,owner 都是 admin,不处理 """ expression = filter.expression if not expression: return ListResult(results=[], count=0) key_mapping = {"project.id": "id"} converter = DjangoQuerySetConverter(key_mapping) filters = converter.convert(expression) queryset = Project.objects.filter(filters) count = queryset.count() results = [{"id": str(p.id), "display_name": p.name} for p in queryset] return ListResult(results=results, count=count)
def fetch_instance_info(self, filter_obj: FancyDict, **options) -> ListResult: query_params = {'project_ids': ','.join(filter_obj.ids)} projects = list_projects(get_system_token(), query_params) results = [{ 'id': p['project_id'], 'display_name': p['project_name'] } for p in projects] return ListResult(results=results, count=len(results))
def list_instance(self, filter_obj: FancyDict, page_obj: Page, **options) -> ListResult: data = page_query_projects(get_system_token(), limit=page_obj.limit, offset=page_obj.offset) results = [{ 'id': p['project_id'], 'display_name': p['project_name'] } for p in data['results']] return ListResult(results=results, count=data['count'])
def fetch_instance_info(self, filter_obj: FancyDict, **options) -> ListResult: """ 批量获取模板集属性详情 :param filter_obj: 查询参数 :return: ListResult 类型的实例列表 """ template_qset = Template.objects.filter(id__in=filter_obj.ids).values('id', 'name') results = [{'id': template['id'], 'display_name': template['name']} for template in template_qset] return ListResult(results=results, count=template_qset.count())
def list_instance(self, filter, page, **options): access_token = ssm.get_client_access_token()["access_token"] projects = filter_projects(access_token) count = len(projects) projects = projects[page.slice_from:page.slice_to] # noqa results = [{ "id": p["project_id"], "display_name": p["project_name"] } for p in projects] return ListResult(results=results, count=count)
def fetch_instance_info(self, filter_obj: FancyDict, **options) -> ListResult: iam_cluster_ns = self._calc_iam_cluster_ns(filter_obj.ids) results = [] for iam_ns_id in filter_obj.ids: # 如果 iam_cluster_ns 没有对应的 iam_ns_id, 则不添加到结果表中 ns = iam_cluster_ns.get(iam_ns_id) if ns: results.append({'id': iam_ns_id, 'display_name': ns['name'], '_bk_iam_approver_': [ns['creator']]}) return ListResult(results=results, count=len(results))
def fetch_instance_info(self, filter, **options): access_token = ssm.get_client_access_token()["access_token"] query_params = None if filter.ids: query_params = {"project_ids": ",".join(filter.ids)} projects = filter_projects(access_token, query_params) results = [{ "id": p["project_id"], "display_name": p["project_name"] } for p in projects] return ListResult(results=results, count=len(results))
def list_instance(self, filter_obj: FancyDict, page_obj: Page, **options) -> ListResult: cluster_id = filter_obj.parent['id'] namespace_list = self._list_namespaces(cluster_id) results = [{ 'id': calc_iam_ns_id(cluster_id, ns['name']), 'display_name': ns['name'] } for ns in namespace_list[page_obj.slice_from:page_obj.slice_to]] return ListResult(results=results, count=len(namespace_list))
def list_instance(self, filter, page, **options): """ mini_app 上层资源为 project """ queryset = [] with_path = False if not (filter.parent or filter.search or filter.resource_type_chain): queryset = AppMaker.objects.filter(is_deleted=False) elif filter.parent: parent_id = filter.parent["id"] if parent_id: queryset = AppMaker.objects.filter(project_id=str(parent_id), is_deleted=False) else: queryset = AppMaker.objects.filter(is_deleted=False) elif filter.search and filter.resource_type_chain: # 返回结果需要带上资源拓扑路径信息 with_path = True # 过滤 project mini_app 名称 project_keywords = filter.search.get("project", []) mini_app_keywords = filter.search.get("mini_app", []) project_filter = Q() mini_app_filter = Q(is_deleted=False) for keyword in project_keywords: project_filter |= Q(name__icontains=keyword) for keyword in mini_app_keywords: mini_app_filter |= Q(name__icontains=keyword) project_ids = Project.objects.filter(project_filter).values_list("id", flat=True) queryset = AppMaker.objects.filter(project_id__in=list(project_ids)).filter(mini_app_filter) count = queryset.count() results = [ {"id": str(mini_app.id), "display_name": mini_app.name} for mini_app in queryset[page.slice_from : page.slice_to] ] if with_path: results = [ { "id": str(mini_app.id), "display_name": mini_app.name, "path": [ [{"type": "project", "id": str(mini_app.project_id), "display_name": mini_app.project.name}] ], } for mini_app in queryset[page.slice_from : page.slice_to] ] return ListResult(results=results, count=count)
def fetch_instance_info(self, filter, **options): """ mini_app 没有定义属性,只处理 filter 中的 ids 字段 """ ids = [] if filter.ids: ids = [int(i) for i in filter.ids] queryset = AppMaker.objects.filter(id__in=ids) count = queryset.count() results = [{"id": str(mini_app.id), "display_name": mini_app.name} for mini_app in queryset] return ListResult(results=results, count=count)
def fetch_instance_info(self, filter, **options): """ flow 没有定义属性,只处理 filter 中的 ids 字段 """ ids = [] if filter.ids: ids = [int(i) for i in filter.ids] queryset = TaskTemplate.objects.filter(id__in=ids) count = queryset.count() results = [{"id": str(flow.id), "display_name": flow.name} for flow in queryset] return ListResult(results=results, count=count)
def list_instance(self, filter, page, **options): """ project 没有上层资源,不需要处理 filter 中的字段 """ queryset = Project.objects.all() count = queryset.count() results = [{ "id": str(p.id), "display_name": p.name } for p in queryset[page.slice_from:page.slice_to]] return ListResult(results=results, count=count)
def list_attr(self, **options): """ clocked_task 包含 iam_resource_owner 属性 """ return ListResult( results=[{ "id": "iam_resource_owner", "display_name": attr_names[options["language"]]["iam_resource_owner"] }], count=1, )
def list_instance(self, filter, page, **options): """ flow 上层资源为 project """ queryset = [] with_path = False if not (filter.parent or filter.search or filter.resource_type_chain): queryset = TaskTemplate.objects.filter(is_deleted=False) elif filter.parent: parent_id = filter.parent["id"] if parent_id: queryset = TaskTemplate.objects.filter(project_id=str(parent_id), is_deleted=False) else: queryset = TaskTemplate.objects.filter(is_deleted=False) elif filter.search and filter.resource_type_chain: # 返回结果需要带上资源拓扑路径信息 with_path = True # 过滤 project flow 名称 project_keywords = filter.search.get("project", []) flow_keywords = filter.search.get("flow", []) project_filter = Q() flow_filter = Q(is_deleted=False) for keyword in project_keywords: project_filter |= Q(name__icontains=keyword) for keyword in flow_keywords: flow_filter |= Q(pipeline_template__name__icontains=keyword) # TODO 优化 project_ids = Project.objects.filter(project_filter).values_list("id", flat=True) queryset = TaskTemplate.objects.filter(project_id__in=list(project_ids)).filter(flow_filter) count = queryset.count() results = [ {"id": str(flow.id), "display_name": flow.name} for flow in queryset[page.slice_from : page.slice_to] ] if with_path: results = [ { "id": str(flow.id), "display_name": flow.name, "path": [[{"type": "project", "id": str(flow.project_id), "display_name": flow.project.name}]], } for flow in queryset[page.slice_from : page.slice_to] ] return ListResult(results=results, count=count)
def list_instance(self, filter_obj: FancyDict, page_obj: Page, **options) -> ListResult: """ 获取模板集列表 :param filter_obj: 查询参数。 以下为必传如: {"parent": {"id": 1}} :param page_obj: 分页对象 :return: ListResult 类型的实例列表 """ template_qset = Template.objects.filter(project_id=filter_obj.parent['id']).values('id', 'name') results = [ {'id': template['id'], 'display_name': template['name']} for template in template_qset[page_obj.slice_from : page_obj.slice_to] ] return ListResult(results=results, count=template_qset.count())
def list_instance_by_policy(self, filter, page, **options): """ flow """ expression = filter.expression if not expression: return ListResult(results=[], count=0) key_mapping = { "flow.id": "id", "flow.owner": "pipeline_template__creator", # TODO 优化 "flow._bk_iam_path_": "project__id", } converter = PathEqDjangoQuerySetConverter(key_mapping, {"project__id": flow_path_value_hook}) filters = converter.convert(expression) queryset = TaskTemplate.objects.filter(filters) count = queryset.count() results = [ {"id": str(flow.id), "display_name": flow.name} for flow in queryset[page.slice_from : page.slice_to] ] return ListResult(results=results, count=count)
def list_attr_value(self, filter, page, **options): """ clocked_task 包含 iam_resource_owner 属性 """ if filter.attr == "iam_resource_owner": user_model = get_user_model() users = user_model.objects.all().values_list("username", flat=True) results = [{ "id": username, "display_name": username } for username in users] else: results = [] return ListResult(results=results, count=len(results))
def list_instance_by_policy(self, filter, page, **options): """ common_flow """ expression = filter.expression if not expression: return ListResult(results=[], count=0) key_mapping = { "common_flow.id": "id", "common_flow.owner": "pipeline_template__creator", # TODO 优化 } converter = DjangoQuerySetConverter(key_mapping) filters = converter.convert(expression) queryset = CommonTemplate.objects.filter(filters) count = queryset.count() results = [{ "id": str(common_flow.id), "display_name": common_flow.name } for common_flow in queryset[page.slice_from:page.slice_to]] return ListResult(results=results, count=count)
def search_instance(self, filter_obj: FancyDict, page_obj: Page, **options) -> ListResult: """支持模糊搜索集群名""" project_id = filter_obj.parent['id'] # 针对搜索关键字过滤集群 clusters = [{ 'id': cluster['cluster_id'], 'display_name': cluster['name'] } for cluster in get_clusters(get_system_token(), project_id) if filter_obj.keyword in cluster['name']] return ListResult( results=clusters[page_obj.slice_from:page_obj.slice_to], count=len(clusters))
def fetch_instance_info(self, filter_obj: FancyDict, **options) -> ListResult: """ 批量获取集群属性详情 :param filter_obj: 查询参数字典 :return: ListResult 类型的实例列表 """ cluster_ids = filter_obj.ids paas_cc = PaaSCCClient(auth=ComponentAuth(get_system_token())) cluster_list = paas_cc.list_clusters(cluster_ids) results = [{ 'id': cluster['cluster_id'], 'display_name': cluster['name'] } for cluster in cluster_list] return ListResult(results=results, count=len(results))
def fetch_instance_info(self, filter, **options): """ periodic_task 没有定义属性,只处理 filter 中的 ids 字段 """ ids = [] if filter.ids: ids = [int(i) for i in filter.ids] queryset = PeriodicTask.objects.filter(id__in=ids) count = queryset.count() results = [{ "id": str(periodic_task.id), "display_name": periodic_task.name } for periodic_task in queryset] return ListResult(results=results, count=count)
def list_instance(self, filter_obj: FancyDict, page_obj: Page, **options) -> ListResult: """ 获取集群列表 :param filter_obj: 查询参数字典。 以下为必传 如: {"parent": {"id": 1}} :param page_obj: 分页对象 :return: ListResult 类型的实例列表 """ project_id = filter_obj.parent['id'] cluster_list = get_clusters(get_system_token(), project_id) results = [{ 'id': cluster['cluster_id'], 'display_name': cluster['name'] } for cluster in cluster_list[page_obj.slice_from:page_obj.slice_to]] return ListResult(results=results, count=len(cluster_list))
def search_instance(self, filter, page, **options): """ project 没有上层资源,不需要处理 filter 的 parent """ keyword = filter.keyword cache_keyword = "iam_search_instance_project_{}".format(keyword) results = cache.get(cache_keyword) if results is None: queryset = Project.objects.filter(name__icontains=keyword, is_disable=False).only("name") results = [{ "id": str(project.id), "display_name": project.name } for project in queryset[page.slice_from:page.slice_to]] cache.set(cache_keyword, results, SEARCH_INSTANCE_CACHE_TIME) return ListResult(results=results, count=len(results))