/*
* 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}
);
};