示例#1
0
    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)
示例#2
0
    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)
示例#3
0
 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)
示例#4
0
 def fetch_instance_info(self, filter, **options):
     return ListResult(
         results=[
             filter,
         ],
         count=100,
     )
示例#5
0
文件: task.py 项目: Tencent/bk-sops
    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))
示例#6
0
 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))
示例#7
0
    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)
示例#8
0
    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)
示例#9
0
 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))
示例#10
0
 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'])
示例#11
0
    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())
示例#12
0
 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)
示例#13
0
    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))
示例#14
0
 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))
示例#15
0
    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))
示例#16
0
    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)
示例#17
0
    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)
示例#18
0
文件: flow.py 项目: Tencent/bk-sops
    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)
示例#19
0
    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)
示例#20
0
 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,
     )
示例#21
0
文件: flow.py 项目: Tencent/bk-sops
    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)
示例#22
0
    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())
示例#23
0
文件: flow.py 项目: Tencent/bk-sops
    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)
示例#24
0
    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))
示例#25
0
    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)
示例#26
0
    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))
示例#27
0
    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))
示例#28
0
    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)
示例#29
0
    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))
示例#30
0
    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))