Пример #1
0
 def _cluster_id_map(self, access_token, project_id):
     clusters = node_utils.get_clusters(access_token, project_id)
     return {
         cluster["cluster_id"]: {
             "cluster_env": cluster_env_transfer(cluster["environment"]),
             "cluster_name": cluster["name"],
         }
         for cluster in clusters
     }
Пример #2
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))
Пример #3
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']
        clusters = get_clusters(get_system_token(), project_id)
        results = [{
            'id': cluster['cluster_id'],
            'display_name': cluster['name']
        } for cluster in clusters[page_obj.slice_from:page_obj.slice_to]]
        return ListResult(results=results, count=len(clusters))
Пример #4
0
    def query_labels(self, request, project_id):
        """查询节点下的labels
        NOTE: 允许查询项目下所有集群中的节点的label
        """
        access_token = request.user.token.access_token
        cluster_id = request.query_params.get("cluster_id")
        if not cluster_id:
            clusters = node_utils.get_clusters(access_token, project_id)
            cluster_id_list = [cluster["cluster_id"] for cluster in clusters]
        else:
            cluster_id_list = [cluster_id]
        # 查询label对应的key-val
        querier = get_label_querier(request.project.kind, access_token,
                                    project_id)
        labels = querier.query_labels(cluster_id_list)

        return response.Response(labels)
Пример #5
0
    def list(self, request, project_id):
        """命名空间列表
        权限控制: 必须有对应集群的使用权限
        """
        access_token = request.user.token.access_token
        valid_group_by = ['env_type', 'cluster_id', 'cluster_name']

        group_by = request.GET.get('group_by')
        cluster_id = request.GET.get('cluster_id')
        with_lb = request.GET.get('with_lb', 0)

        # 过滤有使用权限的命名空间
        perm_can_use = request.GET.get('perm_can_use')
        if perm_can_use == '1':
            perm_can_use = True
        else:
            perm_can_use = False

        # 获取全部namespace,前台分页
        result = paas_cc.get_namespace_list(access_token,
                                            project_id,
                                            with_lb=with_lb,
                                            limit=constants.ALL_LIMIT)
        if result.get('code') != 0:
            raise error_codes.APIError.f(result.get('message', ''))

        results = result["data"]["results"] or []
        # 针对k8s集群过滤掉系统和平台命名空间
        if request.project.kind == ProjectKind.K8S.value:
            results = self._ignore_ns_for_k8s(results)

        # 是否有创建权限
        perm = bcs_perm.Namespace(request, project_id, bcs_perm.NO_RES)
        can_create = perm.can_create(raise_exception=False)

        # 补充cluster_name字段
        cluster_list = get_clusters(access_token, project_id)
        # TODO: 后续发现cluster_id不存在时,再处理
        cluster_dict = {i["cluster_id"]: i for i in (cluster_list or [])}

        # no_vars=1 不显示变量
        no_vars = request.GET.get('no_vars')
        if no_vars == '1':
            project_var = []
        else:
            project_var = NameSpaceVariable.get_project_ns_vars(project_id)

        for i in results:
            # ns_vars = NameSpaceVariable.get_ns_vars(i['id'], project_id)
            ns_id = i['id']
            ns_vars = []
            for _var in project_var:
                _ns_values = _var['ns_values']
                _ns_value_ids = _ns_values.keys()
                ns_vars.append({
                    'id':
                    _var['id'],
                    'key':
                    _var['key'],
                    'name':
                    _var['name'],
                    'value':
                    _ns_values.get(ns_id)
                    if ns_id in _ns_value_ids else _var['default_value'],
                })
            i['ns_vars'] = ns_vars

            if i['cluster_id'] in cluster_dict:
                i['cluster_name'] = cluster_dict[i['cluster_id']]['name']
                i['environment'] = cluster_dict[i['cluster_id']]['environment']
            else:
                i['cluster_name'] = i['cluster_id']
                i['environment'] = None

        # 添加permissions到数据中
        results = perm.hook_perms(results, perm_can_use)

        if cluster_id:
            results = filter(lambda x: x['cluster_id'] == cluster_id, results)

        if group_by and group_by in valid_group_by:
            # 分组, 排序
            results = [{
                'name':
                k,
                '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])]
            if group_by == 'env_type':
                ordering = [i.value for i in constants.EnvType]
                results = sorted(results,
                                 key=lambda x: ordering.index(x['name']))
            else:
                results = sorted(results,
                                 key=lambda x: x['name'],
                                 reverse=True)
                # 过滤带有ns的集群id
                cluster_ids_with_ns = []
                # 按集群分组时,添加集群环境信息
                for r in results:
                    r_ns_list = r.get('results') or []
                    r_ns = r_ns_list[0] if r_ns_list else {}
                    r['environment'] = r_ns.get('environment', '')
                    r['environment_name'] = get_cluster_env_name(
                        r['environment'])
                    r["cluster_id"] = r_ns.get("cluster_id")
                    cluster_ids_with_ns.append(r_ns.get("cluster_id"))

                # 添加无命名空间集群ID
                results.extend(
                    self.get_clusters_without_ns(cluster_dict,
                                                 cluster_ids_with_ns))
        else:
            results = sorted(results, key=lambda x: x['id'], reverse=True)

        permissions = {
            'create': can_create,
            'sync_namespace': enabled_sync_namespace(project_id)
        }

        return APIResult(results, 'success', permissions=permissions)
Пример #6
0
    def list(self, request, project_id):
        """命名空间列表
        权限控制: 必须有对应集群的使用权限
        """
        access_token = request.user.token.access_token
        valid_group_by = ['env_type', 'cluster_id', 'cluster_name']

        group_by = request.GET.get('group_by')
        cluster_id = request.GET.get('cluster_id')

        # 获取全部namespace,前台分页
        result = paas_cc.get_namespace_list(access_token,
                                            project_id,
                                            limit=LIMIT_FOR_ALL_DATA)
        if result.get('code') != 0:
            raise error_codes.APIError.f(result.get('message', ''))

        results = result["data"]["results"] or []
        # 针对k8s集群过滤掉平台命名空间
        results = self._ignore_ns_for_k8s(results)

        # 补充cluster_name字段
        cluster_list = get_clusters(access_token, project_id)
        # 添加共享集群
        cluster_list = append_shared_clusters(cluster_list)
        # TODO: 后续发现cluster_id不存在时,再处理
        cluster_dict = {i["cluster_id"]: i for i in (cluster_list or [])}

        # no_vars=1 不显示变量
        no_vars = request.GET.get('no_vars')
        if no_vars == '1':
            project_var = []
        else:
            project_var = NameSpaceVariable.get_project_ns_vars(project_id)

        for i in results:
            # ns_vars = NameSpaceVariable.get_ns_vars(i['id'], project_id)
            ns_id = i['id']
            ns_vars = []
            for _var in project_var:
                _ns_values = _var['ns_values']
                _ns_value_ids = _ns_values.keys()
                ns_vars.append({
                    'id':
                    _var['id'],
                    'key':
                    _var['key'],
                    'name':
                    _var['name'],
                    'value':
                    _ns_values.get(ns_id)
                    if ns_id in _ns_value_ids else _var['default_value'],
                })
            i['ns_vars'] = ns_vars

            if i['cluster_id'] in cluster_dict:
                i['cluster_name'] = cluster_dict[i['cluster_id']]['name']
                i['environment'] = cluster_dict[i['cluster_id']]['environment']
            else:
                i['cluster_name'] = i['cluster_id']
                i['environment'] = None

        if cluster_id:
            results = filter(lambda x: x['cluster_id'] == cluster_id, results)

        if group_by and group_by in valid_group_by:
            # 分组, 排序
            results = [{
                'name':
                k,
                '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])]
            if group_by == 'env_type':
                ordering = [i.value for i in EnvType]
                results = sorted(results,
                                 key=lambda x: ordering.index(x['name']))
            else:
                results = sorted(results,
                                 key=lambda x: x['name'],
                                 reverse=True)
                # 过滤带有ns的集群id
                cluster_ids_with_ns = []
                # 按集群分组时,添加集群环境信息
                for r in results:
                    r_ns_list = r.get('results') or []
                    r_ns = r_ns_list[0] if r_ns_list else {}
                    r['environment'] = r_ns.get('environment', '')
                    r['environment_name'] = get_cluster_env_name(
                        r['environment'])
                    r["cluster_id"] = r_ns.get("cluster_id")
                    if get_cluster_type(r["cluster_id"]) == ClusterType.SHARED:
                        r["is_shared"] = True
                    cluster_ids_with_ns.append(r_ns.get("cluster_id"))

                # 添加无命名空间集群ID
                results.extend(
                    self.get_clusters_without_ns(cluster_dict,
                                                 cluster_ids_with_ns))
        else:
            results = sorted(results, key=lambda x: x['id'], reverse=True)

        with_perms = str2bool(request.query_params.get('with_perms', True))
        if not with_perms:
            return response.Response(results)

        namespace_list = []
        for namespace in results:
            namespace['iam_ns_id'] = calc_iam_ns_id(namespace['cluster_id'],
                                                    namespace['name'])
            namespace_list.append(namespace)

        return PermsResponse(
            namespace_list,
            NamespaceRequest(project_id=project_id, cluster_id=cluster_id))
Пример #7
0
 def get_cluster_id_name_map(self, access_token, project_id):
     cluster_list = cluster_utils.get_clusters(access_token, project_id)
     return {i["cluster_id"]: i for i in cluster_list}
Пример #8
0
 def clusters(self):
     data = get_clusters(self.context['access_token'],
                         self.context['project_id'])
     if data:
         return [c["cluster_id"] for c in data]
     return []
Пример #9
0
 def list(self, request, project_id_or_code):
     clusters = get_clusters(request.user.token.access_token,
                             request.project.project_id)
     return Response(clusters)