diff --git a/packages/web/projects/vgpu/api/node.js b/packages/web/projects/vgpu/api/node.js index a814103..e90c9a8 100644 --- a/packages/web/projects/vgpu/api/node.js +++ b/packages/web/projects/vgpu/api/node.js @@ -6,7 +6,7 @@ const apiPrefix = '/api/vgpu'; class nodeApi { getNodeList(data) { return { - url: apiPrefix + '/v1/nodes', + url: apiPrefix + '/v1/nodes', method: 'POST', data, }; @@ -14,7 +14,7 @@ class nodeApi { getNodes(data) { return request({ - url: apiPrefix + '/v1/nodes', + url: apiPrefix + '/v1/nodes', method: 'POST', data, }); @@ -22,7 +22,7 @@ class nodeApi { getNodeDetail(params) { return request({ - url: apiPrefix + '/v1/node', + url: apiPrefix + '/v1/node', method: 'GET', params, }); @@ -31,6 +31,21 @@ class nodeApi { getNodeListReq(data) { return request(this.getNodeList(data)); } + + discoveredNodes(data) { + return request({ + url: apiPrefix + '/v1/node/discovered', + method: 'POST', + data, + }); + } + joinNodes(data) { + return request({ + url: apiPrefix + '/v1/node/join', + method: 'POST', + data, + }); + } } export default new nodeApi(); diff --git a/packages/web/projects/vgpu/views/node/admin/index.vue b/packages/web/projects/vgpu/views/node/admin/index.vue index 760994b..83f1bbb 100644 --- a/packages/web/projects/vgpu/views/node/admin/index.vue +++ b/packages/web/projects/vgpu/views/node/admin/index.vue @@ -1,22 +1,35 @@ @@ -26,16 +39,25 @@ import searchSchema from '~/vgpu/views/node/admin/searchSchema'; import { useRouter } from 'vue-router'; import PreviewBar from '~/vgpu/components/previewBar.vue'; import { roundToDecimal } from '@/utils'; -import {ElMessage, ElMessageBox} from 'element-plus'; +import { ElMessage, ElMessageBox } from 'element-plus'; import { ref } from 'vue'; const router = useRouter(); const table = ref(); +// 节点选择相关 +const dialogVisible = ref(false) +const nodeList = ref([]) +const nodeSelect = ref([]) +const loading = ref(true) +const btnLoading = ref(false) + + + const handleClick = async (params) => { const name = params.data.name; - const {list} = await nodeApi.getNodes({filters:{}}) + const { list } = await nodeApi.getNodes({ filters: {} }) const node = list.find(node => node.name === name); if (node) { const uuid = node.uid; @@ -45,6 +67,49 @@ const handleClick = async (params) => { } }; +// 确认操作 +const handleOk = async () => { + if (!nodeSelect.value.length) { + ElMessage({ + message: '请选择节点', + type: 'warning', + }) + return; + } + btnLoading.value = true; + try { + const node_names = nodeList.value.filter(e => nodeSelect.value.includes(e.nodeIp)).map(e => e.nodeName) + const res = await nodeApi.joinNodes({ + node_names + }) + if (res?.code === 200) { + getList(); + dialogVisible.value = false; + } + } finally { + btnLoading.value = false; + } +} + +// 复选框变化 +const handleCheckboxChange = (ip) => { + const index = nodeSelect.value.indexOf(ip); + if (index > -1) { + nodeSelect.value.splice(index, 1); + } else { + nodeSelect.value.push(ip); + } +} + +// 添加节点 +const handleAdd = async () => { + dialogVisible.value = true + loading.value = true + const res = await nodeApi.discoveredNodes({}) + nodeList.value = res?.list || [] + loading.value = false +} + const columns = [ { title: '节点名称', @@ -61,9 +126,9 @@ const columns = [ title: '节点状态', dataIndex: 'isSchedulable', render: ({ isSchedulable, isExternal }) => ( - - {isExternal ? '未纳管' : (isSchedulable ? '可调度' : '禁止调度')} - + + {isExternal ? '未纳管' : (isSchedulable ? '可调度' : '禁止调度')} + ) // filters: [ // { @@ -95,28 +160,28 @@ const columns = [ title: 'vGPU', dataIndex: 'used', render: ({ vgpuTotal, vgpuUsed, isExternal }) => ( - - {isExternal ? '--' : vgpuUsed}/{isExternal ? '--' : vgpuTotal} - + + {isExternal ? '--' : vgpuUsed}/{isExternal ? '--' : vgpuTotal} + ), }, { title: '算力(已分配/总量)', dataIndex: 'used', render: ({ coreTotal, coreUsed, isExternal }) => ( - - {isExternal ? '--' : coreUsed}/{coreTotal} - + + {isExternal ? '--' : coreUsed}/{coreTotal} + ), }, { title: '显存(已分配/总量)', dataIndex: 'w', render: ({ memoryTotal, memoryUsed, isExternal }) => ( - - {isExternal ? '--' : roundToDecimal(memoryUsed / 1024, 1)}/ - {roundToDecimal(memoryTotal / 1024, 1)} GiB - + + {isExternal ? '--' : roundToDecimal(memoryUsed / 1024, 1)}/ + {roundToDecimal(memoryTotal / 1024, 1)} GiB + ), }, ]; diff --git a/packages/web/projects/vgpu/views/poll/admin/index.vue b/packages/web/projects/vgpu/views/poll/admin/index.vue index 6b3af46..17c1e12 100644 --- a/packages/web/projects/vgpu/views/poll/admin/index.vue +++ b/packages/web/projects/vgpu/views/poll/admin/index.vue @@ -8,7 +8,7 @@
+ :key="poolId" style="margin: 15px 0 0 0;">
{{ poolName }} @@ -36,7 +36,7 @@
- @@ -90,10 +90,8 @@