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(_("节点打标签异常,请联系管理员处理!"))
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)
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]
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})
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)
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
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]
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}
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])