import AutoTooltip from '@/components/auto-tooltip'; import DeleteModal from '@/components/delete-modal'; import DropdownButtons from '@/components/drop-down-buttons'; import { FilterBar } from '@/components/page-tools'; import ProgressBar from '@/components/progress-bar'; import InfoColumn from '@/components/simple-table/info-column'; import StatusTag from '@/components/status-tag'; import Hotkeys from '@/config/hotkeys'; import useTableFetch from '@/hooks/use-table-fetch'; import { convertFileSize } from '@/utils'; import { DeleteOutlined, EditOutlined, InfoCircleOutlined } from '@ant-design/icons'; import { PageContainer } from '@ant-design/pro-components'; import { useIntl } from '@umijs/max'; import { ConfigProvider, Empty, Table, Tooltip, message } from 'antd'; import _ from 'lodash'; import React, { useCallback, useState } from 'react'; import { useHotkeys } from 'react-hotkeys-hook'; import { WORKERS_API, deleteWorker, queryWorkersList, updateWorker } from '../apis'; import { WorkerStatusMapValue, status } from '../config'; import { Filesystem, GPUDeviceItem, ListItem } from '../config/types'; import AddWorker from './add-worker'; import UpdateLabels from './update-labels'; const { Column } = Table; const fieldList = [ { label: 'resources.table.total', key: 'total', locale: true, render: (val: any) => { return convertFileSize(val, 0); } }, { label: 'resources.table.used', key: 'used', locale: true, render: (val: any) => { return convertFileSize(val, 0); } }, { label: 'resources.table.allocated', key: 'allocated', locale: true, render: (val: any) => { return convertFileSize(val, 0); } } ]; const ActionList = [ { label: 'common.button.edit', key: 'edit', icon: }, { label: 'common.button.delete', key: 'delete', props: { danger: true }, icon: } ]; const formateUtilazation = (val1: number, val2: number): number => { if (!val2 || !val1) { return 0; } return _.round((val1 / val2) * 100, 0); }; const calcStorage = (files: Filesystem[]) => { const mountRoot = _.find( files, (item: Filesystem) => item.mount_point === '/' ); return mountRoot ? formateUtilazation(mountRoot.used, mountRoot.total) : 0; }; const Workers: React.FC = () => { const { dataSource, rowSelection, queryParams, modalRef, handleDelete, handleDeleteBatch, fetchData, handlePageChange, handleTableChange, handleSearch, handleNameChange } = useTableFetch({ fetchAPI: queryWorkersList, deleteAPI: deleteWorker, contentForDelete: 'worker', watch: true, API: WORKERS_API }); const intl = useIntl(); const [open, setOpen] = useState(false); const [updateLabelsData, setUpdateLabelsData] = useState<{ open: boolean; data: ListItem; }>({ open: false, data: {} as ListItem }); const handleAddWorker = () => { setOpen(true); }; const handleUpdateLabelsOk = useCallback( async (values: Record) => { try { console.log('updateLabelsData.data', updateLabelsData.data); await updateWorker(updateLabelsData.data.id, { ...updateLabelsData.data, labels: values.labels }); message.success(intl.formatMessage({ id: 'common.message.success' })); fetchData(); setUpdateLabelsData({ open: false, data: {} as ListItem }); } catch (error) { console.log('error', error); } }, [updateLabelsData, fetchData] ); const handleCancelUpdateLabels = useCallback(() => { setUpdateLabelsData({ ...updateLabelsData, open: false }); }, []); const handleUpdateLabels = (record: ListItem) => { console.log('record', record); setUpdateLabelsData({ open: true, data: { ...record } }); }; const handleSelect = (val: any, record: ListItem) => { if (val === 'edit') { handleUpdateLabels(record); return; } if (val === 'delete') { handleDelete(record); } }; const renderEmpty = (type?: string) => { if (type !== 'Table') return; if ( !dataSource.loading && dataSource.loadend && !dataSource.dataList.length ) { return ; } return ; }; const renderStorageTooltip = (files: Filesystem[]) => { const mountRoot = _.find( files, (item: Filesystem) => item.mount_point === '/' ); return mountRoot ? ( item.key !== 'allocated')} data={mountRoot} > ) : ( 0 ); }; useHotkeys(Hotkeys.CREATE.join(','), handleAddWorker, { enabled: !open }); return ( <> { return ( {record.name} ); }} /> { return ( {_.map(record.labels, (value: any, key: string) => { return ( {key} :{value} ); })} ); }} /> { return ( ); }} /> { return ( ); }} /> { return ( } > ); }} /> { return ( {_.map( _.sortBy(record?.status?.gpu_devices || [], ['index']), (item: GPUDeviceItem, index: string) => { return ( [{item.index}] {item.core ? ( ) : ( '-' )} ); } )} ); }} /> { return ( {_.map( _.sortBy(record?.status?.gpu_devices || [], ['index']), (item: GPUDeviceItem, index: string) => { return ( [{item.index}] } > {item.memory.is_unified_memory && ( )} ); } )} ); }} /> { return ( ); }} /> { return ( handleSelect(val, record)} > ); }} /> setOpen(false)}> > ); }; export default Workers;