import "./node-details.scss"; import React from "react"; import upperFirst from "lodash/upperFirst"; import kebabCase from "lodash/kebabCase"; import { disposeOnUnmount, observer } from "mobx-react"; import { Trans } from "@lingui/macro"; import { DrawerItem, DrawerItemLabels } from "../drawer"; import { Badge } from "../badge"; import { TooltipContent } from "../tooltip"; import { nodesStore } from "./nodes.store"; import { ResourceMetrics } from "../resource-metrics"; import { podsStore } from "../+workloads-pods/pods.store"; import { KubeObjectDetailsProps } from "../kube-object"; import { Node, nodesApi } from "../../api/endpoints"; import { NodeCharts } from "./node-charts"; import { reaction } from "mobx"; import { PodDetailsList } from "../+workloads-pods/pod-details-list"; import { apiManager } from "../../api/api-manager"; import { KubeObjectMeta } from "../kube-object/kube-object-meta"; interface Props extends KubeObjectDetailsProps { } @observer export class NodeDetails extends React.Component { @disposeOnUnmount clean = reaction(() => this.props.object.getName(), () => { nodesStore.nodeMetrics = null; }); async componentDidMount() { if (!podsStore.isLoaded) { podsStore.loadAll(); } } componentWillUnmount() { nodesStore.nodeMetrics = null; } render() { const { object: node } = this.props; if (!node) return; const { status } = node const { nodeInfo, addresses, capacity, allocatable } = status const conditions = node.getActiveConditions(); const taints = node.getTaints() const childPods = podsStore.getPodsByNode(node.getName()) const metrics = nodesStore.nodeMetrics const metricTabs = [ CPU, Memory, Disk, Pods, ]; return (
{podsStore.isLoaded && ( nodesStore.loadMetrics(node.getName())} tabs={metricTabs} object={node} params={{ metrics }} > )} Capacity}> CPU: {capacity.cpu},{" "} Memory: {Math.floor(parseInt(capacity.memory) / 1024)}Mi,{" "} Pods: {capacity.pods} Allocatable}> CPU: {allocatable.cpu},{" "} Memory: {Math.floor(parseInt(allocatable.memory) / 1024)}Mi,{" "} Pods: {allocatable.pods} {addresses && Addresses}> { addresses.map(({ type, address }) => (

{type}: {address}

)) }
} OS}> {nodeInfo.operatingSystem} ({nodeInfo.architecture}) OS Image}> {nodeInfo.osImage} Kernel version}> {nodeInfo.kernelVersion} Container runtime}> {nodeInfo.containerRuntimeVersion} Kubelet version}> {nodeInfo.kubeletVersion} Labels} labels={node.getLabels()} /> Annotations} labels={node.getAnnotations()} /> {taints.length > 0 && ( Taints} labelsOnly> { taints.map(({ key, effect, value }) => ( )) } )} {conditions && Conditions} className="conditions" labelsOnly> { conditions.map(condition => { const { type } = condition return ( {Object.entries(condition).map(([key, value]) =>
{upperFirst(key)}
{value}
)} } /> ) }) }
}
) } } apiManager.registerViews(nodesApi, { Details: NodeDetails, });