import { Node, Endpoints } from 'kubernetes-types/core/v1'; import { useMemo } from 'react'; import { formatDate } from '@/portainer/filters/filters'; import { getRole, getInternalNodeIpAddress, getNodeApiDetails, getNodeStatus, getAvailability, } from '@/react/kubernetes/cluster/nodeUtils'; import { Badge } from '@@/Badge'; import { DetailsTable } from '@@/DetailsTable'; import { StatusBadge, StatusBadgeType } from '@@/StatusBadge'; import { PortainerSelect, Option } from '@@/form-components/PortainerSelect'; import { FormError } from '@@/form-components/FormError'; import { NodeAvailability } from '../../types'; type Props = { node: Node; endpoints: Endpoints[]; availability: NodeAvailability; error?: string; onChangeAvailability: (availability: NodeAvailability) => void; hasNodeWriteAccess: boolean; }; const availabilityOptions: Option[] = [ { label: 'Active', value: 'Active', }, { label: 'Pause', value: 'Pause', }, { label: 'Drain', value: 'Drain', }, ]; export function NodeSummary({ node, endpoints, availability, onChangeAvailability, hasNodeWriteAccess, error, }: Props) { const parsedNode = useMemo( () => parseNodeValues(node, endpoints), [node, endpoints] ); return ( Hostname {parsedNode.name} {parsedNode.isApi && ( api )} {parsedNode.isApi && ( Kubernetes API {`${parsedNode.ipAddress}:${parsedNode.apiPort}`} )} Role {parsedNode.role} Kubelet version {parsedNode.version || '-'} Creation date {parsedNode.creationDate || '-'} Status
{parsedNode.status} {parsedNode.status === 'Warning' && parsedNode.warningMessage && ( {parsedNode.warningMessage} )}
Availability {hasNodeWriteAccess ? ( <> { if (value) { onChangeAvailability(value); } }} data-cy="node-availability-select" inputId="node-availability-select" aria-label="Availability" /> {error} ) : ( availability )}
); } interface ParsedNodeData { name: string; isApi: boolean; ipAddress?: string; apiPort?: number; role: string; version?: string; creationDate?: string; status: string; statusType: StatusBadgeType; warningMessage?: string; availability: NodeAvailability; } function parseNodeValues(node: Node, endpoints: Endpoints[]): ParsedNodeData { const name = node.metadata?.name || ''; const ipAddress = getInternalNodeIpAddress(node); const { apiPort, isApi } = getNodeApiDetails(node, endpoints); const role = getRole(node); const version = node.status?.nodeInfo?.kubeletVersion; const creationDate = node.metadata?.creationTimestamp ? formatDate(node.metadata.creationTimestamp) : undefined; const { status, statusType, warningMessage } = getNodeStatus(node); const availability = getAvailability(node); return { name, isApi, ipAddress, apiPort, role, version, creationDate, status, statusType, availability, warningMessage, }; }