/* * Copyright OpenSearch Contributors * SPDX-License-Identifier: Apache-2.0 */ import React, { useMemo, useCallback } from 'react'; import { EuiFlyout, EuiFlyoutBody, EuiFlyoutHeader, EuiTitle, EuiHealth, EuiDescriptionList, EuiDescriptionListTitle, EuiDescriptionListDescription, EuiSpacer, EuiTextColor, } from '@elastic/eui'; import { APIProvider } from '../../apis/api_provider'; import { useFetcher } from '../../hooks/use_fetcher'; import { NodesTable } from './nodes_table'; import { CopyableText } from '../common'; import { ModelDeploymentProfile } from '../../apis/profile'; export interface INode { id: string; deployed: boolean; } export interface PreviewModel { name: string; id: string; planningWorkerNodes: string[]; source: string; } interface Props { onClose: (data: ModelDeploymentProfile | null) => void; model: PreviewModel; } export const PreviewPanel = ({ onClose, model }: Props) => { const { id, name, source } = model; const { data, loading } = useFetcher(APIProvider.getAPI('profile').getModel, id); const nodes = useMemo(() => { if (loading) { return []; } const targetNodes = data?.target_worker_nodes ?? model.planningWorkerNodes ?? []; const deployedNodes = data?.worker_nodes ?? []; return targetNodes.map((item) => ({ id: item, deployed: deployedNodes.indexOf(item) > -1 ? true : false, })); }, [data, model, loading]); const respondingStatus = useMemo(() => { if (loading) { return ( Loading... ); } const deployedNodesNum = nodes.filter(({ deployed }) => deployed).length; const targetNodesNum = nodes.length; if (deployedNodesNum === 0) { return ( Not responding on {targetNodesNum} of {targetNodesNum} nodes ); } if (deployedNodesNum < targetNodesNum) { return ( Partially responding on {deployedNodesNum} of {targetNodesNum} nodes ); } return ( Responding on {deployedNodesNum} of {targetNodesNum} nodes ); }, [nodes, loading]); const onCloseFlyout = useCallback(() => { onClose(data); }, [onClose, data]); return (

{name}

Model ID Source {source} Model status by node {respondingStatus}
); };