Example #1
0
 def create_node_label_via_bcs(self,
                               request,
                               project_id,
                               cluster_id,
                               node_id_labels={}):
     """调用BCS服务创建节点标签"""
     nodes = cluster_utils.get_cluster_nodes(
         request.user.token.access_token, project_id, cluster_id)
     # compose id: ip
     node_id_ip = {
         info["id"]: info["inner_ip"]
         for info in nodes if str(info["id"]) in node_id_labels.keys()
     }
     client = K8SClient(request.user.token.access_token, project_id,
                        cluster_id, None)
     for node_id, ip in node_id_ip.items():
         k8s_resp = client.get_node_detail(ip)
         if k8s_resp.get("code") != 0:
             raise error_codes.APIError.f(k8s_resp.get("message"),
                                          replace=True)
         exist_metadata = (k8s_resp.get("data") or {}).get("metadata") or {}
         exist_labels = exist_metadata.get("labels") or {}
         if node_id_labels[str(node_id)] == "del":
             exist_labels.pop("nodetype", None)
         else:
             exist_labels.update(K8S_LB_LABEL)
         exist_labels["$patch"] = "replace"
         resp = client.create_node_labels(ip, exist_labels)
         if resp.get("code") != 0:
             raise error_codes.APIError(_("节点打标签异常,请联系管理员处理!"))
Example #2
0
 def delete_cluster_nodes(self, access_token, project_id, cluster_id):
     """删除集群下的节点"""
     # 查询集群下节点
     nodes = cluster_utils.get_cluster_nodes(access_token, project_id, cluster_id, raise_exception=False)
     if not nodes:
         return
     node_status = [{"inner_ip": node["inner_ip"], "status": CommonStatus.Removed} for node in nodes]
     cluster_utils.update_cc_nodes_status(access_token, project_id, cluster_id, node_status)
Example #3
0
    def _get_cluster_node_ip_list(self, project_id: str, cluster_id: str) -> List:
        """
        获取指定集群下属节点 IP 列表

        :param project_id: 项目 ID
        :param cluster_id: 集群 ID
        :return: Node IP 列表
        """
        node_list = get_cluster_nodes(self.request.user.token.access_token, project_id, cluster_id)
        return [node['inner_ip'] for node in node_list]
Example #4
0
    def list_labels(self, request, project_id):
        # TODO: 现阶段仅针对mesos
        if request.project.kind == ProjectKind.K8S.value:
            raise error_codes.NotOpen()

        access_token = request.user.token.access_token
        cluster_id = request.query_params.get("cluster_id")
        # cluster_id 为None时,查询项目下的所有集群的节点
        nodes = node_utils.get_cluster_nodes(access_token, project_id, cluster_id, raise_exception=False)
        # 排除状态为已删除的节点
        nodes = [node for node in nodes if node["status"] not in [NodeStatus.Removed]]
        project_kind_name = ProjectKind.get_choice_label(request.project.kind)
        labels = getattr(self, f"_{project_kind_name.lower()}_node_labels")(access_token, project_id, nodes)
        cluster_id_map = self._cluster_id_map(access_token, project_id)
        self.compose_node_data(nodes, labels, cluster_id_map)
        # 添加权限
        nodes_results = bcs_perm.Cluster.hook_perms(request, project_id, nodes)

        return response.Response({'count': len(nodes_results), 'results': nodes_results})
Example #5
0
    def info(self, request, project_id, cluster_id, node_ip):
        """ 节点基础指标信息 """
        node_list = get_cluster_nodes(request.user.token.access_token,
                                      project_id, cluster_id)
        node_ip_map = {i["inner_ip"]: i["id"] for i in node_list}

        if node_ip not in node_ip_map:
            raise error_codes.ValidateError(
                _('IP {} 不合法或不属于当前集群').format(node_ip))

        response_data = {'provider': 'Prometheus', 'id': node_ip_map[node_ip]}
        for info in prom.get_node_info(cluster_id,
                                       node_ip).get('result') or []:
            for k, v in info['metric'].items():
                if k in constants.NODE_UNAME_METRIC:
                    response_data[k] = v
                elif k == 'metric_name' and v in constants.NODE_USAGE_METRIC:
                    response_data[
                        v] = info['value'][1] if info['value'] else '0'

        return Response(response_data)
Example #6
0
def get_node_metric(request, access_token, project_id, cluster_id,
                    cluster_type):
    node_data = get_cluster_nodes(access_token, project_id, cluster_id)
    # 重新组装数据
    node = {
        "count": len(node_data),
        "results": node_data,
    }
    node_total = node['count']
    node_actived = 0
    node_disabled = 0

    # namespace 获取处理
    client = k8s.K8SClient(access_token,
                           project_id,
                           cluster_id=cluster_id,
                           env=None)
    namespace = client.get_namespace()
    if not namespace.get('result'):
        raise APIError(namespace.get('message'))

    # 节点状态处理 计算k8s有容器的节点
    if node_total > 0:
        node_ips = [i['inner_ip'] for i in node['results']]
        containers = k8s_containers(request, project_id, cluster_id, node_ips)
        for node in node_ips:
            if containers.get(node, 0) > 0:
                node_actived += 1

    node_disabled = node_total - node_actived
    data = {
        'total': node_total,
        'actived': node_actived,
        'disabled': node_disabled
    }
    return data
Example #7
0
 def _get_cluster_node_ip_list(self, access_token, project_id, cluster_id):
     data = cluster_utils.get_cluster_nodes(access_token, project_id,
                                            cluster_id)
     return [info["inner_ip"] for info in data]
Example #8
0
 def get_nodes_id_ip(self, access_token, project_id, cluster_id):
     nodes = cluster_utils.get_cluster_nodes(access_token, project_id,
                                             cluster_id)
     return {info["id"]: info for info in nodes}
Example #9
0
 def list_nodes_ip(self, request, project_id, cluster_id):
     """获取集群下节点的IP"""
     nodes = get_cluster_nodes(request.user.token.access_token, project_id, cluster_id, raise_exception=False)
     return Response([info["inner_ip"] for info in nodes if info["status"] != CommonStatus.Removed])